177 lines
3.6 KiB
Go
177 lines
3.6 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"flag"
|
|
"fmt"
|
|
"net"
|
|
"os"
|
|
"os/signal"
|
|
"strings"
|
|
"syscall"
|
|
|
|
"github.com/LandaMm/hsp-go/hsp"
|
|
"github.com/LandaMm/hsp-go/hsp/client"
|
|
"github.com/LandaMm/hsp-go/hsp/server"
|
|
"github.com/chzyer/readline"
|
|
)
|
|
|
|
func Index(req *hsp.Request) *hsp.Response {
|
|
pkt := req.GetRawPacket()
|
|
|
|
fmt.Printf("%s %s\n", strings.ToUpper(req.GetRequestKind()), req.GetRoute())
|
|
fmt.Println("Headers:")
|
|
|
|
for k, v := range pkt.Headers {
|
|
fmt.Printf("\t%s: %s\n", k, v)
|
|
}
|
|
|
|
df, err := req.GetDataFormat()
|
|
if err != nil {
|
|
h, ok := req.GetHeader(hsp.H_DATA_FORMAT)
|
|
if !ok {
|
|
fmt.Println("ERR: Data-Format header is not present")
|
|
return hsp.NewErrorResponse(err)
|
|
}
|
|
fmt.Printf("Invalid Data Format: %s\n", h)
|
|
return hsp.NewErrorResponse(err)
|
|
}
|
|
|
|
fmt.Printf("Payload (%s):\n", df.String())
|
|
|
|
switch df.Format {
|
|
case "text":
|
|
body, err := req.ExtractText()
|
|
if err != nil {
|
|
fmt.Println("ERR: Failed to extract text from payload:", err)
|
|
return hsp.NewErrorResponse(err)
|
|
}
|
|
|
|
fmt.Println(body)
|
|
break
|
|
case "json":
|
|
var out map[string]any
|
|
err := req.ExtractJson(&out)
|
|
if err != nil {
|
|
fmt.Println("ERR: Failed to extract json from payload:", err)
|
|
return hsp.NewErrorResponse(err)
|
|
}
|
|
|
|
fmt.Println(json.MarshalIndent(out, "", " "))
|
|
break
|
|
case "bytes":
|
|
bts, err := req.ExtractBytes()
|
|
if err != nil {
|
|
fmt.Println("ERR: Failed to extract bytes from payload:", err)
|
|
return hsp.NewErrorResponse(err)
|
|
}
|
|
|
|
fmt.Println(bts)
|
|
break;
|
|
default:
|
|
fmt.Printf("ERR: Unsupported data format: %s\n", df.String())
|
|
}
|
|
|
|
return hsp.NewStatusResponse(hsp.STATUS_SUCCESS)
|
|
}
|
|
|
|
func StartServer(addr *hsp.Adddress) {
|
|
srv := server.NewServer(*addr)
|
|
fmt.Printf("Server created on address: %s\n", srv.Addr.String())
|
|
|
|
handler := make(chan net.Conn, 1)
|
|
|
|
router := server.NewRouter()
|
|
|
|
router.AddRoute("*", Index)
|
|
|
|
srv.SetListener(handler)
|
|
|
|
go func() {
|
|
for {
|
|
conn := <-handler
|
|
if err := router.Handle(conn); err != nil {
|
|
fmt.Println("ERR: Couldn't handle connection:", err.Error())
|
|
}
|
|
}
|
|
}()
|
|
|
|
sigs := make(chan os.Signal, 1)
|
|
|
|
go func() {
|
|
s := <-sigs
|
|
if s == syscall.SIGINT || s == syscall.SIGTERM {
|
|
fmt.Println("Gracefully shutting down the server")
|
|
if err := srv.Stop(); err != nil {
|
|
fmt.Println("Failed to close the server:", err)
|
|
}
|
|
}
|
|
}()
|
|
|
|
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
|
|
|
|
if err := srv.Start(); err != nil {
|
|
fmt.Println("ERR: Failed to start server:", err)
|
|
}
|
|
}
|
|
|
|
func StartSession(addr *hsp.Adddress) {
|
|
url := addr.String() + addr.Route
|
|
fmt.Println("Starting session on", url)
|
|
|
|
c := client.NewClient()
|
|
|
|
rl, err := readline.New("> ")
|
|
if err != nil {
|
|
fmt.Println("ERR: Failed to open readline session:", err)
|
|
}
|
|
|
|
defer rl.Close()
|
|
|
|
for {
|
|
line, err := rl.Readline()
|
|
if err != nil {
|
|
break
|
|
}
|
|
|
|
c.SendText(url, line)
|
|
}
|
|
}
|
|
|
|
func main() {
|
|
var listening bool
|
|
flag.BoolVar(&listening, "server", false, "start a simple server")
|
|
|
|
var host string
|
|
var service string
|
|
var address string
|
|
|
|
flag.StringVar(&host, "host", "localhost", "specify server host (default: localhost)")
|
|
flag.StringVar(&service, "port", "998", "specify server port (default: 998)")
|
|
flag.StringVar(&address, "addr", "localhost:998", "specify target address (default: :998)")
|
|
|
|
flag.Parse()
|
|
|
|
if listening {
|
|
a := fmt.Sprintf("%s:%s", host, service)
|
|
addr, err := hsp.ParseAddress(a)
|
|
if err != nil {
|
|
fmt.Printf("ERR: Invalid address %s: %v\n", a, err)
|
|
return
|
|
}
|
|
|
|
StartServer(addr)
|
|
return
|
|
}
|
|
|
|
addr, err := hsp.ParseAddress(address)
|
|
if err != nil {
|
|
fmt.Printf("ERR: Invalid address %s: %v\n", address, err)
|
|
return
|
|
}
|
|
StartSession(addr)
|
|
}
|
|
|
|
|
|
|