Initial 2024-01-26
This commit is contained in:
245
cmpSnipper/cmpSnipperHttpUtil.go
Normal file
245
cmpSnipper/cmpSnipperHttpUtil.go
Normal file
@@ -0,0 +1,245 @@
|
||||
|
||||
package cmpSnipper
|
||||
|
||||
import (
|
||||
"os"
|
||||
"strings"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
func (app *App) HttpRespText(w http.ResponseWriter, data []byte) {
|
||||
w.Write(data)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func (app *App) HttpRespJson(w http.ResponseWriter, data any) {
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
|
||||
jsonResp, err := json.MarshalIndent(data, "", "\t")
|
||||
|
||||
if err != nil {
|
||||
app.Log("Error happened in JSON marshal. Err: %s", err)
|
||||
return
|
||||
}
|
||||
|
||||
app.HttpRespText(w, jsonResp)
|
||||
}
|
||||
|
||||
func HttpRespCodeText(w http.ResponseWriter, req *http.Request, code int, cont string, mesg any) {
|
||||
w.WriteHeader(code)
|
||||
|
||||
w.Header().Set("Content-Type", cont)
|
||||
|
||||
|
||||
}
|
||||
|
||||
func (app *App) HttpRespForbidden(w http.ResponseWriter, req *http.Request, mesg string) {
|
||||
w.WriteHeader(http.StatusForbidden)
|
||||
|
||||
resp := make(map[string]any)
|
||||
resp["code"] = 403
|
||||
resp["status"] = "Forbidden"
|
||||
resp["message"] = mesg
|
||||
|
||||
app.HttpRespJson(w, resp)
|
||||
}
|
||||
|
||||
|
||||
|
||||
func (app *App) HttpReqDir1(w http.ResponseWriter, req *http.Request, targ string, path string) {
|
||||
resp := map[string]interface{}{
|
||||
"path" : path,
|
||||
"directory": targ,
|
||||
"content" : nil,
|
||||
}
|
||||
|
||||
entries, err := os.ReadDir(targ)
|
||||
|
||||
if err != nil {
|
||||
app.Log(err)
|
||||
app.HttpRespForbidden(w, req, "Server error")
|
||||
}
|
||||
|
||||
var slice []interface{};
|
||||
|
||||
for _, e := range entries {
|
||||
slice = append(slice, map[string]interface{}{
|
||||
"name": e.Name(),
|
||||
})
|
||||
|
||||
// fmt.Println(e.Name());
|
||||
}
|
||||
|
||||
resp["content"] = slice
|
||||
|
||||
app.HttpRespJson(w, resp)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func (app *App) HttpReqDir(w http.ResponseWriter, req *http.Request, targ string, path string) {
|
||||
finx := path + "/index.html"
|
||||
|
||||
data, err := app.FileReadLimit(finx, 1048576);
|
||||
|
||||
if os.IsNotExist(err) {
|
||||
app.HttpReqDir1(w, req, targ, path)
|
||||
return
|
||||
}
|
||||
|
||||
if err == app.ErrIsDir {
|
||||
app.HttpReqDir1(w, req, targ, path)
|
||||
return
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
app.Log("Err: %s", err)
|
||||
app.HttpRespForbidden(w, req, "Server error")
|
||||
return
|
||||
}
|
||||
|
||||
w.Header().Set("Content-Type", "text/html")
|
||||
|
||||
app.HttpRespText(w, data)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func (app *App) HttpReq(w http.ResponseWriter, req *http.Request) {
|
||||
// https://go.dev/src/net/http/request.go
|
||||
|
||||
// fmt.Printf("Request: %+v\n", req)
|
||||
|
||||
var auri = (strings.Split(req.RequestURI, "/"))
|
||||
auri[0] = "/"
|
||||
|
||||
var aidx = 0
|
||||
|
||||
app.Log("Auri: %+v", auri)
|
||||
|
||||
var locTarg map[string]interface{}
|
||||
var locEnd bool
|
||||
|
||||
locList, err := app.ConfGetArr("http", "location")
|
||||
|
||||
if err != nil {
|
||||
app.HttpRespForbidden(w, req, "Invalid http.location")
|
||||
return
|
||||
}
|
||||
|
||||
for uid, uri := range auri {
|
||||
locEnd = false
|
||||
|
||||
for _, locIfc := range locList {
|
||||
var locMap map[string]interface{};
|
||||
|
||||
switch v := locIfc.(type) {
|
||||
case map[string]interface{}:
|
||||
locMap = v;
|
||||
}
|
||||
|
||||
if locMap == nil {
|
||||
app.Log("Not Found")
|
||||
continue
|
||||
}
|
||||
|
||||
locUri := locMap["uri"]
|
||||
|
||||
if 1 == 0 {
|
||||
// fmt.Printf("Found: %+v\n", locUri)
|
||||
continue
|
||||
}
|
||||
|
||||
if locUri != uri {
|
||||
// fmt.Printf(" %s != %s\n", locUri, uri)
|
||||
continue
|
||||
}
|
||||
|
||||
// fmt.Printf("Found: %s\n", uri)
|
||||
|
||||
locTarg = locMap
|
||||
locEnd = true
|
||||
aidx = uid
|
||||
|
||||
switch v := locMap["list"].(type) {
|
||||
case []interface{}:
|
||||
locList = v;
|
||||
// fmt.Printf("Found list\n");
|
||||
}
|
||||
}
|
||||
|
||||
if !locEnd {
|
||||
break
|
||||
}
|
||||
}
|
||||
/*
|
||||
fmt.Printf("Targ %+v\n", locTarg);
|
||||
fmt.Printf("Targ %+v\n", locEnd );
|
||||
fmt.Printf("Targ %s \n", locTarg["uri"] );
|
||||
fmt.Printf("Targ %+v\n", auri[(aidx+1):]);
|
||||
*/
|
||||
switch locTarg["type"] {
|
||||
case "json":
|
||||
targ := locTarg["targ"].(string)
|
||||
|
||||
app.HttpRespJson(w, locTarg[targ])
|
||||
|
||||
return
|
||||
|
||||
case "func":
|
||||
targ := locTarg["targ"].(string)
|
||||
parm := locTarg["parm"]
|
||||
|
||||
resp, err := app.CallFuncByName(targ, parm)
|
||||
|
||||
if err != nil {
|
||||
app.Log("Err: %s", err)
|
||||
break
|
||||
}
|
||||
|
||||
app.HttpRespJson(w, resp)
|
||||
|
||||
return
|
||||
|
||||
case "directory":
|
||||
targ := locTarg["targ"].(string)
|
||||
|
||||
path := targ + "/" + strings.Join(auri[(aidx+1):], "/")
|
||||
|
||||
app.Log("Location: %s", path)
|
||||
|
||||
data, err := app.FileReadLimit(path, 1048576);
|
||||
|
||||
if os.IsNotExist(err) {
|
||||
break
|
||||
}
|
||||
|
||||
if err == app.ErrIsDir {
|
||||
app.HttpReqDir(w, req, targ, path)
|
||||
return
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
app.Log("Err: %s", err)
|
||||
app.HttpRespForbidden(w, req, "Server error")
|
||||
return
|
||||
}
|
||||
|
||||
w.Header().Set("Content-Type", "text/html")
|
||||
|
||||
app.HttpRespText(w, data)
|
||||
|
||||
return
|
||||
|
||||
case "redirect":
|
||||
http.Redirect(w, req, locTarg["targ"].(string), int(locTarg["code"].(float64)))
|
||||
|
||||
return
|
||||
|
||||
// case "ws":
|
||||
}
|
||||
|
||||
app.HttpRespForbidden(w, req, "Invalid type")
|
||||
}
|
Reference in New Issue
Block a user