func NewServerHTTPRequest()

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
}