Subject: bug#10768: closed (Re: bug#10768: 23.3; url-http misses data when last few bytes are in 2nd packet and content-length is used)

From: [email-masked] (GNU bug Tracking System)
Date: Fri, 10 Feb 2012 11:49:02 +0000

Your bug report

#10768: 23.3; url-http misses data when last few bytes are in 2nd packet and content-length is used

which was filed against the emacs package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
10768: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=10768
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: bug#10768: 23.3; url-http misses data when last few bytes are in 2nd packet and content-length is used
From: Andreas Schwab <[email-masked]>
To: "Christopher J. White" <[email-masked]>
Cc: [email-masked]
Date: Fri, 10 Feb 2012 12:47:20 +0100
List-Id: <debbugs-submit.debbugs.gnu.org>

Thanks for testing, installed in trunk.

Andreas.

-- 
Andreas Schwab, [email-masked]
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."

Subject: 23.3; url-http misses data when last few bytes are in 2nd packet and content-length is used
From: "Christopher J. White" <[email-masked]>
To: [email-masked]
Date: Wed, 8 Feb 2012 23:53:21 -0500
List-Id: <debbugs-submit.debbugs.gnu.org>

I’m using url-http to retrieve an XML response.  In noticed somewhat by
chance that certain page sizes were cutting off the last few characters
of the response, which in turn caused the XML to be poorly formed.

I've noticed the issue occurs when the payload response has to be sent
in two TCP packets and the last packet has 8 or fewer bytes.  I observe
this by looking at the HTTP stream in Wireshark.

I spent time tracing the response by adding some debug using
url-http-debug.  The first chunk of data comes from the first TCP packet
and includes the HTTP header and all the XML data minus the last 8 bytes.
url-http-wait-for-headers-change-function is called to process this
chunk of data.  After processing this chunk, the connection is closed
and the buffer of XML data returned minux the 8 bytes.

Here's the http trace, along with my added debug messages (inlcuding
dumping of the full data):

