Added H2C (experimental)

- Added experimental H2C transporter
- Exposed default listening port and web server listen state to start parameters #474
This commit is contained in:
Toby Chui 2025-02-03 20:36:34 +08:00
parent 7d9f240d56
commit 07dc63a82c
3 changed files with 21 additions and 5 deletions

View File

@ -87,6 +87,10 @@ var (
allowWebFileManager = flag.Bool("webfm", true, "Enable web file manager for static web server root folder") allowWebFileManager = flag.Bool("webfm", true, "Enable web file manager for static web server root folder")
enableAutoUpdate = flag.Bool("cfgupgrade", true, "Enable auto config upgrade if breaking change is detected") enableAutoUpdate = flag.Bool("cfgupgrade", true, "Enable auto config upgrade if breaking change is detected")
/* Default Configuration Flags */
defaultInboundPort = flag.Int("default_inbound_port", 443, "Default web server listening port")
defaultEnableInboundTraffic = flag.Bool("default_inbound_enabled", true, "If web server is enabled by default")
/* Path Configuration Flags */ /* Path Configuration Flags */
//path_database = flag.String("dbpath", "./sys.db", "Database path") //path_database = flag.String("dbpath", "./sys.db", "Database path")
//path_conf = flag.String("conf", "./conf", "Configuration folder path") //path_conf = flag.String("conf", "./conf", "Configuration folder path")

View File

@ -2,6 +2,7 @@ package dpcore
import ( import (
"context" "context"
"crypto/tls"
"errors" "errors"
"io" "io"
"log" "log"
@ -11,6 +12,7 @@ import (
"strings" "strings"
"time" "time"
"golang.org/x/net/http2"
"imuslab.com/zoraxy/mod/dynamicproxy/domainsniff" "imuslab.com/zoraxy/mod/dynamicproxy/domainsniff"
"imuslab.com/zoraxy/mod/dynamicproxy/permissionpolicy" "imuslab.com/zoraxy/mod/dynamicproxy/permissionpolicy"
) )
@ -84,6 +86,7 @@ type requestCanceler interface {
type DpcoreOptions struct { type DpcoreOptions struct {
IgnoreTLSVerification bool //Disable all TLS verification when request pass through this proxy router IgnoreTLSVerification bool //Disable all TLS verification when request pass through this proxy router
FlushInterval time.Duration //Duration to flush in normal requests. Stream request or keep-alive request will always flush with interval of -1 (immediately) FlushInterval time.Duration //Duration to flush in normal requests. Stream request or keep-alive request will always flush with interval of -1 (immediately)
UseH2CRoundTripper bool //Use H2C RoundTripper for HTTP/2.0 connection
} }
func NewDynamicProxyCore(target *url.URL, prepender string, dpcOptions *DpcoreOptions) *ReverseProxy { func NewDynamicProxyCore(target *url.URL, prepender string, dpcOptions *DpcoreOptions) *ReverseProxy {
@ -100,8 +103,17 @@ func NewDynamicProxyCore(target *url.URL, prepender string, dpcOptions *DpcoreOp
} }
//Hack the default transporter to handle more connections
thisTransporter := http.DefaultTransport thisTransporter := http.DefaultTransport
if dpcOptions.UseH2CRoundTripper {
thisTransporter = &http2.Transport{
DialTLS: func(network, addr string, cfg *tls.Config) (net.Conn, error) {
return net.Dial(network, addr)
},
AllowHTTP: true,
}
}
//Hack the default transporter to handle more connections
optimalConcurrentConnection := 32 optimalConcurrentConnection := 32
thisTransporter.(*http.Transport).MaxIdleConns = optimalConcurrentConnection * 2 thisTransporter.(*http.Transport).MaxIdleConns = optimalConcurrentConnection * 2
thisTransporter.(*http.Transport).MaxIdleConnsPerHost = optimalConcurrentConnection thisTransporter.(*http.Transport).MaxIdleConnsPerHost = optimalConcurrentConnection

View File

@ -28,8 +28,8 @@ func ReverseProxtInit() {
/* /*
Load Reverse Proxy Global Settings Load Reverse Proxy Global Settings
*/ */
inboundPort := 443 inboundPort := *defaultInboundPort
autoStartReverseProxy := true autoStartReverseProxy := *defaultEnableInboundTraffic
if sysdb.KeyExists("settings", "inbound") { if sysdb.KeyExists("settings", "inbound") {
//Read settings from database //Read settings from database
sysdb.Read("settings", "inbound", &inboundPort) sysdb.Read("settings", "inbound", &inboundPort)
@ -42,8 +42,8 @@ func ReverseProxtInit() {
} else { } else {
//Default port //Default port
if netutils.CheckIfPortOccupied(inboundPort) { if netutils.CheckIfPortOccupied(inboundPort) {
inboundPort = 8743 autoStartReverseProxy = false
SystemWideLogger.Println("Port 443 is occupied. Switching to backup port 8743 instead") SystemWideLogger.Println("Port 443 is occupied. Change the listening port in the webmin panel and press \"Start Service\" to start reverse proxy service")
} }
SystemWideLogger.Println("Inbound port not set. Using default (443)") SystemWideLogger.Println("Inbound port not set. Using default (443)")
} }