better error handling in http-server request parsing

This commit is contained in:
Alex Shinn 2020-09-02 11:53:49 +09:00
parent 24d1f6a8a5
commit 8597c3eda5
3 changed files with 29 additions and 16 deletions

View file

@ -40,16 +40,28 @@
(cond (cond
((= 2 (length ls)) ((= 2 (length ls))
(let ((request (let ((request
(make-request command (car ls) (cadr ls) in out sock addr))) (protect
(log-info `(request: ,command ,(car ls) ,(cadr ls) (exn
,(request-headers request)))
(protect (exn
(else (else
(log-error "internal error: " exn) ;; error parsing headers, can't use servlet-respond
(print-stack-trace exn) (log-error "request error: " exn ls
(servlet-respond request 500 "Internal server error"))) (sockaddr-name (address-info-address addr)))
(let restart ((request request)) (servlet-write-status out 500 "Internal server error")
(servlet cfg request servlet-bad-request restart))))) (mime-write-headers `((Status . "500")) out)
(display "\r\n" out)
#f))
(make-request command (car ls) (cadr ls) in out sock addr))))
(cond
(request
(log-info `(request: ,command ,(car ls) ,(cadr ls)
,(request-headers request)))
(protect (exn
(else
(log-error "internal error: " exn)
(print-stack-trace exn)
(servlet-respond request 500 "Internal server error")))
(let restart ((request request))
(servlet cfg request servlet-bad-request restart)))))))
(else (else
(let ((request (make-request command #f #f in out sock addr))) (let ((request (make-request command #f #f in out sock addr)))
(servlet-respond request 400 "bad request"))))))))) (servlet-respond request 400 "bad request")))))))))

View file

@ -9,10 +9,11 @@
http-regexp-servlet http-path-regexp-servlet http-uri-regexp-servlet http-regexp-servlet http-path-regexp-servlet http-uri-regexp-servlet
http-host-regexp-servlet http-redirect-servlet http-rewrite-servlet http-host-regexp-servlet http-redirect-servlet http-rewrite-servlet
http-cgi-bin-dir-servlet http-scheme-script-dir-servlet) http-cgi-bin-dir-servlet http-scheme-script-dir-servlet)
(import (scheme time) (srfi 39) (srfi 95) (import
(chibi) (chibi mime) (chibi regexp) (chibi pathname) (chibi uri) (scheme time) (srfi 39) (srfi 95)
(chibi filesystem) (chibi io) (chibi string) (chibi process) (chibi) (chibi mime) (chibi regexp) (chibi pathname) (chibi uri)
(chibi net server) (chibi net server-util) (chibi net servlet) (chibi filesystem) (chibi io) (chibi string) (chibi process)
(chibi app) (chibi ast) (chibi config) (chibi log) (chibi memoize) (chibi net) (chibi net server) (chibi net server-util) (chibi net servlet)
(chibi temp-file)) (chibi app) (chibi ast) (chibi config) (chibi log) (chibi memoize)
(chibi temp-file))
(include "http-server.scm")) (include "http-server.scm"))

View file

@ -17,7 +17,7 @@
request-uri-string request-with-uri request-path request-uri-string request-with-uri request-path
copy-request make-request make-cgi-request copy-request make-request make-cgi-request
;; servlets ;; servlets
servlet-write servlet-respond servlet-parse-body! servlet-write servlet-write-status servlet-respond servlet-parse-body!
make-status-servlet servlet-handler servlet-run make-status-servlet servlet-handler servlet-run
servlet-bad-request) servlet-bad-request)
(import (import