diff --git a/infra/conf/transport_internet.go b/infra/conf/transport_internet.go index b4458096b458..b726ef0aca13 100644 --- a/infra/conf/transport_internet.go +++ b/infra/conf/transport_internet.go @@ -230,13 +230,14 @@ type SplitHTTPConfig struct { SeqKey string `json:"seqKey"` UplinkDataPlacement string `json:"uplinkDataPlacement"` UplinkDataKey string `json:"uplinkDataKey"` - UplinkChunkSize uint32 `json:"uplinkChunkSize"` + UplinkChunkSize Int32Range `json:"uplinkChunkSize"` NoGRPCHeader bool `json:"noGRPCHeader"` NoSSEHeader bool `json:"noSSEHeader"` ScMaxEachPostBytes Int32Range `json:"scMaxEachPostBytes"` ScMinPostsIntervalMs Int32Range `json:"scMinPostsIntervalMs"` ScMaxBufferedPosts int64 `json:"scMaxBufferedPosts"` ScStreamUpServerSecs Int32Range `json:"scStreamUpServerSecs"` + ServerMaxHeaderBytes int32 `json:"serverMaxHeaderBytes"` Xmux XmuxConfig `json:"xmux"` DownloadSettings *StreamConfig `json:"downloadSettings"` Extra json.RawMessage `json:"extra"` @@ -316,9 +317,9 @@ func (c *SplitHTTPConfig) Build() (proto.Message, error) { switch c.UplinkDataPlacement { case "": - c.UplinkDataPlacement = "body" - case "body": - case "cookie", "header": + c.UplinkDataPlacement = splithttp.PlacementAuto + case splithttp.PlacementAuto, splithttp.PlacementBody: + case splithttp.PlacementCookie, splithttp.PlacementHeader: if c.Mode != "packet-up" { return nil, errors.New("UplinkDataPlacement can be " + c.UplinkDataPlacement + " only in packet-up mode") } @@ -347,9 +348,6 @@ func (c *SplitHTTPConfig) Build() (proto.Message, error) { case "": c.SeqPlacement = "path" case "path", "cookie", "header", "query": - if c.SessionPlacement == "path" { - return nil, errors.New("SeqPlacement must be path when SessionPlacement is path") - } default: return nil, errors.New("unsupported seq placement: " + c.SeqPlacement) } @@ -372,24 +370,17 @@ func (c *SplitHTTPConfig) Build() (proto.Message, error) { } } - if c.UplinkDataPlacement != "body" && c.UplinkDataKey == "" { + if c.UplinkDataPlacement != splithttp.PlacementBody && c.UplinkDataKey == "" { switch c.UplinkDataPlacement { - case "cookie": + case splithttp.PlacementCookie: c.UplinkDataKey = "x_data" - case "header": + case splithttp.PlacementAuto, splithttp.PlacementHeader: c.UplinkDataKey = "X-Data" } } - if c.UplinkChunkSize == 0 { - switch c.UplinkDataPlacement { - case "cookie": - c.UplinkChunkSize = 3 * 1024 // 3KB - case "header": - c.UplinkChunkSize = 4 * 1024 // 4KB - } - } else if c.UplinkChunkSize < 64 { - c.UplinkChunkSize = 64 + if c.ServerMaxHeaderBytes < 0 { + return nil, errors.New("invalid negative value of maxHeaderBytes") } if c.Xmux.MaxConnections.To > 0 && c.Xmux.MaxConcurrency.To > 0 { @@ -422,13 +413,14 @@ func (c *SplitHTTPConfig) Build() (proto.Message, error) { SeqKey: c.SeqKey, UplinkDataPlacement: c.UplinkDataPlacement, UplinkDataKey: c.UplinkDataKey, - UplinkChunkSize: c.UplinkChunkSize, + UplinkChunkSize: newRangeConfig(c.UplinkChunkSize), NoGRPCHeader: c.NoGRPCHeader, NoSSEHeader: c.NoSSEHeader, ScMaxEachPostBytes: newRangeConfig(c.ScMaxEachPostBytes), ScMinPostsIntervalMs: newRangeConfig(c.ScMinPostsIntervalMs), ScMaxBufferedPosts: c.ScMaxBufferedPosts, ScStreamUpServerSecs: newRangeConfig(c.ScStreamUpServerSecs), + ServerMaxHeaderBytes: c.ServerMaxHeaderBytes, Xmux: &splithttp.XmuxConfig{ MaxConcurrency: newRangeConfig(c.Xmux.MaxConcurrency), MaxConnections: newRangeConfig(c.Xmux.MaxConnections), diff --git a/transport/internet/browser_dialer/dialer.go b/transport/internet/browser_dialer/dialer.go index 1991284d607f..be2f137edc2b 100644 --- a/transport/internet/browser_dialer/dialer.go +++ b/transport/internet/browser_dialer/dialer.go @@ -22,6 +22,7 @@ type task struct { Method string `json:"method"` URL string `json:"url"` Extra any `json:"extra,omitempty"` + StreamResponse bool `json:"streamResponse"` } var conns chan *websocket.Conn @@ -52,6 +53,7 @@ func init() { } } } else { + w.Header().Set("Access-Control-Allow-Origin", "*"); w.Write(webpage) } })) @@ -70,6 +72,7 @@ func DialWS(uri string, ed []byte) (*websocket.Conn, error) { task := task{ Method: "WS", URL: uri, + StreamResponse: true, } if ed != nil { @@ -84,9 +87,10 @@ func DialWS(uri string, ed []byte) (*websocket.Conn, error) { type httpExtra struct { Referrer string `json:"referrer,omitempty"` Headers map[string]string `json:"headers,omitempty"` + Cookies map[string]string `json:"cookies,omitempty"` } -func httpExtraFromHeaders(headers http.Header) *httpExtra { +func httpExtraFromHeadersAndCookies(headers http.Header, cookies []*http.Cookie) *httpExtra { if len(headers) == 0 { return nil } @@ -104,24 +108,37 @@ func httpExtraFromHeaders(headers http.Header) *httpExtra { } } + if len(cookies) > 0 { + extra.Cookies = make(map[string]string) + for _, cookie := range cookies { + extra.Cookies[cookie.Name] = cookie.Value + } + } + return &extra } -func DialGet(uri string, headers http.Header) (*websocket.Conn, error) { +func DialGet(uri string, headers http.Header, cookies []*http.Cookie) (*websocket.Conn, error) { task := task{ Method: "GET", URL: uri, - Extra: httpExtraFromHeaders(headers), + Extra: httpExtraFromHeadersAndCookies(headers, cookies), + StreamResponse: true, } return dialTask(task) } -func DialPost(uri string, headers http.Header, payload []byte) error { +func DialPacket(method string, uri string, headers http.Header, cookies []*http.Cookie, payload []byte) error { + return dialWithBody(method, uri, headers, cookies, payload) +} + +func dialWithBody(method string, uri string, headers http.Header, cookies []*http.Cookie, payload []byte) error { task := task{ - Method: "POST", + Method: method, URL: uri, - Extra: httpExtraFromHeaders(headers), + Extra: httpExtraFromHeadersAndCookies(headers, cookies), + StreamResponse: false, } conn, err := dialTask(task) diff --git a/transport/internet/browser_dialer/dialer.html b/transport/internet/browser_dialer/dialer.html index c62135ae6b70..5a0df4892b81 100644 --- a/transport/internet/browser_dialer/dialer.html +++ b/transport/internet/browser_dialer/dialer.html @@ -2,6 +2,7 @@ Browser Dialer +