diff --git a/server/fwd/dispatcher/dispatch.go b/server/fwd/dispatcher/dispatch.go index 975ef25..6c7e06c 100644 --- a/server/fwd/dispatcher/dispatch.go +++ b/server/fwd/dispatcher/dispatch.go @@ -124,6 +124,8 @@ func (s *Server) acceptSocks(ls net.Listener) error { conn, err := socks.Process(s.ctx, conn) if err != nil { slog.Error("处理 socks 连接失败", "err", err) + utils.Close(conn) + return } select { case <-s.ctx.Done(): diff --git a/server/fwd/http/http.go b/server/fwd/http/http.go index d02cfda..733c7f0 100644 --- a/server/fwd/http/http.go +++ b/server/fwd/http/http.go @@ -1 +1,62 @@ package http + +import ( + "bufio" + "context" + "net" + "net/textproto" + "proxy-server/server/fwd/core" + "strings" + + "github.com/pkg/errors" +) + +type Request struct { + auth *core.AuthContext + dest *core.FwdAddr +} + +func Process(ctx context.Context, conn net.Conn) (*core.Conn, error) { + reader := bufio.NewReader(conn) + textReader := textproto.NewReader(reader) + + // 首行 + line, err := textReader.ReadLine() + if err != nil { + return nil, err + } + parts := strings.Split(line, " ") + if len(parts) != 3 { + return nil, errors.New("invalid http request") + } + + var req Request + if parts[0] == "CONNECT" { + req, err = processHttps(ctx, textReader) + if err != nil { + return nil, err + } + } else { + req, err = processHttp(ctx, textReader) + if err != nil { + return nil, err + } + } + + return &core.Conn{ + Conn: conn, + Reader: reader, + Tag: conn.RemoteAddr().String() + "_" + conn.LocalAddr().String(), + Protocol: "http", + Dest: req.dest, + Auth: req.auth, + }, nil +} + +func processHttps(ctx context.Context, reader *textproto.Reader) (Request, error) { + panic("not implemented") +} + +func processHttp(ctx context.Context, reader *textproto.Reader) (Request, error) { + panic("not implemented") +}