Mercurial > emacs
changeset 74198:f99159d8c860
(url-http-wait-for-headers-change-function): Use `when' instead of
`if' when possible.
author | Magnus Henoch <mange@freemail.hu> |
---|---|
date | Sun, 26 Nov 2006 12:50:07 +0000 |
parents | a6d2e4685692 |
children | 96790717f62a |
files | lisp/url/url-http.el |
diffstat | 1 files changed, 111 insertions(+), 113 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/url/url-http.el Sun Nov 26 12:13:30 2006 +0000 +++ b/lisp/url/url-http.el Sun Nov 26 12:50:07 2006 +0000 @@ -928,123 +928,121 @@ url-http-response-status)) (url-http-debug "url-http-wait-for-headers-change-function (%s)" (buffer-name)) - (if (not (bobp)) - (let ((end-of-headers nil) - (old-http nil) - (content-length nil)) - (goto-char (point-min)) - (if (and (looking-at ".*\n") ; have one line at least - (not (looking-at "^HTTP/[1-9]\\.[0-9]"))) - ;; Not HTTP/x.y data, must be 0.9 - ;; God, I wish this could die. - (setq end-of-headers t - url-http-end-of-headers 0 - old-http t) - (if (re-search-forward "^\r*$" nil t) - ;; Saw the end of the headers - (progn - (url-http-debug "Saw end of headers... (%s)" (buffer-name)) - (setq url-http-end-of-headers (set-marker (make-marker) - (point)) - end-of-headers t) - (url-http-clean-headers)))) + (when (not (bobp)) + (let ((end-of-headers nil) + (old-http nil) + (content-length nil)) + (goto-char (point-min)) + (if (and (looking-at ".*\n") ; have one line at least + (not (looking-at "^HTTP/[1-9]\\.[0-9]"))) + ;; Not HTTP/x.y data, must be 0.9 + ;; God, I wish this could die. + (setq end-of-headers t + url-http-end-of-headers 0 + old-http t) + (when (re-search-forward "^\r*$" nil t) + ;; Saw the end of the headers + (url-http-debug "Saw end of headers... (%s)" (buffer-name)) + (setq url-http-end-of-headers (set-marker (make-marker) + (point)) + end-of-headers t) + (url-http-clean-headers))) + + (if (not end-of-headers) + ;; Haven't seen the end of the headers yet, need to wait + ;; for more data to arrive. + nil + (if old-http + (message "HTTP/0.9 How I hate thee!") + (progn + (url-http-parse-response) + (mail-narrow-to-head) + ;;(narrow-to-region (point-min) url-http-end-of-headers) + (setq url-http-transfer-encoding (mail-fetch-field + "transfer-encoding") + url-http-content-type (mail-fetch-field "content-type")) + (if (mail-fetch-field "content-length") + (setq url-http-content-length + (string-to-number (mail-fetch-field "content-length")))) + (widen))) + (when url-http-transfer-encoding + (setq url-http-transfer-encoding + (downcase url-http-transfer-encoding))) - (if (not end-of-headers) - ;; Haven't seen the end of the headers yet, need to wait - ;; for more data to arrive. - nil - (if old-http - (message "HTTP/0.9 How I hate thee!") - (progn - (url-http-parse-response) - (mail-narrow-to-head) - ;;(narrow-to-region (point-min) url-http-end-of-headers) - (setq url-http-transfer-encoding (mail-fetch-field - "transfer-encoding") - url-http-content-type (mail-fetch-field "content-type")) - (if (mail-fetch-field "content-length") - (setq url-http-content-length - (string-to-number (mail-fetch-field "content-length")))) - (widen))) - (if url-http-transfer-encoding - (setq url-http-transfer-encoding - (downcase url-http-transfer-encoding))) - + (cond + ((or (= url-http-response-status 204) + (= url-http-response-status 205)) + (url-http-debug "%d response must have headers only (%s)." + url-http-response-status (buffer-name)) + (when (url-http-parse-headers) + (url-http-activate-callback))) + ((string= "HEAD" url-http-method) + ;; A HEAD request is _ALWAYS_ terminated by the header + ;; information, regardless of any entity headers, + ;; according to section 4.4 of the HTTP/1.1 draft. + (url-http-debug "HEAD request must have headers only (%s)." + (buffer-name)) + (when (url-http-parse-headers) + (url-http-activate-callback))) + ((string= "CONNECT" url-http-method) + ;; A CONNECT request is finished, but we cannot stick this + ;; back on the free connectin list + (url-http-debug "CONNECT request must have headers only.") + (when (url-http-parse-headers) + (url-http-activate-callback))) + ((equal url-http-response-status 304) + ;; Only allowed to have a header section. We have to handle + ;; this here instead of in url-http-parse-headers because if + ;; you have a cached copy of something without a known + ;; content-length, and try to retrieve it from the cache, we'd + ;; fall into the 'being dumb' section and wait for the + ;; connection to terminate, which means we'd wait for 10 + ;; seconds for the keep-alives to time out on some servers. + (when (url-http-parse-headers) + (url-http-activate-callback))) + (old-http + ;; HTTP/0.9 always signaled end-of-connection by closing the + ;; connection. + (url-http-debug + "Saw HTTP/0.9 response, connection closed means end of document.") + (setq url-http-after-change-function + 'url-http-simple-after-change-function)) + ((equal url-http-transfer-encoding "chunked") + (url-http-debug "Saw chunked encoding.") + (setq url-http-after-change-function + 'url-http-chunked-encoding-after-change-function) + (when (> nd url-http-end-of-headers) + (url-http-debug + "Calling initial chunked-encoding for extra data at end of headers") + (url-http-chunked-encoding-after-change-function + (marker-position url-http-end-of-headers) nd + (- nd url-http-end-of-headers)))) + ((integerp url-http-content-length) + (url-http-debug + "Got a content-length, being smart about document end.") + (setq url-http-after-change-function + 'url-http-content-length-after-change-function) (cond - ((or (= url-http-response-status 204) - (= url-http-response-status 205)) - (url-http-debug "%d response must have headers only (%s)." - url-http-response-status (buffer-name)) - (if (url-http-parse-headers) - (url-http-activate-callback))) - ((string= "HEAD" url-http-method) - ;; A HEAD request is _ALWAYS_ terminated by the header - ;; information, regardless of any entity headers, - ;; according to section 4.4 of the HTTP/1.1 draft. - (url-http-debug "HEAD request must have headers only (%s)." - (buffer-name)) - (if (url-http-parse-headers) - (url-http-activate-callback))) - ((string= "CONNECT" url-http-method) - ;; A CONNECT request is finished, but we cannot stick this - ;; back on the free connectin list - (url-http-debug "CONNECT request must have headers only.") - (if (url-http-parse-headers) - (url-http-activate-callback))) - ((equal url-http-response-status 304) - ;; Only allowed to have a header section. We have to handle - ;; this here instead of in url-http-parse-headers because if - ;; you have a cached copy of something without a known - ;; content-length, and try to retrieve it from the cache, we'd - ;; fall into the 'being dumb' section and wait for the - ;; connection to terminate, which means we'd wait for 10 - ;; seconds for the keep-alives to time out on some servers. - (if (url-http-parse-headers) - (url-http-activate-callback))) - (old-http - ;; HTTP/0.9 always signaled end-of-connection by closing the - ;; connection. + ((= 0 url-http-content-length) + ;; We got a NULL body! Activate the callback + ;; immediately! (url-http-debug - "Saw HTTP/0.9 response, connection closed means end of document.") - (setq url-http-after-change-function - 'url-http-simple-after-change-function)) - ((equal url-http-transfer-encoding "chunked") - (url-http-debug "Saw chunked encoding.") - (setq url-http-after-change-function - 'url-http-chunked-encoding-after-change-function) - (if (> nd url-http-end-of-headers) - (progn - (url-http-debug - "Calling initial chunked-encoding for extra data at end of headers") - (url-http-chunked-encoding-after-change-function - (marker-position url-http-end-of-headers) nd - (- nd url-http-end-of-headers))))) - ((integerp url-http-content-length) - (url-http-debug - "Got a content-length, being smart about document end.") - (setq url-http-after-change-function - 'url-http-content-length-after-change-function) - (cond - ((= 0 url-http-content-length) - ;; We got a NULL body! Activate the callback - ;; immediately! - (url-http-debug - "Got 0-length content-length, activating callback immediately.") - (if (url-http-parse-headers) - (url-http-activate-callback))) - ((> nd url-http-end-of-headers) - ;; Have some leftover data - (url-http-debug "Calling initial content-length for extra data at end of headers") - (url-http-content-length-after-change-function - (marker-position url-http-end-of-headers) - nd - (- nd url-http-end-of-headers))) - (t - nil))) + "Got 0-length content-length, activating callback immediately.") + (when (url-http-parse-headers) + (url-http-activate-callback))) + ((> nd url-http-end-of-headers) + ;; Have some leftover data + (url-http-debug "Calling initial content-length for extra data at end of headers") + (url-http-content-length-after-change-function + (marker-position url-http-end-of-headers) + nd + (- nd url-http-end-of-headers))) (t - (url-http-debug "No content-length, being dumb.") - (setq url-http-after-change-function - 'url-http-simple-after-change-function))))) + nil))) + (t + (url-http-debug "No content-length, being dumb.") + (setq url-http-after-change-function + 'url-http-simple-after-change-function))))) ;; We are still at the beginning of the buffer... must just be ;; waiting for a response. (url-http-debug "Spinning waiting for headers..."))