25
"github.com/cubefs/cubefs/blobstore/common/rpc"
26
"github.com/cubefs/cubefs/blobstore/common/trace"
29
type responseWriter struct {
49
func (w *responseWriter) Write(b []byte) (int, error) {
50
if !w.hasWroteHeader {
51
w.WriteHeader(http.StatusOK)
52
w.hasWroteHeader = true
54
if !(w.statusCode/100 == 2 && w.no2xxBody) && w.n < w.bodyLimit {
55
n := copy(w.body[w.n:], b)
58
n, err := w.ResponseWriter.Write(b)
59
w.bodyWritten += int64(n)
65
func (w *responseWriter) ReadFrom(src io.Reader) (n int64, err error) {
66
if !w.hasWroteHeader {
67
w.WriteHeader(http.StatusOK)
68
w.hasWroteHeader = true
70
if rf, ok := w.ResponseWriter.(io.ReaderFrom); ok {
71
n, err = rf.ReadFrom(src)
72
w.bodyWritten += int64(n)
75
n, err = io.Copy(w.ResponseWriter, src)
76
w.bodyWritten += int64(n)
80
func (w *responseWriter) WriteHeader(code int) {
86
w.span.AppendTrackLog(w.module, w.startTime, nil)
87
traceLog := w.span.TrackLog()
88
for i := range traceLog {
89
w.Header().Add(rpc.HeaderTraceLog, traceLog[i])
91
tags := w.span.Tags().ToSlice()
93
w.Header().Add(rpc.HeaderTraceTags, tags[i])
95
w.Header().Set(trace.GetTraceIDKey(), w.span.TraceID())
96
w.hasRecordCost = true
99
w.ResponseWriter.WriteHeader(code)
100
w.hasWroteHeader = true
103
func (w *responseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) {
104
return w.ResponseWriter.(http.Hijacker).Hijack()
107
func (w *responseWriter) Flush() {
108
w.ResponseWriter.(http.Flusher).Flush()
111
func (w *responseWriter) ExtraHeader() http.Header {
113
w.extra = make(http.Header)
119
func (w *responseWriter) getBody() []byte {
120
header := w.ResponseWriter.Header()
121
length, _ := strconv.ParseInt(header.Get(rpc.HeaderContentLength), 10, 64)
122
if (w.statusCode/100 == 2 && w.no2xxBody) || length > int64(w.n) {
128
func (w *responseWriter) getStatusCode() int {
132
func (w *responseWriter) getHeader() M {
133
header := w.ResponseWriter.Header()
135
for k := range header {
136
if k == rpc.HeaderTraceLog || k == rpc.HeaderTraceTags {
137
headerM[k] = header[k]
138
} else if len(header[k]) == 1 {
139
headerM[k] = header[k][0]
141
headerM[k] = header[k]
145
for k := range w.extra {
146
if len(w.extra[k]) == 1 {
147
headerM[k] = w.extra[k][0]
149
headerM[k] = w.extra[k]
156
func (w *responseWriter) getBodyWritten() int64 {