From 9828e0f213e90a46bad2cf90490495966801ad7f Mon Sep 17 00:00:00 2001 From: Masahiko AMANO Date: Thu, 26 Jan 2023 23:29:52 +0300 Subject: [PATCH] feat(web): add TDBMS client --- web/tdbms-client.go | 49 +++++++++++++++++++++++++++++++++++++++++++++ web/web-server.go | 46 ++++++++++++++++++++++++++++-------------- 2 files changed, 80 insertions(+), 15 deletions(-) create mode 100644 web/tdbms-client.go diff --git a/web/tdbms-client.go b/web/tdbms-client.go new file mode 100644 index 0000000..dba36eb --- /dev/null +++ b/web/tdbms-client.go @@ -0,0 +1,49 @@ +package main + +import ( + "bytes" + "net" +) + +// TDBMS connection struct +type TDBMSConnection struct { + conn net.Conn +} + +// Connect to TDBMS server +func (tdbms *TDBMSConnection) Connect(domain, addr string) error { + c, err := net.Dial(domain, addr) + tdbms.conn = c + return err +} + +// Close connection to TDBMS server +func (tdbms *TDBMSConnection) Close() error { + return tdbms.conn.Close() +} + +// Execute a TDB request +func (tdbms *TDBMSConnection) Query(db_name string, trc uint8, request_body string) []byte { + var err error + buffer := []byte{trc} + buffer = append(buffer, db_name...) + buffer = append(buffer, 0) + buffer = append(buffer, request_body...) + buffer = append(buffer, 0, 4) + _, err = tdbms.conn.Write(buffer) + if err != nil { + return nil + } + var response []byte + var resp_size int = -1 + buffer = make([]byte, 8192) + for resp_size <= 0 { + _, err = tdbms.conn.Read(buffer) + if err != nil { + return nil + } + response = append(response, buffer...) + resp_size = bytes.IndexByte(response, 4) + } + return response[:resp_size-1] +} diff --git a/web/web-server.go b/web/web-server.go index 38dc87f..1d78da3 100644 --- a/web/web-server.go +++ b/web/web-server.go @@ -17,8 +17,13 @@ import ( type JSON struct { Status bool `json:"status,omitempty"` Token string `json:"token,omitempty"` + TRC uint8 `json:"trc,omitempty"` + TRDB string `json:"trdb,omitempty"` + TRB string `json:"trb,omitempty"` } +var tdbms TDBMSConnection + const TOKEN_VALIDTIME = 604800 var SID int64 = 0 @@ -90,9 +95,9 @@ func HandlerAuth(w http.ResponseWriter, r *http.Request) { } } -func HandlerTFM(w http.ResponseWriter, r *http.Request) { +func HandlerTDBMS(w http.ResponseWriter, r *http.Request) { var request JSON - var response = JSON{Status: false} + var response []byte var err error r.Body = http.MaxBytesReader(w, r.Body, 1048576) json_decoder := json.NewDecoder(r.Body) @@ -102,24 +107,35 @@ func HandlerTFM(w http.ResponseWriter, r *http.Request) { http.Error(w, err.Error(), http.StatusBadRequest) return } - if TokenValidate(request.Token) { - response.Status = true - } - w.Header().Set("Content-Type", "application/json; charset=utf-8") - jsonData, err := json.Marshal(response) - if err != nil { - log.Fatalln(err) - } - _, err = w.Write(jsonData) - if err != nil { + if !TokenValidate(request.Token) { + http.Error(w, "Invalid token", http.StatusBadRequest) return } + response = tdbms.Query(request.TRDB, request.TRC, request.TRB) + if response == nil { + http.Error(w, "Failed to execute request", http.StatusInternalServerError) + return + } + w.Header().Set("Content-Type", "application/json; charset=utf-8") + _, err = w.Write(response) if err != nil { - log.Fatalln(err) + log.Println(err) } } func main() { + var err error + log.Println("Connecting to TDBMS server...") + err = tdbms.Connect("unix", "/tmp/tdbms.sock") + if err != nil { + log.Fatalln("Failed to connect to TDBMS server") + } + defer func(tdbms TDBMSConnection) { + err := tdbms.Close() + if err != nil { + log.Fatalln(err) + } + }(tdbms) log.Println("Initializing...") server := &http.Server{ Addr: ":42776", @@ -132,9 +148,9 @@ func main() { public_fs.ServeHTTP(w, r) }) http.HandleFunc("/AUTH", HandlerAuth) - http.HandleFunc("/TFM", HandlerTFM) + http.HandleFunc("/TDBMS", HandlerTDBMS) tfm_fs := http.FileServer(http.Dir("/srv/data/tfm")) - http.Handle("/static", tfm_fs) + http.Handle("/tfm/", http.StripPrefix("/tfm", tfm_fs)) log.Println("Running...") err = server.ListenAndServeTLS("/etc/ssl/certs/web-global.crt", "/etc/ssl/private/web-global.key") if errors.Is(err, http.ErrServerClosed) {