diff --git a/collects/web-server/request-parsing.ss b/collects/web-server/request-parsing.ss index 76ef64f79f..8ef6972c78 100644 --- a/collects/web-server/request-parsing.ss +++ b/collects/web-server/request-parsing.ss @@ -14,16 +14,16 @@ ;; The part of the URL path that gets passed to the servlet as arguments. (provide/contract - [read-request ((connection?) . ->* . (request? boolean?))] + [read-request ((connection? ((input-port?) . ->* . (string? string?))) . ->* . (request? boolean?))] [read-bindings (connection? symbol? url? (listof header?) . -> . (union (listof binding?) string?))]) ;; ************************************************** - ;; read-request: input-port -> request boolean? + ;; read-request: connection (input-port -> string string) -> request boolean? ;; read the request line, and the headers, determine if the connection should ;; be closed after servicing the request and build a request structure - (define (read-request conn) + (define (read-request conn port-addresses) (call-with-semaphore (connection-mutex conn) (lambda () @@ -31,10 +31,7 @@ (let-values ([(method uri major-version minor-version) (read-request-line ip)]) (let ([headers (read-headers ip)]) - (let-values ([(host-ip client-ip) - (if (tcp-port? ip) - (tcp-addresses ip) - (values "127.0.0.1" "127.0.0.1"))]) + (let-values ([(host-ip client-ip) (port-addresses ip)]) (values (make-request method uri headers '() host-ip client-ip) (close-connection? diff --git a/collects/web-server/web-server-unit.ss b/collects/web-server/web-server-unit.ss index a4dd4a6eda..8a12008e1a 100644 --- a/collects/web-server/web-server-unit.ss +++ b/collects/web-server/web-server-unit.ss @@ -77,18 +77,20 @@ (semaphore-post sema) ; Rethrow the error to this thread's error printer (raise e))]) - (server-loop get-ports)))))) + (server-loop get-ports + tcp-addresses)))))) (semaphore-wait sema) (loop)))) - ;; server-loop: (-> i-port o-port) -> void + ;; server-loop: (-> input-port output-port) (input-port -> string string) -> void ;; start a thread to handle each incoming connection - (define (server-loop get-ports) + (define (server-loop get-ports port-addresses) (let loop () (let ([connection-cust (make-custodian)]) (parameterize ([current-custodian connection-cust]) (let-values ([(ip op) (get-ports)]) - (serve-ports/inner ip op)))) + (serve-ports/inner ip op + port-addresses)))) (loop))) ;; serve-ports : input-port output-port -> void @@ -102,11 +104,14 @@ [current-server-custodian server-cust]) (let ([connection-cust (make-custodian)]) (parameterize ([current-custodian connection-cust]) - (serve-ports/inner ip op)))))) + (serve-ports/inner ip op + (lambda (ip) + (values "127.0.0.1" + "127.0.0.1")))))))) - ;; serve-ports/inner : input-port output-port -> void + ;; serve-ports/inner : input-port output-port (input-port -> string string) -> void ;; returns immediately, spawning a thread to handle - (define (serve-ports/inner ip op) + (define (serve-ports/inner ip op port-addresses) (thread (lambda () (let ([conn (new-connection config:initial-connection-timeout @@ -116,13 +121,13 @@ (set-connection-close?! conn #t) (kill-connection! conn) (raise e))]) - (serve-connection conn)))))) + (serve-connection conn port-addresses)))))) - ;; serve-connection: connection -> void + ;; serve-connection: connection (input-port -> string string) -> void ;; respond to all requests on this connection - (define (serve-connection conn) + (define (serve-connection conn port-addresses) (let connection-loop () - (let-values ([(req close?) (config:read-request conn)]) + (let-values ([(req close?) (config:read-request conn port-addresses)]) (set-connection-close?! conn close?) (adjust-connection-timeout! conn config:initial-connection-timeout) (config:dispatch conn req)