/* * Get the mime ebXML message */ MIME *ebxml_getmessage (XML *xml, QUEUEROW *r) { MIME *msg, *payload, *soap; char *pid, *organization, buf[MAX_PATH]; int route; if ((route = cfg_route_index (xml, queue_field_get (r, "ROUTEINFO"))) < 0) return (NULL); organization = cfg_org (xml); pid = queue_field_get (r, "MESSAGEID"); if (pid != NULL) pid = strchr (pid, '-'); if (pid++ == NULL) { error ("Can't get PID from MESSAGEID\n"); return (NULL); } if (strcmp (queue_field_get (r, "ACTION"), "Ping")) { if ((payload = ebxml_getpayload (xml, r)) == NULL) return (NULL); } else payload = NULL; if ((soap = ebxml_getsoap (xml, r)) == NULL) { mime_free (payload); return (NULL); } debug ("building multipart mime message\n"); msg = mime_alloc (); sprintf (buf, "type=\"text/xml\"; start=\"ebxml-envelope@%s\";", organization); mime_setBoundary (msg, buf); sprintf (buf, "%s:%s", cfg_route (xml, route, "Host"), cfg_route (xml, route, "Port")); mime_setHeader (msg, "Host", buf, 99); mime_setHeader (msg, "Connection", "Close", 99); if (strcmp ("basic", cfg_route (xml, route, "Authentication.Type")) == 0) { basicauth_request (buf, cfg_route (xml, route, "Authentication.Id"), cfg_route (xml, route, "Authentication.Password")); pid = strchr (buf, ':'); *pid++ = 0; while (isspace (*pid)) pid++; mime_setHeader (msg, buf, pid, 99); } mime_setHeader (msg, "SOAPAction", "\"ebXML\"", 99); mime_setMultiPart (msg, soap); if (payload != NULL) mime_setMultiPart (msg, payload); debug ("Completed multipart soap message\n"); return (msg); }
/* * set Content-Length */ int mime_setLength (MIME *m, int len) { char buf[10]; sprintf (buf, "%d", len); return (mime_setHeader (m, MIME_LENGTH, buf, 1)); }
/* * set a mulitpart mime boundary - the current time and a random * number is used to set the boundary text */ int mime_setBoundary (MIME *m, char *attr) { char b[256]; snprintf (b, 256, "%s; %s boundary=\"_Part_%ld_%d\"", MIME_MULTIPART, attr, time (NULL), rand ()); return (mime_setHeader (m, MIME_CONTENT, b, 0)); }
/* * Get the mime header (soap) container */ MIME *ebxml_getsoap (XML *xml, QUEUEROW *r) { XML *soap; MIME *msg; char *ch, *pid, *partyid, *cpa, *organization, path[MAX_PATH], buf[MAX_PATH]; int route; debug ("getting soap container...\n"); organization = cfg_org (xml); pid = queue_field_get (r, "MESSAGEID"); if (pid != NULL) pid = strchr (pid, '-'); if (pid++ == NULL) { error ("Can't get PID from MESSAGEID\n"); return (NULL); } if ((route = cfg_route_index (xml, queue_field_get (r, "ROUTEINFO"))) < 0) return (NULL); debug ("getting soap template for pid=%s org=%s...\n", pid, organization); if ((soap = ebxml_template (xml, XSOAP)) == NULL) { error ("Can't get SOAP template\n"); return (NULL); } xml_set_text (soap, SOAPFROMPARTY, cfg_party (xml)); partyid = "Someone_else"; xml_set_text (soap, SOAPTOPARTY, partyid); cpa = cfg_route (xml, route, "Cpa"); xml_set_text (soap, SOAPCPAID, cpa); xml_set_text (soap, SOAPCONVERSEID, pid); xml_set_text (soap, SOAPSERVICE, queue_field_get (r, "SERVICE")); xml_set_text (soap, SOAPACTION, queue_field_get (r, "ACTION")); sprintf (buf, "%ld@%s", pid, organization); xml_set_text (soap, SOAPMESSAGEID, buf); queue_field_set (r, "MESSAGECREATIONTIME", ptime (NULL, buf)); xml_set_text (soap, SOAPDATATIME, buf); if (!strcmp (queue_field_get (r, "ACTION"), "Ping")) { xml_delete (soap, SOAPBODY); } else { sprintf (buf, "cid:%s@%s", queue_field_get (r, "PAYLOADFILE"), organization); debug ("set %s xlink:href=\"%s\"\n", SOAPMREF, buf); xml_set_attribute (soap, SOAPMREF, "xlink:href", buf); sprintf (buf, "%s.%s", r->queue->name, queue_field_get (r, "RECORDID")); xml_set_text (soap, SOAPDBRECID, buf); xml_set_text (soap, SOAPDBMESSID, queue_field_get (r, "MESSAGEID")); xml_set_text (soap, SOAPDBARGS, queue_field_get (r, "ARGUMENTS")); xml_set_text (soap, SOAPDBRECP, queue_field_get (r, "MESSAGERECIPIENT")); } debug ("building soap mime container...\n"); msg = mime_alloc (); mime_setHeader (msg, MIME_CONTENT, MIME_XML, 99); sprintf (buf, "<%s%s>", "ebxml-envelope@", organization); mime_setHeader (msg, MIME_CONTENTID, buf, 0); debug ("formatting soap xml...\n"); ch = xml_format (soap); debug ("soap envelope:\n%s\n", ch); xml_free (soap); mime_setBody (msg, ch, strlen (ch)); free (ch); debug ("returning soap message...\n"); return (msg); }