http_test.go 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  1. package scenarios
  2. import (
  3. "bytes"
  4. "crypto/rand"
  5. "io"
  6. "io/ioutil"
  7. "net/http"
  8. "net/url"
  9. "testing"
  10. "time"
  11. "v2ray.com/core/common"
  12. "v2ray.com/core/common/buf"
  13. "v2ray.com/core"
  14. "v2ray.com/core/app/proxyman"
  15. "v2ray.com/core/common/net"
  16. "v2ray.com/core/common/serial"
  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. tcpServer := tcp.Server{
  73. MsgProcessor: func(msg []byte) []byte {
  74. return []byte{}
  75. },
  76. }
  77. dest, err := tcpServer.Start()
  78. assert(err, IsNil)
  79. defer tcpServer.Close()
  80. time.AfterFunc(time.Second*2, func() {
  81. tcpServer.ShouldClose = true
  82. })
  83. serverPort := tcp.PickPort()
  84. serverConfig := &core.Config{
  85. Inbound: []*core.InboundHandlerConfig{
  86. {
  87. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  88. PortRange: net.SinglePortRange(serverPort),
  89. Listen: net.NewIPOrDomain(net.LocalHostIP),
  90. }),
  91. ProxySettings: serial.ToTypedMessage(&v2http.ServerConfig{}),
  92. },
  93. },
  94. Outbound: []*core.OutboundHandlerConfig{
  95. {
  96. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  97. },
  98. },
  99. }
  100. servers, err := InitializeServerConfigs(serverConfig)
  101. assert(err, IsNil)
  102. {
  103. transport := &http.Transport{
  104. Proxy: func(req *http.Request) (*url.URL, error) {
  105. return url.Parse("http://127.0.0.1:" + serverPort.String())
  106. },
  107. }
  108. client := &http.Client{
  109. Transport: transport,
  110. }
  111. resp, err := client.Get("http://127.0.0.1:" + dest.Port.String())
  112. assert(err, IsNil)
  113. assert(resp.StatusCode, Equals, 503)
  114. }
  115. CloseAllServers(servers)
  116. }
  117. func TestHttpConnectMethod(t *testing.T) {
  118. assert := With(t)
  119. tcpServer := tcp.Server{
  120. MsgProcessor: xor,
  121. }
  122. dest, err := tcpServer.Start()
  123. assert(err, IsNil)
  124. defer tcpServer.Close()
  125. serverPort := tcp.PickPort()
  126. serverConfig := &core.Config{
  127. Inbound: []*core.InboundHandlerConfig{
  128. {
  129. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  130. PortRange: net.SinglePortRange(serverPort),
  131. Listen: net.NewIPOrDomain(net.LocalHostIP),
  132. }),
  133. ProxySettings: serial.ToTypedMessage(&v2http.ServerConfig{}),
  134. },
  135. },
  136. Outbound: []*core.OutboundHandlerConfig{
  137. {
  138. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  139. },
  140. },
  141. }
  142. servers, err := InitializeServerConfigs(serverConfig)
  143. assert(err, IsNil)
  144. {
  145. transport := &http.Transport{
  146. Proxy: func(req *http.Request) (*url.URL, error) {
  147. return url.Parse("http://127.0.0.1:" + serverPort.String())
  148. },
  149. }
  150. client := &http.Client{
  151. Transport: transport,
  152. }
  153. payload := make([]byte, 1024*64)
  154. common.Must2(rand.Read(payload))
  155. req, err := http.NewRequest("Connect", "http://"+dest.NetAddr()+"/", bytes.NewReader(payload))
  156. req.Header.Set("X-a", "b")
  157. req.Header.Set("X-b", "d")
  158. common.Must(err)
  159. resp, err := client.Do(req)
  160. assert(err, IsNil)
  161. assert(resp.StatusCode, Equals, 200)
  162. content := make([]byte, len(payload))
  163. common.Must2(io.ReadFull(resp.Body, content))
  164. assert(err, IsNil)
  165. assert(content, Equals, xor(payload))
  166. }
  167. CloseAllServers(servers)
  168. }
  169. func TestHttpPost(t *testing.T) {
  170. assert := With(t)
  171. httpServerPort := tcp.PickPort()
  172. httpServer := &v2httptest.Server{
  173. Port: httpServerPort,
  174. PathHandler: map[string]http.HandlerFunc{
  175. "/testpost": func(w http.ResponseWriter, r *http.Request) {
  176. payload, err := buf.ReadAllToBytes(r.Body)
  177. r.Body.Close()
  178. if err != nil {
  179. w.WriteHeader(500)
  180. w.Write([]byte("Unable to read all payload"))
  181. return
  182. }
  183. payload = xor(payload)
  184. w.Write(payload)
  185. },
  186. },
  187. }
  188. _, err := httpServer.Start()
  189. assert(err, IsNil)
  190. defer httpServer.Close()
  191. serverPort := tcp.PickPort()
  192. serverConfig := &core.Config{
  193. Inbound: []*core.InboundHandlerConfig{
  194. {
  195. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  196. PortRange: net.SinglePortRange(serverPort),
  197. Listen: net.NewIPOrDomain(net.LocalHostIP),
  198. }),
  199. ProxySettings: serial.ToTypedMessage(&v2http.ServerConfig{}),
  200. },
  201. },
  202. Outbound: []*core.OutboundHandlerConfig{
  203. {
  204. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  205. },
  206. },
  207. }
  208. servers, err := InitializeServerConfigs(serverConfig)
  209. assert(err, IsNil)
  210. {
  211. transport := &http.Transport{
  212. Proxy: func(req *http.Request) (*url.URL, error) {
  213. return url.Parse("http://127.0.0.1:" + serverPort.String())
  214. },
  215. }
  216. client := &http.Client{
  217. Transport: transport,
  218. }
  219. payload := make([]byte, 1024*64)
  220. common.Must2(rand.Read(payload))
  221. resp, err := client.Post("http://127.0.0.1:"+httpServerPort.String()+"/testpost", "application/x-www-form-urlencoded", bytes.NewReader(payload))
  222. assert(err, IsNil)
  223. assert(resp.StatusCode, Equals, 200)
  224. content, err := ioutil.ReadAll(resp.Body)
  225. assert(err, IsNil)
  226. assert(content, Equals, xor(payload))
  227. }
  228. CloseAllServers(servers)
  229. }
  230. func setProxyBasicAuth(req *http.Request, user, pass string) {
  231. req.SetBasicAuth(user, pass)
  232. req.Header.Set("Proxy-Authorization", req.Header.Get("Authorization"))
  233. req.Header.Del("Authorization")
  234. }
  235. func TestHttpBasicAuth(t *testing.T) {
  236. assert := With(t)
  237. httpServerPort := tcp.PickPort()
  238. httpServer := &v2httptest.Server{
  239. Port: httpServerPort,
  240. PathHandler: make(map[string]http.HandlerFunc),
  241. }
  242. _, err := httpServer.Start()
  243. assert(err, IsNil)
  244. defer httpServer.Close()
  245. serverPort := tcp.PickPort()
  246. serverConfig := &core.Config{
  247. Inbound: []*core.InboundHandlerConfig{
  248. {
  249. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  250. PortRange: net.SinglePortRange(serverPort),
  251. Listen: net.NewIPOrDomain(net.LocalHostIP),
  252. }),
  253. ProxySettings: serial.ToTypedMessage(&v2http.ServerConfig{
  254. Accounts: map[string]string{
  255. "a": "b",
  256. },
  257. }),
  258. },
  259. },
  260. Outbound: []*core.OutboundHandlerConfig{
  261. {
  262. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  263. },
  264. },
  265. }
  266. servers, err := InitializeServerConfigs(serverConfig)
  267. assert(err, IsNil)
  268. {
  269. transport := &http.Transport{
  270. Proxy: func(req *http.Request) (*url.URL, error) {
  271. return url.Parse("http://127.0.0.1:" + serverPort.String())
  272. },
  273. }
  274. client := &http.Client{
  275. Transport: transport,
  276. }
  277. {
  278. resp, err := client.Get("http://127.0.0.1:" + httpServerPort.String())
  279. assert(err, IsNil)
  280. assert(resp.StatusCode, Equals, 407)
  281. }
  282. {
  283. req, err := http.NewRequest("GET", "http://127.0.0.1:"+httpServerPort.String(), nil)
  284. assert(err, IsNil)
  285. setProxyBasicAuth(req, "a", "c")
  286. resp, err := client.Do(req)
  287. assert(err, IsNil)
  288. assert(resp.StatusCode, Equals, 407)
  289. }
  290. {
  291. req, err := http.NewRequest("GET", "http://127.0.0.1:"+httpServerPort.String(), nil)
  292. assert(err, IsNil)
  293. setProxyBasicAuth(req, "a", "b")
  294. resp, err := client.Do(req)
  295. assert(err, IsNil)
  296. assert(resp.StatusCode, Equals, 200)
  297. content, err := ioutil.ReadAll(resp.Body)
  298. assert(err, IsNil)
  299. assert(string(content), Equals, "Home")
  300. }
  301. }
  302. CloseAllServers(servers)
  303. }