mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-11 14:21:10 +02:00
stub fixes to http 1.0 support in the web server
* module/web/server.scm (read-client): Fix number of returned values in the case in which there is an error reading the client. (sanitize-response): Add a case to adapt the reponse to the request version. (handle-request): Sanitize the response within an error-handling block. (serve-one-client): Move sanitation out of here. * module/web/server/http.scm (keep-alive?): A more proper detection on whether we should support persistent connections. * module/web/response.scm (adapt-response-version): New routine, to adapt a response to a given version. Currently a stub.
This commit is contained in:
parent
c0f6c1638b
commit
c637190203
3 changed files with 50 additions and 26 deletions
|
@ -34,6 +34,7 @@
|
||||||
read-response
|
read-response
|
||||||
build-response
|
build-response
|
||||||
extend-response
|
extend-response
|
||||||
|
adapt-response-version
|
||||||
write-response
|
write-response
|
||||||
|
|
||||||
read-response-body/latin-1
|
read-response-body/latin-1
|
||||||
|
@ -164,6 +165,12 @@
|
||||||
(lambda (version code reason-phrase)
|
(lambda (version code reason-phrase)
|
||||||
(make-response version code reason-phrase (read-headers port) port))))
|
(make-response version code reason-phrase (read-headers port) port))))
|
||||||
|
|
||||||
|
(define (adapt-response-version response version)
|
||||||
|
(build-response #:code (response-code response)
|
||||||
|
#:version version
|
||||||
|
#:headers (response-headers response)
|
||||||
|
#:port (response-port response)))
|
||||||
|
|
||||||
(define (write-response r port)
|
(define (write-response r port)
|
||||||
(write-response-line (response-version r) (response-code r)
|
(write-response-line (response-version r) (response-code r)
|
||||||
(response-reason-phrase r) port)
|
(response-reason-phrase r) port)
|
||||||
|
|
|
@ -140,21 +140,7 @@
|
||||||
#:post-error
|
#:post-error
|
||||||
(lambda (k . args)
|
(lambda (k . args)
|
||||||
(warn "Error while accepting client" k args)
|
(warn "Error while accepting client" k args)
|
||||||
(values keep-alive #f #f #f #f))))
|
(values keep-alive #f #f #f))))
|
||||||
|
|
||||||
;; -> response body state ...
|
|
||||||
(define (handle-request handler request body . state)
|
|
||||||
(call-with-error-handling
|
|
||||||
(lambda ()
|
|
||||||
(with-stack-and-prompt
|
|
||||||
(lambda ()
|
|
||||||
(apply handler request body state))))
|
|
||||||
#:pass-keys '(quit interrupt)
|
|
||||||
#:on-error (if (batch-mode?) 'pass 'debug)
|
|
||||||
#:post-error
|
|
||||||
(lambda (k . args)
|
|
||||||
(warn "Error handling request" k args)
|
|
||||||
(apply values (build-response #:code 500) #f state))))
|
|
||||||
|
|
||||||
(define (encode-string str charset)
|
(define (encode-string str charset)
|
||||||
(case charset
|
(case charset
|
||||||
|
@ -165,7 +151,15 @@
|
||||||
(define (sanitize-response request response body)
|
(define (sanitize-response request response body)
|
||||||
(cond
|
(cond
|
||||||
((list? response)
|
((list? response)
|
||||||
(sanitize-response request (build-response #:headers response) body))
|
(sanitize-response request
|
||||||
|
(build-response #:version (request-version request)
|
||||||
|
#:headers response)
|
||||||
|
body))
|
||||||
|
((not (equal? (request-version request) (response-version response)))
|
||||||
|
(sanitize-response request
|
||||||
|
(adapt-response-version response
|
||||||
|
(request-version request))
|
||||||
|
body))
|
||||||
((not body)
|
((not body)
|
||||||
(values response #vu8()))
|
(values response #vu8()))
|
||||||
((string? body)
|
((string? body)
|
||||||
|
@ -199,6 +193,26 @@
|
||||||
(else
|
(else
|
||||||
(error "unexpected body type"))))
|
(error "unexpected body type"))))
|
||||||
|
|
||||||
|
;; -> response body state
|
||||||
|
(define (handle-request handler request body state)
|
||||||
|
(call-with-error-handling
|
||||||
|
(lambda ()
|
||||||
|
(call-with-values (lambda ()
|
||||||
|
(with-stack-and-prompt
|
||||||
|
(lambda ()
|
||||||
|
(apply handler request body state))))
|
||||||
|
(lambda (response body . state)
|
||||||
|
(call-with-values (lambda ()
|
||||||
|
(sanitize-response request response body))
|
||||||
|
(lambda (response body)
|
||||||
|
(values response body state))))))
|
||||||
|
#:pass-keys '(quit interrupt)
|
||||||
|
#:on-error (if (batch-mode?) 'pass 'debug)
|
||||||
|
#:post-error
|
||||||
|
(lambda (k . args)
|
||||||
|
(warn "Error handling request" k args)
|
||||||
|
(values (build-response #:code 500) #f state))))
|
||||||
|
|
||||||
;; -> (#f | client)
|
;; -> (#f | client)
|
||||||
(define (write-client impl server client response body)
|
(define (write-client impl server client response body)
|
||||||
(call-with-error-handling
|
(call-with-error-handling
|
||||||
|
@ -253,15 +267,12 @@
|
||||||
(if client
|
(if client
|
||||||
(call-with-values
|
(call-with-values
|
||||||
(lambda ()
|
(lambda ()
|
||||||
(apply handle-request handler request body state))
|
(handle-request handler request body state))
|
||||||
(lambda (response body . state)
|
(lambda (response body state)
|
||||||
(call-with-values (lambda ()
|
(values
|
||||||
(sanitize-response request response body))
|
(and-cons (write-client impl server client response body)
|
||||||
(lambda (response body)
|
keep-alive)
|
||||||
(values
|
state)))
|
||||||
(and-cons (write-client impl server client response body)
|
|
||||||
keep-alive)
|
|
||||||
state)))))
|
|
||||||
(values keep-alive state)))))
|
(values keep-alive state)))))
|
||||||
|
|
||||||
(define* (run-server handler #:optional (impl 'http) (open-params '())
|
(define* (run-server handler #:optional (impl 'http) (open-params '())
|
||||||
|
|
|
@ -91,7 +91,13 @@
|
||||||
(values keep-alive #f #f #f))))))
|
(values keep-alive #f #f #f))))))
|
||||||
|
|
||||||
(define (keep-alive? response)
|
(define (keep-alive? response)
|
||||||
#t)
|
(let ((v (response-version response)))
|
||||||
|
(case (car v)
|
||||||
|
((1)
|
||||||
|
(case (cdr v)
|
||||||
|
((1) #t)
|
||||||
|
((0) (memq 'keep-alive (response-connection response)))))
|
||||||
|
(else #f))))
|
||||||
|
|
||||||
;; -> (#f | client)
|
;; -> (#f | client)
|
||||||
(define (http-write server client response body)
|
(define (http-write server client response body)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue