Function: url-http-chunked-encoding-after-change-function

url-http-chunked-encoding-after-change-function is a byte-compiled function defined in url-http.el.gz.

Signature

(url-http-chunked-encoding-after-change-function ST ND LENGTH)

Documentation

Function used when dealing with chunked encoding.

Cannot give a sophisticated percentage, but we need a different function to look for the special 0-length chunk that signifies the end of the document.

Source Code

;; Defined in /usr/src/emacs/lisp/url/url-http.el.gz
(defun url-http-chunked-encoding-after-change-function (st nd length)
  "Function used when dealing with chunked encoding.
Cannot give a sophisticated percentage, but we need a different
function to look for the special 0-length chunk that signifies
the end of the document."
  (if url-http-chunked-last-crlf-missing
      (progn
        (goto-char url-http-chunked-last-crlf-missing)
        (if (not (looking-at "\r\n"))
	    (url-http-debug
             "Still spinning for the terminator of last chunk...")
          (url-http-debug "Saw the last CRLF.")
          (delete-region (match-beginning 0) (match-end 0))
          (when (url-http-parse-headers)
	    (url-http-activate-callback))))
    (save-excursion
      (goto-char st)
      (let ((read-next-chunk t)
	    (case-fold-search t)
	    (regexp nil)
	    (no-initial-crlf nil))
        ;; We need to loop thru looking for more chunks even within
        ;; one after-change-function call.
        (while read-next-chunk
	  (setq no-initial-crlf (= 0 url-http-chunked-counter))
	  (url-http-debug "Reading chunk %d (%d %d %d)"
			  url-http-chunked-counter st nd length)
	  (setq regexp (if no-initial-crlf
			   "\\([0-9a-z]+\\).*\r?\n"
                         "\r?\n\\([0-9a-z]+\\).*\r?\n"))

	  (if url-http-chunked-start
	      ;; We know how long the chunk is supposed to be, skip over
	      ;; leading crap if possible.
	      (if (> nd (+ url-http-chunked-start url-http-chunked-length))
		  (progn
		    (url-http-debug "Got to the end of chunk #%d!"
				    url-http-chunked-counter)
		    (goto-char (+ url-http-chunked-start
				  url-http-chunked-length)))
                (url-http-debug "Still need %d bytes to hit end of chunk"
                                (- (+ url-http-chunked-start
				      url-http-chunked-length)
				   nd))
                (setq read-next-chunk nil)))
	  (if (not read-next-chunk)
	      (url-http-debug "Still spinning for next chunk...")
	    (if no-initial-crlf (skip-chars-forward "\r\n"))
	    (if (not (looking-at regexp))
                (progn
                  ;; Must not have received the entirety of the chunk header,
		  ;; need to spin some more.
		  (url-http-debug "Did not see start of chunk @ %d!" (point))
		  (setq read-next-chunk nil))
              ;; The data we got may have started in the middle of the
              ;; initial chunk header, so move back to the start of the
              ;; line and re-compute.
              (when (= url-http-chunked-counter 0)
                (beginning-of-line)
                (looking-at regexp))
              (add-text-properties (match-beginning 0) (match-end 0)
                                   (list 'chunked-encoding t
                                         'face 'cursor
                                         'invisible t))
	      (setq url-http-chunked-length
                    (string-to-number (buffer-substring (match-beginning 1)
                                                        (match-end 1))
                                      16)
		    url-http-chunked-counter (1+ url-http-chunked-counter)
		    url-http-chunked-start (set-marker
					    (or url-http-chunked-start
                                                (make-marker))
					    (match-end 0)))
	      (delete-region (match-beginning 0) (match-end 0))
	      (url-http-debug "Saw start of chunk %d (length=%d, start=%d"
			      url-http-chunked-counter url-http-chunked-length
			      (marker-position url-http-chunked-start))
	      (if (= 0 url-http-chunked-length)
		  (progn
		    ;; Found the end of the document!  Wheee!
		    (url-http-debug "Saw end of stream chunk!")
		    (setq read-next-chunk nil)
		    ;; Every chunk, even the last 0-length one, is
		    ;; terminated by CRLF.  Skip it.
		    (if (not (looking-at "\r?\n"))
                        (progn
                          (url-http-debug
                           "Spinning for the terminator of last chunk...")
                          (setq url-http-chunked-last-crlf-missing
                                      (point)))
		      (url-http-debug "Removing terminator of last chunk")
		      (delete-region (match-beginning 0) (match-end 0))
		      (when (re-search-forward "^\r?\n" nil t)
                        (url-http-debug "Saw end of trailers..."))
		      (when (url-http-parse-headers)
                        (url-http-activate-callback))))))))))))