Opened 11 months ago

Closed 6 months ago

#11321 closed defect (fixed)

XML response has incorrect Content-Type on some errors

Reported by: mattinflection Owned by: osimons
Priority: normal Component: XmlRpcPlugin
Severity: normal Keywords:
Cc: olemis Trac Release: 0.12


curl -v -H "Content-Type: text/xml" --data @body.xml http://$USER:$PASS@trac/login/xmlrpc

POST /login/xmlrpc HTTP/1.1
Authorization: Basic 
User-Agent: curl/7.24.0 (x86_64-apple-darwin12.0) libcurl/7.24.0 
Host: trac
Accept: */*
Content-Type: text/xml
Content-Length: 273

The XMLRPC plugin is supposed to detect the Content-Type and send back a response with the same Content-Type:

HTTP/1.1 200 OK
Date: Thu, 12 Sep 2013 18:23:23 GMT
Server: Apache/2.2.22
Content-Length: 2509
Vary: Accept-Encoding
Content-Type: text/xml

However, if I send an XMLRPC request that attempts to perform an invalid action on a ticket (for example, the workflow does not allow a ticket with the status 'new' to be set as 'in_QA'), the plugin sends back a different Content-Type (though still with a 200 OK header):

HTTP/1.1 200 OK
Date: Thu, 12 Sep 2013 18:24:20 GMT
Server: Apache/2.2.22
Content-Length: 345
Content-Type: application/xml

While this might not be a problem for some client libraries, the Ruby XMLRPC::Client library requires a text/xml content type.

Suspected Cause/Solution:

On line 130 of tracrpc/, this is how the plugin sends a (correct) response for some specified error codes:

130 self._send_response(req, xmlrpclib.dumps(fault), rpcreq['mimetype'])

On line 140, where the (incorrect) response is sent for all other types of errors, the plugin leaves out the rpcreq['mimetype'] argument:

140 self._send_response(req,
141      xmlrpclib.dumps(
142            xmlrpclib.Fault(err_code,
143                 "'%s' while executing '%s()'" % (str(e), method))))

I believe changing this to the following will fix the problem:

140 self._send_response(req,
141       xmlrpclib.dumps(
142              xmlrpclib.Fault(err_code,
143                     "'%s' while executing '%s()'" % (str(e), method))), rpcreq['mimetype'])

Attachments (0)

Change History (3)

comment:1 Changed 11 months ago by olemis

This is an interesting issue I'll write a test case to reproduce this situation . I'm sure osimons will add comments on this subject soon .

Thanks for reporting this issue.

comment:2 Changed 6 months ago by AllenB

I can verify that manually applying this patch to the current codebase (r13203) resolved my problems running XMLRPC calls from Ruby scripts. That particular call to the _send_response function is the only one in that file that doesn't pass rpcreq['mimetype'] as the third argument.

comment:3 Changed 6 months ago by osimons

  • Resolution set to fixed
  • Status changed from new to closed

In 13637:

XmlRpcPlugin: Fixed missing mimetype when returning error for unknown faults. Closes #11321.

Thanks to mattinflection for report + patch, and to AllenB for verification.

Add Comment

Modify Ticket

as closed .
as The resolution will be set. Next status will be 'closed'.
to The owner will be changed from osimons. Next status will be 'closed'.
The resolution will be deleted. Next status will be 'reopened'.

E-mail address and user name can be saved in the Preferences.

Note: See TracTickets for help on using tickets.