mirror of
https://github.com/weaveworks/scope.git
synced 2026-07-27 09:11:57 +00:00
``` $ gvt delete github.com/weaveworks/common $ gvt fetch -revision 15746cbb5831e70c58d520634b09393b7c3cfd56 github.com/weaveworks/common 2017/10/08 XX:XX:XX Fetching: github.com/weaveworks/common 2017/10/08 XX:XX:XX · Skipping (existing): github.com/sirupsen/logrus 2017/10/08 XX:XX:XX · Skipping (existing): github.com/golang/protobuf/proto 2017/10/08 XX:XX:XX · Skipping (existing): github.com/mgutz/ansi 2017/10/08 XX:XX:XX · Skipping (existing): golang.org/x/net/context 2017/10/08 XX:XX:XX · Skipping (existing): github.com/opentracing/opentracing-go/ext 2017/10/08 XX:XX:XX · Skipping (existing): github.com/golang/protobuf/ptypes/empty 2017/10/08 XX:XX:XX · Fetching recursive dependency: github.com/opentracing-contrib/go-stdlib/nethttp 2017/10/08 XX:XX:XX ·· Skipping (existing): github.com/opentracing/opentracing-go 2017/10/08 XX:XX:XX ·· Skipping (existing): github.com/opentracing/opentracing-go/ext 2017/10/08 XX:XX:XX ·· Skipping (existing): github.com/opentracing/opentracing-go/log 2017/10/08 XX:XX:XX · Skipping (existing): github.com/aws/aws-sdk-go/aws/credentials 2017/10/08 XX:XX:XX · Skipping (existing): github.com/weaveworks/promrus 2017/10/08 XX:XX:XX · Skipping (existing): github.com/golang/protobuf/ptypes 2017/10/08 XX:XX:XX · Fetching recursive dependency: github.com/grpc-ecosystem/grpc-opentracing/go/otgrpc 2017/10/08 XX:XX:XX ·· Skipping (existing): github.com/opentracing/opentracing-go 2017/10/08 XX:XX:XX ·· Skipping (existing): github.com/opentracing/opentracing-go/ext 2017/10/08 XX:XX:XX ·· Skipping (existing): google.golang.org/grpc/metadata 2017/10/08 XX:XX:XX ·· Skipping (existing): google.golang.org/grpc/codes 2017/10/08 XX:XX:XX ·· Skipping (existing): google.golang.org/grpc/status 2017/10/08 XX:XX:XX ·· Skipping (existing): github.com/opentracing/opentracing-go/log 2017/10/08 XX:XX:XX ·· Skipping (existing): golang.org/x/net/context 2017/10/08 XX:XX:XX ·· Skipping (existing): google.golang.org/grpc 2017/10/08 XX:XX:XX · Skipping (existing): golang.org/x/tools/cover 2017/10/08 XX:XX:XX · Skipping (existing): github.com/aws/aws-sdk-go/aws 2017/10/08 XX:XX:XX · Skipping (existing): github.com/armon/go-socks5 2017/10/08 XX:XX:XX · Fetching recursive dependency: github.com/weaveworks-experiments/loki/pkg/client 2017/10/08 XX:XX:XX ·· Fetching recursive dependency: github.com/weaveworks-experiments/loki/vendor/github.com/apache/thrift/lib/go/thrift 2017/10/08 XX:XX:XX ·· Fetching recursive dependency: github.com/weaveworks-experiments/loki/vendor/github.com/opentracing/opentracing-go 2017/10/08 XX:XX:XX ··· Fetching recursive dependency: github.com/weaveworks-experiments/loki/vendor/golang.org/x/net/context 2017/10/08 XX:XX:XX ·· Fetching recursive dependency: github.com/weaveworks-experiments/loki/vendor/github.com/openzipkin/zipkin-go-opentracing 2017/10/08 XX:XX:XX ··· Fetching recursive dependency: github.com/weaveworks-experiments/loki/vendor/github.com/gogo/protobuf/proto 2017/10/08 XX:XX:XX ··· Fetching recursive dependency: github.com/weaveworks-experiments/loki/vendor/github.com/Shopify/sarama 2017/10/08 XX:XX:XX ···· Fetching recursive dependency: github.com/weaveworks-experiments/loki/vendor/github.com/eapache/queue 2017/10/08 XX:XX:XX ···· Fetching recursive dependency: github.com/weaveworks-experiments/loki/vendor/github.com/eapache/go-xerial-snappy 2017/10/08 XX:XX:XX ····· Fetching recursive dependency: github.com/weaveworks-experiments/loki/vendor/github.com/golang/snappy 2017/10/08 XX:XX:XX ···· Fetching recursive dependency: github.com/weaveworks-experiments/loki/vendor/github.com/pierrec/lz4 2017/10/08 XX:XX:XX ····· Fetching recursive dependency: github.com/weaveworks-experiments/loki/vendor/github.com/pierrec/xxHash/xxHash32 2017/10/08 XX:XX:XX ···· Fetching recursive dependency: github.com/weaveworks-experiments/loki/vendor/github.com/eapache/go-resiliency/breaker 2017/10/08 XX:XX:XX ···· Fetching recursive dependency: github.com/weaveworks-experiments/loki/vendor/github.com/klauspost/crc32 2017/10/08 XX:XX:XX ···· Fetching recursive dependency: github.com/weaveworks-experiments/loki/vendor/github.com/davecgh/go-spew/spew 2017/10/08 XX:XX:XX ···· Fetching recursive dependency: github.com/weaveworks-experiments/loki/vendor/github.com/rcrowley/go-metrics 2017/10/08 XX:XX:XX ··· Fetching recursive dependency: github.com/weaveworks-experiments/loki/vendor/github.com/go-logfmt/logfmt 2017/10/08 XX:XX:XX ···· Fetching recursive dependency: github.com/weaveworks-experiments/loki/vendor/github.com/kr/logfmt 2017/10/08 XX:XX:XX · Skipping (existing): google.golang.org/grpc/metadata 2017/10/08 XX:XX:XX · Fetching recursive dependency: github.com/mwitkow/go-grpc-middleware 2017/10/08 XX:XX:XX ·· Skipping (existing): google.golang.org/grpc/grpclog 2017/10/08 XX:XX:XX ·· Fetching recursive dependency: go.uber.org/zap/zapcore 2017/10/08 XX:XX:XX ··· Fetching recursive dependency: go.uber.org/zap/internal/exit 2017/10/08 XX:XX:XX ··· Fetching recursive dependency: go.uber.org/multierr 2017/10/08 XX:XX:XX ···· Fetching recursive dependency: go.uber.org/atomic 2017/10/08 XX:XX:XX ··· Fetching recursive dependency: go.uber.org/zap/internal/color 2017/10/08 XX:XX:XX ··· Fetching recursive dependency: go.uber.org/zap/buffer 2017/10/08 XX:XX:XX ··· Fetching recursive dependency: go.uber.org/zap/internal/bufferpool 2017/10/08 XX:XX:XX ·· Skipping (existing): google.golang.org/grpc/metadata 2017/10/08 XX:XX:XX ·· Fetching recursive dependency: github.com/grpc-ecosystem/go-grpc-middleware/testing/testproto 2017/10/08 XX:XX:XX ··· Skipping (existing): github.com/golang/protobuf/proto 2017/10/08 XX:XX:XX ··· Skipping (existing): golang.org/x/net/context 2017/10/08 XX:XX:XX ··· Skipping (existing): google.golang.org/grpc 2017/10/08 XX:XX:XX ·· Skipping (existing): github.com/opentracing/opentracing-go 2017/10/08 XX:XX:XX ·· Skipping (existing): github.com/opentracing/opentracing-go/log 2017/10/08 XX:XX:XX ·· Skipping (existing): golang.org/x/net/context 2017/10/08 XX:XX:XX ·· Skipping (existing): github.com/sirupsen/logrus 2017/10/08 XX:XX:XX ·· Fetching recursive dependency: github.com/golang/protobuf/jsonpb 2017/10/08 XX:XX:XX ··· Skipping (existing): github.com/golang/protobuf/proto 2017/10/08 XX:XX:XX ··· Skipping (existing): github.com/golang/protobuf/ptypes/any 2017/10/08 XX:XX:XX ··· Skipping (existing): github.com/golang/protobuf/ptypes/struct 2017/10/08 XX:XX:XX ··· Skipping (existing): github.com/golang/protobuf/ptypes/duration 2017/10/08 XX:XX:XX ··· Skipping (existing): github.com/golang/protobuf/ptypes/timestamp 2017/10/08 XX:XX:XX ··· Skipping (existing): github.com/golang/protobuf/ptypes/wrappers 2017/10/08 XX:XX:XX ·· Skipping (existing): golang.org/x/net/trace 2017/10/08 XX:XX:XX ·· Skipping (existing): google.golang.org/grpc 2017/10/08 XX:XX:XX ·· Skipping (existing): google.golang.org/grpc/credentials 2017/10/08 XX:XX:XX ·· Fetching recursive dependency: github.com/grpc-ecosystem/go-grpc-middleware/logging 2017/10/08 XX:XX:XX ··· Skipping (existing): google.golang.org/grpc/grpclog 2017/10/08 XX:XX:XX ··· Fetching recursive dependency: go.uber.org/zap 2017/10/08 XX:XX:XX ··· Skipping (existing): github.com/sirupsen/logrus 2017/10/08 XX:XX:XX ··· Skipping (existing): google.golang.org/grpc/codes 2017/10/08 XX:XX:XX ··· Fetching recursive dependency: github.com/grpc-ecosystem/go-grpc-middleware/tags 2017/10/08 XX:XX:XX ···· Skipping (existing): google.golang.org/grpc/peer 2017/10/08 XX:XX:XX ···· Fetching recursive dependency: github.com/grpc-ecosystem/go-grpc-middleware 2017/10/08 XX:XX:XX ····· Skipping (existing): github.com/opentracing/opentracing-go/log 2017/10/08 XX:XX:XX ····· Skipping (existing): golang.org/x/net/context 2017/10/08 XX:XX:XX ····· Skipping (existing): google.golang.org/grpc 2017/10/08 XX:XX:XX ····· Skipping (existing): github.com/golang/protobuf/proto 2017/10/08 XX:XX:XX ····· Skipping (existing): google.golang.org/grpc/metadata 2017/10/08 XX:XX:XX ····· Fetching recursive dependency: github.com/stretchr/testify/suite 2017/10/08 XX:XX:XX ······ Skipping (existing): github.com/stretchr/testify/assert 2017/10/08 XX:XX:XX ······ Fetching recursive dependency: github.com/stretchr/testify/require 2017/10/08 XX:XX:XX ······· Skipping (existing): github.com/stretchr/testify/assert 2017/10/08 XX:XX:XX ····· Skipping (existing): github.com/opentracing/opentracing-go 2017/10/08 XX:XX:XX ····· Skipping (existing): github.com/sirupsen/logrus 2017/10/08 XX:XX:XX ····· Fetching recursive dependency: github.com/gogo/protobuf/gogoproto 2017/10/08 XX:XX:XX ······ Fetching recursive dependency: github.com/gogo/protobuf/proto 2017/10/08 XX:XX:XX ······· Fetching recursive dependency: github.com/gogo/protobuf/types 2017/10/08 XX:XX:XX ········ Fetching recursive dependency: github.com/gogo/protobuf/sortkeys 2017/10/08 XX:XX:XX ······ Fetching recursive dependency: github.com/gogo/protobuf/protoc-gen-gogo/descriptor 2017/10/08 XX:XX:XX ····· Skipping (existing): google.golang.org/grpc/codes 2017/10/08 XX:XX:XX ····· Skipping (existing): github.com/opentracing/opentracing-go/ext 2017/10/08 XX:XX:XX ····· Skipping (existing): google.golang.org/grpc/grpclog 2017/10/08 XX:XX:XX ····· Skipping (existing): google.golang.org/grpc/peer 2017/10/08 XX:XX:XX ····· Skipping (existing): golang.org/x/net/trace 2017/10/08 XX:XX:XX ····· Skipping (existing): google.golang.org/grpc/credentials 2017/10/08 XX:XX:XX ···· Skipping (existing): golang.org/x/net/context 2017/10/08 XX:XX:XX ···· Skipping (existing): google.golang.org/grpc 2017/10/08 XX:XX:XX ··· Skipping (existing): github.com/golang/protobuf/proto 2017/10/08 XX:XX:XX ··· Skipping (existing): golang.org/x/net/context 2017/10/08 XX:XX:XX ··· Skipping (existing): google.golang.org/grpc 2017/10/08 XX:XX:XX ·· Skipping (existing): github.com/opentracing/opentracing-go/ext 2017/10/08 XX:XX:XX ·· Skipping (existing): github.com/golang/protobuf/proto 2017/10/08 XX:XX:XX ·· Skipping (existing): google.golang.org/grpc/codes 2017/10/08 XX:XX:XX ·· Skipping (existing): google.golang.org/grpc/peer 2017/10/08 XX:XX:XX · Skipping (existing): github.com/davecgh/go-spew/spew 2017/10/08 XX:XX:XX · Skipping (existing): google.golang.org/grpc/status 2017/10/08 XX:XX:XX · Skipping (existing): google.golang.org/grpc 2017/10/08 XX:XX:XX · Skipping (existing): github.com/golang/protobuf/ptypes/any 2017/10/08 XX:XX:XX · Skipping (existing): github.com/opentracing/opentracing-go 2017/10/08 XX:XX:XX · Skipping (existing): github.com/prometheus/client_golang/prometheus 2017/10/08 XX:XX:XX · Fetching recursive dependency: google.golang.org/genproto/googleapis/rpc/status 2017/10/08 XX:XX:XX ·· Skipping (existing): github.com/golang/protobuf/proto 2017/10/08 XX:XX:XX ·· Skipping (existing): github.com/golang/protobuf/ptypes/any 2017/10/08 XX:XX:XX · Skipping (existing): github.com/pmezard/go-difflib/difflib 2017/10/08 XX:XX:XX · Fetching recursive dependency: github.com/sercand/kuberesolver 2017/10/08 XX:XX:XX ·· Skipping (existing): google.golang.org/grpc/naming 2017/10/08 XX:XX:XX ·· Skipping (existing): google.golang.org/grpc/grpclog 2017/10/08 XX:XX:XX ·· Skipping (existing): google.golang.org/grpc 2017/10/08 XX:XX:XX · Skipping (existing): github.com/gorilla/mux ```
84 lines
2.1 KiB
Go
84 lines
2.1 KiB
Go
package middleware
|
|
|
|
import (
|
|
"bufio"
|
|
"fmt"
|
|
"io"
|
|
"net"
|
|
"net/http"
|
|
)
|
|
|
|
const (
|
|
maxResponseBodyInLogs = 4096 // At most 4k bytes from response bodies in our logs.
|
|
)
|
|
|
|
// badResponseLoggingWriter writes the body of "bad" responses (i.e. 5xx
|
|
// responses) to a buffer.
|
|
type badResponseLoggingWriter struct {
|
|
rw http.ResponseWriter
|
|
buffer io.Writer
|
|
logBody bool
|
|
bodyBytesLeft int
|
|
statusCode int
|
|
}
|
|
|
|
// newBadResponseLoggingWriter makes a new badResponseLoggingWriter.
|
|
func newBadResponseLoggingWriter(rw http.ResponseWriter, buffer io.Writer) *badResponseLoggingWriter {
|
|
return &badResponseLoggingWriter{
|
|
rw: rw,
|
|
buffer: buffer,
|
|
logBody: false,
|
|
bodyBytesLeft: maxResponseBodyInLogs,
|
|
}
|
|
}
|
|
|
|
// Header returns the header map that will be sent by WriteHeader.
|
|
// Implements ResponseWriter.
|
|
func (b *badResponseLoggingWriter) Header() http.Header {
|
|
return b.rw.Header()
|
|
}
|
|
|
|
// Write writes HTTP response data.
|
|
func (b *badResponseLoggingWriter) Write(data []byte) (int, error) {
|
|
if b.statusCode == 0 {
|
|
// WriteHeader has (probably) not been called, so we need to call it with StatusOK to fuflil the interface contract.
|
|
// https://godoc.org/net/http#ResponseWriter
|
|
b.WriteHeader(http.StatusOK)
|
|
}
|
|
n, err := b.rw.Write(data)
|
|
if b.logBody {
|
|
b.captureResponseBody(data)
|
|
}
|
|
return n, err
|
|
}
|
|
|
|
// WriteHeader writes the HTTP response header.
|
|
func (b *badResponseLoggingWriter) WriteHeader(statusCode int) {
|
|
b.statusCode = statusCode
|
|
if statusCode >= 500 {
|
|
b.logBody = true
|
|
}
|
|
b.rw.WriteHeader(statusCode)
|
|
}
|
|
|
|
// Hijack hijacks the first response writer that is a Hijacker.
|
|
func (b *badResponseLoggingWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) {
|
|
hj, ok := b.rw.(http.Hijacker)
|
|
if ok {
|
|
return hj.Hijack()
|
|
}
|
|
return nil, nil, fmt.Errorf("badResponseLoggingWriter: can't cast underlying response writer to Hijacker")
|
|
}
|
|
|
|
func (b *badResponseLoggingWriter) captureResponseBody(data []byte) {
|
|
if len(data) > b.bodyBytesLeft {
|
|
b.buffer.Write(data[:b.bodyBytesLeft])
|
|
io.WriteString(b.buffer, "...")
|
|
b.bodyBytesLeft = 0
|
|
b.logBody = false
|
|
} else {
|
|
b.buffer.Write(data)
|
|
b.bodyBytesLeft -= len(data)
|
|
}
|
|
}
|