|  | /* | 
|  | Copyright 2016 The Transicator Authors | 
|  |  | 
|  | Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | you may not use this file except in compliance with the License. | 
|  | You may obtain a copy of the License at | 
|  |  | 
|  | http://www.apache.org/licenses/LICENSE-2.0 | 
|  |  | 
|  | Unless required by applicable law or agreed to in writing, software | 
|  | distributed under the License is distributed on an "AS IS" BASIS, | 
|  | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | See the License for the specific language governing permissions and | 
|  | limitations under the License. | 
|  | */ | 
|  | package main | 
|  |  | 
|  | import ( | 
|  | "net/http" | 
|  | "runtime" | 
|  |  | 
|  | "github.com/julienschmidt/httprouter" | 
|  | ) | 
|  |  | 
|  | func (s *server) initDiagAPI(prefix string, router *httprouter.Router) { | 
|  | router.HandlerFunc("GET", prefix+"/diagnostics/stack", s.handleGetStack) | 
|  | } | 
|  |  | 
|  | func (s *server) handleGetStack( | 
|  | resp http.ResponseWriter, req *http.Request) { | 
|  | stackBufLen := 64 | 
|  | for { | 
|  | stackBuf := make([]byte, stackBufLen) | 
|  | stackLen := runtime.Stack(stackBuf, true) | 
|  | if stackLen == len(stackBuf) { | 
|  | // Must be truncated | 
|  | stackBufLen *= 2 | 
|  | } else { | 
|  | resp.Header().Set("Content-Type", textContent) | 
|  | resp.Write(stackBuf[:stackLen]) | 
|  | return | 
|  | } | 
|  | } | 
|  | } |