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