1
0
Fork 0

mm7 changes -- special header add

This commit is contained in:
bagyenda 2008-09-12 08:46:46 +00:00
parent 04037fbb64
commit 069455ec3d
5 changed files with 53 additions and 9 deletions

View File

@ -1,3 +1,5 @@
2008-09-12 P. A. Bagyenda <bagyenda@dsmagic.com>
* Added facility for appending special response header to each message (mime) part in MM7 response
2008-09-11 P. A. Bagyenda <bagyenda@dsmagic.com> 2008-09-11 P. A. Bagyenda <bagyenda@dsmagic.com>
* MMSBox HTTP MMSC type added, for inter-mmsbox message relay * MMSBox HTTP MMSC type added, for inter-mmsbox message relay
* MM5 support, basic infrastructure on the MMSC side. * MM5 support, basic infrastructure on the MMSC side.

View File

@ -205,6 +205,7 @@ MULTI_GROUP(mms-service,
OCTSTR(aliases) OCTSTR(aliases)
OCTSTR(http-post-parameters) OCTSTR(http-post-parameters)
OCTSTR(service-code) OCTSTR(service-code)
OCTSTR(extra-reply-content-header)
) )
#undef OCTSTR #undef OCTSTR
#undef SINGLE_GROUP #undef SINGLE_GROUP

View File

