Hi Benny, Thanks for the response, The only issue is when a 3rd party manufacturer *needs* the form: ;param="the value" This form is currently not possible in PJSIP without setting value to "\"the value\"", and then in this case the boundary string is incorrect. Setting to "the value", will as you rightly and as PJSIP rightly does, create an escaped version ;param=the%20value. Steve -----Original Message----- From: pjsip-bounces@xxxxxxxxxxxxxxx [mailto:pjsip-bounces at lists.pjsip.org] On Behalf Of Benny Prijono Sent: Tuesday, 4 October 2011 08:06 PM To: pjsip list Subject: Re: Bug: Quoted boundary string in outgoing multipartmessage On Fri, Sep 30, 2011 at 1:13 PM, Steve King <sking at zetron.com> wrote: > Hi All, > > When using a quoted boundary identifier for multipart messages, the > output multipart encoding is incorrect and includes the quotes as part > of the boundary identifiers. ?Tested on v1.8.10. > I think the code is correct. The general rule is, every (SIP) element in the application must contain the actual (i.e. unescaped) value, and pjsip will take care about converting it to/from the representation in the wire. For example, if a parameter in the wire looks like these: ;param="the value" ;param=the%20value once they are parsed by pjsip, both will result in a value "the value" (without the quote!). Similarly for the reverse direction, just put the unescaped and unquoted value (e.g. "the value", without the quote) to your parameter value, and pjsip will take care with encoding it with the correct escaping rule. Benny > Example SIP INVITE out with incorrect boundary identifier: > > INVITE sip:sipp at 127.0.200.1:5080 SIP/2.0 > Via: SIP/2.0/UDP > 127.0.100.1:5060;rport;branch=z9hG4bKPj1faee00e-fccf-47d2-a845-992eb07d1 > fdc > Max-Forwards: 70 > From: "Steven King" > <sip:test1 at 127.0.100.1>;tag=7014f0cd-169b-4a9a-919b-db39868fc172 > To: "sipp" <sip:sipp at 127.0.200.1> > Contact: "Steven King" <sip:test1 at 127.0.100.1:5060> > Call-ID: 794f5354-c908-424f-b4a2-b82e9915e157 > CSeq: 30587 INVITE > Allow: PRACK, INVITE, ACK, BYE, CANCEL, UPDATE > Supported: replaces, 100rel, timer > Session-Expires: 1800 > Min-SE: 90 > Date: 2011-09-30 15:59:21+10:00 > Content-Type: multipart/mixed;boundary="BLAH BLAH" > Content-Length: ? 491 > > > --"BLAH BLAH" > Content-Type: application/x--blah > Content-Length: ? ?10 > > c-rate: 0 > --"BLAH BLAH" > Content-Type: application/sdp > Content-Length: ? 236 > > v=0 > o=test1 at 127.0.100.1:5060 3526351161 3526351161 IN IP4 127.0.100.1 > s=pjsip > c=IN IP4 127.0.100.1 > t=0 0 > m=audio 4000 RTP/AVP 0 101 > a=rtpmap:0 PCMU/8000 > a=ptime:20 > a=sendrecv > a=rtpmap:101 telephone-event/8000 > a=fmtp:101 0-16 > > --"BLAH BLAH"-- > > The problem is in sip_multipart.c : multipart_print_body > > Below is diff: > > Index: sip_multipart.c > =================================================================== > --- sip_multipart.c ? ? (revision 23) > +++ sip_multipart.c ? ? (working copy) > @@ -48,6 +48,41 @@ > ?}; > > > +/* > + * Print boundary delimiter in multipart body, taking care > + * to not print quotes in a quoted boundary parameter. > + * > + * @pre assumed that buf has enough space for boundary > + * > + * @param buf Location to print boundary string > + * @param boundary Boundary string to print > + * > + * @return number of chars printed to buf ?*/ static int > +multipart_print_boundary(char* buf, const pj_str_t* boundary) { > + ? ?char* p; > + ? ?int len = 0; > + ? ?if(!buf || !boundary || !boundary->ptr || boundary->slen == 0) > + ? ? ? ?return 0; > + > + ? ?p = boundary->ptr; > + ? ?len = boundary->slen; > + > + ? ?/* Only modify the output if starts/ends with '"' */ > + ? ?if(p[0]=='"' && p[boundary->slen-1] == '"') { > + ? ? ? ?p++; /* skip '"' */ > + ? ? ? ?len-=2; /* skip leading/trailing '"' */ > + ? ?} > + > + ? ?if(len > 0) { > + ? ? ? ?pj_memcpy(buf, p, len); > + ? ?} > + > + ? ?return len; > +} > + > + > ?static int multipart_print_body(struct pjsip_msg_body *msg_body, > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?char *buf, pj_size_t size) > ?{ > @@ -74,8 +109,7 @@ > ? ? ? ?if (SIZE_LEFT() <= (m_data->boundary.slen+8) << 1) > ? ? ? ? ? ?return -1; > ? ? ? ?*p++ = 13; *p++ = 10; *p++ = '-'; *p++ = '-'; > - ? ? ? pj_memcpy(p, m_data->boundary.ptr, m_data->boundary.slen); > - ? ? ? p += m_data->boundary.slen; > + ? ? ? p += multipart_print_boundary(p, &m_data->boundary); > ? ? ? ?*p++ = 13; *p++ = 10; > > ? ? ? ?/* Print optional headers */ > @@ -159,8 +193,7 @@ > ? ? if (SIZE_LEFT() < m_data->boundary.slen+8) > ? ? ? ?return -1; > ? ? *p++ = 13; *p++ = 10; *p++ = '-'; *p++ = '-'; > - ? ?pj_memcpy(p, m_data->boundary.ptr, m_data->boundary.slen); > - ? ?p += m_data->boundary.slen; > + ? ?p += multipart_print_boundary(p, &m_data->boundary); > ? ? *p++ = '-'; *p++ = '-'; *p++ = 13; *p++ = 10; > > ?#undef SIZE_LEFT > > > BRegards, > > Steve King > > > _______________________________________________ > Visit our blog: http://blog.pjsip.org > > pjsip mailing list > pjsip at lists.pjsip.org > http://lists.pjsip.org/mailman/listinfo/pjsip_lists.pjsip.org > _______________________________________________ Visit our blog: http://blog.pjsip.org pjsip mailing list pjsip at lists.pjsip.org http://lists.pjsip.org/mailman/listinfo/pjsip_lists.pjsip.org