@@ -27,6 +27,7 @@ func (h ResponseHeader) String() string {
2727}
2828
2929func (u URI ) Parse () bool {
30+ // URIs must start with a slash as in /uri
3031 matched , err := regexp .Match (`^\/.*` , []byte (u ))
3132 if err != nil {
3233 return false
@@ -54,14 +55,14 @@ func TLSVersionName(v uint16) string {
5455
5556func cipherSuiteName (id uint16 ) string {
5657 cs := tls .CipherSuiteName (id )
57- if cs == "" {
58+ if strings . Contains ( cs , "0x" ) {
5859 return fmt .Sprintf ("Unknown (0x%x)" , id )
5960 }
6061
6162 return cs
6263}
6364
64- func parseResponseHeaders (headers http.Header , filter []string ) string {
65+ func filterResponseHeaders (headers http.Header , filter []string ) string {
6566 var outputStr string
6667
6768 var outputMap map [string ][]string
@@ -94,49 +95,48 @@ func parseResponseHeaders(headers http.Header, filter []string) string {
9495 return outputStr
9596}
9697
97- func getUrlsFromHost (h Host ) []string {
98+ func getUrlsFromHost (h Host ) ( []string , error ) {
9899 var list []string
99100
100101 if len (h .URIList ) == 0 {
101102 s := httpClientDefaultScheme + "://" + h .Name
102103 list = append (list , s )
103104
104- return list
105+ return list , nil
105106 }
106107
107108 for _ , uri := range h .URIList {
108109 if parsed := uri .Parse (); ! parsed {
109- fmt .Printf ("Invalid uri %s for host %s" , uri , h .Name )
110-
111- break
110+ return nil , fmt .Errorf ("invalid uri %s for host %s" , uri , h .Name )
112111 }
113112
114113 s := fmt .Sprintf ("%s://%s%s" , httpClientDefaultScheme , h .Name , uri )
115114 list = append (list , s )
116115 }
117116
118- return list
119- }
120-
121- func transportAddressFromRequest (r RequestConfig ) (string , error ) {
122- addr , err := transportAddressFromURLString (r .TransportOverrideURL )
123- if err != nil {
124- return emptyString , err
125- }
126-
127- return addr , nil
117+ return list , nil
128118}
129119
130120func transportAddressFromURLString (transportURL string ) (string , error ) {
131121 var addr string
132122
123+ if transportURL == emptyString {
124+ return emptyString , errors .New ("empty string provided as transportURL" )
125+ }
126+
127+ // Add HTTPS scheme if missing from transportURL
128+ if match , _ := regexp .MatchString ("^https://" , transportURL ); ! match {
129+ transportURL = "https://" + transportURL
130+ }
131+
133132 overrideURL , err := url .Parse (transportURL )
134133 if err != nil {
135134 return "" , err
136135 }
137136
138137 addr = overrideURL .Host
139138
139+ // Add default HTTPS port if a port is missing from transportURL
140140 if match , _ := regexp .MatchString ("\\ :\\ d+$" , addr ); ! match {
141141 addr += ":443"
142142 }
@@ -203,10 +203,10 @@ func proxyProtoHeaderFromRequest(r RequestConfig, serverName string) (proxyproto
203203 return header , nil
204204}
205205
206- func HandleRequests (cfg * RequestsMetaConfig ) (map [string ][]ResponseData , error ) {
206+ func HandleRequests (w io. Writer , cfg * RequestsMetaConfig ) (map [string ][]ResponseData , error ) {
207207 responseDataMap := make (map [string ][]ResponseData )
208208
209- cfg .PrintCmd (os . Stdout )
209+ cfg .PrintCmd (w )
210210
211211 for _ , r := range cfg .Requests {
212212 responseDataList , err := processHTTPRequestsByHost (
@@ -304,11 +304,11 @@ func (rd ResponseData) PrintResponseData(isVerbose bool) {
304304 style .StatusCodeParse (rd .Response .StatusCode )))
305305
306306 if rd .Request .PrintResponseCertificates {
307- RenderTLSData (rd .Response )
307+ RenderTLSData (os . Stdout , rd .Response )
308308 }
309309
310310 if rd .Request .PrintResponseHeaders {
311- headersStr := parseResponseHeaders (
311+ headersStr := filterResponseHeaders (
312312 rd .Response .Header ,
313313 rd .Request .ResponseHeadersFilter )
314314
@@ -330,26 +330,36 @@ func (rd ResponseData) PrintResponseData(isVerbose bool) {
330330 }
331331}
332332
333- func RenderTLSData (r * http.Response ) {
333+ func RenderTLSData (w io. Writer , r * http.Response ) {
334334 respTLS := r .TLS
335335 sl := style .CertKeyP4 .Render
336336 sv := style .CertValue .Render
337337
338- fmt .Println ( style .LgSprintf (style .ItemKeyP3 , "TLS:" ))
338+ fmt .Fprintln ( w , style .LgSprintf (style .ItemKeyP3 , "TLS:" ))
339339
340340 if respTLS == nil {
341- fmt .Println (style .LgSprintf (style .CertKeyP4 ,
342- "%s" ,
343- style .Error .Render ("No TLS connection state available" )))
341+ fmt .Fprintln (
342+ w ,
343+ style .LgSprintf (style .CertKeyP4 ,
344+ "%s" ,
345+ style .Error .Render ("No TLS connection state available" ),
346+ ),
347+ )
344348
345349 return
346350 }
347351
348352 t := table .New ().Border (style .LGDefBorder )
349- t .Row (sl ("Version" ), sv (TLSVersionName (respTLS .Version )))
350- t .Row (sl ("CipherSuite" ), sv (cipherSuiteName (respTLS .CipherSuite )))
351- fmt .Println (t .Render ())
353+ t .Row (
354+ sl ("Version" ),
355+ sv (TLSVersionName (respTLS .Version )),
356+ )
357+ t .Row (
358+ sl ("CipherSuite" ),
359+ sv (cipherSuiteName (respTLS .CipherSuite )),
360+ )
361+ fmt .Fprintln (w , t .Render ())
352362 t .ClearRows ()
353363
354- certinfo .CertsToTables (respTLS .PeerCertificates )
364+ certinfo .CertsToTables (w , respTLS .PeerCertificates )
355365}
0 commit comments