Skip to content

Commit

Permalink
feat: Converter support Xray HTTPUpgrade fast open path
Browse files Browse the repository at this point in the history
  • Loading branch information
H1JK committed Mar 30, 2024
1 parent 72d0948 commit 007c337
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 5 deletions.
27 changes: 25 additions & 2 deletions common/convert/converter.go
Original file line number Diff line number Diff line change
Expand Up @@ -330,15 +330,38 @@ func ConvertsV2Ray(buf []byte) ([]map[string]any, error) {

vmess["h2-opts"] = h2Opts

case "ws":
case "ws", "httpupgrade":
headers := make(map[string]any)
wsOpts := make(map[string]any)
wsOpts["path"] = []string{"/"}
if host, ok := values["host"]; ok && host != "" {
headers["Host"] = host.(string)
}
if path, ok := values["path"]; ok && path != "" {
wsOpts["path"] = path.(string)
path := path.(string)
pathURL, err := url.Parse(path)
if err == nil {
query := pathURL.Query()
if earlyData := query.Get("ed"); earlyData != "" {
med, err := strconv.Atoi(earlyData)
if err == nil {
switch network {
case "ws":
wsOpts["max-early-data"] = med
wsOpts["early-data-header-name"] = "Sec-WebSocket-Protocol"
case "httpupgrade":
wsOpts["v2ray-http-upgrade-fast-open"] = true
}
query.Del("ed")
pathURL.RawQuery = query.Encode()
path = pathURL.String()
}
}
if earlyDataHeader := query.Get("eh"); earlyDataHeader != "" {
wsOpts["early-data-header-name"] = earlyDataHeader
}
}
wsOpts["path"] = path
}
wsOpts["headers"] = headers
vmess["ws-opts"] = wsOpts
Expand Down
10 changes: 8 additions & 2 deletions common/convert/v.go
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ func handleVShareLink(names map[string]int, url *url.URL, scheme string, proxy m
h2Opts["headers"] = headers
proxy["h2-opts"] = h2Opts

case "ws":
case "ws", "httpupgrade":
headers := make(map[string]any)
wsOpts := make(map[string]any)
headers["User-Agent"] = RandUserAgent()
Expand All @@ -113,7 +113,13 @@ func handleVShareLink(names map[string]int, url *url.URL, scheme string, proxy m
if err != nil {
return fmt.Errorf("bad WebSocket max early data size: %v", err)
}
wsOpts["max-early-data"] = med
switch network {
case "ws":
wsOpts["max-early-data"] = med
wsOpts["early-data-header-name"] = "Sec-WebSocket-Protocol"
case "httpupgrade":
wsOpts["v2ray-http-upgrade-fast-open"] = true
}
}
if earlyDataHeader := query.Get("eh"); earlyDataHeader != "" {
wsOpts["early-data-header-name"] = earlyDataHeader
Expand Down
4 changes: 4 additions & 0 deletions docs/config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -383,6 +383,7 @@ proxies: # socks5
# headers:
# custom: value
# v2ray-http-upgrade: false
# v2ray-http-upgrade-fast-open: false

- name: "ss4-shadow-tls"
type: ss
Expand Down Expand Up @@ -461,6 +462,7 @@ proxies: # socks5
# max-early-data: 2048
# early-data-header-name: Sec-WebSocket-Protocol
# v2ray-http-upgrade: false
# v2ray-http-upgrade-fast-open: false

- name: "vmess-h2"
type: vmess
Expand Down Expand Up @@ -589,6 +591,7 @@ proxies: # socks5
headers:
Host: example.com
# v2ray-http-upgrade: false
# v2ray-http-upgrade-fast-open: false

# Trojan
- name: "trojan"
Expand Down Expand Up @@ -633,6 +636,7 @@ proxies: # socks5
# headers:
# Host: example.com
# v2ray-http-upgrade: false
# v2ray-http-upgrade-fast-open: false

- name: "trojan-xtls"
type: trojan
Expand Down
2 changes: 1 addition & 1 deletion transport/vmess/websocket.go
Original file line number Diff line number Diff line change
Expand Up @@ -495,7 +495,7 @@ func StreamWebsocketConn(ctx context.Context, conn net.Conn, c *WebsocketConfig)
}
}

if c.MaxEarlyData > 0 {
if c.MaxEarlyData > 0 && !c.V2rayHttpUpgrade {
return streamWebsocketWithEarlyDataConn(conn, c)
}

Expand Down

0 comments on commit 007c337

Please sign in to comment.