browser_client.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. package splithttp
  2. import (
  3. "context"
  4. "io"
  5. "io/ioutil"
  6. gonet "net"
  7. "github.com/xtls/xray-core/transport/internet/browser_dialer"
  8. "github.com/xtls/xray-core/transport/internet/websocket"
  9. )
  10. // implements splithttp.DialerClient in terms of browser dialer
  11. // has no fields because everything is global state :O)
  12. type BrowserDialerClient struct{}
  13. func (c *BrowserDialerClient) Open(ctx context.Context, pureURL string) (io.WriteCloser, io.ReadCloser) {
  14. panic("not implemented yet")
  15. }
  16. func (c *BrowserDialerClient) OpenUpload(ctx context.Context, baseURL string) io.WriteCloser {
  17. panic("not implemented yet")
  18. }
  19. func (c *BrowserDialerClient) OpenDownload(ctx context.Context, baseURL string) (io.ReadCloser, gonet.Addr, gonet.Addr, error) {
  20. conn, err := browser_dialer.DialGet(baseURL)
  21. dummyAddr := &gonet.IPAddr{}
  22. if err != nil {
  23. return nil, dummyAddr, dummyAddr, err
  24. }
  25. return websocket.NewConnection(conn, dummyAddr, nil, 0), conn.RemoteAddr(), conn.LocalAddr(), nil
  26. }
  27. func (c *BrowserDialerClient) SendUploadRequest(ctx context.Context, url string, payload io.ReadWriteCloser, contentLength int64) error {
  28. bytes, err := ioutil.ReadAll(payload)
  29. if err != nil {
  30. return err
  31. }
  32. err = browser_dialer.DialPost(url, bytes)
  33. if err != nil {
  34. return err
  35. }
  36. return nil
  37. }