Here is the patch :)
On Mon, Oct 10, 2011 at 2:54 AM, Bassam Al-Sarori <[email protected]>wrote:
> Hi all,
>
> I am new to this mailing list but have been using Kannel for a long time.
>
> I want to share a patch which I hope to be useful.
>
> The patch solves two issues which I faced with http smsc (generic)
>
> 1) URL Parameters of an MO message request are not logged. Only the base
> URL gets logged, for example,
> 2011-10-10 00:35:06 [2930] [7] DEBUG: HTTP[httpsmsc]: Got request `/send'
>
> Which makes it hard for debugging
>
> So, I made some changes so that the full URL and parameters are logged
>
> 2011-10-10 00:35:06 [2930] [7] DEBUG: HTTP[httpsmsc]: Got request
> `/send?from=13123&to=6774638981&text=hi&coding=0&udh='
>
> 2) Incorrect success reply for failed MOs. SMSC assumes that the only case
> of failure is when bb_smscconn_receive returns -1, which is not correct
> (bb_smscconn_receive never returns -1). So, I changed it to only assume
> success in case of SMSCCONN_SUCCESS or SMSCCONN_QUEUED is returned.
>
> Please note that I am not an experienced C programmer. So, if you find any
> stupid mistakes let me know. Thanks!
>
>
> Regards,
> Bassam
>
>
Index: gw/smsc/smsc_http.c
===================================================================
--- gw/smsc/smsc_http.c (revision 4932)
+++ gw/smsc/smsc_http.c (working copy)
@@ -287,8 +287,8 @@
/* XXX if conn->is_stopped, do not receive new messages.. */
- client = http_accept_request(conndata->port, &ip, &url,
- &headers, &body, &cgivars);
+ client = http_accept_request_real(conndata->port, &ip, &url,
+ &headers, &body, &cgivars,1);
if (client == NULL)
break;
@@ -1810,13 +1810,13 @@
Msg *resp = msg_duplicate(dlrmsg);
ret = bb_smscconn_receive(conn, dlrmsg);
- if (ret == -1) {
- retmsg = octstr_create("Not accepted");
- retstatus = fm->status_error;
- } else {
- retmsg = urltrans_fill_escape_codes(fm->message_sent, resp);
- retstatus = fm->status_sent;
- }
+ if (ret == SMSCCONN_SUCCESS || ret == SMSCCONN_QUEUED){
+ retmsg =
urltrans_fill_escape_codes(fm->message_sent, resp);
+ retstatus = fm->status_sent;
+ }else{
+ retmsg = octstr_create("Not accepted");
+ retstatus = fm->status_error;
+ }
msg_destroy(resp);
} else {
error(0,"HTTP[%s]: Got DLR but could not find message or was not
interested "
@@ -1901,12 +1901,12 @@
msg->sms.meta_data = octstr_duplicate(meta_data);
Msg *resp = msg_duplicate(msg);
ret = bb_smscconn_receive(conn, msg);
- if (ret == -1) {
+ if (ret == SMSCCONN_SUCCESS || ret == SMSCCONN_QUEUED){
+ retmsg = urltrans_fill_escape_codes(fm->message_sent,
resp);
+ retstatus = fm->status_sent;
+ }else{
retmsg = octstr_create("Not accepted");
retstatus = fm->status_error;
- } else {
- retmsg = urltrans_fill_escape_codes(fm->message_sent, resp);
- retstatus = fm->status_sent;
}
msg_destroy(resp);
}
Index: gwlib/http.c
===================================================================
--- gwlib/http.c (revision 4932)
+++ gwlib/http.c (working copy)
@@ -2557,9 +2557,9 @@
}
-HTTPClient *http_accept_request(int port, Octstr **client_ip, Octstr **url,
+HTTPClient *http_accept_request_real(int port, Octstr **client_ip, Octstr
**url,
List **headers, Octstr **body,
- List **cgivars)
+ List **cgivars, int keep_url)
{
HTTPClient *client;
@@ -2578,6 +2578,12 @@
} while(client == NULL);
*client_ip = octstr_duplicate(client->ip);
+
+ if(keep_url)
+ *url = octstr_duplicate(client->url);//duplicate otherwise parse_cgivars
will eat params
+ else
+ *url = client->url;
+
*url = client->url;
*headers = client->request->headers;
*body = client->request->body;
Index: gwlib/http.h
===================================================================
--- gwlib/http.h (revision 4932)
+++ gwlib/http.h (working copy)
@@ -430,10 +430,15 @@
* many threads to be fast. The HTTP user should use a single thread,
* unless requests can block.
*/
-HTTPClient *http_accept_request(int port, Octstr **client_ip,
+HTTPClient *http_accept_request_real(int port, Octstr **client_ip,
Octstr **url, List **headers, Octstr **body,
- List **cgivars);
+ List **cgivars, int keep_url);
+/* always eats URL params, bb and other boxes use it while SMSCs should
+ use the real one */
+#define http_accept_request(port,client_ip, url, headers, body, cgivars) \
+ http_accept_request_real(port,client_ip, url, headers, body, cgivars, 0)
+
/*
* Send a reply to a previously accepted request. The caller is responsible