getsentry/raven-python — pull request #406 by IfpnI (2013-12-30 23:40:33+00:00)
Title: make json encoding more robust in the face of binary data

Hi,

I from time to time get into the situation where binary data is posted (which may or may not be an error) and an error occurs which sentry should log. The result is that I only get an error inside sentry logged (e.g. UnicodeDecodeError: 'utf8' codec can't decode byte 0xff in position 0: invalid start byte) and not the information from the originating request.

Now I can I can make the data that the tornadoweb sentry adapter passes into sentry saner (e.g. don't pass files in), but that only goes so far. In my opinion sentry should always log the original error (and not barf).

The simplejson encoder used by ravens BetterJSONEncoder seems to be designed for encoding known good data in and not something that happens to come in from the random internets as an http request. As such it uses the strict unicode encoding for encoding strings and not something more permissive, nor does it allow to pass the codec error handling schemes.

Using the patch below I at least get the original errors into sentry.

Test code:
```python
import datetime
import pprint
import raven.utils.json

data = 'GIF89aX\x02D\x02\xd5HzreSzNTczkc9d"?> \x01\xff\xfe\xfd\xfc\xfb\xfa\xf9\xf8\xf7\xf6\xf5\xf4\xf3\xf2\xf1\xf0\xef\xee\xed\xec\xeb\xea\xe9\xe8\xe7\xe6\xe5\xe4\xe3\xe2\xe1\xe0\xdf\xde\xdd\xdc\xdb\xda\xd9\xd8\xd7\xd6\xd5\xd4\xd3\xd2\xd1\xd0\xcf\xce\xcd\xcc\xcb\xca\xc9\xc8\xc7\xc6\xc5\xc4\xc3\xc2\xc1\xc0\xbf\xbe\xbd\xbc\xbb\xba\xb9\xb8\xb7\xb6\xb5\xb4\xb3\xb2\xb1\xb0\xaf\xae\xad\xac\xab\xaa\xa9\xa8\xa7\xa6\xa5\xa4\xa3\xa2\xa1\xa0\x9f\x9e\x9d\x9c\x9b\x9a\x99\x98\x97\x96\x95\x94\x93\x92\x91\x90\x8f\x8e\x8d\x8c\x8b\x8a\x89\x88\x87\x86\x85\x84\x83\x82\x81\x80\x7f~}|{zyxwvutsrqponmlkjihgfedcba`_^]\\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)(\'&%$#"! \x1f\x1e\x1d\x1c\x1b\x1a\x19\x18\x17\x16\x15\x14\x13\x12\x11\x10\x0f\x0e\t\x08\x07\x06\x05\x04\x03\x02\x014\xf4m\x9c9u\xee\xe6)\\\xc8\xb0\xa1\xc3\x87\x03x8\xb0 \x03\x03~\xff\x06j\xdc\xc8\x86\x07\x0br\x19\x12B\x1cI\xb2\xa4\xc9\x85\x12-\x8a`\xc1\x83\xa3\xcb\x97V840\'\xf2\xa4\xcd\x9b8I\xa6d\xd0\x80\x03\xcc\xff\x9f@\x7f\x80\x18\x172\xa7\xd1\xa3HIz\xc8\xe0\xa3\x01\xc0\xa0P\xaf\x1e\xac\x15/\x83\xbd}\x13\x9b\xe2@60\xe1\xc7\x90\xb1\x06\xc8 \xc2\xa7\xe2\xcb\x9a\x86\x96\x8d\xcc\xb9\xf3\xd5\xa5N1\x8b\x86\xc4\xa3\xb1\xe7\xd3\xa8\x93N\x16\xd1r\xb4\xebB\x1c|\x1cHM\xbb6\xd2\x03>,\xbf\xde\xad\x87\x03\x03\xab\xb6\x83\x0b\xc7\xe9\x81\x01[\xde\xc8\xe3\xf8\x06>\xbc\xb9s\x93\xc5u\'\x9f^\xa6\xf4\xec\xe7\xd8\xb3\x93<\xc0\x9a\xbaw/C\x17h\x1fO\x1e\xe2\x82\xd0\xdf\xd3Sa\x91\xc1q\xf9\xf7\xf0\xe5MF\xac\xbe\xbe\x12\x1e>\x98\xc7\xdf\xbf\xdf\x83\x8f\xd6\xf6\x05\xf8\x03{\xfc\x15h\xa0<\x19\xd0\' u \x88\xa0\xdf\x81\x10\xc6\xe7\x81\x08_-\xf8Z\x0b\xedE\xa8\xa1\x81\x93\x1dg\xff!f\x11?c\x19n\xe8A\x03\xc0\xda\xc2\x81\x88@R\xb6\xe4+\xc8\xde\xfa\xde\x02\xc66\xbbJ\x8c@.\xb0\x16/c\xf5z \x8e\xda\xb6b\xab\x81\xc5)\x08\xff\xcc_\xc3\x96\x17\xc0\xaf\xe5\xa2\xc2\xc2u\xfby;-1\x8cA\x1b\xdf\x01\xea\xc6\xfb\t\x08\x87\xc6\xe7\xed\xac\xc84\xa8\xef{\x19\x10\xec\xef%g\x9d\xc2y@v\xe3d\x9c\x1d\x9c\xe4\xa5Rn\xdb\xdb\x98\xa3\x01\xf0p\x9c7\xebym\t\x87^\xc6\xe3\xc2a\x8b\xb1\x9fk\x9e\xa3\x0e;\xee\xc0\x13\xff\x11<\xf7d\xa9\xa5\x08\xfc\xb0\xb4I\x0b\x1a3}\xb9\xeaX\xf4m2\xe2\x8cx\x04RUa\x17\xc6\x95J\xbeO2\xef\xd1\x83\x13\xbfE\xd4\xb5-\xfb\x08\x08\xa0VU\x1eW\x17\xb1\xa06!\xc2\x06w\xb5\xf5X\x80\x10|g\xa0+\x02i\xa8\x1a\xe6\x9a\xf3 \x9a\xa7\xb6\xc0\xf8\xe8/\xd1\x02\xe4\x8f\xc9\x8a\x08\xb2\x80\xda\x14\x9e*\x83\x88Seo~\xf9S\x82\xf1Rc\xa9Bp\x0f~v\x9a\x87a\xc4W\x08C\xd5\xa6b\t\x8c\x02\xf6\x98V=?L\x05o\x11t\xc8\x01\xbc2\x88\xf2\xd1\xe6|\x19L\x82\xfah\x13\xdc\x0co\x0e&\xe8\x04\x16HZ\xc9h\xd3\xa8\x10\x11\xd8\x88\xe4\x08\x11\xb0(l\x8a\x08\x8fJ\x01\x89IP\x8b\xb6\x95\x8f?p\x80YQ\x8c\xb1p\x8f\xc4\x17\x06\xe1h\x12\x01\t\x06\xcfE\x90\xf6\xf3\x8dL\xb0\x8f\x0e1\x87Y0\x8c%\xa1\x8e\xa80\x91\x17mi\x06-\x10\x17\x8f\x89\x14\xa5\xa7~\x83\x11\x98L\xe0\x8aX\x01\x9a\xa4\xb0\x84Y\xf7\x05\xec\x08_h\xf0p\x95c`\x05\x14Do\xf9\x19\xa5Y\x988U\x96Kp\x93#\xf1\x85\xba\x80\x92\x959\x05\xbf\xa9\x105\xe9\x05\x89\tQ\x87\x01\t\xec\xd2\x1c,6\x8fE\x95\x8f\x86\xe9\x10\xb2\x19<@Z\xdf8\x99=\xf0\x9c\xf1\xc75\xd3Y\t\x7f\x91\x9aH\x88\x06$\t\x11\xddi\x04\xb4i\x16\x1a\x89\t\xdb\xd9\x10\xaeY\x9c\xe9V\x1d\xedy\x15K\xb6\tM\x967\xf3Y\x04\xb0i\x16\x90\xe7\x99tw\x0b\x1c\xc4t\x1a\xf7\x19\x05\x10\xfa\x8a_`\x9c\xec\x94\x1a\xef\xc9\x04.Z\x12)z\x90t\x11\x9c\x96\xe0\xa1\x11q\x8b\x0c\x98e \x9a\x97\x16\xa0\xc9\xf3\x8ex\xd7bp\xd7\x8bi\xb8\x9c\xa5\x10\xa3\xe8x\x16\xb3j\x04\x93:\x95-\xd7\x19\xf2h*\xe2\xf9\xa1c\xa0\xac\x0f\xf1\xab\xac\xda\xa0u\xba3\xdbEU\x8d\x8a}\x8f\x813\xcc IN5\x06\x83\x9a\x15\xcfZ\x04Y*\x0f;\t\xcdj\x16\xc1I\xac\xed\xbat\x9d\xb4\xaa\xb7\x90\x95G\x01\x89\xdc\xb7q\x86\xea\xad\xaaP\xab#\xc1\xadK@\xb0\xfdG\xae\xac\x96\xab\xad \x974*\x96z\x98\x89\x80\xaao\x19\xa9E\xb0\xaeW\xc1\xab_\xd0\xaa\x85\xa1\xaf\xbc\xc0\xaf\xf3\x97\xadu\x81\x9c\\\xf0\xa7R\x96\xa9\xca\x10\x06\xab\x04\xd1J\x0f\x01\xca\xb1e$\xa4\xb9\x90Q|u\xaf\x82\xaa\x88+\x0b\xa4\xb5y\xef\xda\x03\x16K\x04\xffJ\x17.\x08\xaa\xc0\xf7\xad\xb50q/\'\xb3B\x90\xb2\x0ea\xb3?`\xb2cv,h\x91\xb3H\xa0\xadZ\xbaN\xeay\x9d\xd8\x10\xacG\xe1\xa0\x12\xcbo_k\x16?\xcb\x08\x93:\xb6\xffB\x80\xb0h\xc9\x98\x03*e\x0c\xab\x0b\xbe(ej\xdb\x9c\x1e+\x04P\x9b\x15T\xeb\x08\xf3j\xb7]\xb0\xb6I\x91|\xd9E\x18\xab\x197\xa0\xc2&\xed\x10\x0f\x12$\x11\x13Q\x11\xfb\x10=\x81\xd0\xa9\xcb\xc5\x98L\xbb\x15\x9c\xc8\xa6\xc8:h\xdb\xb4\xe5\xf9\x8b\x12I\x18s\xfb\xa9\xe4\xe0=i\xd1\x15u\xd9\x07\x97\xcb\x8aa\xd0\xb2\xf1: \x13;R\x19\xa7O\x80\xb1HQ\xa8Z \x9e$\x87\x07\x9ee\xb56Qym\xbb\x1e\xa9\x99\xban\t\x9e\x96z\xb2\xa2\x10\xb4Z\xa1uL\x99|\xa5\x8b\x96\xbb\x0b\x05\x9aA\xac7\x01\x1aF+\x05o\x9b\x15\x9dK\x04\x91\xbb\x10\xa9{\xbd\xf2\xe0\xb4\x85\xc0\xa6\x1a\x8b\x05\xa6:\xb5\xc0(\x18\xfdV\x075\x83\xbb\xfcf\x1cv\xf0\xb7\xebw\xbauA\x88\xe8\xbb\x88\xdey\xaa]\x10\xad\x95+\xa5\xdef\xbe\x14\x1ff\x14\x82Q\xfa\x05y+\xa3[\xa0\xbd=\xb0\xbc\x99\x03\x01\x08\x9c\xc0\xbc\xc0\t\x1c\xb4\x0c\xc6\xaf\x0c\xcb\xa0,\xcb\xff\xb5\xdc\xc5\xb7\x8c\xcbU\xac\xcb\xbb\xdc\xcb\xab\xbc\xcb\\,\xccp\\\xbe\xe0\x0c\xde\xe0\xff\x0e\xfe\xe0\x10\x0e\xdb\x05~\xe0\t\x1e\xe1\x16~\xe1\x18\x9e\xe1\x1a\xbe\xe1\xc0=\xe1Y\x80\xe0X\xcc\xe1">\xe2$^\xe2&\xbe\xdf\x1e\x8e\x05 ~\xc5\'\xde\xe2.\xfe\xe20\x1e\xe3\xc3\x9d\xe2W\xb0\xe2V,\xe38\x9e\xe3:\xbe\xe3%N\xe3V`\xe3U\xcc\xe3B>\xe4D^\xe4\xfc\xed\xe3U\xb4^\xeb\xb6~\xeb\xff\xb8>\xbf\xf0\x0c\xdf\xf0\xfc\x0e\xeb\x03\x1f\xf1o^\xf0Cp\xf0\xb9\x9d\xf0\x0e\x9f\xf1\x1a\xbf\xf1\xf7\x0e\xf1\x12\xff\xf1fN\xf1B`\xf1\xb8\x8d\xf1\x1c\x7f\xf2(\xff\xef\xaf\x0e\xf2,\xff\xe5"\xff\x03$\x7f\xdb!0\xf3!\xa0z?\xdb\x98\xdf\xf8\x9a\xdf\xdc%Q\xb3\xc1T\xcfX\xd9d\xc1\xc3\xc5\xf5\xd8j\tq\x95$\x08\x9d\x8dF\x12\x8cs\x10.0|W\xec\x03+&\x1c\xe3/\x82G\xec\xd5\xfdI`\x8f\x1e\x06{+\xe8\xf9pg\xec\xc2\xc1\x84H\xfe\x1d\x0c\xd6d\xd0\x9f\x02\xc5\x92QB\x92o_\x0e\t\x05\x02H\x92X\x04\xc3\x05!\x13VT\x14"\xe1\xe0\x91\x92\xf0\xf8a\x08I\x8dfM\x9b7\x05\x8d\xc2\xa6-\x1b74\x9cZ\x8d\x13:\xd4\x0e\xad+\x17\t\xf1\x9aR!\xe0\xa3x\x91\x8c\xac\xc3\xff\x9f\x8b\x01&<\x9cxq\x8a:\x11kS\x8c\x0c\xe87\xc8\xcf\xc7\x19\xbd\x82\xb7\xd8\x85\x02\xc2kSE A\x82\xf6\xba\x1f}\xe8\xfeH6\x06\xeeT\xc5K\xb0\xda\xf4C\xdf\xdb\xb2]\xae\x83\xc2{\xb3\x0f\xaa\xdf\x8f\xb85B\xfd\xfc\xa3\xfau\xff\xa0.\x07\xf1n\xdb\x8e;\x1fT\xca\xa1\x9f\x11\x1cHP+\xe3 \x8c\x10B\xc3\x92\xeb\xc9\x1a\xc6\xda\x80n\x8e\x01h@\x01\x05\x1a\x06\xd0p\x96r\xb0\xf8\xad7!\x10H0*\xa2E$\xf4{\xed\x98\xb0\x1c(r\xc6bPZ\xc1\x10f\x868\x02&t\xdaR\xc2-\xb9\xc4\x89\xc2\x13\xbb\xb0\xb9\xc6D\x84C\x80\x05\xd0D\xf3\xf6O\xbc\x96\xf5\xe1\xb6\x99TB\xe0\xc7%\x8c\x1d\x10\x89\x04e\xf4A?\\\x07\xdcW\xdf\x7f}\xfd\xe3\xdbm\x8f T5\xeb\xb0\x13W\xe4\x91\xa9 \xb7\xdcm\xce\xd5$]\x11\xcfl7M6E\x94\xb7\x92Jr-\x01O|\x10\xe3G5\x92x`-\x93P4!\x98"f\xc2AOSr\xd2gJD\x933\xe3x\x96\xe0\xd8\x88\xbbN\x9c\x8b\xe4\xab\xb1\xd6\x02\xb9\x93\xcd]e\xcc\x0cE\x1c\xe0*s\xb0\xe4\x91\x11\xf0\x1a\xc1\xf4\xd3Q7=\x92\x9d\xa1\x15"\x98\xba\xf1b\x82\xb7\xe8.TA\xd6\xf0\x08A/e\xd5\xc3\x1e\xab\x93\x1b\xcfvG\xbe\x0c\x0e\xeb|\xccR7\xb7\x11,\x16\x83-\xd7D\xd0W\x8c$\xa7|\x82\x93\xa2\x82\x11\'b\xc8\x99\x05s\x8ec\x166\xcc\x9ea\xb3V|\xf7\t\xd4ysHJ\xc3I\x05\x1c \x11\xb6J\xa1\x04\xa7\x03\x15\\\x0f\x92V\xa7\xee\xd5&\x17\xe5IF\xb1\xb0\xd1\xa1t\xb4]ZuC\xe5\xd2\x84\x02>z\xd5s|-\xe8\xfa\x1c\x1bY\xc9R\xc3\xaf\xcaI\x19\x0f\x058\x94\x14,V\x01\x0f\xa0%\xf5\xe0 6\xd0\x12%\x9e|\xe5\xd7x@8Y\xd5\xaev\\P\x8dj*.+\xc7\xccr\xf4\x0ba\x11\x8f\xb8\xa2\xc9E\xc5x\xadP\xde<\xe0\x92l\x1av\x03\x803\xbcX\xde\x9a-\xc1\x8d%\xf1\x8dq\xecT\x13\x87i\xb9\x98mn8x\x8b\x02\x03\x1fx\xb1\xe7]\x80VY\x8c&<\x02W\xc19v\xf2\x93\x97\xb7cS\xa0\xb8*\xbe\x83\x91\x05\xf0\x80!\x97\xf4k\xd4\xc2\xae\x80\xf1\x81_H\xef\xfb\xc2nJ}@\xe9\xfa\x94O\xe5\xb2S\xff\x14S\xbdT\xf6RG\x95.@E\xf0*\x91\xa0=\xea#\xee24\t6\xb5P\xc51T\xd3\x0e\x0e\xcb1\tx\x92S\xb7\x12\x01\x18\xb3\x13\x17\xb3\x08r\xf5\x08\xec\x94\t.\xd5O\xd7\xcf\xf6\xce\xff\xf3\xaf\xd23\xf7\xd6SUt\xc9-\x9d4?/X\x91\x95f\xdb\xf5f\x11\xa0I\x15\xd2\xf8\xd5jU\xf5\xec(\xd4f\xc3\xd1\x1c\xe3.B\x97\x8e5+\xbb6+\xcd\xb1=lvl\xb9\x12Y\x192S\xefPoM\xd7q\xad0\xfd\x1c\xd6\x1c%p\x0b\x8d`uy\xf7\x1c\x97\xd5\xb2\xc2\x92\xcd\xc6Rp\xe3EeuU?\xd9O\xeb\xd2\xb6\x117CqIWR\x1b\x97\t\x863\x13\x8eU\x02\x171\xfb\x18\x937\xc0\x05L\xe0&\xef\x8esq7x\x81\x12d\x9fvv\x95\x80\xa9\xf7t!4\xfe\x84\x97\x92\xf0\xd6z\x87wWx\x969\xc7Qv#5o\x1d\x14m\xa3\xb7\xef\xc0tqQ\x97\xe1\xdd\xde\xed/\xa5\x04\xe8=\xf6\xdf\xfe\xec\xd9}\xe4\xdd>\xf9\xe0\xdd\xf6\xc7\xdb\x08\xdc\x1e\x07l\xdf\xed\x1f\xc2\xe3I\x89\xe7-1\xdewe\x02\x0cA\xee\xd9\x1dM0\x80\xdeg\xde\xe1g\x02\xf6c\xdf\x04\x84\xdfEh\x7f\xf8\x0b@\xdf{?\xf6y! B\xa5::\x0f\x81N\x04,P\x80:Sh\xe7N\xba09N\x95\xe4R\xe1\xe1h\x06`\xae\xf0"dC\x9a\xb8\x18\x12n\xca\xb5XIh"\xa5K\x12E\x1fCZ\x83EJH\x80$(}L\xb2t\xee\x95;)\x13j\xcaj9A\xda\x90\x05~F\x96\x94\xe2s\xe7\x10$<\x93\xf0LVJ\x90\x89\x97E\x80\xde|\xc9\xea\xdd\xc8@ILX\x9ct/J#@\xae\x92l\xed9i\xcfF)\xff\x1d\xe9Y\x8aRv\x88\xce\x89n\xdf\xc2\x8d{0AB\x86v\xd18|\x13w/\xdf0E2J\x11\x04L\xe5\x94I\xad\x10\xa5\xf5\xe1\'\xec\x10s5\x93xU;l\xe5\x10L^y\x8dcj\xd3\x9b\x8eq\xa6 \xc5)O{\xcaK|\xe6\x93\xa6\'\xf5)Q\x8b\x9a0\x9d\xba\xd4\xa8J]\xea\x8b\x90ZS\xa6\xffB5\xaa\xb3\x04j>w*\xd5\xabb\x15\xa0T=\xa6U\xb3\xea\xd5\xaf~a\xa6"\x98K\x06\xc0j\xd6\xb3\xca\x81\x013\xfd\xc1\\z\x80\xd6\xb7\xc2U\x0b=\x98KP\xd3`\x80\x83\x9c \xaez\xddk\x14Np\x10\x03\xd4\x15\xf0\xd8*~6\xb58}\xc5A@\xda\x1f\xf8\xb5\xb5\xaa\x9d\xadOM\x8b\xd7\xd7\xfe\xc0\x04sqAdi\xeb\xdb\x97&\xf6\xf6\xaf\x81\x1b\xec\xe0\xfa"x\xc1\x12N\xf0\x80\x1fl\xe1\x0b\xdf7\x06*\x980\x87;\xec\xe1\x0f\x83\xd8\xbf*\xa80\x86K\xec\xe0\x08\x87X\xc2$6\xf1\x83S\xacb\x167\x18\xc5.\xfeo\x89\xdb;\x81\xd1\xc27\xbe\xb6=\x08\x8cg \xe3\x19\xf7\xb7\xc7\x06\xde0\x90\x01\xbcb!\x13\x98\xc8E62\x92\x9b\xac\xe1%C9\xca\x1e\x1eq\x93\x91\xfcc)\xab\xa0\xca\x05\xbe\xf2\x92\xb3\xace\xfbJY\xc05\x9e\x8b\x01p\x9cc\xc1\xceE\xc8a\x96\xc0\x91\x9d\xbc\xe6\xfd~\x99\xc0o\xe6o\x9b\xe3l\xe1\'\xcf9\xcfE\xa6\xb2\x9dM\xcc\xe5(\xf7\xf9\xbes\xae\xb3\x90\xffk\xfa\xc2\x97.r\xa6\x9b\xf6\xbdO\x9d\x02}\xcf\xba\xde\xcd~\x83\x9f\xef\x89\x03\x80\xa7\xb7\xdd\x07\xef\xf4\x13,^\xeaHw<\xd6\xff\x1e\xf9\xa9O\x9e\xf2b\xbf<\xe7%\x9fv\xcd\x83>\xebp\xef<\xe9\x87\xae\xf6\xd0?\xbd\xf0\xa5\x17z\xe3Q\xaft\xd5w\xfe\xf4\xa8\xb7\xbc\xd99\x80\xf8=y`\xf1\x82w=\xd4W_o\xde/=\xea\xbe\xa7\xf7\xee\x81\xbf\xf4\xbc\x0f\xbf\xf4\x14(\x81\xec\x8d\x8f\xf7\x12\x08?\xf9\x97\xf7\xba\xf3\x83/\xfd`T\x7f\x03\xbe/\xbe\xeb\xa3Ov\x0f\xdc~O,\x88|\xf3AO\xfb\xceg\x1e\xf8\x90\xbf\xfe\x06\xaa\xaft\xe4_\x1f\xfd\x14\xf8\xbc\xfb\x9f\xfep\xc0>\xfe\x80O\x7f\xf6\xe3_~\xd4\xe7\xdf\xe5\xb5^\xe8\xad\x9f\xdc\xb1@\xf8\xd5\xd2\xe2\xb5\x1f\xf0\x05`\xe4-\xa0\xf1\x9d\x9f\xef\x9a\x9f\xdcQa\x15\x1e\x0b\x0b\xcc\xdb\xdc\xb9\xa1\xe6\xe5 \xf9U_\x1e\xa2\x1f\x08*\x1d\x1b\x96a \xa2\xee\xf9a\xd2\x89\xa1\x0eb(\x8a\xa2\xd9= \x08f\xe2\x16\xba\xdf)\x9e]\x0cn]k\xb1\x80O\xfe#|\xc9\xa4O\xda\xe2\x01\xacdQR%w\xb4\xa5j\x12\x97i\xbef\x06\xbc\xa5n:#\x08\xf0\xe6i\xc6&|\xb5\x80b"%nEfC\xee%r\xe6X@\xbadm\xd2O:\xea\xa4\x07\x1c\xa7w\x11\'s\xba\xa5u\xca\xe1\\B\'[6\xa7w\x81\xc0t^fn2\xd6ln\xe49\x92\xe7\x99-\'Bb\xe6BBeR\x9e\x19\x07\xb0\xa7d\x8e\xe7|\xfe\x9cy\xbe\xa6-z\x80|\xc2\x17pf\xe7k\x19\xe6FV\'\x80\x12WP\xba$g2\x16\x82~d\x83^\xa3f\x0e\xa8%|\xa7\x83\x12\x17\x08\x18\xc2\x80F\xa5{zW}F\xe7kY&B\'\x87\xe2\x16\x89\xf6cSr\xe5\xffh*\x9ar\x82\xa8-\x06>\xebk5\x80\x9d\xce(\xa2\xfe\xaa\xffn\x06\xab\xab\xce\xe8d\xc6[\xaa$\xa8z\xa9X2+FZ\xab:\xc2j\x95\x9ek?N+iA\xe3\xb0\xea\xa2\x07\x94\xea\x8f\xc2%\x08\xa0*\xb7\x1e*\x98\x8ehV\x06\xc0\xa5\xd6\x95\xa7\xb6\xe8\xad\x96+\xae\xce\xa4\xb8\x92\x96\xac\x92+\xb4\xc9(\xbcR\xe3\x02\x88\x80\xbe^d\x0b\x88\xc0\x02\xac+\x94\x1ag\xbc\xf1\xaaDrj\xd6Dk\x84\x0el\x87V\xac6ji`\x81\xab@\x8elb2\xac?.\xac\x89.\xa6\xcb\xe6S\x92~\xe4\xc6\xf6\xac\xe8\x08\xed7\x12&@\x86\xec;\x9e,|\xe5\xe4\xd3\x1e\xa3\xbc2@\x03\xb4,|\xc1l\x030@\x06l\xad\xd1\xd6\xe4\xcf\xe9\xac}\xfak]9m\xb8f\xed\x96\xea\xa4\x0f\x10\x17\xc0nd\xd8z\x17\x07\xdc-\xff\xd9\xd2\xac\x07,@\x06$m\x03\xa0-\x0f\x80^&\xfd\x9e\xef1!,\xde\xf6m\x8f\xf2/qY\xa9\xfc\x1a\xb0Of@\xd4z\x97\xe9n\xe4\xe8j-m\xf6/^\x1e&\xeb0\x02\xb2\xc0\xdb\x1ep\x06\x03\xa3\x07d\xeb\x99\x81\xce\xf2\x99\xb1@-\xb3\xb2\xb3v2\xac\xb5n]\xfe2\xc3\xfc/4D\xff3T&3\xc3\xf8@\xe5\x1e\x80\x078\xb7\xecc\xee\xa8>\xea5\x927.\xa2\xf3z\xc3W\xfb\xfa\xe4|\xbf\x16\x7f\x0e+\x17\xd3\xb7I\xce\xe5\xb0\xa2r\x8e}\xb2Pjw\x7f\x07\x16i7\xaf\xa2\xa9\xb1{\x1b\xb7\x81\xcb\xa6f\x7f\xb1y3\x0c_\x97c\x83;\xb8\x8c\xe8v2\xfa5\x14S\xb8K\x1e\x80W_8x\xba\xf5L\xfa\xa8\xa2e82nx\x88Cq\xff|\'\xe4n2\xac\x94\xaax\x15\x160\xbc\xa6x\xd6\x9cx\xd9\xcau\x8c\x1f\x8b}\xdf\xf4\x99!8[&\xaa\x8e\xc7\x9b\x8e\xa6\xac\x85\xdf\x85O\x1f#\xea9og\xa5=C$\x84\x97c\x8d\xe6\xf8\x92s\x07\xfc\x0eke{\x97:\xfb\xa4wS\xb9\x8c \xf91\x1a\xb9]\xe87\xc3Jy\x97\x93\x96\x95\x03x\x81\x07\xd5\x8f\xe3\xa3E\x9b\xb9\x0f\xf7\xf6@w\xb8N\x96\xf9\x9bC\xab \x8fj\x89+\xdaj\xe3\xa3\x12\xdby\xab\xb2%\x97\xef\xc9\x97\xbf.\x7f\xff\xf9]\xa09\xbc\xba\xb9mN\xed\xa1#)\x94\xe3\xa2\xa0\xcb\x08qwo\x90;\xfaB\xe8(\xa4\xff\xf4i\xa3\xa7p_z\x19#3\xb4\x8d\xb9\xd1\xca\xf3\xa7\xabA0\x93m\x80\xefy\xa8\x9b:\xe7\xb2z\x8c\xde\xb8\x87Kzc7\xc0\x88\x0f\xef\x94\x1f\x0b\x9f\xb7y\xab\xdb\xf5\xab+\x1aw\xa7\xecF\xdb9\xa3\x12n\x0c\xaf:[\xfa9\xaf\x9f9\x8b\xe7b\x98\xdf\xc5\xa8\x93m\xa9R9\xaa\xce\xae\xff\xaa\xffz]\xe2\xb7\xb2\x93\x96#\xcf\xa4\xb3\xdb\xc5\x7fW\xbb\xa5\x1b8\xb1\xcf\xee\xc5\xd6\xa3dJ\xb8\xb6\xcf\xa1\xa6\xdf\xa2\x93\xef9\xbb\xdf)B\x8bw5\xcf\xf9kby\x8ei9S\x82\xb8\xba3\x8c\xae\xef\xfa\x90\xd7\xbb\xbd\xcf\xabY\xdb\xebP#/;C\x1b\xa1s$\xbf\xc3Z\xbe\xf7x=\xc2\xfb\xeb\x0e|3\x17|\xc4\xdb\xa7\xb7\x1f\xf9i\xba;\xc3/\xb6\xfb\x12m\xc0;\xeaQ\xa7{\x98\xf2\x80P[|C"<\xb4\xc5:\x8as\xfc\xcf\xad\xfc1\xd6\xb8\xff\x9e\xbcDv\xf5\xf9j5\x1cc\xfc]\xbc|?\xb7<\xe2\x81\xfc4\x1e}]\xad\xad\x0f\xc4\xf6\xcc\xdb\xfb\xc6\x9f;s\x96\xfd\xe1\x97&\xe6\xc7|\xb2\xee\xbc\xebJ\xf7\xcab\xb7mO\xfe\x1a@nr\xb7\xfd\xe5\x12\xf5.\xfa=\xfd\x8c\xbe?\xee\xbb\xe7\x07\x15\xa5\xe7g\xeaG\xb2\xdec2u\x1f.\xe2&\xad\x08`\xb7\xe2\x12\x7f\xf1\x0b?\xe5\xb6m\x06,@sc\xbe\xd1\x0e\xfe\xfb\xfe<<\xe2\xbd\xedw\xea)\x1b~\x9e\xf2\xfe\xebk\x7f\xbc.>w@{\xa0S\xbf\x1c\xfa{\x8bN?\xc3$\xfa\xf6\xa3\xbfP\x1az\xbc\xe1>I\x87\x7f$\x8e\x7f?.::*|\xfa\xdb?-\x8a\xfb\xf2\x82h\xf9\xbf?\x10\xfc\x84Cb\xb1\xd8\xe8%\x95Kf\xd3\xf9df@Fj\xd5z\xa5\xf22Pn\xd7\xfb\x05\x87\xc5cr\xd9|VfxXv\x1b\x0b\xda\xa2\xc9\x10\x01\xadkI\x14U]em\xf5\xca(4m\x13\tpU\xca\x94\xcd\xd5\xdd\xe5\xdd\x0c\xb4\xed\x91\xea\xadB\x056>F6\x83\x1d\xa6\x82;\xc6e\x8e\x96\x9e\x1en\xa8\x05&\xa4\x1eBL\xee\xf6\xfe\xce\x90\xd4\xfe\xa94\x0e\x80\x1eOW_\xcf\xb36/M\xe7a\xb8\xfe\xae\xb7\x7f\x0c`XK\xa75Gg\x07\x18P \x11\x16\xf4l\tK\x07B\x84\xa5{v\xe2\xc1\x87\xd6\x80\x88\x91)6\x9cY\xf3\xacnM\x07r`\xe0\x18\xf2^\x0f\x0c\x8a\xbc\x8a\x0c\xdef\xd6\xad\x8d\xb8K\xfc\x97c\xe8\xd1\xa4\x19\xe0\x15\x08\xc2\xf2\xb1s\xae}\xff\xfeQ\xb0\xb3\xca\x80\x1c|\x04\xae]\xf2\x80\x8f\xd3\x19\x1b\x88nu\x11\xf8\xf4\xd6J\xbd\xa9\x99\t\xa2A\xd9\xe4\xdf~6\x90\xbd\xb8.6\xca\xd4\xcd\x17\x06A\xb2\x1b)\xa4,\x18 \xef\xde\xea\t\xc4\x90\x01\x11p\x8c\xeb>o\xf2\xd3\xb1I\xb9\xfcK\xc6\x83\x0f\xff\xbb\x02\x81\x85 \x17\x80\xae!\x0f2\x14\x81\x05\x13\xe3J\xb0\x9e\x05\x9d$\x13\xa9\x07\xbd9\xa0\xbe\xea\xacd \x03,m\xbc$\x80-30\x92\x85\xf2Xc\x01\xbe\xf5\xa6,\xb3\xcf\xcf\xb2\x04f\x01$\x81\xe3\x81\x85\x06D\x08\xb2\xcd\x05\x168\xc0\x03G\x03\x80\xb4\tH\xe5t\xf4\x80E\xe94R\x84\x06\xecd\xb0\x05\x1e\xbf!\xcaOQ\x91r\xe6\x9epFE\xd5nL\xfd2UW\xd5Q\xb2\x9eS_EuU{|\xa45W\x81jrhV]\x9b\xb4\xd5\x9eP\x7f%\xd6\xa9\xf1\xaeS\xb3X\xf3\xc8z\x08!e\x9f\x1d\xe7L{R\x82v:\xbd\x1c\xea\xadZm\xa9\xe1\xe1\xd3{\x0e\xe0s[3\xf5\x9c\xf6Nq\xcf\xdd%\xd6{$k\x15\xdd\x8c@h\xac$\\\xdd\xa5w\x17\x0e\xc8\xbd\xd5\xd7z5B\x04N\xb7f\xdc7\xe0O\xa0l\x88Z\x81\x01\xba\xd6\xa41\x0ff\xb8\x13\x96x\xca\xc7\xdc\x86\x93\x9a\x87\'\x90&\xc6x\xe0\xa8\x0c\xce8\x97\x84\xffOZ\xb8c\x91\xfdh\x01_lo\x1b\x99\x93\x16*\xee\xc9\xb3\x94_\xf6\x83\xe5\x9e\x0e\x10Ab\x98\xdb\xe0A\x04\x93O\xbe\xb9g?\xbaEk\x01\x89|fC!oyZ\xc0f\xa2\x97fCZ\x883\xd8\x90\xe9\x1f\xb4\xe3\xee\xacl\xa5\xc6\xda\x8eR\xf7\x12\xba\xdd\x86\x8d~\xcc\xd9\xac\xc7v#O\xc8\x84\x06\x98a\x14\x8f\x96*M\xb2\xdf\xbeC]\xb4JK\xb6^\xf7\xb8C;|\x0c\x87?t\x04\xc7x8D7\xe8\x04\x88G\x94\xc3O\x06ED&Z\xc1\x86H\x84"\x18t\xd8D*\xde\x81YQ\xc4b\x132P\xb7*v\x91e\x89\x84\xe4$\x8c\xa3\xc7F\xa2\xc94\x91\xc4$\'r6\xa4J\xf6Hh~\xccd(\xf3@5FvR\xd9\x0e\x98;\x9d(U\xd9\t\xce\xa9\xd1\x94]`\xdc!W9\xcbM\xb8\x87\x93\xaf4C\x91\xb8HK^\x9a\xc2\x96\xae\x9c\xa3.{9Lj\xf5>\x0f'

request = {'project': '10', 'sentry.interfaces.User': {'is_authenticated': True, 'ip_address': '127.0.0.1', 'id': 10}, 'sentry.interfaces.Exception': {'type': 'HTTPError', 'module': u'tornado.web', 'value': u"HTTP 403: Forbidden ('_xsrf' argument missing from POST)"}, 'culprit': 'tornado.web in check_xsrf_cookie', 'server_name': u'foo', 'extra': {'sys.argv': ("'foo.py'",)}, 'event_id': '16c416fcb5fc43b5bf97960583a2ee63', 'timestamp': datetime.datetime(2013, 12, 30, 18, 25, 21, 785921), 'level': 40, 'modules': {}, 'time_spent': None, 'platform': 'python', 'sentry.interfaces.Http': {'cookies': None, 'url': 'http://foo.com/', 'headers': {'Content-Length': '8740', 'Host': 'foo.com', 'Accept': '*/*', 'User-Agent': 'curl/7.27.0', 'Connection': 'close', 'X-Real-Ip': '127.0.0.1', 'Content-Type': 'application/x-www-form-urlencoded'}, 'query_string': '', 'data': data, 'method': 'POST'}, 'message': u"HTTPError: HTTP 403: Forbidden ('_xsrf' argument missing from POST)", 'sentry.interfaces.Stacktrace': {'frames': [{'function': '_execute', 'abs_path': '/home/foo/foo/virtualenv/local/lib/python2.7/site-packages/tornado-3.1.1-py2.7.egg/tornado/web.py', 'pre_context': [u' for (k, v) in kwargs.items())', u' # If XSRF cookies are turned on, reject form submissions without', u' # the proper cookie', u' if self.request.method not in ("GET", "HEAD", "OPTIONS") and \\', u' self.application.settings.get("xsrf_cookies"):'], 'post_context': [u' self._when_complete(self.prepare(), self._execute_method)', u' except Exception as e:', u' self._handle_request_exception(e)', u'', u' def _when_complete(self, result, callback):'], 'vars': {"'transforms'": [''], "'e'": 'HTTPError()', "'args'": [], "'self'": '<__main__.Handler object at 0x1ce1110>', "'kwargs'": {}}, 'module': 'tornado.web', 'filename': 'tornado/web.py', 'lineno': 1133, 'context_line': u' self.check_xsrf_cookie()'}, {'function': 'check_xsrf_cookie', 'abs_path': '/home/foo/foo/virtualenv/local/lib/python2.7/site-packages/tornado-3.1.1-py2.7.egg/tornado/web.py', 'pre_context': [u' """', u' token = (self.get_argument("_xsrf", None) or', u' self.request.headers.get("X-Xsrftoken") or', u' self.request.headers.get("X-Csrftoken"))', u' if not token:'], 'post_context': [u' if self.xsrf_token != token:', u' raise HTTPError(403, "XSRF cookie does not match POST argument")', u'', u' def xsrf_form_html(self):', u' """An HTML ```` element to be included with all POST forms.'], 'vars': {"'token'": None, "'self'": '<__main__.Handler object at 0x1ce1110>'}, 'module': 'tornado.web', 'filename': 'tornado/web.py', 'lineno': 978, 'context_line': u' raise HTTPError(403, "\'_xsrf\' argument missing from POST")'}]}, 'tags': {}}
json_result = raven.utils.json.dumps(request)
pprint.pprint(json_result)

```