github.com/apex/up@v1.7.1/internal/proxy/request.go (about)

     1  package proxy
     2  
     3  import (
     4  	"encoding/base64"
     5  	"encoding/json"
     6  	"net/http"
     7  	"net/url"
     8  	"strconv"
     9  	"strings"
    10  
    11  	"github.com/pkg/errors"
    12  )
    13  
    14  // NewRequest returns a new http.Request from the given Lambda event.
    15  func NewRequest(e *Input) (*http.Request, error) {
    16  	// path
    17  	u, err := url.Parse(e.Path)
    18  	if err != nil {
    19  		return nil, errors.Wrap(err, "parsing path")
    20  	}
    21  
    22  	// querystring
    23  	q := u.Query()
    24  	for k, v := range e.QueryStringParameters {
    25  		q.Set(k, v)
    26  	}
    27  	u.RawQuery = q.Encode()
    28  
    29  	// base64 encoded body
    30  	body := e.Body
    31  	if e.IsBase64Encoded {
    32  		b, err := base64.StdEncoding.DecodeString(body)
    33  		if err != nil {
    34  			return nil, errors.Wrap(err, "decoding base64 body")
    35  		}
    36  		body = string(b)
    37  	}
    38  
    39  	// new request
    40  	req, err := http.NewRequest(e.HTTPMethod, u.String(), strings.NewReader(body))
    41  	if err != nil {
    42  		return nil, errors.Wrap(err, "creating request")
    43  	}
    44  
    45  	// remote addr
    46  	req.RemoteAddr = e.RequestContext.Identity.SourceIP
    47  
    48  	// header fields
    49  	for k, v := range e.Headers {
    50  		req.Header.Set(k, v)
    51  	}
    52  
    53  	// content-length
    54  	if req.Header.Get("Content-Length") == "" && body != "" {
    55  		req.Header.Set("Content-Length", strconv.Itoa(len(body)))
    56  	}
    57  
    58  	// custom fields
    59  	b, _ := json.Marshal(e.RequestContext)
    60  	req.Header.Set("X-Context", string(b))
    61  	req.Header.Set("X-Request-Id", e.RequestContext.RequestID)
    62  	req.Header.Set("X-Stage", e.RequestContext.Stage)
    63  
    64  	// host
    65  	req.URL.Host = req.Header.Get("Host")
    66  	req.Host = req.URL.Host
    67  
    68  	return req, nil
    69  }