From 72db2b71477ed9fc4b36ed5b37019cc20eb68a6d Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Sun, 14 Aug 2016 18:32:38 -0400 Subject: [PATCH] Explicitly close the http-conn on http-sendrecv with method HEAD. Fixes #1414. --- racket/collects/net/http-client.rkt | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/racket/collects/net/http-client.rkt b/racket/collects/net/http-client.rkt index 381e4bb913..0808c3f04d 100644 --- a/racket/collects/net/http-client.rkt +++ b/racket/collects/net/http-client.rkt @@ -237,6 +237,11 @@ (http-conn-open! hc host-bs #:ssl? ssl? #:port port) hc) +(define (head? method-bss) + (or (equal? method-bss #"HEAD") + (equal? method-bss "HEAD") + (equal? method-bss 'HEAD))) + (define (http-conn-recv! hc #:method [method-bss #"GET"] #:content-decode [decodes '(gzip)] @@ -248,13 +253,9 @@ (regexp-member #rx#"^(?i:Connection: +close)$" headers))) (when close? (http-conn-abandon! hc)) - (define head? - (or (equal? method-bss #"HEAD") - (equal? method-bss "HEAD") - (equal? method-bss 'HEAD))) (define-values (raw-response-port wait-for-close?) (cond - [head? (values (open-input-bytes #"") #f)] + [(head? method-bss) (values (open-input-bytes #"") #f)] [(regexp-member #rx#"^(?i:Transfer-Encoding: +chunked)$" headers) (values (http-conn-response-port/chunked! hc #:close? #t) #t)] @@ -273,7 +274,7 @@ (values (http-conn-response-port/rest! hc) #t)])) (define decoded-response-port (cond - [head? raw-response-port] + [(head? method-bss) raw-response-port] [(and (memq 'gzip decodes) (regexp-member #rx#"^(?i:Content-Encoding: +gzip)$" headers) (not (eof-object? (peek-byte raw-response-port)))) @@ -323,13 +324,15 @@ #:data [data #f] #:content-decode [decodes '(gzip)]) (define hc (http-conn-open host-bs #:ssl? ssl? #:port port)) - (http-conn-sendrecv! hc url-bs - #:version version-bs - #:method method-bss - #:headers headers-bs - #:data data - #:content-decode decodes - #:close? #t)) + (begin0 (http-conn-sendrecv! hc url-bs + #:version version-bs + #:method method-bss + #:headers headers-bs + #:data data + #:content-decode decodes + #:close? #t) + (when (head? method-bss) + (http-conn-close! hc)))) (define data-procedure/c (-> (-> (or/c bytes? string?) void?) any))