Minor fixes to mmbox code, more mm7
This commit is contained in:
parent
38a4b2197c
commit
7967dcc45f
|
@ -6,6 +6,7 @@
|
|||
|
||||
#define content(n) ((n)->xmlChildrenNode ? dfltstr(((n)->xmlChildrenNode)->content) : dfltstr((n)->content))
|
||||
|
||||
|
||||
static Octstr *parse_time(char *s)
|
||||
{
|
||||
time_t t = time(NULL);
|
||||
|
@ -187,20 +188,81 @@ static int parse_headers(xmlNodePtr start, List *h, int sigparent)
|
|||
return 0;
|
||||
}
|
||||
|
||||
List *parse_soapmsg(Octstr *xml)
|
||||
MSoapMsg_t *mm7_parse_soap(List *headers, Octstr *body)
|
||||
{
|
||||
xmlDocPtr doc = xmlParseMemory(octstr_get_cstr(xml), octstr_len(xml));
|
||||
MIMEEntity *mime = mime_http_to_entity(headers, body);
|
||||
Octstr *xml = NULL, *cloc;
|
||||
xmlDocPtr doc;
|
||||
MmsMsg *msg = NULL;
|
||||
List *h;
|
||||
int s = -1;
|
||||
if (!doc || !doc->xmlChildrenNode)
|
||||
MSoapMsg_t *smsg = NULL;
|
||||
|
||||
if (!mime)
|
||||
return NULL;
|
||||
/* Find the start element:
|
||||
* - either the mime entity is multipart and has start param ...
|
||||
* - or entity is multipart and start element is (implicitly) first element
|
||||
* - or entity is not multipart, so body is xml
|
||||
*/
|
||||
|
||||
if (mime->start)
|
||||
xml = mime->start->body;
|
||||
else if (mime->multiparts && list_len(mime->multiparts) > 0) {
|
||||
MIMEEntity *x = list_get(mime->multiparts,0);
|
||||
xml = x->body;
|
||||
} else
|
||||
xml = mime->body;
|
||||
|
||||
if (!xml)
|
||||
goto done;
|
||||
|
||||
doc = xmlParseMemory(octstr_get_cstr(xml), octstr_len(xml));
|
||||
if (!doc || !doc->xmlChildrenNode)
|
||||
goto done;
|
||||
|
||||
h = http_create_empty_headers();
|
||||
|
||||
parse_headers(doc->xmlChildrenNode, h, s);
|
||||
xmlFreeDoc(doc);
|
||||
|
||||
/* Free the doc! */
|
||||
return h;
|
||||
if (!h)
|
||||
goto done;
|
||||
|
||||
cloc = http_header_value(h, octstr_imm("Content"));
|
||||
|
||||
if (cloc) {
|
||||
/* XXXX only support content that is inline. easy to add external. */
|
||||
MIMEEntity *c = NULL;
|
||||
int i, n;
|
||||
char *loc = octstr_get_cstr(cloc) + 4; /* skip 'cid:' part. */
|
||||
for (i = 0, n = list_len(mime->multiparts); i<n; i++) {
|
||||
MIMEEntity *x = list_get(mime->multiparts, i);
|
||||
Octstr *y = x ? http_header_value(x->headers, octstr_imm("Content-ID")) : NULL;
|
||||
|
||||
if (y && octstr_str_compare(y, loc) == 0)
|
||||
c = x;
|
||||
|
||||
if (y)
|
||||
octstr_destroy(y);
|
||||
if (c)
|
||||
break;
|
||||
}
|
||||
if (c)
|
||||
msg = mms_frommime(c);
|
||||
|
||||
octstr_destroy(cloc);
|
||||
}
|
||||
smsg = gw_malloc(sizeof *smsg);
|
||||
smsg->envelope = h;
|
||||
smsg->msg = msg;
|
||||
|
||||
done:
|
||||
if (mime)
|
||||
mime_entity_destroy(mime);
|
||||
if (xml)
|
||||
octstr_destroy(xml);
|
||||
return smsg;
|
||||
}
|
||||
|
||||
static void output_rcpt(char *hdr, List *hdrs, Octstr *p)
|
||||
|
@ -413,3 +475,61 @@ Octstr *headers_to_soapxml(List *hdrs)
|
|||
|
||||
return s;
|
||||
}
|
||||
|
||||
int mm7_soapmsg_to_httpmsg(MSoapMsg_t *m, List **hdrs, Octstr **body)
|
||||
{
|
||||
MIMEEntity *mime;
|
||||
Octstr *ctype;
|
||||
|
||||
mime = mime_entity_create();
|
||||
|
||||
if (m->msg) {
|
||||
MIMEEntity *c = mms_tomime(m->msg);
|
||||
Octstr *cloc = octstr_format("cid:<c%ld.%d.%c%c.msg>",
|
||||
time(NULL), random(),
|
||||
'A' + random() % 26,
|
||||
'a' + random() % 26);
|
||||
Octstr *envloc = octstr_format("<s%ld.%d.%c%c.msg>",
|
||||
time(NULL), random(),
|
||||
'A' + random() % 26,
|
||||
'a' + random() % 26);
|
||||
MIMEEntity *xml = mime_entity_create();
|
||||
List *hh = http_header_duplicate(m->envelope);
|
||||
|
||||
/* Replace in envelope. */
|
||||
http_header_remove_all(hh, "Content-ID");
|
||||
http_header_add(hh, "Content-ID", octstr_get_cstr(cloc));
|
||||
|
||||
/* Replace content location in msg part. */
|
||||
http_header_remove_all(c->headers, "Content-ID");
|
||||
http_header_add(c->headers, "Content-ID", octstr_get_cstr(cloc) + 4);
|
||||
|
||||
http_header_add(xml->headers, "Content-Type", "text/xml; charset=\"utf-8\"");
|
||||
http_header_add(xml->headers, "Content-ID", octstr_get_cstr(envloc));
|
||||
xml->body = headers_to_soapxml(hh);
|
||||
|
||||
list_append(mime->multiparts, xml);
|
||||
list_append(mime->multiparts, c);
|
||||
|
||||
http_destroy_headers(hh);
|
||||
|
||||
ctype = octstr_format("multipart/related; start=\"%S\"; type=text/xml",
|
||||
envloc);
|
||||
|
||||
octstr_destroy(envloc);
|
||||
octstr_destroy(cloc);
|
||||
} else {
|
||||
ctype = octstr_imm("text/xml; charset=\"utf-8\"");
|
||||
mime->body = headers_to_soapxml(m->envelope);
|
||||
}
|
||||
|
||||
http_header_add(mime->headers, "Content-Type", octstr_get_cstr(ctype));
|
||||
http_header_add(mime->headers, "SOAPAction", "\"\"");
|
||||
|
||||
*hdrs = mime_entity_headers(mime);
|
||||
*body = mime_entity_body(mime);
|
||||
|
||||
mime_entity_destroy(mime);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -1,10 +1,15 @@
|
|||
#ifndef __MMS_MM7SOAP_INCLUDED__
|
||||
#define __MMS_MM7SOAP_INCLUDED__
|
||||
#include "mms_util.h"
|
||||
typedef struct Mm7Soap_t *Mm7Soap_t;
|
||||
|
||||
extern Mm7Soap_t *mms_mm7soap_from_mime(Octstr *text);
|
||||
typedef struct MSoapMsg_t {
|
||||
List *envelope; /* of http headers. */
|
||||
MmsMsg *msg;
|
||||
} MSoapMsg_t;
|
||||
|
||||
extern MSoapMsg_t *mm7_parse_soap(List *headers, Octstr *body);
|
||||
extern int mm7_soapmsg_to_httpmsg(MSoapMsg_t *m, List **hdrs, Octstr **body);
|
||||
|
||||
extern MmsMsg *mm7_soapmsg_to_mmsmsg(MSoapMsg_t *m);
|
||||
|
||||
extern List *parse_soapmsg(Octstr *xml);
|
||||
extern Octstr *headers_to_soapxml(List *hdrs);
|
||||
#endif
|
||||
|
|
|
@ -985,7 +985,8 @@ static int fixup_msg(MmsMsg *m, Octstr *from)
|
|||
else if (octstr_str_compare(ver, "1.2") <= 0)
|
||||
m->enc = MS_1_2;
|
||||
|
||||
if (m->message_type == MMS_MSGTYPE_SEND_REQ) {
|
||||
if (m->message_type == MMS_MSGTYPE_SEND_REQ ||
|
||||
m->message_type == MMS_MSGTYPE_RETRIEVE_CONF) {
|
||||
Octstr *s = NULL;
|
||||
|
||||
/* Check for from. */
|
||||
|
@ -1003,6 +1004,12 @@ static int fixup_msg(MmsMsg *m, Octstr *from)
|
|||
} else
|
||||
octstr_destroy(s);
|
||||
|
||||
/* Check for msgid, put in if missing. */
|
||||
if ((s = http_header_value(m->headers, octstr_imm("MessageID"))) == NULL)
|
||||
http_header_add(m->headers, "MessageID", "00000");
|
||||
else
|
||||
octstr_destroy(s);
|
||||
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -1713,7 +1720,7 @@ static int mms_convert_to_mboxdescr(MmsMsg *mm, Octstr *cloc, List *reqhdrs,
|
|||
int i, n;
|
||||
List *mh, *xh;
|
||||
Octstr *xstate;
|
||||
int addcontent = 0;
|
||||
int addcontent = 0, hasmsgid = 0;
|
||||
|
||||
if (!mm)
|
||||
return -1;
|
||||
|
@ -1724,6 +1731,7 @@ static int mms_convert_to_mboxdescr(MmsMsg *mm, Octstr *cloc, List *reqhdrs,
|
|||
|
||||
http_header_add(mh, "X-Mms-Message-Type", "m-mbox-descr");
|
||||
http_header_add(mh, "X-Mms-MMS-Version", "1.2");
|
||||
http_header_add(mh, "X-Mms-Content-Location", octstr_get_cstr(cloc));
|
||||
|
||||
/* Add only those headers requested. */
|
||||
for (i = 0, n = list_len(reqhdrs); i < n; i++) {
|
||||
|
@ -1740,7 +1748,8 @@ static int mms_convert_to_mboxdescr(MmsMsg *mm, Octstr *cloc, List *reqhdrs,
|
|||
sprintf(yy, "%lu", msize);
|
||||
http_header_add(mh, "X-Mms-Message-Size", yy);
|
||||
goto loop;
|
||||
}
|
||||
} else if (octstr_case_compare(header, octstr_imm("Message-ID")) == 0)
|
||||
hasmsgid = 1;
|
||||
|
||||
for (j = 0; j < list_len(h); j++) {
|
||||
Octstr *hname, *value;
|
||||
|
@ -1757,6 +1766,15 @@ static int mms_convert_to_mboxdescr(MmsMsg *mm, Octstr *cloc, List *reqhdrs,
|
|||
/* We ignore the extra attributes request. */
|
||||
}
|
||||
|
||||
if (!hasmsgid) {
|
||||
Octstr *v = http_header_value(mm->headers, octstr_imm("Message-ID"));
|
||||
if (v) {
|
||||
http_header_add(mh, "Message-ID",
|
||||
octstr_get_cstr(v));
|
||||
octstr_destroy(v);
|
||||
}
|
||||
}
|
||||
|
||||
/* Copy over the MM-State and MM-flags headers. */
|
||||
xh = http_header_find_all(mm->headers, "X-Mms-MM-Flags");
|
||||
if (xh) {
|
||||
|
|
|
@ -1264,6 +1264,7 @@ static void sendmms_proxy(MmsHTTPClientInfo *h)
|
|||
if (sdf)
|
||||
octstr_destroy(sdf);
|
||||
|
||||
|
||||
reply_body = mms_tobinary(mresp);
|
||||
notify_cmd = "uploaded";
|
||||
}
|
||||
|
@ -1350,6 +1351,7 @@ static void sendmms_proxy(MmsHTTPClientInfo *h)
|
|||
if (otransid)
|
||||
octstr_destroy(otransid);
|
||||
|
||||
|
||||
reply_body = mms_tobinary(mresp);
|
||||
notify_cmd = "deleted";
|
||||
}
|
||||
|
@ -1469,7 +1471,6 @@ static void sendmms_proxy(MmsHTTPClientInfo *h)
|
|||
mms_ua_maxmsgsize(h->prof),
|
||||
MS_1_2,
|
||||
otherhdrs);
|
||||
|
||||
reply_body = mms_tobinary(mresp);
|
||||
notify_cmd = "deleted";
|
||||
|
||||
|
@ -1517,6 +1518,11 @@ static void sendmms_proxy(MmsHTTPClientInfo *h)
|
|||
|
||||
done:
|
||||
|
||||
#if 1
|
||||
if (mresp)
|
||||
mms_msgdump(mresp, 0);
|
||||
#endif
|
||||
|
||||
if (mresp)
|
||||
mms_destroy(mresp);
|
||||
if (!ctype_set)
|
||||
|
|
Loading…
Reference in New Issue