getRequestMetadataFromHeaders extracts request metadata from HTTP headers for ConnectRPC.
(headers http.Header, peerAddr string)
| 817 | |
| 818 | // getRequestMetadataFromHeaders extracts request metadata from HTTP headers for ConnectRPC. |
| 819 | func getRequestMetadataFromHeaders(headers http.Header, peerAddr string) *storepb.RequestMetadata { |
| 820 | userAgent := headers.Get("User-Agent") |
| 821 | // Extract caller IP with fallback chain: |
| 822 | // 1. X-Real-IP (set by reverse proxy, most trustworthy single IP) |
| 823 | // 2. X-Forwarded-For (standard but can contain client-spoofed data) |
| 824 | // 3. Peer address from ConnectRPC (direct connection fallback) |
| 825 | callerIP := headers.Get("X-Real-IP") |
| 826 | if callerIP == "" { |
| 827 | callerIP = headers.Get("X-Forwarded-For") |
| 828 | } |
| 829 | if callerIP == "" { |
| 830 | callerIP = peerAddr |
| 831 | } |
| 832 | |
| 833 | return &storepb.RequestMetadata{ |
| 834 | CallerIp: callerIP, |
| 835 | CallerSuppliedUserAgent: userAgent, |
| 836 | } |
| 837 | } |
| 838 | |
| 839 | // isValidateOnlyRequest checks if a request has validate_only field set to true |
| 840 | // using protoreflect to generically detect the field. |