[wp-xmlrpc] what clients send an XML declaration in XML-RPC requests?

Joseph Scott joseph at josephscott.org
Sun Jul 26 04:08:58 UTC 2009

On Jul 25, 2009, at 10:17 AM, Daniel Jalkut wrote:

> Hi Joseph - MarsEdit does include the preamble and it looks like  
> your example but also includes content-encoding information:
> <?xml version="1.0" encoding="utf-8"?>
> Is there some context for why you're asking about this? Just curious  
> if we can help brainstorm an answer to whatever is on your mind.

I've been looking at PHP memory usage during XML-RPC requests (using  
memory_get_peak_usage function).  With a specific target of reducing  
the memory usage for large requests, like those with massive base64  
encoded data sections.  So I've been making calls to  
metaWeblog.newMediaObject with a 3369029 byte jpg file to upload.  The  
nature of base64 encoding adds about a third to the size of the  
original data and processing it takes even more memory.

The XML-RPC library that WordPress uses has a regular expression (a  
preg_replace call) to look for this XML-RPC declaration and remove  
it.  By replacing this regular expression with a simple string  
substitution (with the substr function) I was able to cut the peak  
memory usage of the request by 5.4%.  By decoding the base64 in chunks  
instead of all at once I was able to shave another 1.4% off that.   
When using both of these techniques the total reduction in memory  
usage when compared to the current approach is 7.8%.  These numbers  
are based only on my sample jpg file, I'm not sure yet how much they  
will fluctuate when the data is smaller or larger.

Since I couldn't be sure that the substr approach would work in all  
cases it falls back to the original regex method if the substr can't  
be used.  To determine if the substr method will work I'm checking to  
see if the string '<?xml version="1.0"?>' is at position zero in the  
XML-RPC request.  If it is then use substr, if not use preg_replace.   
This is a very simple approach, would could be expanded upon to match  
other XML declarations.

This got me to wondering how many client requests actually use exactly  
'<?xml version="1.0"?>'.  I plan to do some logging of XML-RPC  
requests on WordPress.com to see what's actually being sent.  But it's  
helpful to get an idea of what those declarations could look like as  
well from client authors.  Brandon's reply about what most .Net apps  
would probably do was helpful to know.

On a slightly related note I've wondered about the idea of compressed  
base64 encoding.  Using my jpg example, a client would zip the jpg  
file, then base64 encode the zipped version and ship that in the XML- 
RPC request.  On the server end we'd base64 decode and then decompress  
the resulting data to get back to the original jpg.  Making the flow  
look like:

jpg -> gzip -> base64  --------> XML-RPC ---------> base64 decode ->  
unzip -> jpg

Setting aside the XML-RPC layer issues for a moment, I don't know if  
this method would really improve things.  It's currently only a  
thought, I haven't run any tests using that approach.

Joseph Scott
joseph at josephscott.org

More information about the wp-xmlrpc mailing list