Beispiel #1
0
/*
 * 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);
}
Beispiel #2
0
/*
 * 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));
}
Beispiel #3
0
/*
 * 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));
}
Beispiel #4
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);
}