----------------------------------------
22:06.781000 http -> Contacting host: api.toodledo.com:80
22:06.827000 http -> Marking connection as busy: api.toodledo.com:80 #<process api.toodledo.com<1>>
22:06.828000 http -> Request is: 
POST /2/tasks/get.php HTTP/1.1 
MIME-Version: 1.0 
Connection: keep-alive 
Extension: Security/Digest Security/SSL 
Host: api.toodledo.com 
Accept-charset: nil 
Accept: */* 
User-Agent: URL/Emacs (i386-mingw-nt6.1.7601; Windows-NT; 32bit) 
Content-Type: application/x-www-form-urlencoded 
Content-length: 212 
 
f=xml&key=9f2a92de083e8d63c2bd14771661139f&unix=1&fields=status%2crepeat%2crepeatfrom%2ccontext%2cduedate%2cduetime%2cstartdate%2cstarttime%2cfolder%2cgoal%2cpriority%2cnote%2clength%2cparent&comp=%2d1&modafter=0 

22:06.828000 retrieval -> Spinning in url-retrieve-synchronously: nil (#<buffer  *http api.toodledo.com:80*<80>>)
22:06.889000 http -> Calling after change function `url-http-wait-for-headers-change-function' for `#<process api.toodledo.com<1>>'
22:06.889000 http ->    data (point-max 1) (len 1380):
"HTTP/1.1 200 OK 
Date: Thu, 09 Feb 2012 04:22:06 GMT 
Server: Apache/2.2.3 (Red Hat) 
Content-Length: 1189 
Keep-Alive: timeout=2, max=100 
Connection: Keep-Alive 
Content-Type: application/xml 
 
<?xml version=\"1.0\" encoding=\"UTF-8\"?><tasks num='3' total='3'><task><id>9105869</id><title>Test 1</title><modified>1328482938</modified><completed>1327924800</completed><folder>0</folder><context>0</context><goal>0</goal><priority>0</priority><repeat></repeat><repeatfrom>0</repeatfrom><duedate>1328097600</duedate><startdate>0</startdate><duetime>1328137200</duetime><starttime>0</starttime><length>0</length><status>2</status><note></note></task><task><id>9108309</id><title>Test 2 -foobar</title><modified>1328761322</modified><completed>0</completed><folder>0</folder><context>0</context><goal>0</goal><priority>0</priority><repeat></repeat><repeatfrom>0</repeatfrom><duedate>0</duedate><startdate>0</startdate><duetime>0</duetime><starttime>0</starttime><length>0</length><status>2</status><note></note></task><task><id>9149333</id><title>org-toodledo</title><modified>1328011949</modified><completed>0</completed><folder>0</folder><context>0</context><goal>0</goal><priority>2</priority><repeat></repeat><repeatfrom>0</repeatfrom><duedate>0</duedate><startdate>0</startdate><duetime>0</duetime><starttime>0</starttime><length>0</length><status>2</status><note></note></task></"
22:06.889000 http -> url-http-wait-for-headers-change-function ( *http api.toodledo.com:80*<80>)
22:06.890000 http -> Saw end of headers... ( *http api.toodledo.com:80*<80>) @ 197
22:06.890000 http -> url-http-clean-headers, end-of-headers now at 189
22:06.890000 http -> url-http-parse-response called in ( *http api.toodledo.com:80*<80>)
22:06.890000 http -> Got a content-length 1189, being smart about document end.
22:06.890000 http -> Calling initial content-length for extra data at end of headers
22:06.890000 http -> url-http-content-length-after-change-function 189 1381 1192
22:06.891000 http -> End of document found!
22:06.891000 http -> Marking connection as free: api.toodledo.com:80 #<process api.toodledo.com<1>>
22:06.891000 http -> url-http-parse-headers called in ( *http api.toodledo.com:80*<80>)
22:06.891000 http -> url-http-parse-response called in ( *http api.toodledo.com:80*<80>)
22:06.891000 http -> Parsed HTTP headers: class=2 status=200
22:06.891000 http -> Finished parsing HTTP headers: t
22:06.891000 http -> Marking connection as free: api.toodledo.com:80 #<process api.toodledo.com<1>>
22:06.891000 http -> Activating callback in buffer ( *http api.toodledo.com:80*<80>)
----------------------------------------

Notice that the XML in the data finishes with "...</note></task></".  It
should finish with:  "...</note></task></tasks>".  

A key debug message I added is "End of document found!", and this is
placed in the function url-http-content-length-after-change-function
right after the comment "Found the end of the document!  Wheee!":

(defun url-http-content-length-after-change-function (st nd length)
  <....>
  (if (> (- nd url-http-end-of-headers) url-http-content-length)
      (progn
	;; Found the end of the document!  Wheee!
        (url-http-debug "End of document found!")
	(url-display-percentage nil nil)
	(url-lazy-message "Reading... done.")
	(if (url-http-parse-headers)
	    (url-http-activate-callback)))))

If I slightly increase or decrease the amount of data returned
by the XML (by adding or deleting characters from title), I can get it
to work properly or not.  

For example, by adding 5 chars, I get:

----------------------------------------
39:20.144000 http -> Finding free connection: api.toodledo.com:80
39:20.144000 http -> Contacting host: api.toodledo.com:80
39:20.187000 http -> Marking connection as busy: api.toodledo.com:80 #<process api.toodledo.com<1>>
39:20.188000 http -> Request is: 
POST /2/tasks/get.php HTTP/1.1 
MIME-Version: 1.0 
Connection: keep-alive 
Extension: Security/Digest Security/SSL 
Host: api.toodledo.com 
Accept-charset: nil 
Accept: */* 
User-Agent: URL/Emacs (i386-mingw-nt6.1.7601; Windows-NT; 32bit) 
Content-Type: application/x-www-form-urlencoded 
Content-length: 212 
 
f=xml&key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&unix=1&fields=status%2crepeat%2crepeatfrom%2ccontext%2cduedate%2cduetime%2cstartdate%2cstarttime%2cfolder%2cgoal%2cpriority%2cnote%2clength%2cparent&comp=%2d1&modafter=0 

