func Wrap()

in lambdaurl/http_handler.go [105:156]


func Wrap(handler http.Handler) func(context.Context, *events.LambdaFunctionURLRequest) (*events.LambdaFunctionURLStreamingResponse, error) {
	return func(ctx context.Context, request *events.LambdaFunctionURLRequest) (*events.LambdaFunctionURLStreamingResponse, error) {

		var body io.Reader = strings.NewReader(request.Body)
		if request.IsBase64Encoded {
			body = base64.NewDecoder(base64.StdEncoding, body)
		}
		url := "https://" + request.RequestContext.DomainName + request.RawPath
		if request.RawQueryString != "" {
			url += "?" + request.RawQueryString
		}
		ctx = context.WithValue(ctx, requestContextKey{}, request)
		httpRequest, err := http.NewRequestWithContext(ctx, request.RequestContext.HTTP.Method, url, body)
		if err != nil {
			return nil, err
		}
		httpRequest.RemoteAddr = request.RequestContext.HTTP.SourceIP
		for k, v := range request.Headers {
			httpRequest.Header.Add(k, v)
		}

		ready := make(chan header) // Signals when it's OK to start returning the response body to Lambda
		r, w := io.Pipe()
		responseWriter := &httpResponseWriter{writer: w, ready: ready}
		if detectContentType, ok := ctx.Value(detectContentTypeContextKey{}).(bool); ok {
			responseWriter.detectContentType = detectContentType
		}
		go func() {
			defer close(ready)
			defer w.Close() // TODO: recover and CloseWithError the any panic value once the runtime API client supports plumbing fatal errors through the reader
			//nolint:errcheck
			defer responseWriter.Write(nil) // force default status, headers, content type detection, if none occured during the execution of the handler
			handler.ServeHTTP(responseWriter, httpRequest)
		}()
		header := <-ready
		response := &events.LambdaFunctionURLStreamingResponse{
			Body:       r,
			StatusCode: header.code,
		}
		if len(header.header) > 0 {
			response.Headers = make(map[string]string, len(header.header))
			for k, v := range header.header {
				if k == "Set-Cookie" {
					response.Cookies = v
				} else {
					response.Headers[k] = strings.Join(v, ",")
				}
			}
		}
		return response, nil
	}
}