@@ -175,23 +175,24 @@ func (py *Proxy) Serve(done chan byte) {
175
175
debug .Println ("client connection:" , err )
176
176
continue
177
177
}
178
- if debug {
179
- debug .Println ("new client:" , conn .RemoteAddr ())
180
- }
181
178
c := newClientConn (conn , py )
182
179
go c .serve ()
183
180
}
184
181
}
185
182
186
- func newClientConn (rwc net.Conn , proxy * Proxy ) * clientConn {
183
+ func newClientConn (cli net.Conn , proxy * Proxy ) * clientConn {
187
184
buf := httpBuf .Get ()
188
185
c := & clientConn {
189
- Conn : rwc ,
186
+ Conn : cli ,
190
187
serverConn : map [string ]* serverConn {},
191
188
buf : buf ,
192
- bufRd : bufio .NewReaderFromBuf (rwc , buf ),
189
+ bufRd : bufio .NewReaderFromBuf (cli , buf ),
193
190
proxy : proxy ,
194
191
}
192
+ if debug {
193
+ debug .Printf ("cli(%s) connected, total %d clients\n " ,
194
+ cli .RemoteAddr (), incCliCnt ())
195
+ }
195
196
return c
196
197
}
197
198
@@ -204,15 +205,16 @@ func (c *clientConn) releaseBuf() {
204
205
}
205
206
}
206
207
207
- func (c * clientConn ) Close () error {
208
+ func (c * clientConn ) Close () {
208
209
c .releaseBuf ()
209
210
for _ , sv := range c .serverConn {
210
- sv .Close ()
211
+ sv .Close (c )
211
212
}
212
213
if debug {
213
- debug .Printf ("Client %v connection closed\n " , c .RemoteAddr ())
214
+ debug .Printf ("cli(%s) closed, total %d clients\n " ,
215
+ c .RemoteAddr (), decCliCnt ())
214
216
}
215
- return c .Conn .Close ()
217
+ c .Conn .Close ()
216
218
}
217
219
218
220
func isSelfURL (url string ) bool {
@@ -269,6 +271,16 @@ func (c *clientConn) shouldRetry(r *Request, sv *serverConn, re error) bool {
269
271
return true
270
272
}
271
273
274
+ func dbgPrintRq (c * clientConn , r * Request ) {
275
+ if dbgRq {
276
+ if verbose {
277
+ dbgRq .Printf ("cli(%s) request %s\n %s" , c .RemoteAddr (), r , r .Verbose ())
278
+ } else {
279
+ dbgRq .Printf ("cli(%s) request %s\n " , c .RemoteAddr (), r )
280
+ }
281
+ }
282
+ }
283
+
272
284
func (c * clientConn ) serve () {
273
285
var r Request
274
286
var rp Response
@@ -296,7 +308,7 @@ func (c *clientConn) serve() {
296
308
297
309
if err = parseRequest (c , & r ); err != nil {
298
310
if debug {
299
- debug .Printf ("client: %s parse request %v\n " , c .RemoteAddr (), err )
311
+ debug .Printf ("cli(%s) parse request %v\n " , c .RemoteAddr (), err )
300
312
}
301
313
if err == io .EOF || isErrConnReset (err ) {
302
314
return
@@ -316,13 +328,7 @@ func (c *clientConn) serve() {
316
328
}
317
329
// next getRequest should start with timeout count 0
318
330
c .timeoutCnt = 0
319
- if dbgRq {
320
- if verbose {
321
- dbgRq .Printf ("request from client %s: %s\n %s" , c .RemoteAddr (), & r , r .Verbose ())
322
- } else {
323
- dbgRq .Printf ("request from client %s: %s\n " , c .RemoteAddr (), & r )
324
- }
325
- }
331
+ dbgPrintRq (c , & r )
326
332
327
333
if isSelfURL (r .URL .HostPort ) {
328
334
if err = c .serveSelfURL (& r ); err != nil {
@@ -359,7 +365,7 @@ func (c *clientConn) serve() {
359
365
retry:
360
366
r .tryOnce ()
361
367
if bool (debug ) && r .isRetry () {
362
- errl .Printf ("%s retry request tryCnt=%d %v\n " , c .RemoteAddr (), r .tryCnt , & r )
368
+ errl .Printf ("cli(%s) retry request tryCnt=%d %v\n " , c .RemoteAddr (), r .tryCnt , & r )
363
369
}
364
370
if sv , err = c .getServerConn (& r ); err != nil {
365
371
// debug.Printf("Failed to get serverConn for %s %v\n", c.RemoteAddr(), r)
@@ -374,7 +380,7 @@ func (c *clientConn) serve() {
374
380
375
381
if r .isConnect {
376
382
err = sv .doConnect (& r , c )
377
- sv .Close ()
383
+ sv .Close (c )
378
384
if c .shouldRetry (& r , sv , err ) {
379
385
// connection for CONNECT is not reused, no need to remove
380
386
goto retry
@@ -394,7 +400,9 @@ func (c *clientConn) serve() {
394
400
}
395
401
396
402
if ! r .ConnectionKeepAlive {
397
- // debug.Println("close client connection because request has no keep-alive")
403
+ if debug {
404
+ debug .Println ("cli(%s) close connection" , c .RemoteAddr ())
405
+ }
398
406
return
399
407
}
400
408
}
@@ -417,7 +425,7 @@ func (c *clientConn) handleServerReadError(r *Request, sv *serverConn, err error
417
425
var errMsg string
418
426
if err == io .EOF {
419
427
if debug {
420
- debug .Printf ("client %s; %s read from server EOF\n " , c .RemoteAddr (), msg )
428
+ debug .Printf ("cli(%s) %s read from server EOF\n " , c .RemoteAddr (), msg )
421
429
}
422
430
return RetryError {err }
423
431
}
@@ -442,6 +450,18 @@ func (c *clientConn) handleServerWriteError(r *Request, sv *serverConn, err erro
442
450
return RetryError {err }
443
451
}
444
452
453
+ func dbgPrintRep (c * clientConn , r * Request , rp * Response ) {
454
+ if dbgRep {
455
+ if verbose {
456
+ dbgRep .Printf ("cli(%s) response %s %s\n %s" ,
457
+ c .RemoteAddr (), r , rp , rp .Verbose ())
458
+ } else {
459
+ dbgRep .Printf ("cli(%s) response %s %s\n " ,
460
+ c .RemoteAddr (), r , rp )
461
+ }
462
+ }
463
+ }
464
+
445
465
func (c * clientConn ) readResponse (sv * serverConn , r * Request , rp * Response ) (err error ) {
446
466
sv .initBuf ()
447
467
defer func () {
@@ -476,14 +496,8 @@ func (c *clientConn) readResponse(sv *serverConn, r *Request, rp *Response) (err
476
496
if _ , err = c .Write (rp .rawResponse ()); err != nil {
477
497
return err
478
498
}
479
- if dbgRep {
480
- if verbose {
481
- // extra space after resposne to align with request debug message
482
- dbgRep .Printf ("response to client %v: %s %s\n %s" , c .RemoteAddr (), r , rp , rp .Verbose ())
483
- } else {
484
- dbgRep .Printf ("response to client %v: %s %s\n " , c .RemoteAddr (), r , rp )
485
- }
486
- }
499
+ dbgPrintRep (c , r , rp )
500
+
487
501
rp .releaseBuf ()
488
502
489
503
if rp .hasBody (r .Method ) {
@@ -513,13 +527,21 @@ func (c *clientConn) readResponse(sv *serverConn, r *Request, rp *Response) (err
513
527
debug.Printf("[Finished] %v request %s %s\n", c.RemoteAddr(), r.Method, r.URL)
514
528
}
515
529
*/
530
+ var remoteAddr string // avoid evaluating c.RemoteAddr() in the following debug call
531
+ if debug {
532
+ remoteAddr = c .RemoteAddr ().String ()
533
+ }
516
534
if rp .ConnectionKeepAlive {
517
535
if rp .KeepAlive == time .Duration (0 ) {
518
536
sv .willCloseOn = time .Now ().Add (defaultServerConnTimeout )
519
537
} else {
520
- sv .willCloseOn = time .Now ().Add (rp .KeepAlive - time .Second )
538
+ debug .Printf ("cli(%s) server %s keep-alive %v\n " ,
539
+ remoteAddr , sv .url .HostPort , rp .KeepAlive )
540
+ sv .willCloseOn = time .Now ().Add (rp .KeepAlive )
521
541
}
522
542
} else {
543
+ debug .Printf ("cli(%s) server %s close connection\n " ,
544
+ remoteAddr , sv .url .HostPort )
523
545
c .removeServerConn (sv )
524
546
}
525
547
return
@@ -532,16 +554,17 @@ func (c *clientConn) shouldCleanServerConn() bool {
532
554
533
555
// Remove all maybe closed server connection
534
556
func (c * clientConn ) cleanServerConn () {
535
- if debug {
536
- debug .Printf ("%s client clean up idle server connection" , c .RemoteAddr ())
537
- }
538
557
now := time .Now ()
539
558
c .cleanedOn = now
540
559
for _ , sv := range c .serverConn {
541
560
if now .After (sv .willCloseOn ) {
542
561
c .removeServerConn (sv )
543
562
}
544
563
}
564
+ if debug {
565
+ debug .Printf ("cli(%s) close idle connections, remains %d\n " ,
566
+ c .RemoteAddr (), len (c .serverConn ))
567
+ }
545
568
}
546
569
547
570
func (c * clientConn ) getServerConn (r * Request ) (sv * serverConn , err error ) {
@@ -558,7 +581,7 @@ func (c *clientConn) getServerConn(r *Request) (sv *serverConn, err error) {
558
581
}
559
582
560
583
func (c * clientConn ) removeServerConn (sv * serverConn ) {
561
- sv .Close ()
584
+ sv .Close (c )
562
585
delete (c .serverConn , sv .url .HostPort )
563
586
}
564
587
@@ -573,7 +596,7 @@ func connectDirect(url *URL, siteInfo *VisitCnt) (conn, error) {
573
596
debug .Printf ("error direct connect to: %s %v\n " , url .HostPort , err )
574
597
return zeroConn , err
575
598
}
576
- debug .Println ("connected to" , url .HostPort )
599
+ // debug.Println("directly connected to", url.HostPort)
577
600
return conn {ctDirectConn , c , nil }, nil
578
601
}
579
602
@@ -588,6 +611,8 @@ func maybeBlocked(err error) bool {
588
611
return isErrTimeout (err ) || isErrConnReset (err )
589
612
}
590
613
614
+ // Connect to requested server according to whether it's visit count.
615
+ // If direct connection fails, try parent proxies.
591
616
func (c * clientConn ) connect (r * Request , siteInfo * VisitCnt ) (srvconn conn , err error ) {
592
617
var errMsg string
593
618
if config .AlwaysProxy {
@@ -662,6 +687,10 @@ func (c *clientConn) createServerConn(r *Request) (*serverConn, error) {
662
687
return sv , nil
663
688
}
664
689
c .serverConn [sv .url .HostPort ] = sv
690
+ if debug {
691
+ debug .Printf ("cli(%s) connected to %s %d concurrent connections\n " ,
692
+ c .RemoteAddr (), sv .url .HostPort , incSrvConnCnt (sv .url .HostPort ))
693
+ }
665
694
// client will connect to differnet servers in a single proxy connection
666
695
// debug.Printf("serverConn to for client %v %v\n", c.RemoteAddr(), c.serverConn)
667
696
return sv , nil
@@ -702,14 +731,17 @@ func (sv *serverConn) initBuf() {
702
731
}
703
732
}
704
733
705
- func (sv * serverConn ) Close () error {
706
- debug .Println ("Closing server conn:" , sv .url .HostPort )
734
+ func (sv * serverConn ) Close (c * clientConn ) error {
707
735
sv .bufRd = nil
708
736
if sv .buf != nil {
709
737
// debug.Println("release server buffer")
710
738
httpBuf .Put (sv .buf )
711
739
sv .buf = nil
712
740
}
741
+ if debug {
742
+ debug .Printf ("cli(%s) close connection to %s remains %d concurrent connections\n " ,
743
+ c .RemoteAddr (), sv .url .HostPort , decSrvConnCnt (sv .url .HostPort ))
744
+ }
713
745
return sv .Conn .Close ()
714
746
}
715
747
@@ -736,11 +768,11 @@ func (sv *serverConn) setReadTimeout(msg string) {
736
768
if sv .siteInfo .OnceBlocked () && to > defaultReadTimeout {
737
769
to = minReadTimeout
738
770
}
739
- setConnReadTimeout (sv , to , msg )
771
+ setConnReadTimeout (sv . Conn , to , msg )
740
772
}
741
773
742
774
func (sv * serverConn ) unsetReadTimeout (msg string ) {
743
- unsetConnReadTimeout (sv , msg )
775
+ unsetConnReadTimeout (sv . Conn , msg )
744
776
}
745
777
746
778
func (sv * serverConn ) maybeSSLErr (cliStart time.Time ) bool {
@@ -851,7 +883,7 @@ func copyClient2Server(c *clientConn, sv *serverConn, r *Request, srvStopped not
851
883
defer func () {
852
884
if deadlineIsSet {
853
885
// maybe need to retry, should unset timeout here because
854
- unsetConnReadTimeout (c , "cli->srv after err" )
886
+ unsetConnReadTimeout (c . Conn , "cli->srv after err" )
855
887
}
856
888
done <- 1
857
889
}()
@@ -880,7 +912,8 @@ func copyClient2Server(c *clientConn, sv *serverConn, r *Request, srvStopped not
880
912
}
881
913
}
882
914
if debug {
883
- debug .Printf ("cli->srv client %s released read buffer\n " , c .RemoteAddr ())
915
+ debug .Printf ("cli(%s)->srv(%s) released read buffer\n " ,
916
+ c .RemoteAddr (), r .URL .HostPort )
884
917
}
885
918
c .releaseBuf ()
886
919
}
@@ -896,11 +929,11 @@ func copyClient2Server(c *clientConn, sv *serverConn, r *Request, srvStopped not
896
929
for {
897
930
// debug.Println("cli->srv")
898
931
if sv .maybeFake () {
899
- setConnReadTimeout (c , time .Second , "cli->srv" )
932
+ setConnReadTimeout (c . Conn , time .Second , "cli->srv" )
900
933
deadlineIsSet = true
901
934
} else if deadlineIsSet {
902
935
// maybeFake may trun to false after timeout, but timeout should be unset
903
- unsetConnReadTimeout (c , "cli->srv before read" )
936
+ unsetConnReadTimeout (c . Conn , "cli->srv before read" )
904
937
deadlineIsSet = false
905
938
}
906
939
if n , err = c .Read (buf ); err != nil {
@@ -942,7 +975,7 @@ func (sv *serverConn) doConnect(r *Request, c *clientConn) (err error) {
942
975
// debug.Printf("%s Sending CONNECT request to http proxy server\n", c.RemoteAddr())
943
976
if err = sv .sendHTTPProxyRequest (r , c ); err != nil {
944
977
if debug {
945
- debug .Printf ("%s error sending CONNECT request to http proxy server: %v\n " ,
978
+ debug .Printf ("cli(%s) error sending CONNECT request to http proxy server: %v\n " ,
946
979
c .RemoteAddr (), err )
947
980
}
948
981
return err
@@ -951,7 +984,8 @@ func (sv *serverConn) doConnect(r *Request, c *clientConn) (err error) {
951
984
// debug.Printf("send connection confirmation to %s->%s\n", c.RemoteAddr(), r.URL.HostPort)
952
985
if _ , err = c .Write (connEstablished ); err != nil {
953
986
if debug {
954
- debug .Printf ("%s error sending 200 Connecion established: %v\n " , c .RemoteAddr (), err )
987
+ debug .Printf ("cli(%s) error sending 200 Connecion established: %v\n " ,
988
+ c .RemoteAddr (), err )
955
989
}
956
990
return err
957
991
}
@@ -963,7 +997,7 @@ func (sv *serverConn) doConnect(r *Request, c *clientConn) (err error) {
963
997
go func () {
964
998
// debug.Printf("doConnect: cli(%s)->srv(%s)\n", c.RemoteAddr(), r.URL.HostPort)
965
999
cli2srvErr = copyClient2Server (c , sv , r , srvStopped , done )
966
- sv .Close () // close sv to force read from server in copyServer2Client return
1000
+ sv .Close (c ) // close sv to force read from server in copyServer2Client return
967
1001
}()
968
1002
969
1003
// debug.Printf("doConnect: srv(%s)->cli(%s)\n", r.URL.HostPort, c.RemoteAddr())
@@ -1049,7 +1083,7 @@ func (sv *serverConn) doRequest(c *clientConn, r *Request, rp *Response) (err er
1049
1083
return
1050
1084
}
1051
1085
if debug {
1052
- debug .Printf ("%s %s body sent\n " , c .RemoteAddr (), r )
1086
+ debug .Printf ("cli(%s) %s request body sent\n " , c .RemoteAddr (), r )
1053
1087
}
1054
1088
}
1055
1089
r .state = rsSent
0 commit comments