39:20.188000 retrieval -> Spinning in url-retrieve-synchronously: nil (#<buffer  *http api.toodledo.com:80*<86>>)
39:20.242000 http -> Calling after change function `url-http-wait-for-headers-change-function' for `#<process api.toodledo.com<1>>'
39:20.243000 http ->    data (point-max 1) (len 1380):
"HTTP/1.1 200 OK 
Date: Thu, 09 Feb 2012 04:39:20 GMT 
Server: Apache/2.2.3 (Red Hat) 
Content-Length: 1194 
Keep-Alive: timeout=2, max=100 
Connection: Keep-Alive 
Content-Type: application/xml 
 
<?xml version=\"1.0\" encoding=\"UTF-8\"?><tasks num='3' total='3'><task><id>9105869</id><title>Test 1</title><modified>1328482938</modified><completed>1327924800</completed><folder>0</folder><context>0</context><goal>0</goal><priority>0</priority><repeat></repeat><repeatfrom>0</repeatfrom><duedate>1328097600</duedate><startdate>0</startdate><duetime>1328137200</duetime><starttime>0</starttime><length>0</length><status>2</status><note></note></task><task><id>9108309</id><title>Test 2 -foobar12345</title><modified>1328762353</modified><completed>0</completed><folder>0</folder><context>0</context><goal>0</goal><priority>0</priority><repeat></repeat><repeatfrom>0</repeatfrom><duedate>0</duedate><startdate>0</startdate><duetime>0</duetime><starttime>0</starttime><length>0</length><status>2</status><note></note></task><task><id>9149333</id><title>org-toodledo</title><modified>1328011949</modified><completed>0</completed><folder>0</folder><context>0</context><goal>0</goal><priority>2</priority><repeat></repeat><repeatfrom>0</repeatfrom><duedate>0</duedate><startdate>0</startdate><duetime>0</duetime><starttime>0</starttime><length>0</length><status>2</status><note></note></ta"
39:20.243000 http -> url-http-wait-for-headers-change-function ( *http api.toodledo.com:80*<86>)
39:20.243000 http -> Saw end of headers... ( *http api.toodledo.com:80*<86>) @ 197
39:20.243000 http -> url-http-clean-headers, end-of-headers now at 189
39:20.243000 http -> url-http-parse-response called in ( *http api.toodledo.com:80*<86>)
39:20.243000 http -> Got a content-length 1194, being smart about document end.
39:20.243000 http -> Calling initial content-length for extra data at end of headers
39:20.243000 http -> url-http-content-length-after-change-function 189 1381 1192
39:20.244000 http -> Spinning waiting for headers...
39:20.244000 retrieval -> Spinning in url-retrieve-synchronously: nil (#<buffer  *http api.toodledo.com:80*<86>>)
39:20.247000 http -> Calling after change function `url-http-content-length-after-change-function' for `#<process api.toodledo.com<1>>'
39:20.247000 http ->    data (point-max 1373) (len 11):
"sk></tasks>"
39:20.247000 http -> url-http-content-length-after-change-function 1373 1384 11
39:20.247000 http -> End of document found!
39:20.247000 http -> Marking connection as free: api.toodledo.com:80 #<process api.toodledo.com<1>>
39:20.247000 http -> url-http-parse-headers called in ( *http api.toodledo.com:80*<86>)
39:20.247000 http -> url-http-parse-response called in ( *http api.toodledo.com:80*<86>)
39:20.247000 http -> Parsed HTTP headers: class=2 status=200
39:20.248000 http -> Finished parsing HTTP headers: t
39:20.248000 http -> Marking connection as free: api.toodledo.com:80 #<process api.toodledo.com<1>>
39:20.248000 http -> Activating callback in buffer ( *http api.toodledo.com:80*<86>)
----------------------------------------

In this case, url-http waits for the remaining data from the second TCP
packet, which comes in slightly later and is pieced together and forms a
good XML document.

If I reduce the size by an appropriate number of bytes so that the XML
data fits entirely in the first packet it also works. 

I think the problem relates to url-http-clean-headers.  I have 8-lines
of headers, and this function removes the trailing \r from each of those
lines.  I think this is not accounted for when using the content-length
to determine if all the data has been received.   After dropping these 8
trailing \r charaters, the buffer positions all change.  

I'm not quite able to figure out how the content-length is used to
detect the end of processing, so I thought I'd submit this bug and see
if any other folks can point me in the right direction.

...cj

In GNU Emacs 23.3.1 (i386-mingw-nt6.1.7601)
 of 2011-03-10 on 3249CTO
Windowing system distributor `Microsoft Corp.', version 6.1.7601
configured using `configure --with-gcc (4.5) --no-opt --cflags -Ic:/imagesupport/include'

Important settings:
  value of $LC_ALL: nil
  value of $LC_COLLATE: nil
  value of $LC_CTYPE: nil
  value of $LC_MESSAGES: nil
  value of $LC_MONETARY: nil
  value of $LC_NUMERIC: nil
  value of $LC_TIME: nil
  value of $LANG: C.UTF-8
  value of $XMODIFIERS: nil
  locale-coding-system: cp1252
  default enable-multibyte-characters: t

Major mode: Fundamental

Minor modes in effect:
  show-paren-mode: t
  display-time-mode: t
  tooltip-mode: t
  mouse-wheel-mode: t
  global-font-lock-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  column-number-mode: t
  line-number-mode: t
  transient-mark-mode: t

Recent input:
- - - - - - - - - - - - - - - - <return> <return> <switch-frame> 
<help-echo> <select-window> <backspace> <escape> C-x 
<select-window> <help-echo> C-/ C-/ C-/ C-/ SPC C-/ 
C-/ C-a <tab> <tab> C-x [ C-x ] C-x [ C-/ C-/ C-/ C-x 
[ C-SPC C-x ] C-w C-/ C-/ C-/ C-/ C-/ C-/ C-/ C-/ C-a 
<tab> <S-tab> <tab> C-o s <help-echo> <switch-frame> 
C-SPC C-x ] <up> <up> <up> <up> <up> <up> <up> <up> 
<up> <up> <up> <up> <up> <up> <up> <up> <up> <up> <up> 
<up> <up> <up> <up> <up> <up> <up> <up> <up> <up> <up> 
<up> <up> <up> <up> <up> <up> <up> <up> <up> <up> <up> 
<up> <up> <up> <up> <up> <up> <up> <up> <up> <up> <up> 
<up> <up> <up> <down> C-w <up> <down> <switch-frame> 
<switch-frame> <down> <down> C-x 2 <prior> <prior> 
<down> <down> <down-mouse-1> <mouse-movement> <mouse-1> 
<C-left> C-s C-w C-w C-w C-w C-w C-w C-w <return> C-x 
o C-s C-s C-a <help-echo> C-a C-l C-n C-n C-n C-n C-n 
C-n C-n C-n C-n C-n C-n C-n C-n C-n C-n C-n C-n <down> 
<down> <down> <down> C-x o C-p C-n C-n C-n C-n C-n 
C-n C-n C-n C-n C-n C-n C-n C-n C-n C-n C-n C-n C-l 
C-n C-n C-l C-n C-n C-n C-n C-n C-l C-n C-n C-n C-n 
C-l C-x o C-n C-n C-n <select-window> <select-window> 
<select-window> <help-echo> <prior> <prior> <next> 
<switch-frame> <down-mouse-1> <mouse-movement> <mouse-1> 
C-o s <select-window> <help-echo> <switch-frame> <down-mouse-1> 
<mouse-movement> <mouse-1> C-x ] <prior> <switch-frame> 
<down-mouse-1> <mouse-movement> <mouse-1> <down-mouse-1> 
<mouse-1> SPC <escape> C-x <select-window> <help-echo> 
<select-window> C-x o C-o s <switch-frame> <down-mouse-1> 
<mouse-movement> <mouse-1> C-x ] C-r t a s k s C-r 
C-r C-r C-s C-a <next> <switch-frame> <switch-frame> 
<switch-frame> <switch-frame> <switch-frame> <switch-frame> 
<switch-frame> <switch-frame> <escape> x r e p o <tab> 
r t SPC e m SPC SPC <return>

