@@ -25,11 +25,15 @@ var directCmd = &cobra.Command{
2525}
2626
2727var (
28- scanDirectFlagFilename string
29- scanDirectFlagHttps bool
30- scanDirectFlagOutput string
31- scanDirectFlagHideLocation string
32- scanDirectFlagMethod string
28+ scanDirectFlagFilename string
29+ scanDirectFlagHttps bool
30+ scanDirectFlagOutput string
31+ scanDirectFlagHideLocation string
32+ scanDirectFlagMethod string
33+ scanDirectFlagTimeoutConnect int
34+ scanDirectFlagTimeoutTLS int
35+ scanDirectFlagTimeoutHeader int
36+ scanDirectFlagTimeoutRequest int
3337)
3438
3539func init () {
@@ -40,6 +44,10 @@ func init() {
4044 directCmd .Flags ().StringVarP (& scanDirectFlagMethod , "method" , "m" , "HEAD" , "HTTP method to use (e.g. HEAD, GET, POST)" )
4145 directCmd .Flags ().BoolVar (& scanDirectFlagHttps , "https" , false , "use https" )
4246 directCmd .Flags ().StringVar (& scanDirectFlagHideLocation , "hide-location" , "https://jio.com/BalanceExhaust" , "hide results with this Location header" )
47+ directCmd .Flags ().IntVar (& scanDirectFlagTimeoutConnect , "timeout-connect" , 5 , "TCP connect timeout in seconds (default 5)" )
48+ directCmd .Flags ().IntVar (& scanDirectFlagTimeoutTLS , "timeout-tls" , 2 , "TLS handshake timeout in seconds (default 2)" )
49+ directCmd .Flags ().IntVar (& scanDirectFlagTimeoutHeader , "timeout-header" , 3 , "Response header timeout in seconds (default 3)" )
50+ directCmd .Flags ().IntVar (& scanDirectFlagTimeoutRequest , "timeout-request" , 10 , "Overall request timeout in seconds (default 10)" )
4351
4452 directCmd .MarkFlagRequired ("filename" )
4553}
@@ -56,22 +64,24 @@ type scanDirectResponse struct {
5664 Location string
5765}
5866
59- var httpClient = & http.Client {
60- CheckRedirect : func (req * http.Request , via []* http.Request ) error {
61- return http .ErrUseLastResponse
62- },
63- Transport : & http.Transport {
64- DisableKeepAlives : true ,
65- TLSClientConfig : & tls.Config {
66- InsecureSkipVerify : true ,
67+ func newHTTPClient () * http.Client {
68+ return & http.Client {
69+ CheckRedirect : func (req * http.Request , via []* http.Request ) error {
70+ return http .ErrUseLastResponse
6771 },
68- DialContext : (& net.Dialer {
69- Timeout : 5 * time .Second ,
70- KeepAlive : 0 ,
71- }).DialContext ,
72- TLSHandshakeTimeout : 2 * time .Second ,
73- ResponseHeaderTimeout : 3 * time .Second ,
74- },
72+ Transport : & http.Transport {
73+ DisableKeepAlives : true ,
74+ TLSClientConfig : & tls.Config {
75+ InsecureSkipVerify : true ,
76+ },
77+ DialContext : (& net.Dialer {
78+ Timeout : time .Duration (scanDirectFlagTimeoutConnect ) * time .Second ,
79+ KeepAlive : 0 ,
80+ }).DialContext ,
81+ TLSHandshakeTimeout : time .Duration (scanDirectFlagTimeoutTLS ) * time .Second ,
82+ ResponseHeaderTimeout : time .Duration (scanDirectFlagTimeoutHeader ) * time .Second ,
83+ },
84+ }
7585}
7686
7787func scanDirect (c * queuescanner.Ctx , p * queuescanner.QueueScannerScanParams ) {
@@ -82,7 +92,7 @@ func scanDirect(c *queuescanner.Ctx, p *queuescanner.QueueScannerScanParams) {
8292 httpScheme = "https"
8393 }
8494
85- ctx , cancel := context .WithTimeout (context .Background (), 10 * time .Second )
95+ ctx , cancel := context .WithTimeout (context .Background (), time . Duration ( scanDirectFlagTimeoutRequest ) * time .Second )
8696 defer cancel ()
8797
8898 method := scanDirectFlagMethod
@@ -97,10 +107,13 @@ func scanDirect(c *queuescanner.Ctx, p *queuescanner.QueueScannerScanParams) {
97107
98108 httpReq = httpReq .WithContext (ctx )
99109
100- httpRes , err := httpClient .Do (httpReq )
110+ client := newHTTPClient ()
111+ httpRes , err := client .Do (httpReq )
101112 if err != nil {
102113 return
103114 }
115+ defer httpRes .Body .Close ()
116+
104117 hServer := httpRes .Header .Get ("Server" )
105118 hLocation := httpRes .Header .Get ("Location" )
106119
0 commit comments