changeset d824969ef13a in /home/hg/repos/gajim
details:http://hg.gajim.org/gajim?cmd=changeset;node=d824969ef13a description: fix http message parsing, it may contain \n\n!
diffstat:
src/common/xmpp/transports_nb.py | 18 +++++++++++------- 1 files changed, 11 insertions(+), 7 deletions(-)
diffs (59 lines):
diff -r 48080bc9e93d -r d824969ef13a src/common/xmpp/transports_nb.py --- a/src/common/xmpp/transports_nb.py Mon Nov 16 16:42:40 2009 +0100 +++ b/src/common/xmpp/transports_nb.py Wed Nov 18 11:12:06 2009 +0100 @@ -655,7 +655,7 @@ self.recvbuff = '%s%s' % (self.recvbuff or '', data) statusline, headers, httpbody, buffer_rest = self.parse_http_message( self.recvbuff) - + if not (statusline and headers and httpbody): log.debug('Received incomplete HTTP response') return @@ -667,12 +667,12 @@ self.expected_length = int(headers['Content-Length']) if 'Connection' in headers and headers['Connection'].strip()=='close': self.close_current_connection = True - + if self.expected_length > len(httpbody): # If we haven't received the whole HTTP mess yet, let's end the thread. # It will be finnished from one of following recvs on plugged socket. - log.info('not enough bytes in HTTP response - %d expected, %d got' % - (self.expected_length, len(self.recvbuff))) + log.info('not enough bytes in HTTP response - %d expected, got %d' % + (self.expected_length, len(httpbody))) else: # First part of buffer has been extraced and is going to be handled, # remove it from buffer @@ -724,6 +724,7 @@ http_rest - what is left in the message after a full HTTP header + body ''' message = message.replace('\r','') + message = message.lstrip('\n') splitted = message.split('\n\n') if len(splitted) < 2: # no complete http message. Keep filling the buffer until we find one @@ -731,9 +732,6 @@ return ('', '', '', buffer_rest) else: (header, httpbody) = splitted[:2] - if httpbody.endswith('\n'): - httpbody = httpbody[:-1] - buffer_rest = "\n\n".join(splitted[2:]) header = header.split('\n') statusline = header[0].split(' ', 2) header = header[1:] @@ -741,6 +739,12 @@ for dummy in header: row = dummy.split(' ', 1) headers[row[0][:-1]] = row[1] + body_size = headers['Content-Length'] + rest_splitted = splitted[2:] + while (len(httpbody) < body_size) and rest_splitted: + # Complete httpbody until it has the announced size + httpbody = '\n\n'.join([httpbody, rest_splitted.pop(0)]) + buffer_rest = "\n\n".join(rest_splitted) return (statusline, headers, httpbody, buffer_rest)