Files
inp2025/tcp/response.go
2025-11-10 10:02:55 +08:00

91 lines
1.5 KiB
Go

package tcp
import (
"encoding/json"
"net"
"net/http"
"strings"
)
const (
StatusOK int = 200
StatusBadRequest = 400
StatusUnauthorized = 401
StatusForbidden = 403
StatusNotFound = 404
StatusInternalServerError = 500
)
type ResponseHeader struct {
StatusCode int `json:"status_code"`
}
type Response struct {
StatusCode int
Body []byte
RemoteAddr string
}
func (self *Response) Header() ([]byte, error) {
b, err := json.Marshal(ResponseHeader{
StatusCode: self.StatusCode,
})
if err != nil {
return []byte{}, err
}
return b, nil
}
type ResponseWriter interface {
Write([]byte) (int, error)
WriteHeader(statusCode int)
SocketSend([]byte) error
SocketSendString(string) error
}
type ResponseBuilder struct {
// For socket to send without closing connection
conn net.Conn
b strings.Builder
statusCode int
}
func NewResponseBuilder(conn net.Conn) *ResponseBuilder {
return &ResponseBuilder{
conn: conn,
statusCode: http.StatusInternalServerError,
}
}
func (self *ResponseBuilder) Write(b []byte) (int, error) {
return self.b.Write(b)
}
func (self *ResponseBuilder) WriteHeader(statusCode int) {
self.statusCode = statusCode
}
func (self *ResponseBuilder) Build(req *Request) *Response {
return &Response{
StatusCode: self.statusCode,
RemoteAddr: req.RemoteAddr,
Body: []byte(self.b.String()),
}
}
func (self *ResponseBuilder) SocketSend(b []byte) error {
return sendFrame(self.conn, b)
}
func (self *ResponseBuilder) SocketSendString(s string) error {
return self.SocketSend([]byte(s))
}