improve http handler

This commit is contained in:
ginuerzh
2021-10-31 12:41:53 +08:00
parent 248f7e4318
commit 64736585ee
11 changed files with 435 additions and 127 deletions

View File

@ -5,9 +5,9 @@ import (
"context"
"encoding/base64"
"fmt"
"log"
"net"
"net/http"
"net/http/httputil"
"net/url"
"strings"
@ -51,11 +51,15 @@ func (c *Connector) Connect(ctx context.Context, conn net.Conn, network, address
Header: make(http.Header),
}
if c.md.UserAgent != "" {
log.Println(c.md.UserAgent)
req.Header.Set("User-Agent", c.md.UserAgent)
}
req.Header.Set("Proxy-Connection", "keep-alive")
c.logger = c.logger.WithFields(map[string]interface{}{
"src": conn.LocalAddr().String(),
"dst": conn.RemoteAddr().String(),
})
if user := c.md.User; user != nil {
u := user.Username()
p, _ := user.Password()
@ -63,6 +67,11 @@ func (c *Connector) Connect(ctx context.Context, conn net.Conn, network, address
"Basic "+base64.StdEncoding.EncodeToString([]byte(u+":"+p)))
}
if c.logger.IsLevelEnabled(logger.DebugLevel) {
dump, _ := httputil.DumpRequest(req, false)
c.logger.Debug(string(dump))
}
req = req.WithContext(ctx)
if err := req.Write(conn); err != nil {
return nil, err
@ -74,6 +83,11 @@ func (c *Connector) Connect(ctx context.Context, conn net.Conn, network, address
}
defer resp.Body.Close()
if c.logger.IsLevelEnabled(logger.DebugLevel) {
dump, _ := httputil.DumpResponse(resp, false)
c.logger.Debug(string(dump))
}
if resp.StatusCode != http.StatusOK {
return nil, fmt.Errorf("%s", resp.Status)
}

View File

@ -42,11 +42,33 @@ func (d *Dialer) Dial(ctx context.Context, addr string, opts ...dialer.DialOptio
dial := options.DialFunc
if dial != nil {
return dial(ctx, addr)
conn, err := dial(ctx, addr)
if err != nil {
d.logger.Error(err)
} else {
if d.logger.IsLevelEnabled(logger.DebugLevel) {
d.logger.WithFields(map[string]interface{}{
"src": conn.LocalAddr().String(),
"dst": addr,
}).Debug("dial with dial func")
}
}
return conn, err
}
var netd net.Dialer
return netd.DialContext(ctx, "tcp", addr)
conn, err := netd.DialContext(ctx, "tcp", addr)
if err != nil {
d.logger.Error(err)
} else {
if d.logger.IsLevelEnabled(logger.DebugLevel) {
d.logger.WithFields(map[string]interface{}{
"src": conn.LocalAddr().String(),
"dst": addr,
}).Debug("dial direct")
}
}
return conn, err
}
func (d *Dialer) parseMetadata(md md.Metadata) (err error) {

View File

@ -76,6 +76,7 @@ func (h *Handler) parseMetadata(md md.Metadata) error {
}
}
}
h.md.retryCount = md.GetInt(retryCount)
return nil
}
@ -260,10 +261,10 @@ func (h *Handler) dial(ctx context.Context, addr string) (conn net.Conn, err err
*/
conn, err = route.Dial(ctx, "tcp", addr)
if err != nil {
h.logger.Warn("retry:", err)
continue
if err == nil {
break
}
h.logger.Errorf("route(retry=%d): %s", i, err)
}
return

View File

@ -8,6 +8,7 @@ const (
authsKey = "auths"
probeResistKey = "probeResist"
knockKey = "knock"
retryCount = "retry"
)
type metadata struct {