@@ -25,6 +25,7 @@ import (
2525 "github.com/xtls/xray-core/testing/servers/tcp"
2626 "github.com/xtls/xray-core/transport/internet"
2727 "github.com/xtls/xray-core/transport/internet/reality"
28+ "github.com/xtls/xray-core/transport/internet/splithttp"
2829 transtcp "github.com/xtls/xray-core/transport/internet/tcp"
2930 "github.com/xtls/xray-core/transport/internet/tls"
3031 "golang.org/x/sync/errgroup"
@@ -647,3 +648,121 @@ func TestVlessRealityFingerprints(t *testing.T) {
647648 }
648649 wg .Wait ()
649650}
651+
652+ func TestVlessXHTTPH2C (t * testing.T ) {
653+ tcpServer := tcp.Server {
654+ MsgProcessor : xor ,
655+ }
656+ dest , err := tcpServer .Start ()
657+ common .Must (err )
658+ defer tcpServer .Close ()
659+
660+ userID := protocol .NewID (uuid .New ())
661+ serverPort := tcp .PickPort ()
662+
663+ xhttpSettings := serial .ToTypedMessage (& splithttp.Config {
664+ Path : "/h2c" ,
665+ AllowH2C : true ,
666+ })
667+
668+ serverConfig := & core.Config {
669+ App : []* serial.TypedMessage {
670+ serial .ToTypedMessage (& log.Config {
671+ ErrorLogLevel : clog .Severity_Debug ,
672+ ErrorLogType : log .LogType_Console ,
673+ }),
674+ },
675+ Inbound : []* core.InboundHandlerConfig {
676+ {
677+ ReceiverSettings : serial .ToTypedMessage (& proxyman.ReceiverConfig {
678+ PortList : & net.PortList {Range : []* net.PortRange {net .SinglePortRange (serverPort )}},
679+ Listen : net .NewIPOrDomain (net .LocalHostIP ),
680+ StreamSettings : & internet.StreamConfig {
681+ ProtocolName : "splithttp" ,
682+ TransportSettings : []* internet.TransportConfig {
683+ {
684+ ProtocolName : "splithttp" ,
685+ Settings : xhttpSettings ,
686+ },
687+ },
688+ },
689+ }),
690+ ProxySettings : serial .ToTypedMessage (& inbound.Config {
691+ Clients : []* protocol.User {
692+ {
693+ Account : serial .ToTypedMessage (& vless.Account {
694+ Id : userID .String (),
695+ }),
696+ },
697+ },
698+ }),
699+ },
700+ },
701+ Outbound : []* core.OutboundHandlerConfig {
702+ {
703+ ProxySettings : serial .ToTypedMessage (& freedom.Config {}),
704+ },
705+ },
706+ }
707+
708+ clientPort := tcp .PickPort ()
709+ clientConfig := & core.Config {
710+ App : []* serial.TypedMessage {
711+ serial .ToTypedMessage (& log.Config {
712+ ErrorLogLevel : clog .Severity_Debug ,
713+ ErrorLogType : log .LogType_Console ,
714+ }),
715+ },
716+ Inbound : []* core.InboundHandlerConfig {
717+ {
718+ ReceiverSettings : serial .ToTypedMessage (& proxyman.ReceiverConfig {
719+ PortList : & net.PortList {Range : []* net.PortRange {net .SinglePortRange (clientPort )}},
720+ Listen : net .NewIPOrDomain (net .LocalHostIP ),
721+ }),
722+ ProxySettings : serial .ToTypedMessage (& dokodemo.Config {
723+ Address : net .NewIPOrDomain (dest .Address ),
724+ Port : uint32 (dest .Port ),
725+ Networks : []net.Network {net .Network_TCP },
726+ }),
727+ },
728+ },
729+ Outbound : []* core.OutboundHandlerConfig {
730+ {
731+ ProxySettings : serial .ToTypedMessage (& outbound.Config {
732+ Vnext : & protocol.ServerEndpoint {
733+ Address : net .NewIPOrDomain (net .LocalHostIP ),
734+ Port : uint32 (serverPort ),
735+ User : & protocol.User {
736+ Account : serial .ToTypedMessage (& vless.Account {
737+ Id : userID .String (),
738+ }),
739+ },
740+ },
741+ }),
742+ SenderSettings : serial .ToTypedMessage (& proxyman.SenderConfig {
743+ StreamSettings : & internet.StreamConfig {
744+ ProtocolName : "splithttp" ,
745+ TransportSettings : []* internet.TransportConfig {
746+ {
747+ ProtocolName : "splithttp" ,
748+ Settings : xhttpSettings ,
749+ },
750+ },
751+ },
752+ }),
753+ },
754+ },
755+ }
756+
757+ servers , err := InitializeServerConfigs (serverConfig , clientConfig )
758+ common .Must (err )
759+ defer CloseAllServers (servers )
760+
761+ var errg errgroup.Group
762+ for range 3 {
763+ errg .Go (testTCPConn (clientPort , 1024 * 1024 , time .Second * 30 ))
764+ }
765+ if err := errg .Wait (); err != nil {
766+ t .Error (err )
767+ }
768+ }
0 commit comments