Ticket #28678: multiparser_json.diff

File multiparser_json.diff, 2.2 KB (added by Facundo Batista, 7 years ago)

Proof of concept patch showing what the fix would probably be

  • multipartparser.py

    old new  
    99import base64
    1010import binascii
    1111import cgi
     12import json
    1213import sys
    1314
    1415from django.conf import settings
     
    175176                if item_type == FIELD:
    176177                    # Avoid storing more than DATA_UPLOAD_MAX_NUMBER_FIELDS.
    177178                    num_post_keys += 1
     179                    text_info = True
    178180                    if (settings.DATA_UPLOAD_MAX_NUMBER_FIELDS is not None and
    179181                            settings.DATA_UPLOAD_MAX_NUMBER_FIELDS < num_post_keys):
    180182                        raise TooManyFieldsSent(
     
    194196                            data = base64.b64decode(raw_data)
    195197                        except _BASE64_DECODE_ERROR:
    196198                            data = raw_data
     199                    elif 'content-type' in meta_data and meta_data['content-type'][0].strip() == 'application/json':
     200                        raw_data = field_stream.read(size=read_size)
     201                        num_bytes_read += len(raw_data)
     202                        try:
     203                            data = json.loads(raw_data)
     204                            text_info = False
     205                        except ValueError:
     206                            data = raw_data
    197207                    else:
    198208                        data = field_stream.read(size=read_size)
    199209                        num_bytes_read += len(data)
     
    205215                            num_bytes_read > settings.DATA_UPLOAD_MAX_MEMORY_SIZE):
    206216                        raise RequestDataTooBig('Request body exceeded settings.DATA_UPLOAD_MAX_MEMORY_SIZE.')
    207217
    208                     self._post.appendlist(field_name, force_text(data, encoding, errors='replace'))
     218                    if text_info:
     219                        self._post.appendlist(field_name, force_text(data, encoding, errors='replace'))
     220                    else:
     221                        self._post.appendlist(field_name, data)
    209222                elif item_type == FILE:
    210223                    # This is a file, use the handler...
    211224                    file_name = disposition.get('filename')
Back to Top