added non-stanrd x-forward-path-prefix header
This commit is contained in:
parent
3fc48eb590
commit
b147795ae0
@ -32,6 +32,7 @@ var xterm_html []byte
|
|||||||
|
|
||||||
type server_proxy_http_init struct {
|
type server_proxy_http_init struct {
|
||||||
s *Server
|
s *Server
|
||||||
|
prefix string
|
||||||
}
|
}
|
||||||
|
|
||||||
type server_proxy_http_main struct {
|
type server_proxy_http_main struct {
|
||||||
@ -77,7 +78,7 @@ func delete_hop_by_hop_headers(header http.Header) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func mutate_proxy_req_headers(req *http.Request, newreq *http.Request, add_path bool) {
|
func mutate_proxy_req_headers(req *http.Request, newreq *http.Request, path_prefix string) {
|
||||||
var hdr http.Header
|
var hdr http.Header
|
||||||
var newhdr http.Header
|
var newhdr http.Header
|
||||||
var remote_addr string
|
var remote_addr string
|
||||||
@ -125,11 +126,22 @@ func mutate_proxy_req_headers(req *http.Request, newreq *http.Request, add_path
|
|||||||
newhdr.Set("X-Forwarded-Host", req.Host)
|
newhdr.Set("X-Forwarded-Host", req.Host)
|
||||||
}
|
}
|
||||||
|
|
||||||
if add_path {
|
if path_prefix != "" {
|
||||||
|
var v []string
|
||||||
|
|
||||||
_, ok = newhdr["X-Forwarded-Path"]
|
_, ok = newhdr["X-Forwarded-Path"]
|
||||||
if !ok {
|
if !ok {
|
||||||
newhdr.Set("X-Forwarded-Path", req.URL.Path)
|
newhdr.Set("X-Forwarded-Path", req.URL.Path)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
v, ok = newhdr["X-Forwarded-Path-Prefix"]
|
||||||
|
if !ok {
|
||||||
|
newhdr.Set("X-Forwarded-Path-Prefix", path_prefix)
|
||||||
|
} else {
|
||||||
|
// TODO: how to multiple existing items...
|
||||||
|
// there isn't supposed to be multiple items...
|
||||||
|
newhdr.Set("X-Forwarded-Path-Prefix", v[0] + path_prefix)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -142,6 +154,7 @@ func (pxy *server_proxy_http_init) ServeHTTP(w http.ResponseWriter, req *http.Re
|
|||||||
var conn_id string
|
var conn_id string
|
||||||
var route_id string
|
var route_id string
|
||||||
var hdr http.Header
|
var hdr http.Header
|
||||||
|
var path_prefix string
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
@ -153,6 +166,7 @@ func (pxy *server_proxy_http_init) ServeHTTP(w http.ResponseWriter, req *http.Re
|
|||||||
|
|
||||||
conn_id = req.PathValue("conn_id")
|
conn_id = req.PathValue("conn_id")
|
||||||
route_id = req.PathValue("route_id")
|
route_id = req.PathValue("route_id")
|
||||||
|
path_prefix = fmt.Sprintf("%s/%s/%s", pxy.prefix, conn_id, route_id)
|
||||||
|
|
||||||
r, err = s.FindServerRouteByIdStr(conn_id, route_id)
|
r, err = s.FindServerRouteByIdStr(conn_id, route_id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -162,7 +176,7 @@ func (pxy *server_proxy_http_init) ServeHTTP(w http.ResponseWriter, req *http.Re
|
|||||||
|
|
||||||
hdr = w.Header()
|
hdr = w.Header()
|
||||||
hdr.Add("Set-Cookie", fmt.Sprintf("%s=%s-%s; Path=/; HttpOnly", SERVER_PROXY_ID_COOKIE, r.cts.id, r.id)) // use numeric id
|
hdr.Add("Set-Cookie", fmt.Sprintf("%s=%s-%s; Path=/; HttpOnly", SERVER_PROXY_ID_COOKIE, r.cts.id, r.id)) // use numeric id
|
||||||
hdr.Set("Location", strings.TrimPrefix(req.URL.Path, fmt.Sprintf("/_init/%s/%s", conn_id, route_id))) // use the original ids as in the request
|
hdr.Set("Location", strings.TrimPrefix(req.URL.Path, path_prefix)) // use the original ids as in the request
|
||||||
status_code = http.StatusFound; w.WriteHeader(status_code)
|
status_code = http.StatusFound; w.WriteHeader(status_code)
|
||||||
|
|
||||||
//done:
|
//done:
|
||||||
@ -187,7 +201,7 @@ func (pxy *server_proxy_http_main) ServeHTTP(w http.ResponseWriter, req *http.Re
|
|||||||
var id *http.Cookie
|
var id *http.Cookie
|
||||||
var conn_id string
|
var conn_id string
|
||||||
var route_id string
|
var route_id string
|
||||||
var prefixed bool
|
var path_prefix string
|
||||||
var client *http.Client
|
var client *http.Client
|
||||||
var resp *http.Response
|
var resp *http.Response
|
||||||
var tcp_conn *net.TCPConn
|
var tcp_conn *net.TCPConn
|
||||||
@ -213,7 +227,6 @@ func (pxy *server_proxy_http_main) ServeHTTP(w http.ResponseWriter, req *http.Re
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
prefixed = true
|
|
||||||
conn_id = req.PathValue("conn_id")
|
conn_id = req.PathValue("conn_id")
|
||||||
route_id = req.PathValue("route_id")
|
route_id = req.PathValue("route_id")
|
||||||
if conn_id == "" && route_id == "" {
|
if conn_id == "" && route_id == "" {
|
||||||
@ -233,9 +246,11 @@ func (pxy *server_proxy_http_main) ServeHTTP(w http.ResponseWriter, req *http.Re
|
|||||||
goto oops
|
goto oops
|
||||||
}
|
}
|
||||||
|
|
||||||
prefixed = false
|
|
||||||
conn_id = ids[0]
|
conn_id = ids[0]
|
||||||
route_id = ids[1]
|
route_id = ids[1]
|
||||||
|
path_prefix = ""
|
||||||
|
} else {
|
||||||
|
path_prefix = fmt.Sprintf("%s/%s/%s", pxy.prefix, conn_id, route_id)
|
||||||
}
|
}
|
||||||
|
|
||||||
r, err = s.FindServerRouteByIdStr(conn_id, route_id)
|
r, err = s.FindServerRouteByIdStr(conn_id, route_id)
|
||||||
@ -278,9 +293,7 @@ func (pxy *server_proxy_http_main) ServeHTTP(w http.ResponseWriter, req *http.Re
|
|||||||
}
|
}
|
||||||
|
|
||||||
proxy_url_path = req.URL.Path
|
proxy_url_path = req.URL.Path
|
||||||
if prefixed {
|
if path_prefix != "" { proxy_url_path = strings.TrimPrefix(proxy_url_path, path_prefix) }
|
||||||
proxy_url_path = strings.TrimPrefix(proxy_url_path, fmt.Sprintf("%s/%s/%s", pxy.prefix, conn_id, route_id))
|
|
||||||
}
|
|
||||||
|
|
||||||
proxy_url = &url.URL{
|
proxy_url = &url.URL{
|
||||||
Scheme: proxy_proto,
|
Scheme: proxy_proto,
|
||||||
@ -302,7 +315,7 @@ func (pxy *server_proxy_http_main) ServeHTTP(w http.ResponseWriter, req *http.Re
|
|||||||
if httpguts.HeaderValuesContainsToken(req.Header["Connection"], "Upgrade") {
|
if httpguts.HeaderValuesContainsToken(req.Header["Connection"], "Upgrade") {
|
||||||
req_upgrade_type = req.Header.Get("Upgrade")
|
req_upgrade_type = req.Header.Get("Upgrade")
|
||||||
}
|
}
|
||||||
mutate_proxy_req_headers(req, proxy_req, prefixed)
|
mutate_proxy_req_headers(req, proxy_req, path_prefix)
|
||||||
|
|
||||||
if httpguts.HeaderValuesContainsToken(req.Header["Te"], "trailers") {
|
if httpguts.HeaderValuesContainsToken(req.Header["Te"], "trailers") {
|
||||||
proxy_req.Header.Set("Te", "trailers")
|
proxy_req.Header.Set("Te", "trailers")
|
||||||
@ -338,7 +351,7 @@ func (pxy *server_proxy_http_main) ServeHTTP(w http.ResponseWriter, req *http.Re
|
|||||||
hdr.Set("Location", xxx)
|
hdr.Set("Location", xxx)
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
if !prefixed {
|
if path_prefix == "" {
|
||||||
hdr.Add("Set-Cookie", fmt.Sprintf("%s=%d-%d; Path=/; HttpOnly", SERVER_PROXY_ID_COOKIE, conn_id, route_id))
|
hdr.Add("Set-Cookie", fmt.Sprintf("%s=%d-%d; Path=/; HttpOnly", SERVER_PROXY_ID_COOKIE, conn_id, route_id))
|
||||||
}
|
}
|
||||||
status_code = resp.StatusCode; w.WriteHeader(status_code)
|
status_code = resp.StatusCode; w.WriteHeader(status_code)
|
||||||
|
@ -1009,7 +1009,7 @@ func NewServer(ctx context.Context, logger Logger, ctl_addrs []string, rpc_addrs
|
|||||||
//s.pxy_mux.Handle(s.ctl_prefix + "/ui/", http.StripPrefix(s.ctl_prefix, http.FileServer(http.Dir(cwd)))) // TODO: proper directory. it must not use the current working directory...
|
//s.pxy_mux.Handle(s.ctl_prefix + "/ui/", http.StripPrefix(s.ctl_prefix, http.FileServer(http.Dir(cwd)))) // TODO: proper directory. it must not use the current working directory...
|
||||||
|
|
||||||
s.pxy_mux.Handle("/_http/{conn_id}/{route_id}/{trailer...}", &server_proxy_http_main{s: &s, prefix: "/_http"})
|
s.pxy_mux.Handle("/_http/{conn_id}/{route_id}/{trailer...}", &server_proxy_http_main{s: &s, prefix: "/_http"})
|
||||||
s.pxy_mux.Handle("/_init/{conn_id}/{route_id}/{trailer...}", &server_proxy_http_init{s: &s})
|
s.pxy_mux.Handle("/_init/{conn_id}/{route_id}/{trailer...}", &server_proxy_http_init{s: &s, prefix: "/_init"})
|
||||||
s.pxy_mux.Handle("/", &server_proxy_http_main{s: &s})
|
s.pxy_mux.Handle("/", &server_proxy_http_main{s: &s})
|
||||||
|
|
||||||
s.pxy_addr = make([]string, len(pxy_addrs))
|
s.pxy_addr = make([]string, len(pxy_addrs))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user