Recent messages:
Reading [application/xml 
]... 1k of 1k (100%)
Contacting host: api.toodledo.com:80
Reading [application/xml 
]... 718 bytes of 717 bytes (100%)
Sync complete, 794 changes: recv 3 mod 791 del 
Mark set
Mark saved where search started
Auto-saving...done
Making completion list...

Load-path shadows:
~cwhite/lib/lisp/org-toodledo/w3mexcerpt hides ~cwhite/lib/lisp/w3mexcerpt
~cwhite/lib/lisp/org-toodledo/http-post-simple hides ~cwhite/lib/lisp/http-post-simple
~/lib/lisp/org-mode/lisp/org hides c:/Users/cwhite/emacs-23.3/lisp/org/org
~/lib/lisp/org-mode/lisp/org-xoxo hides c:/Users/cwhite/emacs-23.3/lisp/org/org-xoxo
~/lib/lisp/org-mode/lisp/org-wl hides c:/Users/cwhite/emacs-23.3/lisp/org/org-wl
~/lib/lisp/org-mode/lisp/org-w3m hides c:/Users/cwhite/emacs-23.3/lisp/org/org-w3m
~/lib/lisp/org-mode/lisp/org-vm hides c:/Users/cwhite/emacs-23.3/lisp/org/org-vm
~/lib/lisp/org-mode/lisp/org-timer hides c:/Users/cwhite/emacs-23.3/lisp/org/org-timer
~/lib/lisp/org-mode/lisp/org-table hides c:/Users/cwhite/emacs-23.3/lisp/org/org-table
~/lib/lisp/org-mode/lisp/org-src hides c:/Users/cwhite/emacs-23.3/lisp/org/org-src
~/lib/lisp/org-mode/lisp/org-rmail hides c:/Users/cwhite/emacs-23.3/lisp/org/org-rmail
~/lib/lisp/org-mode/lisp/org-remember hides c:/Users/cwhite/emacs-23.3/lisp/org/org-remember
~/lib/lisp/org-mode/lisp/org-publish hides c:/Users/cwhite/emacs-23.3/lisp/org/org-publish
~/lib/lisp/org-mode/lisp/org-protocol hides c:/Users/cwhite/emacs-23.3/lisp/org/org-protocol
~/lib/lisp/org-mode/lisp/org-plot hides c:/Users/cwhite/emacs-23.3/lisp/org/org-plot
~/lib/lisp/org-mode/lisp/org-mouse hides c:/Users/cwhite/emacs-23.3/lisp/org/org-mouse
~/lib/lisp/org-mode/lisp/org-mobile hides c:/Users/cwhite/emacs-23.3/lisp/org/org-mobile
~/lib/lisp/org-mode/lisp/org-mhe hides c:/Users/cwhite/emacs-23.3/lisp/org/org-mhe
~/lib/lisp/org-mode/lisp/org-mew hides c:/Users/cwhite/emacs-23.3/lisp/org/org-mew
~/lib/lisp/org-mode/lisp/org-macs hides c:/Users/cwhite/emacs-23.3/lisp/org/org-macs
~/lib/lisp/org-mode/lisp/org-mac-message hides c:/Users/cwhite/emacs-23.3/lisp/org/org-mac-message
~/lib/lisp/org-mode/lisp/org-list hides c:/Users/cwhite/emacs-23.3/lisp/org/org-list
~/lib/lisp/org-mode/lisp/org-latex hides c:/Users/cwhite/emacs-23.3/lisp/org/org-latex
~/lib/lisp/org-mode/lisp/org-jsinfo hides c:/Users/cwhite/emacs-23.3/lisp/org/org-jsinfo
~/lib/lisp/org-mode/lisp/org-irc hides c:/Users/cwhite/emacs-23.3/lisp/org/org-irc
~/lib/lisp/org-mode/lisp/org-install hides c:/Users/cwhite/emacs-23.3/lisp/org/org-install
~/lib/lisp/org-mode/lisp/org-inlinetask hides c:/Users/cwhite/emacs-23.3/lisp/org/org-inlinetask
~/lib/lisp/org-mode/lisp/org-info hides c:/Users/cwhite/emacs-23.3/lisp/org/org-info
~/lib/lisp/org-mode/lisp/org-indent hides c:/Users/cwhite/emacs-23.3/lisp/org/org-indent
~/lib/lisp/org-mode/lisp/org-id hides c:/Users/cwhite/emacs-23.3/lisp/org/org-id
~/lib/lisp/org-mode/lisp/org-icalendar hides c:/Users/cwhite/emacs-23.3/lisp/org/org-icalendar
~/lib/lisp/org-mode/lisp/org-html hides c:/Users/cwhite/emacs-23.3/lisp/org/org-html
~/lib/lisp/org-mode/lisp/org-habit hides c:/Users/cwhite/emacs-23.3/lisp/org/org-habit
~/lib/lisp/org-mode/lisp/org-gnus hides c:/Users/cwhite/emacs-23.3/lisp/org/org-gnus
~/lib/lisp/org-mode/lisp/org-freemind hides c:/Users/cwhite/emacs-23.3/lisp/org/org-freemind
~/lib/lisp/org-mode/lisp/org-footnote hides c:/Users/cwhite/emacs-23.3/lisp/org/org-footnote
~/lib/lisp/org-mode/lisp/org-feed hides c:/Users/cwhite/emacs-23.3/lisp/org/org-feed
~/lib/lisp/org-mode/lisp/org-faces hides c:/Users/cwhite/emacs-23.3/lisp/org/org-faces
~/lib/lisp/org-mode/lisp/org-exp hides c:/Users/cwhite/emacs-23.3/lisp/org/org-exp
~/lib/lisp/org-mode/lisp/org-exp-blocks hides c:/Users/cwhite/emacs-23.3/lisp/org/org-exp-blocks
~/lib/lisp/org-mode/lisp/org-docbook hides c:/Users/cwhite/emacs-23.3/lisp/org/org-docbook
~/lib/lisp/org-mode/lisp/org-datetree hides c:/Users/cwhite/emacs-23.3/lisp/org/org-datetree
~/lib/lisp/org-mode/lisp/org-crypt hides c:/Users/cwhite/emacs-23.3/lisp/org/org-crypt
~/lib/lisp/org-mode/lisp/org-compat hides c:/Users/cwhite/emacs-23.3/lisp/org/org-compat
~/lib/lisp/org-mode/lisp/org-colview hides c:/Users/cwhite/emacs-23.3/lisp/org/org-colview
~/lib/lisp/org-mode/lisp/org-clock hides c:/Users/cwhite/emacs-23.3/lisp/org/org-clock
~/lib/lisp/org-mode/lisp/org-bibtex hides c:/Users/cwhite/emacs-23.3/lisp/org/org-bibtex
~/lib/lisp/org-mode/lisp/org-bbdb hides c:/Users/cwhite/emacs-23.3/lisp/org/org-bbdb
~/lib/lisp/org-mode/lisp/org-attach hides c:/Users/cwhite/emacs-23.3/lisp/org/org-attach
~/lib/lisp/org-mode/lisp/org-ascii hides c:/Users/cwhite/emacs-23.3/lisp/org/org-ascii
~/lib/lisp/org-mode/lisp/org-archive hides c:/Users/cwhite/emacs-23.3/lisp/org/org-archive
~/lib/lisp/org-mode/lisp/org-agenda hides c:/Users/cwhite/emacs-23.3/lisp/org/org-agenda

