Skip to content

Commit 26a7b59

Browse files
committed
TUN-6248: Fix panic in cloudflared during tracing when origin doesn't provide header map
1 parent 4b6437c commit 26a7b59

File tree

3 files changed

+30
-0
lines changed

3 files changed

+30
-0
lines changed

proxy/proxy.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,11 @@ func (p *Proxy) proxyHTTPRequest(
203203
tracing.EndWithStatus(ttfbSpan, codes.Ok, resp.Status)
204204
defer resp.Body.Close()
205205

206+
// resp headers can be nil
207+
if resp.Header == nil {
208+
resp.Header = make(http.Header)
209+
}
210+
206211
// Add spans to response header (if available)
207212
tr.AddSpans(resp.Header, p.log)
208213

tracing/tracing.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,11 @@ func (cft *TracedRequest) Tracer() trace.Tracer {
103103

104104
// Spans returns the spans as base64 encoded protobuf otlp traces.
105105
func (cft *TracedRequest) AddSpans(headers http.Header, log *zerolog.Logger) {
106+
if headers == nil {
107+
log.Error().Msgf("provided headers map is nil")
108+
return
109+
}
110+
106111
enc, err := cft.exporter.Spans()
107112
switch err {
108113
case nil:
@@ -121,6 +126,7 @@ func (cft *TracedRequest) AddSpans(headers http.Header, log *zerolog.Logger) {
121126
log.Error().Msgf("no traces provided and no error from exporter")
122127
return
123128
}
129+
124130
headers[CanonicalCloudflaredTracingHeader] = []string{enc}
125131
}
126132

tracing/tracing_test.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
package tracing
22

33
import (
4+
"context"
45
"net/http"
56
"net/http/httptest"
67
"testing"
78

9+
"github.com/rs/zerolog"
810
"github.com/stretchr/testify/assert"
911
tracesdk "go.opentelemetry.io/otel/sdk/trace"
1012
"go.opentelemetry.io/otel/trace"
13+
tracepb "go.opentelemetry.io/proto/otlp/trace/v1"
1114
)
1215

1316
func TestNewCfTracer(t *testing.T) {
@@ -48,3 +51,19 @@ func TestNewCfTracerInvalidHeaders(t *testing.T) {
4851
assert.IsType(t, &NoopOtlpClient{}, tr.exporter)
4952
}
5053
}
54+
55+
func TestAddingSpansWithNilMap(t *testing.T) {
56+
req := httptest.NewRequest("GET", "http://localhost", nil)
57+
req.Header.Add(TracerContextName, "14cb070dde8e51fc5ae8514e69ba42ca:b38f1bf5eae406f3:0:1")
58+
tr := NewTracedRequest(req)
59+
60+
exporter := tr.exporter.(*InMemoryOtlpClient)
61+
62+
// add fake spans
63+
spans := createResourceSpans([]*tracepb.Span{createOtlpSpan(traceId)})
64+
err := exporter.UploadTraces(context.Background(), spans)
65+
assert.NoError(t, err)
66+
67+
// a panic shouldn't occur
68+
tr.AddSpans(nil, &zerolog.Logger{})
69+
}

0 commit comments

Comments
 (0)