freedom.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package freedom
  2. import (
  3. "io"
  4. "net"
  5. "github.com/v2ray/v2ray-core"
  6. "github.com/v2ray/v2ray-core/log"
  7. v2net "github.com/v2ray/v2ray-core/net"
  8. )
  9. type FreedomConnection struct {
  10. dest v2net.Address
  11. }
  12. func NewFreedomConnection(dest v2net.Address) *FreedomConnection {
  13. conn := new(FreedomConnection)
  14. conn.dest = dest
  15. return conn
  16. }
  17. func (vconn *FreedomConnection) Start(ray core.OutboundRay) error {
  18. input := ray.OutboundInput()
  19. output := ray.OutboundOutput()
  20. conn, err := net.Dial("tcp", vconn.dest.String())
  21. if err != nil {
  22. return log.Error("Failed to open tcp: %s", vconn.dest.String())
  23. }
  24. log.Debug("Sending outbound tcp: %s", vconn.dest.String())
  25. finish := make(chan bool, 2)
  26. go vconn.DumpInput(conn, input, finish)
  27. go vconn.DumpOutput(conn, output, finish)
  28. go vconn.CloseConn(conn, finish)
  29. return nil
  30. }
  31. func (vconn *FreedomConnection) DumpInput(conn net.Conn, input <-chan []byte, finish chan<- bool) {
  32. for {
  33. data, open := <-input
  34. if !open {
  35. finish <- true
  36. log.Debug("Freedom finishing input.")
  37. break
  38. }
  39. nBytes, err := conn.Write(data)
  40. log.Debug("Freedom wrote %d bytes with error %v", nBytes, err)
  41. }
  42. }
  43. func (vconn *FreedomConnection) DumpOutput(conn net.Conn, output chan<- []byte, finish chan<- bool) {
  44. for {
  45. buffer := make([]byte, 512)
  46. nBytes, err := conn.Read(buffer)
  47. log.Debug("Freedom reading %d bytes with error %v", nBytes, err)
  48. if err == io.EOF {
  49. close(output)
  50. finish <- true
  51. log.Debug("Freedom finishing output.")
  52. break
  53. }
  54. output <- buffer[:nBytes]
  55. }
  56. }
  57. func (vconn *FreedomConnection) CloseConn(conn net.Conn, finish <-chan bool) {
  58. <-finish
  59. <-finish
  60. conn.Close()
  61. }