Skip to content

Commit 78b9b5b

Browse files
committed
refactor: add timeout flags for direct scan command and improve HTTP client configuration
1 parent 553272e commit 78b9b5b

1 file changed

Lines changed: 35 additions & 22 deletions

File tree

cmd/scan_direct.go

Lines changed: 35 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,15 @@ var directCmd = &cobra.Command{
2525
}
2626

2727
var (
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

3539
func 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

7787
func 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

Comments
 (0)