(define-module(www server-utils log)#:export(string<-sockaddr log-http-response-proc)#:use-module(ice-9 optargs))
(define (fs s . args)(apply simple-format #f s args))
(define ntop(cond-expand(guile-2 inet-ntop)(else(lambda(family-ignored addr)(inet-ntoa addr)))))
(define(string<-sockaddr saddr)(let((fam(sockaddr:fam saddr)))(cond((= AF_UNIX fam)(let((fn(sockaddr:path saddr)))(if(or(not fn)(string-null? fn))"localhost" fn)))((= AF_INET fam)(let((addr(sockaddr:addr saddr))(port(sockaddr:port saddr)))(fs "~A:~A"(ntop fam addr)port)))(else(object->string saddr)))))
(define*(log-http-response-proc port #:optional gmtime?(stamp-format "%Y-%m-%d:%H:%M:%S %Z")method-pair?)(setvbuf port(cond-expand(guile-2.2  'line)(else _IOLBF)))(let*((rep(if gmtime? gmtime localtime))(meth(if method-pair? car identity))(vers(if method-pair?(lambda(x)(fs " ~A"(cdr x)))(lambda(x)""))))(define (fsp s . args)(apply simple-format port s args))(lambda(client method upath status)(fsp "~A - - [~A] \"~A ~A~A\" ~A" client(strftime stamp-format(rep(current-time)))(meth method)upath(vers method)(if(pair? status)(car status)status))(and(pair? status)(for-each(lambda(x)(fsp " ~A" x))(cdr status)))(newline port))))
