feature_test.go 19 KB

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