diff --git a/testing/scenarios/http_test.go b/testing/scenarios/http_test.go index d92d99f7..761206fb 100644 --- a/testing/scenarios/http_test.go +++ b/testing/scenarios/http_test.go @@ -1,11 +1,17 @@ package scenarios import ( + "bytes" + "crypto/rand" + "io" "io/ioutil" "net/http" "net/url" "testing" + "v2ray.com/core/common" + "v2ray.com/core/common/buf" + "v2ray.com/core" "v2ray.com/core/app/proxyman" "v2ray.com/core/common/net" @@ -13,6 +19,7 @@ import ( "v2ray.com/core/proxy/freedom" v2http "v2ray.com/core/proxy/http" v2httptest "v2ray.com/core/testing/servers/http" + "v2ray.com/core/testing/servers/tcp" . "v2ray.com/ext/assert" ) @@ -73,6 +80,141 @@ func TestHttpConformance(t *testing.T) { CloseAllServers(servers) } +func TestHttpConnectMethod(t *testing.T) { + assert := With(t) + + tcpServer := tcp.Server{ + MsgProcessor: xor, + } + dest, err := tcpServer.Start() + assert(err, IsNil) + defer tcpServer.Close() + + serverPort := pickPort() + serverConfig := &core.Config{ + Inbound: []*proxyman.InboundHandlerConfig{ + { + ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ + PortRange: net.SinglePortRange(serverPort), + Listen: net.NewIPOrDomain(net.LocalHostIP), + }), + ProxySettings: serial.ToTypedMessage(&v2http.ServerConfig{}), + }, + }, + Outbound: []*proxyman.OutboundHandlerConfig{ + { + ProxySettings: serial.ToTypedMessage(&freedom.Config{}), + }, + }, + } + + servers, err := InitializeServerConfigs(serverConfig) + assert(err, IsNil) + + { + transport := &http.Transport{ + Proxy: func(req *http.Request) (*url.URL, error) { + return url.Parse("http://127.0.0.1:" + serverPort.String()) + }, + } + + client := &http.Client{ + Transport: transport, + } + + payload := make([]byte, 1024*64) + common.Must2(rand.Read(payload)) + req, err := http.NewRequest("Connect", "http://"+dest.NetAddr()+"/", bytes.NewReader(payload)) + common.Must(err) + + resp, err := client.Do(req) + assert(err, IsNil) + assert(resp.StatusCode, Equals, 200) + + content := make([]byte, len(payload)) + common.Must2(io.ReadFull(resp.Body, content)) + assert(err, IsNil) + assert(content, Equals, xor(payload)) + + } + + CloseAllServers(servers) +} + +func TestHttpPost(t *testing.T) { + assert := With(t) + + httpServerPort := pickPort() + httpServer := &v2httptest.Server{ + Port: httpServerPort, + PathHandler: map[string]http.HandlerFunc{ + "/testpost": func(w http.ResponseWriter, r *http.Request) { + payload, err := buf.ReadAllToBytes(r.Body) + r.Body.Close() + + if err != nil { + w.WriteHeader(500) + w.Write([]byte("Unable to read all payload")) + return + } + payload = xor(payload) + w.Write(payload) + }, + }, + } + + _, err := httpServer.Start() + assert(err, IsNil) + defer httpServer.Close() + + serverPort := pickPort() + serverConfig := &core.Config{ + Inbound: []*proxyman.InboundHandlerConfig{ + { + ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ + PortRange: net.SinglePortRange(serverPort), + Listen: net.NewIPOrDomain(net.LocalHostIP), + }), + ProxySettings: serial.ToTypedMessage(&v2http.ServerConfig{}), + }, + }, + Outbound: []*proxyman.OutboundHandlerConfig{ + { + ProxySettings: serial.ToTypedMessage(&freedom.Config{}), + }, + }, + } + + servers, err := InitializeServerConfigs(serverConfig) + assert(err, IsNil) + + { + transport := &http.Transport{ + Proxy: func(req *http.Request) (*url.URL, error) { + return url.Parse("http://127.0.0.1:" + serverPort.String()) + }, + } + + client := &http.Client{ + Transport: transport, + } + + payload := make([]byte, 1024*64) + common.Must2(rand.Read(payload)) + + resp, err := client.Post("http://127.0.0.1:"+httpServerPort.String()+"/testpost", "application/x-www-form-urlencoded", bytes.NewReader(payload)) + assert(err, IsNil) + assert(resp.StatusCode, Equals, 200) + + content, err := ioutil.ReadAll(resp.Body) + assert(err, IsNil) + assert(content, Equals, xor(payload)) + + } + + CloseAllServers(servers) +} + func setProxyBasicAuth(req *http.Request, user, pass string) { req.SetBasicAuth(user, pass) req.Header.Set("Proxy-Authorization", req.Header.Get("Authorization"))