diff --git a/src/gov/nist/javax/sip/message/MultipartMimeContentImpl.java b/src/gov/nist/javax/sip/message/MultipartMimeContentImpl.java index 4293fafc8..959464f54 100644 --- a/src/gov/nist/javax/sip/message/MultipartMimeContentImpl.java +++ b/src/gov/nist/javax/sip/message/MultipartMimeContentImpl.java @@ -153,11 +153,15 @@ private ContentImpl parseBodyPart(String bodyPart) throws ParseException { // the body and don't split on any crlf in the body String[] nextPartSplit = bodyPart.split("\r?\n\r?\n", 2); + bodyContent = bodyPart; + if (nextPartSplit.length == 2) { - headers = nextPartSplit[0].split("\r?\n"); - bodyContent = nextPartSplit[1]; - } else { - bodyContent = bodyPart; + // since we aren't completely sure the data is a header let's test the first one + String potentialHeaders[] = nextPartSplit[0].split("\r?\n"); + if (potentialHeaders[0].indexOf(":") > 0) { + headers = potentialHeaders; + bodyContent = nextPartSplit[1]; + } } } diff --git a/src/test/unit/gov/nist/javax/sip/multipartmime/MultipartMimeParserTest.java b/src/test/unit/gov/nist/javax/sip/multipartmime/MultipartMimeParserTest.java index 681ecd22f..d3026d12d 100644 --- a/src/test/unit/gov/nist/javax/sip/multipartmime/MultipartMimeParserTest.java +++ b/src/test/unit/gov/nist/javax/sip/multipartmime/MultipartMimeParserTest.java @@ -203,6 +203,12 @@ public class MultipartMimeParserTest extends TestCase { + "a=fmtp:101 0-15\n" + "\n"; + private static String isup = "^A^P`^@\n" + +"^C^F^M^C���^G^C^P^Tf49^U\n" + +"\n" + + "�^S^U^@at�D^Q^E�^A^@�^G^C^P^T6pw\"�^C^Px'�&^@^@\"\n" + + "\n"; + private static String multipartContentWithEmptyLine = "\n" + "--boundary1\n" + "Content-Type: message/sip\n" @@ -402,6 +408,22 @@ public void testMultiPartMimeMarshallingAndUnMarshallingWithANonMultiPartBodyWit MultipartMimeContent multipartMimeContent2 = request.getMultipartMimeContent(); checkSimpleBody(multipartMimeContent2); } + + public void testMultiPartMimeMarshallingAndUnMarshallingWithANonMultiPartBodyWithAnEmptyLineWithNoLeadingLine() throws Exception { + SIPRequest request = new SIPRequest(); + byte[] content = isup.getBytes("UTF-8"); + ContentType contentType = new ContentType("application", "sdp"); + request.setContent(content, contentType); + MultipartMimeContent multipartMimeContent = request.getMultipartMimeContent(); + checkSimpleBody(multipartMimeContent); + + // let's now marshall back the body and reparse it to check consistency + // we just want the content, not the boundaries (which are null) + String bodyContent = multipartMimeContent.getContents().next().getContent().toString(); + request.setContent(bodyContent, contentType); + MultipartMimeContent multipartMimeContent2 = request.getMultipartMimeContent(); + checkSimpleBody(multipartMimeContent2); + } private void checkMultiPart(MultipartMimeContent multipartMimeContent) { Iterator partContentIterator = multipartMimeContent.getContents();