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  }