Hi, I am writing this in case someone else is looking for the solution to this problem. Nikos reckons as well that this is a bug. He posted/forward this to the devel mailinglist.
I reckon it won't be too difficult to fix this. I have also three workarounds to this bug. 1) One can generate an invalid XML where the & character is not escaped. This can be done through a string substitution after the XML is generated. Personally I don't like this solution. 2) One can use a valid XML where & character is escaped correctly. The result is that when Kannel is going to query the callback url (dlr-url) through a HTTP/GET the url will look like http://example.com/call-back?param_1=xxxx&param2=yyyyy&param3=zzzzz. As a result on the callback side instead of receiving param1=xxxx param2=yyyy and param3=zzzz it will receive something like parm1=xxxxx 'amp;parm2'=yyyyy 'amp;param3' = zzzzz . In this case one has to change the call back to assign param2 = 'amp;param2' and param3 = 'amp;param3' . Say, in php the code would look something this $param1 = $_GET['param1'] ; $param2 = $_GET['amp;param2'] ; $param3 = $_GET['amp;param3'] ; 3) One can decide to pass to the HTTP/GET only one parameter which contains the combination of any other parameters separated by an opportune character . Say http://example.com/call-back?params=xxxx%2Cyyyyy%2Czzzzz where I choose as separator a comma ',' uri escaped in %2C. Oscar On Sun, Feb 21, 2010 at 2:26 AM, Nikos Balkanas <[email protected]> wrote: > OK. Looks like a bug. I'll take a look at it when I get some time. In the > meantime can you live with the illegal XML? > > Nikos > ----- Original Message ----- From: "oscar cassetti" > <[email protected]> > To: "Nikos Balkanas" <[email protected]> > Cc: <[email protected]> > Sent: Saturday, February 20, 2010 2:18 PM > Subject: Re: XML Post and dlr-url > > > But that's what I did in the second test. I didn't URL-escape > anything, I just let the Perl XML writer escape & with & which is > the right thing to do. > However when kannel parses the <dlr-url> it doesn't un-escape the & to > &. > As a result the query URL used by kannel looks like this one below > > > 2010-02-19 21:11:44 [1381] [9] DEBUG: Parsing URL > `http://localhost/dump_me.php?send_history_id=13853220&to_number=000000000000&type=8': > > which produces on my entry point this > > GET = > Array > ( > [send_history_id] => 13853220 > [amp;to_number] => 000000000000 > [amp;type] => 8 > ) > > Note the amp;to_number for example. If the dlr-url was escaped > properly this one should have just been to_number . > > Finally in third and last test I produced an illegal XML by not > escaping the & and it worked: > > > 2010-02-19 21:28:18 [1381] [9] DEBUG: Parsing URL > `http://localhost/dump_me.php?send_history_id=13853221&to_number=3538706323 > 46&type=8': > > and on my entry point > GET = > Array > ( > [send_history_id] => 13853221 > [to_number] => 000000000000 > [type] => 8 > ) > > > The issue is that I need to use an invalid XML to produced the right > result. The problem is related to non un-escaping the <dlr-url> > element. > > Oscar > > On Sat, Feb 20, 2010 at 2:09 AM, Nikos Balkanas <[email protected]> wrote: >> >> So, in XML POST you shouldn't urlencode anything. And it will work. What's >> your issue then? >> >> Nikos >> ----- Original Message ----- From: "oscar cassetti" >> <[email protected]> >> To: <[email protected]> >> Sent: Saturday, February 20, 2010 12:36 AM >> Subject: Re: XML Post and dlr-url >> >> >> Hi, >> >> I tried few things and I believe I found a bug in the way the >> <dlr-url> is parsed. >> (1) >> First of all I tried to URI-escape the entire dlr-url and it didn't work. >> Basically I passed this: >> >> <dlr-url>http%3A%2F%2Flocalhost%2Fdump_me.php%3Fsend_history_id%3D13853219%26to_number%3D000000000000%26t >> ype%3D%25d</dlr-url> >> >> And the same appears in the logs >> >> 2010-02-19 21:03:32 [1318] [3] DEBUG: XMLParsing: tag <dlr-url> value >> <http%3A%2F%2Flocalhost%2Fdump_me.php%3Fsend_history_id >> >> When Kannel is going to parse the url it rejects it: >> >> 2010-02-19 21:03:32 [1318] [3] DEBUG: Status: 400 Answer: <DLR-URL >> field misformed, rejected> >> >> In this case the message was not sent. >> (2) >> In a second test I didn't escape URI-escape. I let the Perl XML Writer >> to escape the content of <dlr-url> . >> In this case & is substituted by & This can also be seen in smsbox >> logs. >> >> 2010-02-19 21:11:43 [1381] [3] DEBUG: XMLParsing: tag <dlr-url> value >> >> <http://localhost/dump_me.php?send_history_id=13853220&to_number=000000000000&type=%d> >> >> However when kannel parses the URL the & is not changed back to & . >> So the result is the following URL is used. >> >> 2010-02-19 21:11:44 [1381] [9] DEBUG: Parsing URL >> >> `http://localhost/dump_me.php?send_history_id=13853220&to_number=000000000000&type=8': >> >> I wrote a simple script to catch the content of the GET when kannel >> query the <dlr-url> and the result is >> >> GET = >> Array >> ( >> [send_history_id] => 13853220 >> [amp;to_number] => 000000000000 >> [amp;type] => 8 >> ) >> >> (3) >> Finally I tried to overwrite the <dlr-ulr> so I substituted & with & >> so the request looks like this one below: >> >> <?xml version="1.0" encoding="UTF-8"?> >> >> <message><submit><da><number>000000000000</number></da><oa><number>000000000000</number></oa><ud>%E2%82%ACee</ud><statusrequest><dlr-mask>31</dlr-mask><dlr-url>http://localhost/dump_me.php?send_history_id=13853221&to_number=000000000000&type=%d</dlr-url></statusrequest><!-- >> request from application to Kannel >> >> --><from><username>xxxxxxx</username><password>xxxxxxx</password></from></submit></message> >> >> Note that this XML is technically wrong. However this produces the >> right result as ti can be seen from the logs: >> >> 2010-02-19 21:28:17 [1381] [3] DEBUG: XMLParsing: tag <dlr-url> value >> >> <http://localhost/dump_me.php?send_history_id=13853221&to_number=000000000000&type=%d> >> >> 2010-02-19 21:28:18 [1381] [9] DEBUG: Parsing URL >> >> `http://localhost/dump_me.php?send_history_id=13853221&to_number=3538706323 >> 46&type=8': >> 2010-02-19 21:28:18 [1381] [9] DEBUG: Scheme: http:// >> 2010-02-19 21:28:18 [1381] [9] DEBUG: Host: localhost >> 2010-02-19 21:28:18 [1381] [9] DEBUG: Port: 80 >> 2010-02-19 21:28:18 [1381] [9] DEBUG: Username: (null) >> 2010-02-19 21:28:18 [1381] [9] DEBUG: Password: (null) >> 2010-02-19 21:28:18 [1381] [9] DEBUG: Path: /dump_me.php >> 2010-02-19 21:28:18 [1381] [9] DEBUG: Query: >> send_history_id=13853221&to_number=353870632346&type=8 >> 2010-02-19 21:28:18 [1381] [9] DEBUG: Fragment: (null) >> >> And also from my entry point I was able to get the three parameters >> correctly >> >> GET = >> Array >> ( >> [send_history_id] => 13853221 >> [to_number] => 000000000000 >> [type] => 8 >> ) >> >> In summary I believe that an incorrect XML produces the right result. >> The problem looks to me e that the <dlr-ulr> is not escaped correctly. >> >> Here some details >> Kannel smsbox version 1.4.3 >> xml2-config --version 2.6.32 >> >> Any suggestion? >> >> Thank you, >> Oscar >> >> On Thu, Feb 18, 2010 at 3:09 PM, Nikos Balkanas <[email protected]> >> wrote: >>> >>> Well, urlencoding is not right, still. In your URL ytou need to encode /, >>> & >>> and ?. Don't need to encode = or 8. But I think you want to encode >>> &type=%d. >>> That should be %26type=%%d >>> >>> So is this working or not? What do you mean by 3 parmaters, not 2? This >>> is >>> the dlr-url you send in your XML. >>> >>> BR, >>> Nikos >>> >> >> > >
