proxy.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package main
  2. import (
  3. "fmt"
  4. "io"
  5. "net"
  6. "os"
  7. )
  8. // Proxy struct to hold connection data
  9. type Proxy struct {
  10. Conn *net.TCPConn
  11. Addr *net.TCPAddr
  12. err error
  13. }
  14. func (p *Proxy) SetAddrAndPort(ip string, port int) {
  15. address := fmt.Sprintf("%s:%d", ip, port)
  16. p.Addr, p.err = net.ResolveTCPAddr("tcp4", address)
  17. p.CheckError()
  18. }
  19. // OpenConnection opens dials the tcp connection
  20. func (p *Proxy) OpenConnection() {
  21. p.Conn, p.err = net.DialTCP("tcp4", nil, p.Addr)
  22. p.CheckError()
  23. }
  24. func (p *Proxy) WriteBytes(ch chan []byte) {
  25. select {
  26. case d := <-ch:
  27. p.Conn.Write(d)
  28. }
  29. p.CheckError()
  30. }
  31. func (p *Proxy) ReadAll(ch chan []byte) {
  32. data := make([]byte, 0, 16384)
  33. tmp := make([]byte, 256)
  34. for {
  35. size, err := p.Conn.Read(tmp)
  36. if err != nil {
  37. if err == io.EOF {
  38. break
  39. }
  40. fmt.Printf("\n\n\n### Error on read %v", err)
  41. os.Exit(1)
  42. }
  43. data = append(data, tmp[:size]...)
  44. if size < 256 {
  45. ch <- data
  46. }
  47. }
  48. p.CheckError()
  49. }
  50. func (p *Proxy) CheckError() {
  51. if p.err != nil {
  52. fmt.Println(p.err)
  53. os.Exit(1)
  54. }
  55. }
  56. func NewProxy() *Proxy {
  57. return &Proxy{}
  58. }
  59. func ReplaceNonPrintable(data []byte) []byte {
  60. for i, b := range data {
  61. if (b < 32 && b != 13 && b != 10) || b > 127 {
  62. data[i] = 0
  63. }
  64. }
  65. return data
  66. }