feature_test.go 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748
  1. package scenarios
  2. import (
  3. "net"
  4. "net/http"
  5. "net/url"
  6. "testing"
  7. "time"
  8. "io/ioutil"
  9. xproxy "golang.org/x/net/proxy"
  10. "v2ray.com/core"
  11. "v2ray.com/core/app/log"
  12. "v2ray.com/core/app/proxyman"
  13. "v2ray.com/core/app/router"
  14. v2net "v2ray.com/core/common/net"
  15. "v2ray.com/core/common/protocol"
  16. "v2ray.com/core/common/serial"
  17. "v2ray.com/core/common/uuid"
  18. "v2ray.com/core/proxy/blackhole"
  19. "v2ray.com/core/proxy/dokodemo"
  20. "v2ray.com/core/proxy/freedom"
  21. v2http "v2ray.com/core/proxy/http"
  22. "v2ray.com/core/proxy/socks"
  23. "v2ray.com/core/proxy/vmess"
  24. "v2ray.com/core/proxy/vmess/inbound"
  25. "v2ray.com/core/proxy/vmess/outbound"
  26. "v2ray.com/core/testing/assert"
  27. "v2ray.com/core/testing/servers/tcp"
  28. "v2ray.com/core/testing/servers/udp"
  29. "v2ray.com/core/transport/internet"
  30. )
  31. func TestPassiveConnection(t *testing.T) {
  32. assert := assert.On(t)
  33. tcpServer := tcp.Server{
  34. MsgProcessor: xor,
  35. SendFirst: []byte("send first"),
  36. }
  37. dest, err := tcpServer.Start()
  38. assert.Error(err).IsNil()
  39. defer tcpServer.Close()
  40. serverPort := pickPort()
  41. serverConfig := &core.Config{
  42. Inbound: []*proxyman.InboundHandlerConfig{
  43. {
  44. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  45. PortRange: v2net.SinglePortRange(serverPort),
  46. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  47. }),
  48. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  49. Address: v2net.NewIPOrDomain(dest.Address),
  50. Port: uint32(dest.Port),
  51. NetworkList: &v2net.NetworkList{
  52. Network: []v2net.Network{v2net.Network_TCP},
  53. },
  54. }),
  55. },
  56. },
  57. Outbound: []*proxyman.OutboundHandlerConfig{
  58. {
  59. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  60. },
  61. },
  62. }
  63. assert.Error(InitializeServerConfig(serverConfig)).IsNil()
  64. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  65. IP: []byte{127, 0, 0, 1},
  66. Port: int(serverPort),
  67. })
  68. assert.Error(err).IsNil()
  69. {
  70. response := make([]byte, 1024)
  71. nBytes, err := conn.Read(response)
  72. assert.Error(err).IsNil()
  73. assert.String(string(response[:nBytes])).Equals("send first")
  74. }
  75. payload := "dokodemo request."
  76. {
  77. nBytes, err := conn.Write([]byte(payload))
  78. assert.Error(err).IsNil()
  79. assert.Int(nBytes).Equals(len(payload))
  80. }
  81. {
  82. response := make([]byte, 1024)
  83. nBytes, err := conn.Read(response)
  84. assert.Error(err).IsNil()
  85. assert.Bytes(response[:nBytes]).Equals(xor([]byte(payload)))
  86. }
  87. assert.Error(conn.Close()).IsNil()
  88. CloseAllServers()
  89. }
  90. func TestProxy(t *testing.T) {
  91. assert := assert.On(t)
  92. tcpServer := tcp.Server{
  93. MsgProcessor: xor,
  94. }
  95. dest, err := tcpServer.Start()
  96. assert.Error(err).IsNil()
  97. defer tcpServer.Close()
  98. serverUserID := protocol.NewID(uuid.New())
  99. serverPort := pickPort()
  100. serverConfig := &core.Config{
  101. Inbound: []*proxyman.InboundHandlerConfig{
  102. {
  103. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  104. PortRange: v2net.SinglePortRange(serverPort),
  105. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  106. }),
  107. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  108. User: []*protocol.User{
  109. {
  110. Account: serial.ToTypedMessage(&vmess.Account{
  111. Id: serverUserID.String(),
  112. }),
  113. },
  114. },
  115. }),
  116. },
  117. },
  118. Outbound: []*proxyman.OutboundHandlerConfig{
  119. {
  120. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  121. },
  122. },
  123. }
  124. proxyUserID := protocol.NewID(uuid.New())
  125. proxyPort := pickPort()
  126. proxyConfig := &core.Config{
  127. Inbound: []*proxyman.InboundHandlerConfig{
  128. {
  129. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  130. PortRange: v2net.SinglePortRange(proxyPort),
  131. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  132. }),
  133. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  134. User: []*protocol.User{
  135. {
  136. Account: serial.ToTypedMessage(&vmess.Account{
  137. Id: proxyUserID.String(),
  138. }),
  139. },
  140. },
  141. }),
  142. },
  143. },
  144. Outbound: []*proxyman.OutboundHandlerConfig{
  145. {
  146. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  147. },
  148. },
  149. }
  150. clientPort := pickPort()
  151. clientConfig := &core.Config{
  152. Inbound: []*proxyman.InboundHandlerConfig{
  153. {
  154. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  155. PortRange: v2net.SinglePortRange(clientPort),
  156. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  157. }),
  158. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  159. Address: v2net.NewIPOrDomain(dest.Address),
  160. Port: uint32(dest.Port),
  161. NetworkList: &v2net.NetworkList{
  162. Network: []v2net.Network{v2net.Network_TCP},
  163. },
  164. }),
  165. },
  166. },
  167. Outbound: []*proxyman.OutboundHandlerConfig{
  168. {
  169. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  170. Receiver: []*protocol.ServerEndpoint{
  171. {
  172. Address: v2net.NewIPOrDomain(v2net.LocalHostIP),
  173. Port: uint32(serverPort),
  174. User: []*protocol.User{
  175. {
  176. Account: serial.ToTypedMessage(&vmess.Account{
  177. Id: serverUserID.String(),
  178. }),
  179. },
  180. },
  181. },
  182. },
  183. }),
  184. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  185. ProxySettings: &internet.ProxyConfig{
  186. Tag: "proxy",
  187. },
  188. }),
  189. },
  190. {
  191. Tag: "proxy",
  192. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  193. Receiver: []*protocol.ServerEndpoint{
  194. {
  195. Address: v2net.NewIPOrDomain(v2net.LocalHostIP),
  196. Port: uint32(proxyPort),
  197. User: []*protocol.User{
  198. {
  199. Account: serial.ToTypedMessage(&vmess.Account{
  200. Id: proxyUserID.String(),
  201. }),
  202. },
  203. },
  204. },
  205. },
  206. }),
  207. },
  208. },
  209. }
  210. assert.Error(InitializeServerConfig(serverConfig)).IsNil()
  211. assert.Error(InitializeServerConfig(proxyConfig)).IsNil()
  212. assert.Error(InitializeServerConfig(clientConfig)).IsNil()
  213. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  214. IP: []byte{127, 0, 0, 1},
  215. Port: int(clientPort),
  216. })
  217. assert.Error(err).IsNil()
  218. payload := "dokodemo request."
  219. nBytes, err := conn.Write([]byte(payload))
  220. assert.Error(err).IsNil()
  221. assert.Int(nBytes).Equals(len(payload))
  222. response := make([]byte, 1024)
  223. nBytes, err = conn.Read(response)
  224. assert.Error(err).IsNil()
  225. assert.Bytes(response[:nBytes]).Equals(xor([]byte(payload)))
  226. assert.Error(conn.Close()).IsNil()
  227. CloseAllServers()
  228. }
  229. func TestProxyOverKCP(t *testing.T) {
  230. assert := assert.On(t)
  231. tcpServer := tcp.Server{
  232. MsgProcessor: xor,
  233. }
  234. dest, err := tcpServer.Start()
  235. assert.Error(err).IsNil()
  236. defer tcpServer.Close()
  237. serverUserID := protocol.NewID(uuid.New())
  238. serverPort := pickPort()
  239. serverConfig := &core.Config{
  240. Inbound: []*proxyman.InboundHandlerConfig{
  241. {
  242. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  243. PortRange: v2net.SinglePortRange(serverPort),
  244. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  245. StreamSettings: &internet.StreamConfig{
  246. Protocol: internet.TransportProtocol_MKCP,
  247. },
  248. }),
  249. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  250. User: []*protocol.User{
  251. {
  252. Account: serial.ToTypedMessage(&vmess.Account{
  253. Id: serverUserID.String(),
  254. }),
  255. },
  256. },
  257. }),
  258. },
  259. },
  260. Outbound: []*proxyman.OutboundHandlerConfig{
  261. {
  262. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  263. },
  264. },
  265. }
  266. proxyUserID := protocol.NewID(uuid.New())
  267. proxyPort := pickPort()
  268. proxyConfig := &core.Config{
  269. Inbound: []*proxyman.InboundHandlerConfig{
  270. {
  271. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  272. PortRange: v2net.SinglePortRange(proxyPort),
  273. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  274. }),
  275. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  276. User: []*protocol.User{
  277. {
  278. Account: serial.ToTypedMessage(&vmess.Account{
  279. Id: proxyUserID.String(),
  280. }),
  281. },
  282. },
  283. }),
  284. },
  285. },
  286. Outbound: []*proxyman.OutboundHandlerConfig{
  287. {
  288. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  289. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  290. StreamSettings: &internet.StreamConfig{
  291. Protocol: internet.TransportProtocol_MKCP,
  292. },
  293. }),
  294. },
  295. },
  296. }
  297. clientPort := pickPort()
  298. clientConfig := &core.Config{
  299. Inbound: []*proxyman.InboundHandlerConfig{
  300. {
  301. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  302. PortRange: v2net.SinglePortRange(clientPort),
  303. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  304. }),
  305. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  306. Address: v2net.NewIPOrDomain(dest.Address),
  307. Port: uint32(dest.Port),
  308. NetworkList: &v2net.NetworkList{
  309. Network: []v2net.Network{v2net.Network_TCP},
  310. },
  311. }),
  312. },
  313. },
  314. Outbound: []*proxyman.OutboundHandlerConfig{
  315. {
  316. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  317. Receiver: []*protocol.ServerEndpoint{
  318. {
  319. Address: v2net.NewIPOrDomain(v2net.LocalHostIP),
  320. Port: uint32(serverPort),
  321. User: []*protocol.User{
  322. {
  323. Account: serial.ToTypedMessage(&vmess.Account{
  324. Id: serverUserID.String(),
  325. }),
  326. },
  327. },
  328. },
  329. },
  330. }),
  331. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  332. ProxySettings: &internet.ProxyConfig{
  333. Tag: "proxy",
  334. },
  335. StreamSettings: &internet.StreamConfig{
  336. Protocol: internet.TransportProtocol_MKCP,
  337. },
  338. }),
  339. },
  340. {
  341. Tag: "proxy",
  342. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  343. Receiver: []*protocol.ServerEndpoint{
  344. {
  345. Address: v2net.NewIPOrDomain(v2net.LocalHostIP),
  346. Port: uint32(proxyPort),
  347. User: []*protocol.User{
  348. {
  349. Account: serial.ToTypedMessage(&vmess.Account{
  350. Id: proxyUserID.String(),
  351. }),
  352. },
  353. },
  354. },
  355. },
  356. }),
  357. },
  358. },
  359. }
  360. assert.Error(InitializeServerConfig(serverConfig)).IsNil()
  361. assert.Error(InitializeServerConfig(proxyConfig)).IsNil()
  362. assert.Error(InitializeServerConfig(clientConfig)).IsNil()
  363. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  364. IP: []byte{127, 0, 0, 1},
  365. Port: int(clientPort),
  366. })
  367. assert.Error(err).IsNil()
  368. payload := "dokodemo request."
  369. nBytes, err := conn.Write([]byte(payload))
  370. assert.Error(err).IsNil()
  371. assert.Int(nBytes).Equals(len(payload))
  372. response := make([]byte, 1024)
  373. nBytes, err = conn.Read(response)
  374. assert.Error(err).IsNil()
  375. assert.Bytes(response[:nBytes]).Equals(xor([]byte(payload)))
  376. assert.Error(conn.Close()).IsNil()
  377. CloseAllServers()
  378. }
  379. func TestBlackhole(t *testing.T) {
  380. assert := assert.On(t)
  381. tcpServer := tcp.Server{
  382. MsgProcessor: xor,
  383. }
  384. dest, err := tcpServer.Start()
  385. assert.Error(err).IsNil()
  386. defer tcpServer.Close()
  387. tcpServer2 := tcp.Server{
  388. MsgProcessor: xor,
  389. }
  390. dest2, err := tcpServer2.Start()
  391. assert.Error(err).IsNil()
  392. defer tcpServer2.Close()
  393. serverPort := pickPort()
  394. serverPort2 := pickPort()
  395. serverConfig := &core.Config{
  396. Inbound: []*proxyman.InboundHandlerConfig{
  397. {
  398. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  399. PortRange: v2net.SinglePortRange(serverPort),
  400. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  401. }),
  402. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  403. Address: v2net.NewIPOrDomain(dest.Address),
  404. Port: uint32(dest.Port),
  405. NetworkList: &v2net.NetworkList{
  406. Network: []v2net.Network{v2net.Network_TCP},
  407. },
  408. }),
  409. },
  410. {
  411. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  412. PortRange: v2net.SinglePortRange(serverPort2),
  413. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  414. }),
  415. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  416. Address: v2net.NewIPOrDomain(dest2.Address),
  417. Port: uint32(dest2.Port),
  418. NetworkList: &v2net.NetworkList{
  419. Network: []v2net.Network{v2net.Network_TCP},
  420. },
  421. }),
  422. },
  423. },
  424. Outbound: []*proxyman.OutboundHandlerConfig{
  425. {
  426. Tag: "direct",
  427. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  428. },
  429. {
  430. Tag: "blocked",
  431. ProxySettings: serial.ToTypedMessage(&blackhole.Config{}),
  432. },
  433. },
  434. App: []*serial.TypedMessage{
  435. serial.ToTypedMessage(&router.Config{
  436. Rule: []*router.RoutingRule{
  437. {
  438. Tag: "blocked",
  439. PortRange: v2net.SinglePortRange(dest2.Port),
  440. },
  441. },
  442. }),
  443. },
  444. }
  445. assert.Error(InitializeServerConfig(serverConfig)).IsNil()
  446. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  447. IP: []byte{127, 0, 0, 1},
  448. Port: int(serverPort2),
  449. })
  450. assert.Error(err).IsNil()
  451. payload := "dokodemo request."
  452. {
  453. nBytes, err := conn.Write([]byte(payload))
  454. assert.Error(err).IsNil()
  455. assert.Int(nBytes).Equals(len(payload))
  456. }
  457. {
  458. response := make([]byte, 1024)
  459. _, err := conn.Read(response)
  460. assert.Error(err).IsNotNil()
  461. }
  462. assert.Error(conn.Close()).IsNil()
  463. CloseAllServers()
  464. }
  465. func TestForward(t *testing.T) {
  466. assert := assert.On(t)
  467. tcpServer := tcp.Server{
  468. MsgProcessor: xor,
  469. }
  470. dest, err := tcpServer.Start()
  471. assert.Error(err).IsNil()
  472. defer tcpServer.Close()
  473. serverPort := pickPort()
  474. serverConfig := &core.Config{
  475. Inbound: []*proxyman.InboundHandlerConfig{
  476. {
  477. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  478. PortRange: v2net.SinglePortRange(serverPort),
  479. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  480. }),
  481. ProxySettings: serial.ToTypedMessage(&socks.ServerConfig{
  482. AuthType: socks.AuthType_NO_AUTH,
  483. Accounts: map[string]string{
  484. "Test Account": "Test Password",
  485. },
  486. Address: v2net.NewIPOrDomain(v2net.LocalHostIP),
  487. UdpEnabled: false,
  488. }),
  489. },
  490. },
  491. Outbound: []*proxyman.OutboundHandlerConfig{
  492. {
  493. ProxySettings: serial.ToTypedMessage(&freedom.Config{
  494. DestinationOverride: &freedom.DestinationOverride{
  495. Server: &protocol.ServerEndpoint{
  496. Address: v2net.NewIPOrDomain(v2net.LocalHostIP),
  497. Port: uint32(dest.Port),
  498. },
  499. },
  500. }),
  501. },
  502. },
  503. }
  504. assert.Error(InitializeServerConfig(serverConfig)).IsNil()
  505. {
  506. noAuthDialer, err := xproxy.SOCKS5("tcp", v2net.TCPDestination(v2net.LocalHostIP, serverPort).NetAddr(), nil, xproxy.Direct)
  507. assert.Error(err).IsNil()
  508. conn, err := noAuthDialer.Dial("tcp", "google.com:80")
  509. assert.Error(err).IsNil()
  510. payload := "test payload"
  511. nBytes, err := conn.Write([]byte(payload))
  512. assert.Error(err).IsNil()
  513. assert.Int(nBytes).Equals(len(payload))
  514. response := make([]byte, 1024)
  515. nBytes, err = conn.Read(response)
  516. assert.Error(err).IsNil()
  517. assert.Bytes(response[:nBytes]).Equals(xor([]byte(payload)))
  518. assert.Error(conn.Close()).IsNil()
  519. }
  520. CloseAllServers()
  521. }
  522. func TestUDPConnection(t *testing.T) {
  523. assert := assert.On(t)
  524. udpServer := udp.Server{
  525. MsgProcessor: xor,
  526. }
  527. dest, err := udpServer.Start()
  528. assert.Error(err).IsNil()
  529. defer udpServer.Close()
  530. clientPort := pickPort()
  531. clientConfig := &core.Config{
  532. Inbound: []*proxyman.InboundHandlerConfig{
  533. {
  534. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  535. PortRange: v2net.SinglePortRange(clientPort),
  536. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  537. }),
  538. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  539. Address: v2net.NewIPOrDomain(dest.Address),
  540. Port: uint32(dest.Port),
  541. NetworkList: &v2net.NetworkList{
  542. Network: []v2net.Network{v2net.Network_UDP},
  543. },
  544. }),
  545. },
  546. },
  547. Outbound: []*proxyman.OutboundHandlerConfig{
  548. {
  549. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  550. },
  551. },
  552. }
  553. assert.Error(InitializeServerConfig(clientConfig)).IsNil()
  554. {
  555. conn, err := net.DialUDP("udp", nil, &net.UDPAddr{
  556. IP: []byte{127, 0, 0, 1},
  557. Port: int(clientPort),
  558. })
  559. assert.Error(err).IsNil()
  560. payload := "dokodemo request."
  561. for i := 0; i < 5; i++ {
  562. nBytes, err := conn.Write([]byte(payload))
  563. assert.Error(err).IsNil()
  564. assert.Int(nBytes).Equals(len(payload))
  565. response := make([]byte, 1024)
  566. nBytes, err = conn.Read(response)
  567. assert.Error(err).IsNil()
  568. assert.Bytes(response[:nBytes]).Equals(xor([]byte(payload)))
  569. }
  570. assert.Error(conn.Close()).IsNil()
  571. }
  572. time.Sleep(20 * time.Second)
  573. {
  574. conn, err := net.DialUDP("udp", nil, &net.UDPAddr{
  575. IP: []byte{127, 0, 0, 1},
  576. Port: int(clientPort),
  577. })
  578. assert.Error(err).IsNil()
  579. payload := "dokodemo request."
  580. nBytes, err := conn.Write([]byte(payload))
  581. assert.Error(err).IsNil()
  582. assert.Int(nBytes).Equals(len(payload))
  583. response := make([]byte, 1024)
  584. nBytes, err = conn.Read(response)
  585. assert.Error(err).IsNil()
  586. assert.Bytes(response[:nBytes]).Equals(xor([]byte(payload)))
  587. assert.Error(conn.Close()).IsNil()
  588. }
  589. CloseAllServers()
  590. }
  591. func TestDomainSniffing(t *testing.T) {
  592. assert := assert.On(t)
  593. sniffingPort := pickPort()
  594. httpPort := pickPort()
  595. serverConfig := &core.Config{
  596. Inbound: []*proxyman.InboundHandlerConfig{
  597. {
  598. Tag: "snif",
  599. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  600. PortRange: v2net.SinglePortRange(sniffingPort),
  601. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  602. DomainOverride: []proxyman.KnownProtocols{
  603. proxyman.KnownProtocols_TLS,
  604. },
  605. }),
  606. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  607. Address: v2net.NewIPOrDomain(v2net.LocalHostIP),
  608. Port: 443,
  609. NetworkList: &v2net.NetworkList{
  610. Network: []v2net.Network{v2net.Network_TCP},
  611. },
  612. }),
  613. },
  614. {
  615. Tag: "http",
  616. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  617. PortRange: v2net.SinglePortRange(httpPort),
  618. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  619. }),
  620. ProxySettings: serial.ToTypedMessage(&v2http.ServerConfig{}),
  621. },
  622. },
  623. Outbound: []*proxyman.OutboundHandlerConfig{
  624. {
  625. Tag: "redir",
  626. ProxySettings: serial.ToTypedMessage(&freedom.Config{
  627. DestinationOverride: &freedom.DestinationOverride{
  628. Server: &protocol.ServerEndpoint{
  629. Address: v2net.NewIPOrDomain(v2net.LocalHostIP),
  630. Port: uint32(sniffingPort),
  631. },
  632. },
  633. }),
  634. },
  635. {
  636. Tag: "direct",
  637. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  638. },
  639. },
  640. App: []*serial.TypedMessage{
  641. serial.ToTypedMessage(&router.Config{
  642. Rule: []*router.RoutingRule{
  643. {
  644. Tag: "direct",
  645. InboundTag: []string{"snif"},
  646. }, {
  647. Tag: "redir",
  648. InboundTag: []string{"http"},
  649. },
  650. },
  651. }),
  652. serial.ToTypedMessage(&log.Config{
  653. ErrorLogLevel: log.LogLevel_Debug,
  654. ErrorLogType: log.LogType_Console,
  655. }),
  656. },
  657. }
  658. assert.Error(InitializeServerConfig(serverConfig)).IsNil()
  659. {
  660. transport := &http.Transport{
  661. Proxy: func(req *http.Request) (*url.URL, error) {
  662. return url.Parse("http://127.0.0.1:" + httpPort.String())
  663. },
  664. }
  665. client := &http.Client{
  666. Transport: transport,
  667. }
  668. resp, err := client.Get("https://www.github.com/")
  669. assert.Error(err).IsNil()
  670. assert.Int(resp.StatusCode).Equals(200)
  671. assert.Error(resp.Write(ioutil.Discard)).IsNil()
  672. }
  673. CloseAllServers()
  674. }