From 01bdec09872e38599cc32d28b40b5fa6e954dfb5 Mon Sep 17 00:00:00 2001 From: gospider <2216403312@qq.com> Date: Tue, 29 Jul 2025 16:12:21 +0800 Subject: [PATCH] sync --- .DS_Store | Bin 0 -> 6148 bytes errors.go | 5 - http.go | 281 ------------------------------------------------------ rw.go | 41 -------- 4 files changed, 327 deletions(-) create mode 100644 .DS_Store delete mode 100644 errors.go delete mode 100644 http.go delete mode 100644 rw.go diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0= 0 { - rawHeaders.Set("Content-Length", fmt.Sprint(contentL)) - } else if chunked { - rawHeaders.Set("Transfer-Encoding", "chunked") - } - ruri := req.URL.RequestURI() - if req.Method == "CONNECT" && req.URL.Path == "" { - if req.URL.Opaque != "" { - ruri = req.URL.Opaque - } else { - ruri = host - } - } - if _, err = obj.w.WriteString(fmt.Sprintf("%s %s %s\r\n", req.Method, ruri, req.Proto)); err != nil { - return - } - for _, kv := range tools.NewHeadersWithH1(orderHeaders, rawHeaders) { - if _, err = obj.w.WriteString(fmt.Sprintf("%s: %s\r\n", kv[0], kv[1])); err != nil { - return - } - } - if _, err = obj.w.WriteString("\r\n"); err != nil { - return - } - if req.Body == nil { - err = obj.w.Flush() - return - } - if chunked { - chunkedWriter := newChunkedWriter(obj.w) - if _, err = tools.Copy(chunkedWriter, req.Body); err != nil { - return - } - if err = chunkedWriter.Close(); err != nil { - return - } - } else { - if _, err = tools.Copy(obj.w, req.Body); err != nil { - return - } - } - err = obj.w.Flush() - return -} - -type clientBody struct { - r io.Reader - cnl context.CancelCauseFunc -} - -func (obj *clientBody) Read(p []byte) (n int, err error) { - return obj.r.Read(p) -} -func (obj *clientBody) Close() error { - return obj.CloseWithError(nil) -} -func (obj *clientBody) CloseWithError(err error) error { - obj.cnl(err) - return nil -} - -func (obj *clientConn) DoRequest(req *http.Request, orderHeaders []interface { - Key() string - Val() any -}) (res *http.Response, ctx context.Context, err error) { - defer func() { - if err != nil { - obj.CloseWithError(tools.WrapError(err, "failed to send request")) - } - }() - var writeErr error - writeDone := make(chan struct{}) - go func() { - writeErr = obj.httpWrite(req, req.Header.Clone(), orderHeaders) - close(writeDone) - }() - select { - case <-writeDone: - if writeErr != nil { - return nil, nil, writeErr - } - select { - case <-req.Context().Done(): - return nil, nil, req.Context().Err() - case <-obj.ctx.Done(): - return nil, nil, obj.ctx.Err() - case rsp := <-obj.rsps: - return rsp.r, rsp.ctx, rsp.err - } - case <-req.Context().Done(): - return nil, nil, req.Context().Err() - case <-obj.ctx.Done(): - return nil, nil, obj.ctx.Err() - case rsp := <-obj.rsps: - return rsp.r, rsp.ctx, rsp.err - } -} - -func (obj *clientConn) Close() error { - return obj.CloseWithError(nil) -} -func (obj *clientConn) CloseWithError(err error) error { - if obj.closeFunc != nil { - obj.closeFunc(err) - } - obj.cnl(err) - return obj.conn.Close() -} - -func (obj *clientConn) Stream() io.ReadWriteCloser { - return &websocketConn{ - cnl: obj.cnl, - r: obj.r, - w: obj.conn, - } -} - -func newChunkedWriter(w *bufio.Writer) io.WriteCloser { - return &chunkedWriter{w} -} - -type chunkedWriter struct { - w *bufio.Writer -} - -func (cw *chunkedWriter) Write(data []byte) (n int, err error) { - if len(data) == 0 { - return 0, nil - } - if _, err = fmt.Fprintf(cw.w, "%x\r\n", len(data)); err != nil { - return 0, err - } - if _, err = cw.w.Write(data); err != nil { - return - } - if _, err = io.WriteString(cw.w, "\r\n"); err != nil { - return - } - return len(data), cw.w.Flush() -} - -func (cw *chunkedWriter) Close() error { - _, err := io.WriteString(cw.w, "0\r\n\r\n") - return err -} - -type websocketConn struct { - r io.Reader - w io.WriteCloser - cnl context.CancelCauseFunc -} - -func (obj *websocketConn) Read(p []byte) (n int, err error) { - return obj.r.Read(p) -} -func (obj *websocketConn) Write(p []byte) (n int, err error) { - // i, err := obj.w.Write(p) - // log.Print(err, " write error ", i, p) - // return i, err - return obj.w.Write(p) -} -func (obj *websocketConn) Close() error { - obj.cnl(nil) - return obj.w.Close() -} diff --git a/rw.go b/rw.go deleted file mode 100644 index 55d22a1..0000000 --- a/rw.go +++ /dev/null @@ -1,41 +0,0 @@ -package requests - -import ( - "errors" - "io" - - "github.com/gospider007/http1" - "github.com/gospider007/tools" -) - -type wrapBody struct { - rawBody *http1.ClientBody - conn *connecotr -} - -func (obj *wrapBody) connStream() io.ReadWriteCloser { - return obj.conn.Conn.Stream() -} -func (obj *wrapBody) Read(p []byte) (n int, err error) { - return obj.rawBody.Read(p) -} -func (obj *wrapBody) Proxys() []Address { - return obj.conn.proxys -} - -func (obj *wrapBody) Close() error { - return obj.CloseWithError(nil) -} - -func (obj *wrapBody) CloseWithError(err error) error { - if err != nil && err != tools.ErrNoErr { - obj.conn.CloseWithError(err) - } - return obj.rawBody.CloseWithError(err) -} - -// safe close conn -func (obj *wrapBody) CloseConn() { - obj.conn.forceCnl(errors.New("readWriterCloser close conn")) - obj.conn.CloseWithError(errConnectionForceClosed) -}