summary refs log tree commit diff
path: root/handlers
diff options
context:
space:
mode:
authorMelonai <einebeere@gmail.com>2021-09-10 23:40:49 +0200
committerMelonai <einebeere@gmail.com>2021-09-10 23:43:57 +0200
commita32b9fe723c633cf5349bb0479d97e1f6d04445d (patch)
treef45869da615f5efcd0b2dd8d1baade6831dd3f4f /handlers
parent175da8f22cd791e81338fe61e6099125868cf5a0 (diff)
downloadportgate-a32b9fe723c633cf5349bb0479d97e1f6d04445d.tar.zst
portgate-a32b9fe723c633cf5349bb0479d97e1f6d04445d.zip
Refactor path into destination
Diffstat (limited to 'handlers')
-rw-r--r--handlers/handler.go33
-rw-r--r--handlers/passthrough.go4
-rw-r--r--handlers/portgate.go8
3 files changed, 21 insertions, 24 deletions
diff --git a/handlers/handler.go b/handlers/handler.go
index d6e1b5b..7989766 100644
--- a/handlers/handler.go
+++ b/handlers/handler.go
@@ -42,34 +42,29 @@ func NewRequestHandler(config *portgate.Config, templates portgate.Templates) Re
 
 // HandleRequest handles all types of requests and delegates to more specific handlers.
 func (h *RequestHandler) HandleRequest(ctx *fasthttp.RequestCtx) {
-	path := portgate.ParsePath(string(ctx.Path()))
+	destination := portgate.DestinationFromURL(string(ctx.Path()))
 
-	if path.IsPortgatePath() {
-		h.handlePortgateRequest(ctx, path)
+	if destination.IsPortgatePath {
+		h.handlePortgateRequest(ctx, destination)
 		return
 	}
 
-	if path.DestinationIdentifier == -1 {
-		// We were not given a destination.
+	if destination.Port == 0 {
+		// Try to get the port from the Referer.
+		destination = destination.AddReferer(string(ctx.Request.Header.Referer()))
 
-		// Try to grab actual destination from Referer header.
-		// This can help us if the user followed an absolute link on a proxied page.
-		refererPath, err := portgate.ParsePathFromReferer(path, string(ctx.Request.Header.Referer()))
-		if err != nil || refererPath.DestinationIdentifier == -1 {
-			// The referer path also has no destination
+		// Still no port?
+		if destination.Port == 0 {
 			h.handleUnknownRequest(ctx)
-		} else {
-			// We found the destination from the referer path, so we
-			// redirect the user to the Portgate URL they should've requested.
-
-			portgateUrl := fmt.Sprintf("/%d%s", refererPath.DestinationIdentifier, refererPath.ResourcePath)
-			ctx.Redirect(portgateUrl, http.StatusTemporaryRedirect)
+			return
 		}
-	} else {
-		// We were given a port, so we have to pass the request through to the destination host.
 
-		h.handlePassthroughRequest(ctx, path)
+		portgateUrl := fmt.Sprintf("/%d%s", destination.Port, destination.Path)
+		ctx.Redirect(portgateUrl, http.StatusTemporaryRedirect)
+		return
 	}
+
+	h.handlePassthroughRequest(ctx, destination)
 }
 
 // handleUnknownRequest handles any request which could not be processed due to missing
diff --git a/handlers/passthrough.go b/handlers/passthrough.go
index 3f8aafc..30cc7df 100644
--- a/handlers/passthrough.go
+++ b/handlers/passthrough.go
@@ -9,7 +9,7 @@ import (
 // handlePassthroughRequest handles requests which are supposed to be proxied to the destination host.
 // If the user is authorized they are allowed to pass, otherwise they should be redirected to
 // the authentication page. (/_portgate)
-func (h *RequestHandler) handlePassthroughRequest(ctx *fasthttp.RequestCtx, p portgate.Path) {
+func (h *RequestHandler) handlePassthroughRequest(ctx *fasthttp.RequestCtx, p portgate.Destination) {
 	// TODO: Check whether port is allowed to be accessed.
 
 	// Check whether given cookie is ok, if not redirect to the authentication page.
@@ -21,7 +21,7 @@ func (h *RequestHandler) handlePassthroughRequest(ctx *fasthttp.RequestCtx, p po
 	// We reuse the request given to us by the user with minor changes to route it to the
 	// destination host.
 	ctx.Request.SetRequestURI(h.config.MakeUrl(p))
-	ctx.Request.Header.SetHost(h.config.TargetAddress(p.DestinationIdentifier))
+	ctx.Request.Header.SetHost(h.config.TargetAddress(p.Port))
 
 	// We pipe the response given to us by the destination host back to the user.
 	// Since it's possible that we get a redirect, we take this into account,
diff --git a/handlers/portgate.go b/handlers/portgate.go
index 6e002e7..2cf8e13 100644
--- a/handlers/portgate.go
+++ b/handlers/portgate.go
@@ -1,16 +1,18 @@
 package handlers
 
 import (
-	"github.com/valyala/fasthttp"
 	"net/http"
 	"portgate"
+	"strings"
 	"time"
+
+	"github.com/valyala/fasthttp"
 )
 
 // handlePortgateRequest handles all Portgate specific request for either showing Portgate
 // specific pages or handling creation of authorization tokens.
-func (h *RequestHandler) handlePortgateRequest(ctx *fasthttp.RequestCtx, path portgate.Path) {
-	if path.IsPortgateStaticPath() {
+func (h *RequestHandler) handlePortgateRequest(ctx *fasthttp.RequestCtx, destination portgate.Destination) {
+	if strings.HasPrefix(destination.Path, "/_portgate/static") {
 		h.staticHandler(ctx)
 	} else {
 		// TODO: Implement authentication, authorization