...
1
2
3
4 package otelhttp
5
6 import (
7 "context"
8 "io"
9 "net/http"
10 "sync/atomic"
11
12 "go.opentelemetry.io/otel/propagation"
13 )
14
15 var _ io.ReadCloser = &bodyWrapper{}
16
17
18
19 type bodyWrapper struct {
20 io.ReadCloser
21 record func(n int64)
22
23 read atomic.Int64
24 err error
25 }
26
27 func (w *bodyWrapper) Read(b []byte) (int, error) {
28 n, err := w.ReadCloser.Read(b)
29 n1 := int64(n)
30 w.read.Add(n1)
31 w.err = err
32 w.record(n1)
33 return n, err
34 }
35
36 func (w *bodyWrapper) Close() error {
37 return w.ReadCloser.Close()
38 }
39
40 var _ http.ResponseWriter = &respWriterWrapper{}
41
42
43
44
45
46
47 type respWriterWrapper struct {
48 http.ResponseWriter
49 record func(n int64)
50
51
52 ctx context.Context
53
54 props propagation.TextMapPropagator
55
56 written int64
57 statusCode int
58 err error
59 wroteHeader bool
60 }
61
62 func (w *respWriterWrapper) Header() http.Header {
63 return w.ResponseWriter.Header()
64 }
65
66 func (w *respWriterWrapper) Write(p []byte) (int, error) {
67 if !w.wroteHeader {
68 w.WriteHeader(http.StatusOK)
69 }
70 n, err := w.ResponseWriter.Write(p)
71 n1 := int64(n)
72 w.record(n1)
73 w.written += n1
74 w.err = err
75 return n, err
76 }
77
78
79
80
81
82
83 func (w *respWriterWrapper) WriteHeader(statusCode int) {
84 if !w.wroteHeader {
85 w.wroteHeader = true
86 w.statusCode = statusCode
87 }
88 w.ResponseWriter.WriteHeader(statusCode)
89 }
90
View as plain text