in runtime/server_http_request.go [69:150]
func NewServerHTTPRequest(
w http.ResponseWriter,
r *http.Request,
params url.Values,
endpoint *RouterEndpoint,
) *ServerHTTPRequest {
ctx := r.Context()
// put request log fields on context
logFields := []zap.Field{
zap.String(logFieldEndpointID, endpoint.EndpointName),
zap.String(logFieldEndpointHandler, endpoint.HandlerName),
zap.String(logFieldRequestHTTPMethod, r.Method),
zap.String(logFieldRequestRemoteAddr, r.RemoteAddr),
zap.String(logFieldRequestPathname, r.URL.RequestURI()),
zap.String(logFieldRequestHost, r.Host),
}
// put request scope tags on context
scopeTags := map[string]string{
scopeTagEndpoint: endpoint.EndpointName,
scopeTagHandler: endpoint.HandlerName,
scopeTagProtocol: scopeTagHTTP,
}
if endpoint.contextExtractor != nil {
headers := map[string]string{}
for k, v := range r.Header {
// TODO: this 0th element logic is probably not correct
headers[k] = v[0]
}
ctx = WithEndpointRequestHeadersField(ctx, headers)
for k, v := range endpoint.contextExtractor.ExtractScopeTags(ctx) {
scopeTags[k] = v
}
logFields = append(logFields, endpoint.contextExtractor.ExtractLogFields(ctx)...)
}
// Overriding the api-environment and default to production
apiEnvironment := GetAPIEnvironment(endpoint, r)
scopeTags[scopeTagsAPIEnvironment] = apiEnvironment
logFields = append(logFields, zap.String(apienvironmentKey, apiEnvironment))
// Overriding the environment for shadow requests
if endpoint.config != nil {
if endpoint.config.ContainsKey("service.shadow.env.override.enable") &&
endpoint.config.MustGetBoolean("service.shadow.env.override.enable") &&
endpoint.config.ContainsKey("shadowRequestHeader") &&
r.Header.Get(endpoint.config.MustGetString("shadowRequestHeader")) != "" {
scopeTags[environmentKey] = shadowEnvironment
logFields = append(logFields, zap.String(environmentKey, shadowEnvironment))
}
}
ctx = WithScopeTagsDefault(ctx, scopeTags, endpoint.scope)
ctx = WithLogFields(ctx, logFields...)
httpRequest := r.WithContext(ctx)
scope := getScope(ctx, endpoint.scope) // use the calculated scope instead of making a new one
logger := endpoint.contextLogger
req := &ServerHTTPRequest{
httpRequest: httpRequest,
queryValues: nil,
tracer: endpoint.tracer,
EndpointName: endpoint.EndpointName,
HandlerName: endpoint.HandlerName,
URL: httpRequest.URL,
Method: httpRequest.Method,
Params: params,
Header: NewServerHTTPHeader(r.Header),
contextLogger: logger,
scope: scope,
jsonWrapper: endpoint.JSONWrapper,
}
req.res = NewServerHTTPResponse(w, req)
req.start()
return req
}