@ -467,6 +467,13 @@ static int fetch_serviceurl(MmsEnvelope *e,
goto done; goto done;
} else { } else {
Octstr *base_url = url_path_prefix(ms->url, typ); Octstr *base_url = url_path_prefix(ms->url, typ);
if (ms->special_header) {
if (rph == NULL)
rph = http_create_empty_headers();
http_header_remove_all(rph, "X-Mbuni-Content-Header");
http_header_add(rph, "X-Mbuni-Content-Header", octstr_get_cstr(ms->special_header));
}
res = make_and_queue_msg(rb, ctype, rph, res = make_and_queue_msg(rb, ctype, rph,
ms->url, ms->url,
base_url, base_url,
@ -709,9 +716,9 @@ static int add_msg_part(MIMEEntity *res, xmlNodePtr node, Octstr *base_url,
Octstr *top_url, Octstr *top_url,
int type, Octstr *svc_name, int type, Octstr *svc_name,
Octstr *mmc_id, Octstr *mmc_id,
Dict *url_map) Dict *url_map, Octstr *xmhdr, Octstr *xmhdr_val)
{ {
Octstr *curl = NULL, *ctype = NULL, *body = NULL, *xcid = NULL; Octstr *curl = NULL, *ctype = NULL, *body = NULL, *xcid = NULL;
char *src = NULL; char *src = NULL;
int isurl, slash_prefix; int isurl, slash_prefix;
Octstr *cid = NULL; Octstr *cid = NULL;
@ -790,6 +797,10 @@ static int add_msg_part(MIMEEntity *res, xmlNodePtr node, Octstr *base_url,
http_header_add(headers, "Content-Type", octstr_get_cstr(ctype)); http_header_add(headers, "Content-Type", octstr_get_cstr(ctype));
http_header_add(headers, "Content-ID", octstr_get_cstr(cid_header_val)); http_header_add(headers, "Content-ID", octstr_get_cstr(cid_header_val));
http_header_add(headers, "Content-Location", p); http_header_add(headers, "Content-Location", p);
if (xmhdr)
http_header_add(headers, octstr_get_cstr(xmhdr), octstr_get_cstr(xmhdr_val));
mime_replace_headers(x, headers); mime_replace_headers(x, headers);
mime_entity_set_body(x, body); mime_entity_set_body(x, body);
@ -824,15 +835,15 @@ static void add_msg_parts(MIMEEntity *res, xmlNodePtr node, Octstr *base_url,
Octstr *top_url, Octstr *top_url,
int type, Octstr *svc_name, int type, Octstr *svc_name,
Octstr *mmc_id, Octstr *mmc_id,
Dict *url_map) Dict *url_map, Octstr *xmhdr, Octstr *xmhdr_val)
{ {
xmlNodePtr n; xmlNodePtr n;
/* Do all the children recursively, then come back and do parent. */ /* Do all the children recursively, then come back and do parent. */
for (n = node; n; n = n->next) for (n = node; n; n = n->next)
if (n->type != XML_COMMENT_NODE) { if (n->type != XML_COMMENT_NODE) {
add_msg_part(res, n, base_url, top_url, type, svc_name, mmc_id, url_map); add_msg_part(res, n, base_url, top_url, type, svc_name, mmc_id, url_map, xmhdr, xmhdr_val);
add_msg_parts(res, n->xmlChildrenNode, base_url, top_url, type, add_msg_parts(res, n->xmlChildrenNode, base_url, top_url, type,
svc_name, mmc_id, url_map); svc_name, mmc_id, url_map, xmhdr, xmhdr_val);
} }
} }
@ -853,7 +864,8 @@ static int make_and_queue_msg(Octstr *data, Octstr *ctype, List *reply_headers,
List *xheaders = NULL; List *xheaders = NULL;
List *hdrs = http_create_empty_headers(); List *hdrs = http_create_empty_headers();
Octstr *otransid = NULL; Octstr *otransid = NULL;
Octstr *xmhdr = NULL, *xmhdr_val = NULL;
time_t expiryt = time(NULL) + DEFAULT_EXPIRE; time_t expiryt = time(NULL) + DEFAULT_EXPIRE;
Octstr *x; Octstr *x;
List *xto = gwlist_create(); List *xto = gwlist_create();
@ -916,6 +928,21 @@ static int make_and_queue_msg(Octstr *data, Octstr *ctype, List *reply_headers,
if (!subject && e && e->subject) if (!subject && e && e->subject)
subject = octstr_duplicate(e->subject); subject = octstr_duplicate(e->subject);
/* Look for special header name/value to be inserted on all objects. */
if (reply_headers &&
(xmhdr = http_header_value(reply_headers, octstr_imm("X-Mbuni-Content-Header"))) != NULL) {
int x = octstr_search_char(xmhdr,':', 0);
if (x > 0) {
xmhdr_val = octstr_copy(xmhdr, x+1, octstr_len(xmhdr));
octstr_delete(xmhdr, x, octstr_len(xmhdr));
} else
xmhdr_val = octstr_create("");
octstr_strip_blanks(xmhdr_val);
octstr_strip_blanks(xmhdr);
}
#if 0 /* don't route via sender, instead use allow/deny settings. */ #if 0 /* don't route via sender, instead use allow/deny settings. */
if (!mmc && e) if (!mmc && e)
mmc = octstr_duplicate(e->fromproxy); mmc = octstr_duplicate(e->fromproxy);
@ -986,7 +1013,7 @@ static int make_and_queue_msg(Octstr *data, Octstr *ctype, List *reply_headers,
add_msg_parts(me, smil->xmlChildrenNode, add_msg_parts(me, smil->xmlChildrenNode,
base_url, turl, type, svc_name, base_url, turl, type, svc_name,
mmc, url_map); mmc, url_map, xmhdr, xmhdr_val);
dict_destroy(url_map); dict_destroy(url_map);
/* SMIL has been modified, convert it to text, put it in. */ /* SMIL has been modified, convert it to text, put it in. */
@ -999,6 +1026,8 @@ static int make_and_queue_msg(Octstr *data, Octstr *ctype, List *reply_headers,
http_header_add(xh, "Content-Type", "application/smil"); http_header_add(xh, "Content-Type", "application/smil");
http_header_add(xh, "Content-ID", "<presentation>"); /* identify it as start element. */ http_header_add(xh, "Content-ID", "<presentation>"); /* identify it as start element. */
if (xmhdr)
http_header_add(xh, octstr_get_cstr(xmhdr), octstr_get_cstr(xmhdr_val));
s = octstr_create_from_data((char *)buf, bsize); s = octstr_create_from_data((char *)buf, bsize);
mime_replace_headers(sm, xh); mime_replace_headers(sm, xh);
@ -1036,6 +1065,9 @@ static int make_and_queue_msg(Octstr *data, Octstr *ctype, List *reply_headers,
} }
http_header_add(xh, "Content-Type", octstr_get_cstr(ctype)); http_header_add(xh, "Content-Type", octstr_get_cstr(ctype));
if (xmhdr)
http_header_add(xh, octstr_get_cstr(xmhdr), octstr_get_cstr(xmhdr_val));
mime_replace_headers(me, xh); mime_replace_headers(me, xh);
http_destroy_headers(xh); http_destroy_headers(xh);
@ -1163,11 +1195,14 @@ done:
octstr_destroy(subject); octstr_destroy(subject);
octstr_destroy(otransid); octstr_destroy(otransid);
octstr_destroy(turl); octstr_destroy(turl);
octstr_destroy(xmhdr);
octstr_destroy(xmhdr_val);
if (me) if (me)
mime_entity_destroy(me); mime_entity_destroy(me);
mms_destroy(m); mms_destroy(m);
gwlist_destroy(xto, (gwlist_item_destructor_t *)octstr_destroy); gwlist_destroy(xto, (void *)octstr_destroy);
http_destroy_headers(hdrs); http_destroy_headers(hdrs);
octstr_destroy(xservice_code); octstr_destroy(xservice_code);
octstr_destroy(hsvc_code); octstr_destroy(hsvc_code);
@ -1225,6 +1260,8 @@ static void dispatch_sendmms_recv(List *rl)
Octstr *prio = http_cgi_variable(h->cgivars, "priority"); Octstr *prio = http_cgi_variable(h->cgivars, "priority");
Octstr *distro = http_cgi_variable(h->cgivars, "distribution"); Octstr *distro = http_cgi_variable(h->cgivars, "distribution");
Octstr *send_type = http_cgi_variable(h->cgivars, "mms-direction"); Octstr *send_type = http_cgi_variable(h->cgivars, "mms-direction");
Octstr *sheader = http_cgi_variable(h->cgivars, "extra-content-header");
Octstr *data_url = NULL; Octstr *data_url = NULL;
dlr_url = http_cgi_variable(h->cgivars, "dlr-url"); dlr_url = http_cgi_variable(h->cgivars, "dlr-url");
@ -1336,6 +1373,9 @@ static void dispatch_sendmms_recv(List *rl)
HTTP_REPLACE_HEADER(rh, "X-Mbuni-Priority", octstr_get_cstr(prio)); HTTP_REPLACE_HEADER(rh, "X-Mbuni-Priority", octstr_get_cstr(prio));
if (distro) if (distro)
HTTP_REPLACE_HEADER(rh, "X-Mbuni-DistributionIndicator", octstr_get_cstr(distro)); HTTP_REPLACE_HEADER(rh, "X-Mbuni-DistributionIndicator", octstr_get_cstr(distro));
if (sheader)
HTTP_REPLACE_HEADER(rh, "X-Mbuni-Content-Header", octstr_get_cstr(sheader));
/* Requests to make_and_queue below can block, but for now we don't care. */ /* Requests to make_and_queue below can block, but for now we don't care. */
if (ctype && data && !rb) { /* only send if no error. */ if (ctype && data && !rb) { /* only send if no error. */

View File

@ -393,7 +393,7 @@ int mms_load_mmsbox_settings(Octstr *fname, gwthread_func_t *mmsc_handler_func)
m->params = NULL; m->params = NULL;
m->service_code = mms_cfg_get(cfg, x, octstr_imm("service-code")); m->service_code = mms_cfg_get(cfg, x, octstr_imm("service-code"));
m->special_header = mms_cfg_get(cfg, x, octstr_imm("extra-reply-content-header"));
gwlist_append(mms_services, m); gwlist_append(mms_services, m);
} }

View File

@ -107,6 +107,7 @@ typedef struct MmsService {
Octstr *service_code; /* Service code (MM7/SOAP only) */ Octstr *service_code; /* Service code (MM7/SOAP only) */
Octstr *allowed_receiver_prefix, *denied_receiver_prefix; Octstr *allowed_receiver_prefix, *denied_receiver_prefix;
Octstr *special_header; /* To be added to each content element. */
} MmsService; } MmsService;
typedef struct SendMmsUser { typedef struct SendMmsUser {