Skip to content

Commit 9b71cfe

Browse files
committed
Merge pull request #178 from gengo/fix/empty-remote-addr
Avoid errors when req.RemoteAddr is empty
2 parents a5edb0b + 70580da commit 9b71cfe

File tree

2 files changed

+14
-13
lines changed

2 files changed

+14
-13
lines changed

runtime/context.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,14 +62,17 @@ func AnnotateContext(ctx context.Context, req *http.Request) (context.Context, e
6262
} else if req.Host != "" {
6363
pairs = append(pairs, strings.ToLower(xForwardedHost), req.Host)
6464
}
65-
if remoteIP, _, err := net.SplitHostPort(req.RemoteAddr); err == nil {
66-
if fwd := req.Header.Get(xForwardedFor); fwd == "" {
67-
pairs = append(pairs, strings.ToLower(xForwardedFor), remoteIP)
65+
66+
if addr := req.RemoteAddr; addr != "" {
67+
if remoteIP, _, err := net.SplitHostPort(addr); err == nil {
68+
if fwd := req.Header.Get(xForwardedFor); fwd == "" {
69+
pairs = append(pairs, strings.ToLower(xForwardedFor), remoteIP)
70+
} else {
71+
pairs = append(pairs, strings.ToLower(xForwardedFor), fmt.Sprintf("%s, %s", fwd, remoteIP))
72+
}
6873
} else {
69-
pairs = append(pairs, strings.ToLower(xForwardedFor), fmt.Sprintf("%s, %s", fwd, remoteIP))
74+
grpclog.Printf("invalid remote addr: %s", addr)
7075
}
71-
} else {
72-
grpclog.Printf("invalid remote addr: %s", req.RemoteAddr)
7376
}
7477

7578
if timeout != 0 {

runtime/context_test.go

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import (
1212
)
1313

1414
const (
15-
emptyForwardMetaCount = 2
15+
emptyForwardMetaCount = 1
1616
)
1717

1818
func TestAnnotateContext_WorksWithEmpty(t *testing.T) {
@@ -22,7 +22,6 @@ func TestAnnotateContext_WorksWithEmpty(t *testing.T) {
2222
if err != nil {
2323
t.Fatalf("http.NewRequest(%q, %q, nil) failed with %v; want success", "GET", "http://www.example.com", err)
2424
}
25-
request.RemoteAddr = "192.0.2.1:12345"
2625
request.Header.Add("Some-Irrelevant-Header", "some value")
2726
annotated, err := runtime.AnnotateContext(ctx, request)
2827
if err != nil {
@@ -31,7 +30,7 @@ func TestAnnotateContext_WorksWithEmpty(t *testing.T) {
3130
}
3231
md, ok := metadata.FromContext(annotated)
3332
if !ok || len(md) != emptyForwardMetaCount {
34-
t.Errorf("Expected 2 metadata items in context; got %v", md)
33+
t.Errorf("Expected %d metadata items in context; got %v", emptyForwardMetaCount, md)
3534
}
3635
}
3736

@@ -41,7 +40,6 @@ func TestAnnotateContext_ForwardsGrpcMetadata(t *testing.T) {
4140
if err != nil {
4241
t.Fatalf("http.NewRequest(%q, %q, nil) failed with %v; want success", "GET", "http://www.example.com", err)
4342
}
44-
request.RemoteAddr = "192.168.0.1:12345"
4543
request.Header.Add("Some-Irrelevant-Header", "some value")
4644
request.Header.Add("Grpc-Metadata-FooBar", "Value1")
4745
request.Header.Add("Grpc-Metadata-Foo-BAZ", "Value2")
@@ -54,7 +52,7 @@ func TestAnnotateContext_ForwardsGrpcMetadata(t *testing.T) {
5452
}
5553
md, ok := metadata.FromContext(annotated)
5654
if !ok || len(md) != emptyForwardMetaCount+3 {
57-
t.Errorf("Expected 5 metadata items in context; got %v", md)
55+
t.Errorf("Expected %d metadata items in context; got %v", md)
5856
}
5957
if got, want := md["foobar"], []string{"Value1"}; !reflect.DeepEqual(got, want) {
6058
t.Errorf(`md["foobar"] = %q; want %q`, got, want)
@@ -82,8 +80,8 @@ func TestAnnotateContext_XForwardedFor(t *testing.T) {
8280
return
8381
}
8482
md, ok := metadata.FromContext(annotated)
85-
if !ok || len(md) != emptyForwardMetaCount {
86-
t.Errorf("Expected 2 metadata items in context; got %v", md)
83+
if !ok || len(md) != emptyForwardMetaCount+1 {
84+
t.Errorf("Expected %d metadata items in context; got %v", emptyForwardMetaCount+1, md)
8785
}
8886
if got, want := md["x-forwarded-host"], []string{"bar.foo.example.com"}; !reflect.DeepEqual(got, want) {
8987
t.Errorf(`md["host"] = %v; want %v`, got, want)

0 commit comments

Comments
 (0)