bash_go_service/tests/testcase/socket-server/server.go

138 lines
3.0 KiB
Go

package main
import (
"bash_go_service/shared/pkg/client"
"bash_go_service/shared/pkg/constants"
"bash_go_service/shared/pkg/logger"
"encoding/binary"
"net"
"os"
"time"
)
type ExecParams struct {
Filename string `json:"filename"`
Pwd string `json:"pwd"`
Args []string `json:"args"`
Env []string `json:"env"`
LogPath string `json:"logPath"`
Error string `json:"error"`
}
func main() {
socketPath := constants.SocketPath
// 删除已存在的socket文件
os.Remove(socketPath)
listener, err := net.Listen("unix", socketPath)
if err != nil {
logger.Error("Listen error: %v\n", err)
return
}
defer listener.Close()
logger.Info("Waiting for connections.")
for {
conn, err := listener.Accept()
if err != nil {
logger.Error("Accept error: %v\n", err)
continue
}
go handleConnection(conn)
}
}
func writeMessage(conn net.Conn, message string) error {
// 先发送消息长度
messageLen := uint32(len(message))
if err := binary.Write(conn, binary.LittleEndian, messageLen); err != nil {
return err
}
// 再发送消息内容
_, err := conn.Write([]byte(message))
return err
}
func handleConnection(conn net.Conn) {
defer conn.Close()
params := &ExecParams{}
// 读取文件名
var filenameLen uint64
binary.Read(conn, binary.LittleEndian, &filenameLen)
filename := make([]byte, filenameLen)
conn.Read(filename)
params.Filename = string(filename)
// 读取pwd
var pwdLen uint64
binary.Read(conn, binary.LittleEndian, &pwdLen)
pwd := make([]byte, pwdLen)
conn.Read(pwd)
params.Pwd = string(pwd)
// 读取argv
var argc int32
binary.Read(conn, binary.LittleEndian, &argc)
params.Args = make([]string, argc)
for i := 0; i < int(argc); i++ {
var argLen uint64
binary.Read(conn, binary.LittleEndian, &argLen)
arg := make([]byte, argLen)
conn.Read(arg)
params.Args[i] = string(arg)
}
// 读取envp
var envc int32
binary.Read(conn, binary.LittleEndian, &envc)
params.Env = make([]string, envc)
for i := 0; i < int(envc); i++ {
var envLen uint64
binary.Read(conn, binary.LittleEndian, &envLen)
env := make([]byte, envLen)
conn.Read(env)
params.Env[i] = string(env)
}
// 读取logPath
var logPathLen uint64
binary.Read(conn, binary.LittleEndian, &logPathLen)
logPath := make([]byte, logPathLen)
conn.Read(logPath)
params.LogPath = string(logPath)
context, readErr := os.ReadFile(params.LogPath)
if readErr != nil {
params.Error = ""
} else {
params.Error = string(context)
}
// 在HTTP调用前发送[start]标记
writeMessage(conn, "[sthttp]")
time.Sleep(200 * time.Millisecond)
client := client.NewClient()
handleQuestion := func(question string) {
if question != "" {
// 当收到非空question时发送[res]响应
res := "[res]" + question + "[wait]"
writeMessage(conn, res)
}
}
client.PostToStream("/question", params, nil, handleQuestion)
// 结束后发送结束标记
writeMessage(conn, "[end]")
logger.Debug("connection done.")
conn.Close() // 显式关闭连接
}