@@ -82,19 +82,19 @@ func isLocalAddress(addr string) bool {
8282 return strings .HasSuffix (host , ".local" ) || host == "localhost"
8383}
8484
85- type app struct {
86- hs * http.Server
87- sc * http.Client
88- hc * http.Client
89- dialer proxy.Dialer
90- logger * zerolog.Logger
85+ type proxyApp struct {
86+ httpServer * http.Server
87+ sockServer * http.Client
88+ httpClient * http.Client
89+ sockDialer proxy.Dialer
90+ logger * zerolog.Logger
9191}
9292
93- func (app * app ) handleForward (w http.ResponseWriter , r * http.Request ) {
93+ func (p * proxyApp ) handleForward (w http.ResponseWriter , r * http.Request ) {
9494
9595 req , err := http .NewRequest (r .Method , r .URL .String (), r .Body )
9696 if err != nil {
97- app .logger .Error ().Err (err ).Msgf ("Error during NewRequest() %s: %s" , r .URL .String (), err )
97+ p .logger .Error ().Err (err ).Msgf ("Error during NewRequest() %s: %s" , r .URL .String (), err )
9898 w .WriteHeader (http .StatusInternalServerError )
9999 return
100100 }
@@ -107,26 +107,26 @@ func (app *app) handleForward(w http.ResponseWriter, r *http.Request) {
107107 }
108108 var resp * http.Response
109109 if isLocalAddress (r .Host ) {
110- resp , err = app . hc .Do (req )
110+ resp , err = p . httpClient .Do (req )
111111 if err != nil {
112- app .logger .Error ().Err (err ).Msg ("Connection failed" )
112+ p .logger .Error ().Err (err ).Msg ("Connection failed" )
113113 w .WriteHeader (http .StatusServiceUnavailable )
114114 return
115115 }
116116 if resp == nil {
117- app .logger .Error ().Err (err ).Msg ("Connection failed" )
117+ p .logger .Error ().Err (err ).Msg ("Connection failed" )
118118 w .WriteHeader (http .StatusServiceUnavailable )
119119 return
120120 }
121121 } else {
122- resp , err = app . sc .Do (req )
122+ resp , err = p . sockServer .Do (req )
123123 if err != nil {
124- app .logger .Error ().Err (err ).Msg ("Connection to SOCKS5 server failed" )
124+ p .logger .Error ().Err (err ).Msg ("Connection to SOCKS5 server failed" )
125125 w .WriteHeader (http .StatusServiceUnavailable )
126126 return
127127 }
128128 if resp == nil {
129- app .logger .Error ().Err (err ).Msg ("Connection to SOCKS5 server failed" )
129+ p .logger .Error ().Err (err ).Msg ("Connection to SOCKS5 server failed" )
130130 w .WriteHeader (http .StatusServiceUnavailable )
131131 return
132132 }
@@ -139,7 +139,7 @@ func (app *app) handleForward(w http.ResponseWriter, r *http.Request) {
139139 w .WriteHeader (resp .StatusCode )
140140 n , err := io .Copy (w , resp .Body )
141141 if err != nil {
142- app .logger .Error ().Err (err ).Msgf ("Error during Copy() %s: %s" , r .URL .String (), err )
142+ p .logger .Error ().Err (err ).Msgf ("Error during Copy() %s: %s" , r .URL .String (), err )
143143 w .WriteHeader (http .StatusInternalServerError )
144144 return
145145 }
@@ -149,10 +149,10 @@ func (app *app) handleForward(w http.ResponseWriter, r *http.Request) {
149149 } else {
150150 written = fmt .Sprintf ("%dKB" , n / kbSize )
151151 }
152- app .logger .Debug ().Msgf ("%s - %s - %s - %d - %s" , r .Proto , r .Method , r .Host , resp .StatusCode , written )
152+ p .logger .Debug ().Msgf ("%s - %s - %s - %d - %s" , r .Proto , r .Method , r .Host , resp .StatusCode , written )
153153}
154154
155- func (app * app ) handleTunnel (w http.ResponseWriter , r * http.Request ) {
155+ func (p * proxyApp ) handleTunnel (w http.ResponseWriter , r * http.Request ) {
156156 var dstConn net.Conn
157157 var err error
158158 if isLocalAddress (r .Host ) {
@@ -162,7 +162,7 @@ func (app *app) handleTunnel(w http.ResponseWriter, r *http.Request) {
162162 return
163163 }
164164 } else {
165- dstConn , err = app . dialer .Dial ("tcp" , r .Host )
165+ dstConn , err = p . sockDialer .Dial ("tcp" , r .Host )
166166 if err != nil {
167167 http .Error (w , err .Error (), http .StatusServiceUnavailable )
168168 return
@@ -186,45 +186,45 @@ func (app *app) handleTunnel(w http.ResponseWriter, r *http.Request) {
186186 dstConnStr := fmt .Sprintf ("%s->%s->%s" , dstConn .LocalAddr ().String (), dstConn .RemoteAddr ().String (), r .Host )
187187 srcConnStr := fmt .Sprintf ("%s->%s" , srcConn .LocalAddr ().String (), srcConn .RemoteAddr ().String ())
188188
189- app .logger .Debug ().Msgf ("%s - %s - %s" , r .Proto , r .Method , r .Host )
190- app .logger .Debug ().Msgf ("src: %s - dst: %s" , srcConnStr , dstConnStr )
189+ p .logger .Debug ().Msgf ("%s - %s - %s" , r .Proto , r .Method , r .Host )
190+ p .logger .Debug ().Msgf ("src: %s - dst: %s" , srcConnStr , dstConnStr )
191191
192192 var wg sync.WaitGroup
193193 wg .Add (2 )
194- go app .transfer (& wg , dstConn , srcConn , dstConnStr , srcConnStr )
195- go app .transfer (& wg , srcConn , dstConn , srcConnStr , dstConnStr )
194+ go p .transfer (& wg , dstConn , srcConn , dstConnStr , srcConnStr )
195+ go p .transfer (& wg , srcConn , dstConn , srcConnStr , dstConnStr )
196196 wg .Wait ()
197197}
198198
199- func (app * app ) transfer (wg * sync.WaitGroup , destination io.Writer , source io.Reader , destName , srcName string ) {
199+ func (p * proxyApp ) transfer (wg * sync.WaitGroup , destination io.Writer , source io.Reader , destName , srcName string ) {
200200 defer wg .Done ()
201201 n , err := io .Copy (destination , source )
202202 if err != nil {
203- app .logger .Error ().Err (err ).Msgf ("Error during copy from %s to %s: %v" , srcName , destName , err )
203+ p .logger .Error ().Err (err ).Msgf ("Error during copy from %s to %s: %v" , srcName , destName , err )
204204 }
205205 var written string
206206 if n < kbSize {
207207 written = fmt .Sprintf ("%dB" , n )
208208 } else {
209209 written = fmt .Sprintf ("%dKB" , n / kbSize )
210210 }
211- app .logger .Debug ().Msgf ("copied %s from %s to %s" , written , srcName , destName )
211+ p .logger .Debug ().Msgf ("copied %s from %s to %s" , written , srcName , destName )
212212}
213213
214- func (app * app ) handler () http.HandlerFunc {
214+ func (p * proxyApp ) handler () http.HandlerFunc {
215215 return func (w http.ResponseWriter , r * http.Request ) {
216216 if r .Method == http .MethodConnect {
217- app .handleTunnel (w , r )
217+ p .handleTunnel (w , r )
218218 } else {
219- app .handleForward (w , r )
219+ p .handleForward (w , r )
220220 }
221221 }
222222}
223223
224- func (app * app ) Run () {
225- app . hs .Handler = app .handler ()
226- if err := app . hs .ListenAndServe (); err != nil {
227- app .logger .Fatal ().Err (err ).Msg ("Unable to start HTTP server" )
224+ func (p * proxyApp ) Run () {
225+ p . httpServer .Handler = p .handler ()
226+ if err := p . httpServer .ListenAndServe (); err != nil {
227+ p .logger .Fatal ().Err (err ).Msg ("Unable to start HTTP server" )
228228 }
229229}
230230
@@ -237,7 +237,7 @@ type Config struct {
237237 Pass string
238238}
239239
240- func New (conf * Config ) * app {
240+ func New (conf * Config ) * proxyApp {
241241 var logger zerolog.Logger
242242 if conf .Json {
243243 logger = zerolog .New (os .Stdout ).With ().Timestamp ().Logger ()
@@ -275,7 +275,10 @@ func New(conf *Config) *app {
275275 ReadTimeout : readTimeout ,
276276 WriteTimeout : writeTimeout ,
277277 MaxHeaderBytes : 1 << 20 ,
278+ Protocols : new (http.Protocols ),
278279 }
280+ hs .TLSNextProto = make (map [string ]func (* http.Server , * tls.Conn , http.Handler ))
281+ hs .Protocols .SetHTTP1 (true )
279282 hc := & http.Client {
280283 Transport : & http.Transport {
281284 TLSClientConfig : & tls.Config {InsecureSkipVerify : true },
@@ -287,5 +290,5 @@ func New(conf *Config) *app {
287290 }
288291 logger .Info ().Msgf ("SOCKS5 Proxy: %s" , conf .AddrSOCKS )
289292 logger .Info ().Msgf ("HTTP Proxy: %s" , conf .AddrHTTP )
290- return & app { hs : hs , sc : socks , hc : hc , dialer : dialer , logger : & logger }
293+ return & proxyApp { httpServer : hs , sockServer : socks , httpClient : hc , sockDialer : dialer , logger : & logger }
291294}
0 commit comments