http_test.go 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  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 := 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 := pickPort()
  33. serverConfig := &core.Config{
  34. Inbound: []*proxyman.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: []*proxyman.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 := pickPort()
  78. serverConfig := &core.Config{
  79. Inbound: []*proxyman.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: []*proxyman.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. common.Must(err)
  109. resp, err := client.Do(req)
  110. assert(err, IsNil)
  111. assert(resp.StatusCode, Equals, 200)
  112. content := make([]byte, len(payload))
  113. common.Must2(io.ReadFull(resp.Body, content))
  114. assert(err, IsNil)
  115. assert(content, Equals, xor(payload))
  116. }
  117. CloseAllServers(servers)
  118. }
  119. func TestHttpPost(t *testing.T) {
  120. assert := With(t)
  121. httpServerPort := pickPort()
  122. httpServer := &v2httptest.Server{
  123. Port: httpServerPort,
  124. PathHandler: map[string]http.HandlerFunc{
  125. "/testpost": func(w http.ResponseWriter, r *http.Request) {
  126. payload, err := buf.ReadAllToBytes(r.Body)
  127. r.Body.Close()
  128. if err != nil {
  129. w.WriteHeader(500)
  130. w.Write([]byte("Unable to read all payload"))
  131. return
  132. }
  133. payload = xor(payload)
  134. w.Write(payload)
  135. },
  136. },
  137. }
  138. _, err := httpServer.Start()
  139. assert(err, IsNil)
  140. defer httpServer.Close()
  141. serverPort := pickPort()
  142. serverConfig := &core.Config{
  143. Inbound: []*proxyman.InboundHandlerConfig{
  144. {
  145. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  146. PortRange: net.SinglePortRange(serverPort),
  147. Listen: net.NewIPOrDomain(net.LocalHostIP),
  148. }),
  149. ProxySettings: serial.ToTypedMessage(&v2http.ServerConfig{}),
  150. },
  151. },
  152. Outbound: []*proxyman.OutboundHandlerConfig{
  153. {
  154. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  155. },
  156. },
  157. }
  158. servers, err := InitializeServerConfigs(serverConfig)
  159. assert(err, IsNil)
  160. {
  161. transport := &http.Transport{
  162. Proxy: func(req *http.Request) (*url.URL, error) {
  163. return url.Parse("http://127.0.0.1:" + serverPort.String())
  164. },
  165. }
  166. client := &http.Client{
  167. Transport: transport,
  168. }
  169. payload := make([]byte, 1024*64)
  170. common.Must2(rand.Read(payload))
  171. resp, err := client.Post("http://127.0.0.1:"+httpServerPort.String()+"/testpost", "application/x-www-form-urlencoded", bytes.NewReader(payload))
  172. assert(err, IsNil)
  173. assert(resp.StatusCode, Equals, 200)
  174. content, err := ioutil.ReadAll(resp.Body)
  175. assert(err, IsNil)
  176. assert(content, Equals, xor(payload))
  177. }
  178. CloseAllServers(servers)
  179. }
  180. func setProxyBasicAuth(req *http.Request, user, pass string) {
  181. req.SetBasicAuth(user, pass)
  182. req.Header.Set("Proxy-Authorization", req.Header.Get("Authorization"))
  183. req.Header.Del("Authorization")
  184. }
  185. func TestHttpBasicAuth(t *testing.T) {
  186. assert := With(t)
  187. httpServerPort := pickPort()
  188. httpServer := &v2httptest.Server{
  189. Port: httpServerPort,
  190. PathHandler: make(map[string]http.HandlerFunc),
  191. }
  192. _, err := httpServer.Start()
  193. assert(err, IsNil)
  194. defer httpServer.Close()
  195. serverPort := pickPort()
  196. serverConfig := &core.Config{
  197. Inbound: []*proxyman.InboundHandlerConfig{
  198. {
  199. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  200. PortRange: net.SinglePortRange(serverPort),
  201. Listen: net.NewIPOrDomain(net.LocalHostIP),
  202. }),
  203. ProxySettings: serial.ToTypedMessage(&v2http.ServerConfig{
  204. Accounts: map[string]string{
  205. "a": "b",
  206. },
  207. }),
  208. },
  209. },
  210. Outbound: []*proxyman.OutboundHandlerConfig{
  211. {
  212. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  213. },
  214. },
  215. }
  216. servers, err := InitializeServerConfigs(serverConfig)
  217. assert(err, IsNil)
  218. {
  219. transport := &http.Transport{
  220. Proxy: func(req *http.Request) (*url.URL, error) {
  221. return url.Parse("http://127.0.0.1:" + serverPort.String())
  222. },
  223. }
  224. client := &http.Client{
  225. Transport: transport,
  226. }
  227. {
  228. resp, err := client.Get("http://127.0.0.1:" + httpServerPort.String())
  229. assert(err, IsNil)
  230. assert(resp.StatusCode, Equals, 407)
  231. }
  232. {
  233. req, err := http.NewRequest("GET", "http://127.0.0.1:"+httpServerPort.String(), nil)
  234. assert(err, IsNil)
  235. setProxyBasicAuth(req, "a", "c")
  236. resp, err := client.Do(req)
  237. assert(err, IsNil)
  238. assert(resp.StatusCode, Equals, 401)
  239. }
  240. {
  241. req, err := http.NewRequest("GET", "http://127.0.0.1:"+httpServerPort.String(), nil)
  242. assert(err, IsNil)
  243. setProxyBasicAuth(req, "a", "b")
  244. resp, err := client.Do(req)
  245. assert(err, IsNil)
  246. assert(resp.StatusCode, Equals, 200)
  247. content, err := ioutil.ReadAll(resp.Body)
  248. assert(err, IsNil)
  249. assert(string(content), Equals, "Home")
  250. }
  251. }
  252. CloseAllServers(servers)
  253. }