send bug report only on non-os-errors
This commit is contained in:
parent
688d576b96
commit
5746c2b149
|
@ -61,7 +61,7 @@
|
|||
(lambda ()
|
||||
(socket-address->internet-address (socket-remote-address sock)))
|
||||
(lambda (host-address service-port)
|
||||
(if (and rate-limiter *http-syslog?*)
|
||||
(if (and rate-limiter (http-syslog?))
|
||||
(http-syslog (syslog-level info) "<~a>~a: concurrent request #~a~%"
|
||||
(pid)
|
||||
(format-internet-host-address host-address)
|
||||
|
@ -72,13 +72,13 @@
|
|||
(lambda ()
|
||||
(set-port-buffering (current-input-port) bufpol/none)
|
||||
(process-toplevel-request sock host-address options)
|
||||
(if *http-syslog?*
|
||||
(if (http-syslog?)
|
||||
(http-syslog (syslog-level debug) "<~a>~a [closing]~%"
|
||||
(pid)
|
||||
(format-internet-host-address host-address)))
|
||||
(with-fatal-error-handler
|
||||
(lambda (c decline)
|
||||
(if *http-syslog?*
|
||||
(if (http-syslog?)
|
||||
(http-syslog (syslog-level notice) "<~a>~a [error closing (~a)]~%"
|
||||
(pid)
|
||||
(format-internet-host-address host-address)
|
||||
|
@ -86,7 +86,7 @@
|
|||
(close-socket sock))
|
||||
(if rate-limiter
|
||||
(rate-limit-close rate-limiter))
|
||||
(if *http-syslog?*
|
||||
(if (http-syslog?)
|
||||
(http-syslog (syslog-level info) "<~a>~a [closed]~%"
|
||||
(pid)
|
||||
(format-internet-host-address host-address)))))))))
|
||||
|
@ -153,15 +153,17 @@
|
|||
#f ; No request yet.
|
||||
"Request parsing error -- report to client maintainer."
|
||||
(condition-stuff c))))
|
||||
((error? c)
|
||||
((not (and (exception? c)
|
||||
(eq? (exception-reason c)
|
||||
(enum exception os-error))))
|
||||
|
||||
;; try to send bug report to client
|
||||
(values #f
|
||||
(apply make-http-error-response http-status/internal-error
|
||||
#f ; don't know
|
||||
(format #f
|
||||
"Internal error occured while processing request")
|
||||
"Internal error occured while processing request"
|
||||
c)))
|
||||
(else ; there's no else...
|
||||
(else
|
||||
(decline))))
|
||||
(lambda ()
|
||||
(let ((initial-req (parse-http-request sock options)))
|
||||
|
@ -219,7 +221,7 @@
|
|||
(define (parse-http-request sock options)
|
||||
(let ((line (read-crlf-line (socket:inport sock))))
|
||||
;; Blat out some logging info.
|
||||
(if *http-syslog?*
|
||||
(if (http-syslog?)
|
||||
(call-with-values
|
||||
(lambda ()
|
||||
(socket-address->internet-address (socket-remote-address sock)))
|
||||
|
|
|
@ -8,35 +8,69 @@
|
|||
;;; For copyright information, see the file COPYING which comes with
|
||||
;;; the distribution.
|
||||
|
||||
;; default: no logging
|
||||
;; initialized by init-http-log!
|
||||
(define do-nothing-proc (lambda a #f))
|
||||
(define-record logging
|
||||
(http-log-port #f) ;port to perform CLF-logging
|
||||
(http-log-proc do-nothing-proc) ;proc to run for CLF-logging (req status-code)
|
||||
(http-syslog? #f) ;do syslogging?
|
||||
(http-syslog-proc do-nothing-proc) ;proc to run for syslog (level fmt . args)
|
||||
(dns-lookup? #f)) ;perform dns-lookups?
|
||||
|
||||
;; CLF-logging
|
||||
;; if enabled, it will look like this:
|
||||
;; (lambda req status-code)
|
||||
(define http-log (lambda a #f)) ; makes logging in CLF
|
||||
(define logging (make-fluid #f))
|
||||
|
||||
;; syslogging
|
||||
;; if enabled, it will look like this:
|
||||
;; (lambda (level fmt . args)
|
||||
(define http-syslog (lambda a #f)) ; makes syslog
|
||||
(define *http-syslog?* #f) ; trigger used to avoid
|
||||
; unnecessary computations
|
||||
(define *http-log-port*)
|
||||
(define (http-log-port)
|
||||
*http-log-port*)
|
||||
(define (set-http-log-port! port)
|
||||
(set! *http-log-port* port))
|
||||
(define dns-lookup? #f) ; perform DNS lookups (write names instead of ips)?
|
||||
(define (make-fluid-selector selector)
|
||||
(lambda () (selector (fluid logging))))
|
||||
|
||||
(define (make-fluid-setter setter)
|
||||
(lambda (value)
|
||||
(setter (fluid logging) value)))
|
||||
|
||||
(define logging-http-log-proc (make-fluid-selector logging:http-log-proc))
|
||||
(define logging-http-syslog-proc (make-fluid-selector logging:http-syslog-proc))
|
||||
(define logging-http-syslog? (make-fluid-selector logging:http-syslog?))
|
||||
(define logging-http-log-port (make-fluid-selector logging:http-log-port))
|
||||
(define logging-dns-lookup? (make-fluid-selector logging:dns-lookup?))
|
||||
|
||||
(define set-logging-http-log-proc (make-fluid-setter set-logging:http-log-proc))
|
||||
(define set-logging-http-syslog-proc (make-fluid-setter set-logging:http-syslog-proc))
|
||||
(define set-logging-http-syslog? (make-fluid-setter set-logging:http-syslog?))
|
||||
(define set-logging-http-log-port (make-fluid-setter set-logging:http-log-port))
|
||||
(define set-logging-dns-lookup? (make-fluid-setter set-logging:dns-lookup?))
|
||||
|
||||
(define http-syslog
|
||||
(lambda a
|
||||
(apply (logging-http-syslog-proc) a)))
|
||||
|
||||
(define http-log
|
||||
(lambda a
|
||||
(apply (logging-http-log-proc) a)))
|
||||
|
||||
(define (http-syslog?)
|
||||
(logging-http-syslog?))
|
||||
|
||||
(define (init-http-log! options)
|
||||
;; syslog has to be initialized befor CLF-logging
|
||||
;; because it may generate syslog-messages
|
||||
;; syslog has to be initialized before CLF-logging
|
||||
;; because the latter may generate syslog-messages
|
||||
(set! logging (make-fluid (make-logging)))
|
||||
(init-http-syslog! (httpd-options-syslog? options))
|
||||
(init-http-port-log! (httpd-options-logfile options))
|
||||
(if (httpd-options-resolve-ips? options)
|
||||
(set! dns-lookup? #t)
|
||||
(set! dns-lookup? #f)))
|
||||
(set-logging-dns-lookup? #t)
|
||||
(set-logging-dns-lookup? #f)))
|
||||
|
||||
(define (init-http-syslog! syslog?)
|
||||
(if syslog?
|
||||
(let ((http-syslog-lock (make-lock)))
|
||||
(set-logging-http-syslog? #t)
|
||||
(set-logging-http-syslog-proc
|
||||
(lambda (level fmt . args)
|
||||
(obtain-lock http-syslog-lock)
|
||||
(syslog level
|
||||
(apply format #f fmt args))
|
||||
(release-lock http-syslog-lock))))
|
||||
(begin
|
||||
(set-logging-http-syslog? #f)
|
||||
(set-logging-http-syslog-proc do-nothing-proc))))
|
||||
|
||||
(define (init-http-port-log! logfile)
|
||||
(let ((logport
|
||||
|
@ -57,25 +91,12 @@
|
|||
|
||||
(if logfile ; if logging was specified, set up the logger
|
||||
(let ((http-log-lock (make-lock)))
|
||||
(set-http-log-port! logport)
|
||||
(set-logging-http-log-port logport)
|
||||
(if (string? logfile)
|
||||
(spawn (make-logfile-rotator logfile http-log-lock)))
|
||||
(set! http-log (make-http-log-proc http-log-lock))))))
|
||||
; alternative-clause: default values of *http-syslog?* and http-log
|
||||
|
||||
(define (init-http-syslog! syslog?)
|
||||
(if syslog?
|
||||
(let ((http-syslog-lock (make-lock)))
|
||||
(set! *http-syslog?* #t)
|
||||
(set! http-syslog
|
||||
(lambda (level fmt . args)
|
||||
(obtain-lock http-syslog-lock)
|
||||
(syslog level
|
||||
(apply format #f fmt args))
|
||||
(release-lock http-syslog-lock))))))
|
||||
(set-logging-http-log-proc (make-http-log-proc http-log-lock))))))
|
||||
|
||||
(define (make-http-log-proc http-log-lock)
|
||||
; (display "--- MARK (server started) ---\n" http-log-port)
|
||||
(lambda (req status-code)
|
||||
(if req
|
||||
(begin
|
||||
|
@ -93,8 +114,8 @@
|
|||
23 ; filesize (unknown)
|
||||
(get-header (request:headers req) 'referer)
|
||||
(get-header (request:headers req) 'user-agent))
|
||||
(http-log-port))
|
||||
(force-output (http-log-port))
|
||||
(logging-http-log-port))
|
||||
(force-output (logging-http-log-port))
|
||||
(release-lock http-log-lock)))))
|
||||
|
||||
|
||||
|
@ -106,8 +127,8 @@
|
|||
interrupt/usr1
|
||||
(lambda ()
|
||||
(obtain-lock http-log-lock)
|
||||
(close-output-port (http-log-port))
|
||||
(set-http-log-port! (open-logfile logfile))
|
||||
(close-output-port (logging-http-log-port))
|
||||
(set-logging-http-log-port (open-logfile logfile))
|
||||
(release-lock http-log-lock)))))
|
||||
|
||||
(define (open-logfile logfile)
|
||||
|
@ -143,7 +164,7 @@
|
|||
|
||||
|
||||
(define (maybe-dns-lookup remote-ip)
|
||||
(if dns-lookup?
|
||||
(if (logging-dns-lookup?)
|
||||
(or (dns-lookup-ip remote-ip)
|
||||
remote-ip)
|
||||
remote-ip))
|
|
@ -290,9 +290,11 @@
|
|||
|
||||
(define-interface httpd-logging-interface
|
||||
(export init-http-log!
|
||||
*http-syslog?*
|
||||
http-syslog?
|
||||
http-syslog
|
||||
http-log))
|
||||
http-log
|
||||
logging
|
||||
make-logging))
|
||||
|
||||
(define-interface httpd-request-interface
|
||||
(export make-request ; HTTP request
|
||||
|
@ -690,6 +692,9 @@
|
|||
dns ; dns-lookup-ip
|
||||
sunet-utilities ; socket-address->string
|
||||
locks ; make-lock et al.
|
||||
fluids ; let-fluid
|
||||
enumerated ; enum
|
||||
architecture ; exception, os-error
|
||||
|
||||
handle-fatal-error
|
||||
httpd-read-options
|
||||
|
@ -733,11 +738,13 @@
|
|||
httpd-request ; request record
|
||||
formats ; format
|
||||
format-net ; format-internet-host-address
|
||||
srfi-13 ; string-join, string-trim
|
||||
srfi-13 ; string-join, string-trim
|
||||
rfc822 ; get-header
|
||||
sunet-utilities ; on-interrupt
|
||||
threads ; spawn
|
||||
dns ; dns-lookup-ip
|
||||
defrec-package ; define-record
|
||||
fluids ; make-fluid et al.
|
||||
scsh
|
||||
scheme)
|
||||
(files (httpd logging)))
|
||||
|
|
Loading…
Reference in New Issue