feature_test.go 19 KB

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