http_test.go 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. package scenarios
  2. import (
  3. "bytes"
  4. "crypto/rand"
  5. "io"
  6. "io/ioutil"
  7. "net/http"
  8. "net/url"
  9. "testing"
  10. "v2ray.com/core/common"
  11. "v2ray.com/core/common/buf"
  12. "v2ray.com/core"
  13. "v2ray.com/core/app/proxyman"
  14. "v2ray.com/core/common/net"
  15. "v2ray.com/core/common/serial"
  16. "v2ray.com/core/proxy/freedom"
  17. v2http "v2ray.com/core/proxy/http"
  18. v2httptest "v2ray.com/core/testing/servers/http"
  19. "v2ray.com/core/testing/servers/tcp"
  20. . "v2ray.com/ext/assert"
  21. )
  22. func TestHttpConformance(t *testing.T) {
  23. assert := With(t)
  24. httpServerPort := tcp.PickPort()
  25. httpServer := &v2httptest.Server{
  26. Port: httpServerPort,
  27. PathHandler: make(map[string]http.HandlerFunc),
  28. }
  29. _, err := httpServer.Start()
  30. assert(err, IsNil)
  31. defer httpServer.Close()
  32. serverPort := tcp.PickPort()
  33. serverConfig := &core.Config{
  34. Inbound: []*core.InboundHandlerConfig{
  35. {
  36. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  37. PortRange: net.SinglePortRange(serverPort),
  38. Listen: net.NewIPOrDomain(net.LocalHostIP),
  39. }),
  40. ProxySettings: serial.ToTypedMessage(&v2http.ServerConfig{}),
  41. },
  42. },
  43. Outbound: []*core.OutboundHandlerConfig{
  44. {
  45. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  46. },
  47. },
  48. }
  49. servers, err := InitializeServerConfigs(serverConfig)
  50. assert(err, IsNil)
  51. {
  52. transport := &http.Transport{
  53. Proxy: func(req *http.Request) (*url.URL, error) {
  54. return url.Parse("http://127.0.0.1:" + serverPort.String())
  55. },
  56. }
  57. client := &http.Client{
  58. Transport: transport,
  59. }
  60. resp, err := client.Get("http://127.0.0.1:" + httpServerPort.String())
  61. assert(err, IsNil)
  62. assert(resp.StatusCode, Equals, 200)
  63. content, err := ioutil.ReadAll(resp.Body)
  64. assert(err, IsNil)
  65. assert(string(content), Equals, "Home")
  66. }
  67. CloseAllServers(servers)
  68. }
  69. func TestHttpConnectMethod(t *testing.T) {
  70. assert := With(t)
  71. tcpServer := tcp.Server{
  72. MsgProcessor: xor,
  73. }
  74. dest, err := tcpServer.Start()
  75. assert(err, IsNil)
  76. defer tcpServer.Close()
  77. serverPort := tcp.PickPort()
  78. serverConfig := &core.Config{
  79. Inbound: []*core.InboundHandlerConfig{
  80. {
  81. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  82. PortRange: net.SinglePortRange(serverPort),
  83. Listen: net.NewIPOrDomain(net.LocalHostIP),
  84. }),
  85. ProxySettings: serial.ToTypedMessage(&v2http.ServerConfig{}),
  86. },
  87. },
  88. Outbound: []*core.OutboundHandlerConfig{
  89. {
  90. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  91. },
  92. },
  93. }
  94. servers, err := InitializeServerConfigs(serverConfig)
  95. assert(err, IsNil)
  96. {
  97. transport := &http.Transport{
  98. Proxy: func(req *http.Request) (*url.URL, error) {
  99. return url.Parse("http://127.0.0.1:" + serverPort.String())
  100. },
  101. }
  102. client := &http.Client{
  103. Transport: transport,
  104. }
  105. payload := make([]byte, 1024*64)
  106. common.Must2(rand.Read(payload))
  107. req, err := http.NewRequest("Connect", "http://"+dest.NetAddr()+"/", bytes.NewReader(payload))
  108. req.Header.Set("X-a", "b")
  109. req.Header.Set("X-b", "d")
  110. common.Must(err)
  111. resp, err := client.Do(req)
  112. assert(err, IsNil)
  113. assert(resp.StatusCode, Equals, 200)
  114. content := make([]byte, len(payload))
  115. common.Must2(io.ReadFull(resp.Body, content))
  116. assert(err, IsNil)
  117. assert(content, Equals, xor(payload))
  118. }
  119. CloseAllServers(servers)
  120. }
  121. func TestHttpPost(t *testing.T) {
  122. assert := With(t)
  123. httpServerPort := tcp.PickPort()
  124. httpServer := &v2httptest.Server{
  125. Port: httpServerPort,
  126. PathHandler: map[string]http.HandlerFunc{
  127. "/testpost": func(w http.ResponseWriter, r *http.Request) {
  128. payload, err := buf.ReadAllToBytes(r.Body)
  129. r.Body.Close()
  130. if err != nil {
  131. w.WriteHeader(500)
  132. w.Write([]byte("Unable to read all payload"))
  133. return
  134. }
  135. payload = xor(payload)
  136. w.Write(payload)
  137. },
  138. },
  139. }
  140. _, err := httpServer.Start()
  141. assert(err, IsNil)
  142. defer httpServer.Close()
  143. serverPort := tcp.PickPort()
  144. serverConfig := &core.Config{
  145. Inbound: []*core.InboundHandlerConfig{
  146. {
  147. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  148. PortRange: net.SinglePortRange(serverPort),
  149. Listen: net.NewIPOrDomain(net.LocalHostIP),
  150. }),
  151. ProxySettings: serial.ToTypedMessage(&v2http.ServerConfig{}),
  152. },
  153. },
  154. Outbound: []*core.OutboundHandlerConfig{
  155. {
  156. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  157. },
  158. },
  159. }
  160. servers, err := InitializeServerConfigs(serverConfig)
  161. assert(err, IsNil)
  162. {
  163. transport := &http.Transport{
  164. Proxy: func(req *http.Request) (*url.URL, error) {
  165. return url.Parse("http://127.0.0.1:" + serverPort.String())
  166. },
  167. }
  168. client := &http.Client{
  169. Transport: transport,
  170. }
  171. payload := make([]byte, 1024*64)
  172. common.Must2(rand.Read(payload))
  173. resp, err := client.Post("http://127.0.0.1:"+httpServerPort.String()+"/testpost", "application/x-www-form-urlencoded", bytes.NewReader(payload))
  174. assert(err, IsNil)
  175. assert(resp.StatusCode, Equals, 200)
  176. content, err := ioutil.ReadAll(resp.Body)
  177. assert(err, IsNil)
  178. assert(content, Equals, xor(payload))
  179. }
  180. CloseAllServers(servers)
  181. }
  182. func setProxyBasicAuth(req *http.Request, user, pass string) {
  183. req.SetBasicAuth(user, pass)
  184. req.Header.Set("Proxy-Authorization", req.Header.Get("Authorization"))
  185. req.Header.Del("Authorization")
  186. }
  187. func TestHttpBasicAuth(t *testing.T) {
  188. assert := With(t)
  189. httpServerPort := tcp.PickPort()
  190. httpServer := &v2httptest.Server{
  191. Port: httpServerPort,
  192. PathHandler: make(map[string]http.HandlerFunc),
  193. }
  194. _, err := httpServer.Start()
  195. assert(err, IsNil)
  196. defer httpServer.Close()
  197. serverPort := tcp.PickPort()
  198. serverConfig := &core.Config{
  199. Inbound: []*core.InboundHandlerConfig{
  200. {
  201. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  202. PortRange: net.SinglePortRange(serverPort),
  203. Listen: net.NewIPOrDomain(net.LocalHostIP),
  204. }),
  205. ProxySettings: serial.ToTypedMessage(&v2http.ServerConfig{
  206. Accounts: map[string]string{
  207. "a": "b",
  208. },
  209. }),
  210. },
  211. },
  212. Outbound: []*core.OutboundHandlerConfig{
  213. {
  214. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  215. },
  216. },
  217. }
  218. servers, err := InitializeServerConfigs(serverConfig)
  219. assert(err, IsNil)
  220. {
  221. transport := &http.Transport{
  222. Proxy: func(req *http.Request) (*url.URL, error) {
  223. return url.Parse("http://127.0.0.1:" + serverPort.String())
  224. },
  225. }
  226. client := &http.Client{
  227. Transport: transport,
  228. }
  229. {
  230. resp, err := client.Get("http://127.0.0.1:" + httpServerPort.String())
  231. assert(err, IsNil)
  232. assert(resp.StatusCode, Equals, 407)
  233. }
  234. {
  235. req, err := http.NewRequest("GET", "http://127.0.0.1:"+httpServerPort.String(), nil)
  236. assert(err, IsNil)
  237. setProxyBasicAuth(req, "a", "c")
  238. resp, err := client.Do(req)
  239. assert(err, IsNil)
  240. assert(resp.StatusCode, Equals, 407)
  241. }
  242. {
  243. req, err := http.NewRequest("GET", "http://127.0.0.1:"+httpServerPort.String(), nil)
  244. assert(err, IsNil)
  245. setProxyBasicAuth(req, "a", "b")
  246. resp, err := client.Do(req)
  247. assert(err, IsNil)
  248. assert(resp.StatusCode, Equals, 200)
  249. content, err := ioutil.ReadAll(resp.Body)
  250. assert(err, IsNil)
  251. assert(string(content), Equals, "Home")
  252. }
  253. }
  254. CloseAllServers(servers)
  255. }