in core/request.go [132:208]
func (r *RequestAccessor) EventToRequest(req events.APIGatewayProxyRequest) (*http.Request, error) {
decodedBody := []byte(req.Body)
if req.IsBase64Encoded {
base64Body, err := base64.StdEncoding.DecodeString(req.Body)
if err != nil {
return nil, err
}
decodedBody = base64Body
}
path := req.Path
if r.stripBasePath != "" && len(r.stripBasePath) > 1 {
if strings.HasPrefix(path, r.stripBasePath) {
path = strings.Replace(path, r.stripBasePath, "", 1)
}
}
if !strings.HasPrefix(path, "/") {
path = "/" + path
}
serverAddress := "https://" + req.RequestContext.DomainName
if customAddress, ok := os.LookupEnv(CustomHostVariable); ok {
serverAddress = customAddress
}
path = serverAddress + path
if len(req.MultiValueQueryStringParameters) > 0 {
queryString := ""
for q, l := range req.MultiValueQueryStringParameters {
for _, v := range l {
if queryString != "" {
queryString += "&"
}
queryString += url.QueryEscape(q) + "=" + url.QueryEscape(v)
}
}
path += "?" + queryString
} else if len(req.QueryStringParameters) > 0 {
// Support `QueryStringParameters` for backward compatibility.
// https://github.com/awslabs/aws-lambda-go-api-proxy/issues/37
queryString := ""
for q := range req.QueryStringParameters {
if queryString != "" {
queryString += "&"
}
queryString += url.QueryEscape(q) + "=" + url.QueryEscape(req.QueryStringParameters[q])
}
path += "?" + queryString
}
httpRequest, err := http.NewRequest(
strings.ToUpper(req.HTTPMethod),
path,
bytes.NewReader(decodedBody),
)
if err != nil {
fmt.Printf("Could not convert request %s:%s to http.Request\n", req.HTTPMethod, req.Path)
log.Println(err)
return nil, err
}
if req.MultiValueHeaders != nil {
for k, values := range req.MultiValueHeaders {
for _, value := range values {
httpRequest.Header.Add(k, value)
}
}
} else {
for h := range req.Headers {
httpRequest.Header.Add(h, req.Headers[h])
}
}
httpRequest.RequestURI = httpRequest.URL.RequestURI()
return httpRequest, nil
}