I was briefly perplexed by an IE only bug this week. An Ajax call was throwing the following 500 exception, but only in IE.

Traceback (most recent call last):

File "/home/chase/bullhorn/branches/talladega/virtualenv/lib/python2.6/site-packages/django/core/servers/basehttp.py", line 280, in run
self.result = application(self.environ, self.start_response)

File "/home/chase/bullhorn/branches/talladega/virtualenv/lib/python2.6/site-packages/django/core/servers/basehttp.py", line 674, in _call_
return self.application(environ, start_response)

File "/home/chase/bullhorn/branches/talladega/virtualenv/lib/python2.6/site-packages/django/core/handlers/wsgi.py", line 246, in _call_
response = self.apply_response_fixes(request, response)

File "/home/chase/bullhorn/branches/talladega/virtualenv/lib/python2.6/site-packages/django/core/handlers/base.py", line 195, in apply_response_fixes
response = func(request, response)

File "/home/chase/bullhorn/branches/talladega/virtualenv/lib/python2.6/site-packages/django/http/utils.py", line 77, in fix_IE_for_vary
if response['Content-Type'].split(';')[0] not in safe_mime_types:

AttributeError: 'int' object has no attribute 'split'

Originally, I thought this looked like a bug in Django, however unlikely that is. But after walking through the code with a debugger, it was clear that the "Content-Type" reponse header was not "text/plain", or some such. Instead it was the integer 200. I finally traced it back to my own code.

return HttpResponse("job saved", 200) # should be status=200

The problem is that the second positional argument to HttpResponse is content type, but I was just assuming it was the status code in this case. Easy fix.