@@ -939,14 +939,15 @@ responses.")
939939
940940(defn web-finalize-response [resp keep-alive]
941941 (let [body-len (String.length (Response.body &resp))
942- cl-k @"Content-Length"
943- cl-v [(Int.str body-len)]
942+ has-te (Map.contains? (Response.headers &resp) "Transfer-Encoding")
944943 conn-k @"Connection"
945944 conn-v [(if keep-alive @"keep-alive" @"close")]
946- h (Map.put
947- (Map.put @(Response.headers &resp) &cl-k &cl-v)
948- &conn-k
949- &conn-v)]
945+ h (let [base (Map.put @(Response.headers &resp) &conn-k &conn-v)]
946+ (if has-te
947+ base
948+ (let [cl-k @"Content-Length"
949+ cl-v [(Int.str body-len)]]
950+ (Map.put base &cl-k &cl-v))))]
950951 (Response.set-headers resp h)))
951952
952953(defn read-request-buf [client buf]
@@ -1675,17 +1676,19 @@ fallback.")
16751676 (if (< ffd 0)
16761677 -1l
16771678 (let [sz (IO.Raw.fstat-size ffd)]
1678- (do
1679- (Map.put! (ConnState.sf-fds cs)
1680- &fd
1681- &ffd)
1682- (Map.put! (ConnState.sf-offsets cs)
1683- &fd
1684- &0l)
1685- (Map.put! (ConnState.sf-sizes cs)
1686- &fd
1687- &sz)
1688- sz))))
1679+ (if (< sz 0l)
1680+ (do (ignore (IO.Raw.close-fd ffd)) -1l)
1681+ (do
1682+ (Map.put! (ConnState.sf-fds cs)
1683+ &fd
1684+ &ffd)
1685+ (Map.put! (ConnState.sf-offsets cs)
1686+ &fd
1687+ &0l)
1688+ (Map.put! (ConnState.sf-sizes cs)
1689+ &fd
1690+ &sz)
1691+ sz)))))
16891692 (Maybe.Nothing) -1l)
16901693 actual-resp (if (and (Maybe.just? &sf-path)
16911694 (< sf-result 0l))
@@ -1925,16 +1928,17 @@ stdout. Reads the start time from `_start` in params, set by
19251928 (GET \"/\" hello))
19261929```")
19271930(defn log-after [req params resp]
1928- (let [start (Maybe.unsafe-from (Long.from-string &(Map.get params "_start")))
1929- now (Uint64.to-long (System.nanotime))
1930- elapsed (/ (- now start) 1000000l)]
1931- (do
1932- (Log.info "%s /%s %d %ldms"
1933- (Request.verb req)
1934- &(web-request-path req)
1935- (Response.code &resp)
1936- elapsed)
1937- resp)))
1931+ (let-do [start (match (Long.from-string &(Map.get params "_start"))
1932+ (Maybe.Just v) v
1933+ (Maybe.Nothing) 0l)
1934+ now (Uint64.to-long (System.nanotime))
1935+ elapsed (/ (- now start) 1000000l)]
1936+ (Log.info "%s /%s %d %ldms"
1937+ (Request.verb req)
1938+ &(web-request-path req)
1939+ (Response.code &resp)
1940+ elapsed)
1941+ resp))
19381942
19391943; ---------------------------------------------------------------------------
19401944; defserver: generate a main that builds an App and starts serving
0 commit comments