diff --git a/option/simple.go b/option/simple.go index eede0512..60cf074b 100644 --- a/option/simple.go +++ b/option/simple.go @@ -27,7 +27,8 @@ type SocksOutboundOptions struct { type HTTPOutboundOptions struct { DialerOptions ServerOptions - Username string `json:"username,omitempty"` - Password string `json:"password,omitempty"` - TLS *OutboundTLSOptions `json:"tls,omitempty"` + Username string `json:"username,omitempty"` + Password string `json:"password,omitempty"` + TLS *OutboundTLSOptions `json:"tls,omitempty"` + Headers map[string]Listable[string] `json:"headers,omitempty"` } diff --git a/outbound/http.go b/outbound/http.go index 1711e98a..075c1e53 100644 --- a/outbound/http.go +++ b/outbound/http.go @@ -3,6 +3,7 @@ package outbound import ( "context" "net" + "net/http" "os" "github.com/sagernet/sing-box/adapter" @@ -14,14 +15,14 @@ import ( "github.com/sagernet/sing/common" M "github.com/sagernet/sing/common/metadata" N "github.com/sagernet/sing/common/network" - "github.com/sagernet/sing/protocol/http" + sHTTP "github.com/sagernet/sing/protocol/http" ) var _ adapter.Outbound = (*HTTP)(nil) type HTTP struct { myOutboundAdapter - client *http.Client + client *sHTTP.Client } func NewHTTP(router adapter.Router, logger log.ContextLogger, tag string, options option.HTTPOutboundOptions) (*HTTP, error) { @@ -29,6 +30,13 @@ func NewHTTP(router adapter.Router, logger log.ContextLogger, tag string, option if err != nil { return nil, err } + var headers http.Header + if options.Headers != nil { + headers = make(http.Header) + for key, values := range options.Headers { + headers[key] = values + } + } return &HTTP{ myOutboundAdapter{ protocol: C.TypeHTTP, @@ -37,7 +45,7 @@ func NewHTTP(router adapter.Router, logger log.ContextLogger, tag string, option logger: logger, tag: tag, }, - http.NewClient(detour, options.ServerOptions.Build(), options.Username, options.Password, nil), + sHTTP.NewClient(detour, options.ServerOptions.Build(), options.Username, options.Password, headers), }, nil }