freedom.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package freedom
  2. import (
  3. "net"
  4. "github.com/v2ray/v2ray-core"
  5. "github.com/v2ray/v2ray-core/log"
  6. v2net "github.com/v2ray/v2ray-core/net"
  7. )
  8. type FreedomConnection struct {
  9. dest v2net.Address
  10. }
  11. func NewFreedomConnection(dest v2net.Address) *FreedomConnection {
  12. conn := new(FreedomConnection)
  13. conn.dest = dest
  14. return conn
  15. }
  16. func (vconn *FreedomConnection) Start(ray core.OutboundRay) error {
  17. input := ray.OutboundInput()
  18. output := ray.OutboundOutput()
  19. conn, err := net.Dial("tcp", vconn.dest.String())
  20. if err != nil {
  21. return log.Error("Failed to open tcp: %s", vconn.dest.String())
  22. }
  23. log.Debug("Sending outbound tcp: %s", vconn.dest.String())
  24. readFinish := make(chan bool)
  25. writeFinish := make(chan bool)
  26. go vconn.DumpInput(conn, input, writeFinish)
  27. go vconn.DumpOutput(conn, output, readFinish)
  28. go vconn.CloseConn(conn, readFinish, writeFinish)
  29. return nil
  30. }
  31. func (vconn *FreedomConnection) DumpInput(conn net.Conn, input <-chan []byte, finish chan<- bool) {
  32. v2net.ChanToWriter(conn, input)
  33. log.Debug("Freedom closing input")
  34. finish <- true
  35. }
  36. func (vconn *FreedomConnection) DumpOutput(conn net.Conn, output chan<- []byte, finish chan<- bool) {
  37. v2net.ReaderToChan(output, conn)
  38. close(output)
  39. log.Debug("Freedom closing output")
  40. finish <- true
  41. }
  42. func (vconn *FreedomConnection) CloseConn(conn net.Conn, readFinish <-chan bool, writeFinish <-chan bool) {
  43. <-writeFinish
  44. if tcpConn, ok := conn.(*net.TCPConn); ok {
  45. log.Debug("Closing freedom write.")
  46. tcpConn.CloseWrite();
  47. }
  48. <-readFinish
  49. conn.Close()
  50. }