fix: chunk request not sent properly
Some checks failed
Docker Build and Push / build-and-push (push) Has been cancelled

This commit is contained in:
2025-12-02 19:17:20 +07:00
parent ecd6ab2618
commit b967619a3a

View File

@ -8,7 +8,6 @@ import (
"io" "io"
"log" "log"
"net" "net"
"net/http"
"regexp" "regexp"
"strconv" "strconv"
"strings" "strings"
@ -16,7 +15,6 @@ import (
"tunnel_pls/session" "tunnel_pls/session"
"tunnel_pls/utils" "tunnel_pls/utils"
"github.com/gorilla/websocket"
"golang.org/x/crypto/ssh" "golang.org/x/crypto/ssh"
) )
@ -25,61 +23,6 @@ var BAD_GATEWAY_RESPONSE = []byte("HTTP/1.1 502 Bad Gateway\r\n" +
"Content-Type: text/plain\r\n\r\n" + "Content-Type: text/plain\r\n\r\n" +
"Bad Gateway") "Bad Gateway")
var upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
}
type connResponseWriter struct {
conn net.Conn
header http.Header
wrote bool
}
func (w *connResponseWriter) Header() http.Header {
if w.header == nil {
w.header = make(http.Header)
}
return w.header
}
func (w *connResponseWriter) WriteHeader(statusCode int) {
if w.wrote {
return
}
w.wrote = true
_, err := fmt.Fprintf(w.conn, "HTTP/1.1 %d %s\r\n", statusCode, http.StatusText(statusCode))
if err != nil {
log.Printf("Error writing HTTP response: %v", err)
return
}
err = w.header.Write(w.conn)
if err != nil {
log.Printf("Error writing HTTP header: %v", err)
return
}
_, err = fmt.Fprint(w.conn, "\r\n")
if err != nil {
log.Printf("Error writing HTTP header: %v", err)
return
}
}
func (w *connResponseWriter) Write(b []byte) (int, error) {
if !w.wrote {
w.WriteHeader(http.StatusOK)
}
return w.conn.Write(b)
}
func (w *connResponseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) {
rw := bufio.NewReadWriter(
bufio.NewReader(w.conn),
bufio.NewWriter(w.conn),
)
return w.conn, rw, nil
}
type CustomWriter struct { type CustomWriter struct {
RemoteAddr net.Addr RemoteAddr net.Addr
writer io.Writer writer io.Writer
@ -198,10 +141,9 @@ func (cw *CustomWriter) Write(p []byte) (int, error) {
} }
req := cw.Requests[0] req := cw.Requests[0]
req.Written += len(body) req.Written += len(body)
if req.Chunked { if req.Chunked {
req.Tail = append(req.Tail, p[len(p)-5:]...) req.Tail = append(req.Tail, p[len(p)-5:]...)
if bytes.Equal(req.Tail, []byte("0\r\n\r\n")) { if bytes.Contains(p, []byte("0\r\n\r\n")) {
cw.interaction.SendMessage(fmt.Sprintf("\033[32m%s %s -> %s %s \033[0m\r\n", timestamp, cw.RemoteAddr.String(), req.Method, req.Path)) cw.interaction.SendMessage(fmt.Sprintf("\033[32m%s %s -> %s %s \033[0m\r\n", timestamp, cw.RemoteAddr.String(), req.Method, req.Path))
} }
} else if req.ContentSize != -1 { } else if req.ContentSize != -1 {
@ -211,6 +153,7 @@ func (cw *CustomWriter) Write(p []byte) (int, error) {
} }
} else { } else {
cw.Requests = cw.Requests[1:] cw.Requests = cw.Requests[1:]
cw.interaction.SendMessage(fmt.Sprintf("\033[32m%s %s -> %s %s \033[0m\r\n", timestamp, cw.RemoteAddr.String(), req.Method, req.Path))
} }
cw.buf = nil cw.buf = nil
return len(p), nil return len(p), nil
@ -223,10 +166,10 @@ func (cw *CustomWriter) Write(p []byte) (int, error) {
} }
req := cw.Requests[0] req := cw.Requests[0]
req.Written += len(p) req.Written += n
if req.Chunked { if req.Chunked {
req.Tail = append(req.Tail, p[len(p)-5:]...) req.Tail = append(req.Tail, p[len(p)-5:]...)
if bytes.Equal(req.Tail, []byte("0\r\n\r\n")) { if bytes.Contains(p, []byte("0\r\n\r\n")) {
cw.Requests = cw.Requests[1:] cw.Requests = cw.Requests[1:]
cw.interaction.SendMessage(fmt.Sprintf("\033[32m%s %s -> %s %s \033[0m\r\n", timestamp, cw.RemoteAddr.String(), req.Method, req.Path)) cw.interaction.SendMessage(fmt.Sprintf("\033[32m%s %s -> %s %s \033[0m\r\n", timestamp, cw.RemoteAddr.String(), req.Method, req.Path))
} }
@ -235,10 +178,11 @@ func (cw *CustomWriter) Write(p []byte) (int, error) {
cw.Requests = cw.Requests[1:] cw.Requests = cw.Requests[1:]
cw.interaction.SendMessage(fmt.Sprintf("\033[32m%s %s -> %s %s \033[0m\r\n", timestamp, cw.RemoteAddr.String(), req.Method, req.Path)) cw.interaction.SendMessage(fmt.Sprintf("\033[32m%s %s -> %s %s \033[0m\r\n", timestamp, cw.RemoteAddr.String(), req.Method, req.Path))
} }
} else { } else {
cw.Requests = cw.Requests[1:] cw.Requests = cw.Requests[1:]
cw.interaction.SendMessage(fmt.Sprintf("\033[32m%s %s -> %s %s \033[0m\r\n", timestamp, cw.RemoteAddr.String(), req.Method, req.Path))
} }
return n, nil return n, nil
} }
@ -247,19 +191,6 @@ func (cw *CustomWriter) AddInteraction(interaction *session.Interaction) {
} }
var redirectTLS = false var redirectTLS = false
var allowedCors = make(map[string]bool)
var isAllowedAllCors = false
func init() {
corsList := utils.Getenv("cors_list")
if corsList == "*" {
isAllowedAllCors = true
} else {
for _, allowedOrigin := range strings.Split(corsList, ",") {
allowedCors[allowedOrigin] = true
}
}
}
func NewHTTPServer() error { func NewHTTPServer() error {
listener, err := net.Listen("tcp", ":80") listener, err := net.Listen("tcp", ":80")
@ -416,7 +347,7 @@ func forwardRequest(cw *CustomWriter, initialRequest *RequestHeaderFactory, sshS
_, err = channel.Write(initialRequest.Finalize()) _, err = channel.Write(initialRequest.Finalize())
if err != nil { if err != nil {
log.Printf("Failed to write forwarded-tcpip:", err) log.Printf("Failed to forward request: %v", err)
return return
} }