Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-pages.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGrzegorz Bizon <grzesiek.bizon@gmail.com>2020-01-13 17:19:15 +0300
committerGrzegorz Bizon <grzesiek.bizon@gmail.com>2020-01-28 13:33:17 +0300
commit4317f67bea77be4cfce36a7454e15f888a2d9ea2 (patch)
tree99f6862d4d92bc2cb0c36d1842abd1b6e13e962a
parent80d45759aab7db0005392b3c9a546e5db92db39b (diff)
Add scaffold of serverless proxy director and transport
-rw-r--r--internal/serving/serverless/director.go15
-rw-r--r--internal/serving/serverless/serverless.go20
-rw-r--r--internal/serving/serverless/transport.go47
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
+}