# HG changeset patch # User paulb # Date 1093745387 0 # Node ID c5b686b9587155d9430bd223e84b4baa4722cd34 # Parent 523f924a230e0fc32caae82536e68032fdc50362 [project @ 2004-08-29 02:09:47 by paulb] Fixed the Stream class's readline method. Fixed the handling of multipart form data using various dubious buffering techniques. diff -r 523f924a230e -r c5b686b95871 WebStack/JavaServlet.py --- a/WebStack/JavaServlet.py Sun Aug 29 01:58:51 2004 +0000 +++ b/WebStack/JavaServlet.py Sun Aug 29 02:09:47 2004 +0000 @@ -43,7 +43,7 @@ "Read a line from the stream, returning it as a string." - return self.stream.readLine() + return self.stream.readLine() + "\n" class Transaction(Generic.Transaction): @@ -439,7 +439,21 @@ "Get fields from a multipart message." session = javax.mail.Session.getDefaultInstance(java.util.Properties()) - message = javax.mail.internet.MimeMessage(session, self.get_request_stream()) + + # Fake a multipart message. + + str_buffer = java.io.StringWriter() + fp = self.get_request_stream() + boundary = fp.readline() + str_buffer.write('Content-Type: multipart/mixed; boundary="%s"\n\n' % boundary[2:-1]) + str_buffer.write(boundary) + str_buffer.write(fp.read()) + str_buffer.close() + + # Re-read that message. + + input_stream = java.io.StringBufferInputStream(str_buffer.toString()) + message = javax.mail.internet.MimeMessage(session, input_stream) content = message.getContent() return self._get_fields_from_multipart(content) @@ -452,13 +466,32 @@ part = content.getBodyPart(i) subcontent = part.getContent() + # Convert input stream content. + + if isinstance(subcontent, java.io.InputStream): + subcontent = Stream(subcontent).read() + # Record string content. if type(subcontent) == type(""): - name = part.getDisposition() - if not fields.has_key(name): - fields[name] = [] - fields[name].append(subcontent) + + # Should get: form-data; name="x" + + disposition = part.getHeader("Content-Disposition")[0].split(";") + + # Locate: name="x" + + if len(disposition) > 1: + for attribute in disposition[1:]: + t = attribute.split("=") + if len(t) == 2 and t[0].strip() == "name": + + # Locate: "x" -> Locate: x + + name = t[1].strip()[1:-1] + if not fields.has_key(name): + fields[name] = [] + fields[name].append(subcontent) else: fields.update(self._get_fields_from_multipart(subcontent))