mirror of
https://github.com/tobychui/zoraxy.git
synced 2025-06-03 06:07:20 +02:00
150 lines
3.9 KiB
Go
150 lines
3.9 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/http"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"imuslab.com/zoraxy/mod/utils"
|
|
)
|
|
|
|
/*
|
|
Redirect.go
|
|
|
|
This script handle all the http handlers
|
|
related to redirection function in the reverse proxy
|
|
*/
|
|
|
|
// Handle request for listing all stored redirection rules
|
|
func handleListRedirectionRules(w http.ResponseWriter, r *http.Request) {
|
|
rules := redirectTable.GetAllRedirectRules()
|
|
js, _ := json.Marshal(rules)
|
|
utils.SendJSONResponse(w, string(js))
|
|
}
|
|
|
|
// Handle request for adding new redirection rule
|
|
func handleAddRedirectionRule(w http.ResponseWriter, r *http.Request) {
|
|
redirectUrl, err := utils.PostPara(r, "redirectUrl")
|
|
if err != nil {
|
|
utils.SendErrorResponse(w, "redirect url cannot be empty")
|
|
return
|
|
}
|
|
destUrl, err := utils.PostPara(r, "destUrl")
|
|
if err != nil {
|
|
utils.SendErrorResponse(w, "destination url cannot be empty")
|
|
}
|
|
|
|
forwardChildpath, err := utils.PostPara(r, "forwardChildpath")
|
|
if err != nil {
|
|
//Assume true
|
|
forwardChildpath = "true"
|
|
}
|
|
|
|
redirectTypeString, err := utils.PostPara(r, "redirectType")
|
|
if err != nil {
|
|
redirectTypeString = "307"
|
|
}
|
|
|
|
redirectionStatusCode, err := strconv.Atoi(redirectTypeString)
|
|
if err != nil {
|
|
utils.SendErrorResponse(w, "invalid status code number")
|
|
return
|
|
}
|
|
|
|
err = redirectTable.AddRedirectRule(redirectUrl, destUrl, forwardChildpath == "true", redirectionStatusCode)
|
|
if err != nil {
|
|
utils.SendErrorResponse(w, err.Error())
|
|
return
|
|
}
|
|
|
|
utils.SendOK(w)
|
|
}
|
|
|
|
// Handle remove of a given redirection rule
|
|
func handleDeleteRedirectionRule(w http.ResponseWriter, r *http.Request) {
|
|
redirectUrl, err := utils.PostPara(r, "redirectUrl")
|
|
if err != nil {
|
|
utils.SendErrorResponse(w, "redirect url cannot be empty")
|
|
return
|
|
}
|
|
|
|
err = redirectTable.DeleteRedirectRule(redirectUrl)
|
|
if err != nil {
|
|
utils.SendErrorResponse(w, err.Error())
|
|
return
|
|
}
|
|
|
|
utils.SendOK(w)
|
|
}
|
|
|
|
func handleEditRedirectionRule(w http.ResponseWriter, r *http.Request) {
|
|
originalRedirectUrl, err := utils.PostPara(r, "originalRedirectUrl")
|
|
if err != nil {
|
|
utils.SendErrorResponse(w, "original redirect url cannot be empty")
|
|
return
|
|
}
|
|
|
|
newRedirectUrl, err := utils.PostPara(r, "newRedirectUrl")
|
|
if err != nil {
|
|
utils.SendErrorResponse(w, "redirect url cannot be empty")
|
|
return
|
|
}
|
|
destUrl, err := utils.PostPara(r, "destUrl")
|
|
if err != nil {
|
|
utils.SendErrorResponse(w, "destination url cannot be empty")
|
|
}
|
|
|
|
forwardChildpath, err := utils.PostPara(r, "forwardChildpath")
|
|
if err != nil {
|
|
//Assume true
|
|
forwardChildpath = "true"
|
|
}
|
|
|
|
redirectTypeString, err := utils.PostPara(r, "redirectType")
|
|
if err != nil {
|
|
redirectTypeString = "307"
|
|
}
|
|
|
|
redirectionStatusCode, err := strconv.Atoi(redirectTypeString)
|
|
if err != nil {
|
|
utils.SendErrorResponse(w, "invalid status code number")
|
|
return
|
|
}
|
|
|
|
err = redirectTable.EditRedirectRule(originalRedirectUrl, newRedirectUrl, destUrl, forwardChildpath == "true", redirectionStatusCode)
|
|
if err != nil {
|
|
utils.SendErrorResponse(w, err.Error())
|
|
return
|
|
}
|
|
|
|
utils.SendOK(w)
|
|
}
|
|
|
|
// Toggle redirection regex support. Note that this cost another O(n) time complexity to each page load
|
|
func handleToggleRedirectRegexpSupport(w http.ResponseWriter, r *http.Request) {
|
|
enabled, err := utils.PostPara(r, "enable")
|
|
if err != nil {
|
|
//Return the current state of the regex support
|
|
js, _ := json.Marshal(redirectTable.AllowRegex)
|
|
utils.SendJSONResponse(w, string(js))
|
|
return
|
|
}
|
|
|
|
//Update the current regex support rule enable state
|
|
enableRegexSupport := strings.EqualFold(strings.TrimSpace(enabled), "true")
|
|
redirectTable.AllowRegex = enableRegexSupport
|
|
err = sysdb.Write("redirect", "regex", enableRegexSupport)
|
|
|
|
if enableRegexSupport {
|
|
SystemWideLogger.PrintAndLog("redirect", "Regex redirect rule enabled", nil)
|
|
} else {
|
|
SystemWideLogger.PrintAndLog("redirect", "Regex redirect rule disabled", nil)
|
|
}
|
|
if err != nil {
|
|
utils.SendErrorResponse(w, "unable to save settings")
|
|
return
|
|
}
|
|
utils.SendOK(w)
|
|
}
|