mirror of
https://github.com/tobychui/zoraxy.git
synced 2025-08-06 21:28:30 +02:00
v2 init commit
This commit is contained in:
88
src/router.go
Normal file
88
src/router.go
Normal file
@@ -0,0 +1,88 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"imuslab.com/zoraxy/mod/sshprox"
|
||||
)
|
||||
|
||||
/*
|
||||
router.go
|
||||
|
||||
This script holds the static resources router
|
||||
for the reverse proxy service
|
||||
*/
|
||||
|
||||
func FSHandler(handler http.Handler) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
/*
|
||||
Development Mode Override
|
||||
=> Web root is located in /
|
||||
*/
|
||||
if development && strings.HasPrefix(r.URL.Path, "/web/") {
|
||||
u, _ := url.Parse(strings.TrimPrefix(r.URL.Path, "/web"))
|
||||
r.URL = u
|
||||
}
|
||||
|
||||
/*
|
||||
Production Mode Override
|
||||
=> Web root is located in /web
|
||||
*/
|
||||
if !development && r.URL.Path == "/" {
|
||||
//Redirect to web UI
|
||||
http.Redirect(w, r, "/web/", http.StatusTemporaryRedirect)
|
||||
return
|
||||
}
|
||||
|
||||
// Allow access to /script/*, /img/pubic/* and /login.html without authentication
|
||||
if strings.HasPrefix(r.URL.Path, ppf("/script/")) || strings.HasPrefix(r.URL.Path, ppf("/img/public/")) || r.URL.Path == ppf("/login.html") || r.URL.Path == ppf("/reset.html") || r.URL.Path == ppf("/favicon.png") {
|
||||
handler.ServeHTTP(w, r)
|
||||
return
|
||||
}
|
||||
|
||||
// check authentication
|
||||
if !authAgent.CheckAuth(r) && requireAuth {
|
||||
http.Redirect(w, r, ppf("/login.html"), http.StatusTemporaryRedirect)
|
||||
return
|
||||
}
|
||||
|
||||
//For WebSSH Routing
|
||||
//Example URL Path: /web.ssh/{{instance_uuid}}/*
|
||||
if strings.HasPrefix(r.URL.Path, "/web.ssh/") {
|
||||
requestPath := r.URL.Path
|
||||
parts := strings.Split(requestPath, "/")
|
||||
if !strings.HasSuffix(requestPath, "/") && len(parts) == 3 {
|
||||
http.Redirect(w, r, requestPath+"/", http.StatusTemporaryRedirect)
|
||||
return
|
||||
}
|
||||
if len(parts) > 2 {
|
||||
//Extract the instance ID from the request path
|
||||
instanceUUID := parts[2]
|
||||
fmt.Println(instanceUUID)
|
||||
|
||||
//Rewrite the url so the proxy knows how to serve stuffs
|
||||
r.URL, _ = sshprox.RewriteURL("/web.ssh/"+instanceUUID, r.RequestURI)
|
||||
webSshManager.HandleHttpByInstanceId(instanceUUID, w, r)
|
||||
} else {
|
||||
fmt.Println(parts)
|
||||
http.Error(w, "Invalid Usage", http.StatusInternalServerError)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
//Authenticated
|
||||
handler.ServeHTTP(w, r)
|
||||
})
|
||||
}
|
||||
|
||||
// Production path fix wrapper. Fix the path on production or development environment
|
||||
func ppf(relativeFilepath string) string {
|
||||
if !development {
|
||||
return strings.ReplaceAll(filepath.Join("/web/", relativeFilepath), "\\", "/")
|
||||
}
|
||||
return relativeFilepath
|
||||
}
|
Reference in New Issue
Block a user