http_test.go 8.0 KB

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