Features:
(shadow sort mail-extr message ecomplete rfc822 mml mml-sec
password-cache mm-decode mm-bodies mm-encode mailabbrev nnheader
gnus-util netrc gmm-utils mailheader canlock sha1 hex-util hashcash
emacsbug sgml-mode cl-specs edebug find-func vc-git nxml-uchnm rng-xsd
xsd-regexp rng-cmpct rng-nxml rng-valid rng-loc rng-uri rng-parse
nxml-parse rng-match rng-dt rng-util rng-pttrn nxml-ns nxml-mode
nxml-outln nxml-rap nxml-util nxml-glyph nxml-enc xmltok browse-url
cperl-mode url-cache org-colview diary-lib diary-loaddefs cal-iso
org-table bookmark pp image-file mule-util grep sh-script executable
tabify org-ascii help-mode view org-wl org-w3m org-vm org-rmail org-mhe
org-mew org-irc org-jsinfo org-infojs org-html format-spec org-exp
ob-exp org-exp-blocks org-agenda org-info org-gnus org-docview
org-bibtex bibtex org-bbdb multi-isearch newcomment org-toodledo
http-post-simple url-http tls url-auth mail-parse rfc2231 rfc2047
rfc2045 qp ietf-drums url-gw url url-proxy url-privacy url-expand
url-methods url-history url-cookie url-util url-parse url-vars mm-util
mail-prsvr mailcap json xml w3mexcerpt remember org-remember
org-datetree org ob-emacs-lisp ob-tangle ob-ref ob-lob ob-table
org-footnote org-src ob-comint ob-keys ob ob-eval org-pcomplete
pcomplete org-list org-faces org-compat org-entities org-macs time-date
noutline outline easy-mmode cal-menu calendar cal-loaddefs cygwin-mount
ange-ftp uniquify filecache server byte-opt warnings advice help-fns
advice-preload paren time etags python-mode info-look css-mode scr rsync
twiki edmacro kmacro info doku pib php-mode speedbar sb-image ezimage
dframe assoc highline pop3 mail-utils cl cl-19 cc-mode cc-fonts cc-menus
cc-cmds cc-styles cc-align cc-engine cc-vars cc-defs regexp-opt cus-edit
easymenu cus-start cus-load wid-edit exec compile comint ring bytecomp
byte-compile tooltip ediff-hook vc-hooks lisp-float-type mwheel dos-w32
disp-table ls-lisp w32-win w32-vars tool-bar dnd fontset image fringe
lisp-mode register page menu-bar rfn-eshadow timer select scroll-bar
mldrag mouse jit-lock font-lock syntax facemenu font-core frame cham
georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao
korean japanese hebrew greek romanian slovak czech european ethiopic
indian cyrillic chinese case-table epa-hook jka-cmpr-hook help simple
abbrev loaddefs button minibuffer faces cus-face files text-properties
overlay md5 base64 format env code-pages mule custom widget
hashtable-print-readable backquote make-network-process multi-tty emacs)