diff options
author | Grzegorz Bizon <grzesiek.bizon@gmail.com> | 2020-01-13 17:19:15 +0300 |
---|---|---|
committer | Grzegorz Bizon <grzesiek.bizon@gmail.com> | 2020-01-28 13:33:17 +0300 |
commit | 4317f67bea77be4cfce36a7454e15f888a2d9ea2 (patch) | |
tree | 99f6862d4d92bc2cb0c36d1842abd1b6e13e962a | |
parent | 80d45759aab7db0005392b3c9a546e5db92db39b (diff) |
Add scaffold of serverless proxy director and transport
-rw-r--r-- | internal/serving/serverless/director.go | 15 | ||||
-rw-r--r-- | internal/serving/serverless/serverless.go | 20 | ||||
-rw-r--r-- | internal/serving/serverless/transport.go | 47 |
3 files changed, 79 insertions, 3 deletions
diff --git a/internal/serving/serverless/director.go b/internal/serving/serverless/director.go new file mode 100644 index 00000000..83398c0e --- /dev/null +++ b/internal/serving/serverless/director.go @@ -0,0 +1,15 @@ +package serverless + +import "net/http" + +// NewDirectorFunc returns a director function capable of configuring a proxy +// request +func NewDirectorFunc(cluster Cluster) func(*http.Request) { + return func(r *http.Request) { + // request.Host = domain + // request.URL.Host = domain + // request.URL.Scheme = "https" + // request.Header.Set("User-Agent", "ReverseProxy PoC") + // request.Header.Set("X-Forwarded ...") + } +} diff --git a/internal/serving/serverless/serverless.go b/internal/serving/serverless/serverless.go index e31ce727..96a3a996 100644 --- a/internal/serving/serverless/serverless.go +++ b/internal/serving/serverless/serverless.go @@ -1,6 +1,9 @@ package serverless import ( + "net/http" + "net/http/httputil" + "gitlab.com/gitlab-org/gitlab-pages/internal/httperrors" "gitlab.com/gitlab-org/gitlab-pages/internal/serving" ) @@ -8,6 +11,17 @@ import ( // Serverless is a servering used to proxy requests between a client and // Knative cluster. type Serverless struct { + proxy *httputil.ReverseProxy +} + +// New returns a new serving instance +func New(cluster Cluster) serving.Serving { + proxy := httputil.ReverseProxy{ + Director: NewDirectorFunc(cluster), + Transport: NewTransport(cluster), + } + + return &Serverless{proxy: &proxy} } // ServeFileHTTP handle an incoming request and proxies it to Knative cluster @@ -20,7 +34,7 @@ func (s *Serverless) ServeNotFoundHTTP(h serving.Handler) { httperrors.Serve404(h.Writer) } -// New returns a new serving instance -func New(cluster Cluster) serving.Serving { - return &Serverless{} +func (s *Serverless) director() func(request *http.Request) { + return func(request *http.Request) { + } } diff --git a/internal/serving/serverless/transport.go b/internal/serving/serverless/transport.go new file mode 100644 index 00000000..7cd3e03d --- /dev/null +++ b/internal/serving/serverless/transport.go @@ -0,0 +1,47 @@ +package serverless + +import ( + "context" + "net" + "net/http" + "time" +) + +// Transport is a struct that handle the proxy connection round trip to Knative +// cluster +type Transport struct { + cluster Cluster + transport *http.Transport +} + +// NewTransport fabricates as new transport type +func NewTransport(cluster Cluster) *Transport { + dialer := net.Dialer{ + Timeout: 60 * time.Second, + KeepAlive: 60 * time.Second, + } + + dialContext := func(ctx context.Context, network, address string) (net.Conn, error) { + // TODO + // if address == domain+":443" { + // address = cluster + ":443" + // } + + return dialer.DialContext(ctx, network, address) + } + + return &Transport{ + transport: &http.Transport{ + DialContext: dialContext, + TLSHandshakeTimeout: 5 * time.Second, + // TODO TLSClientConfig: newTLSConfig(), + }, + } +} + +// RoundTrip performs a connection to a Knative cluster and returns a response +func (t *Transport) RoundTrip(request *http.Request) (*http.Response, error) { + response, err := t.transport.RoundTrip(request) + + return response, err +} |