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 }