void test_multipart () { MIME *m; FILE *fp; struct stat st; char *buf, *fbuf; int sz; if (stat (MNAME, &st)) { error ("Can't stat %s\n", MNAME); return; } buf = (char *) malloc (st.st_size + 1); fp = fopen (MNAME, "rb"); fread (buf, 1, st.st_size, fp); fclose (fp); buf[st.st_size] = 0; debug ("parsing %s sz=%d...\n", MNAME, st.st_size); if ((m = mime_parse (buf)) == NULL) error ("Failed parsing %s\n", MNAME); fbuf = mime_format (m); info ("Passed multipart mime test\n", fbuf); debug ("formated...\n%s\n", fbuf); free (buf); free (fbuf); }
int main (int argc, char **argv) { XML *xml; QUEUE *q; QUEUEROW *r; MIME *m; char *ch; int arg = 1; xml = xml_parse (PhineasConfig); loadpath (cfg_installdir (xml)); queue_init (xml); /* test folder polling */ if ((argc > arg) && (strcmp (argv[arg], "-f") == 0)) { fpoller_register ("ebxml", ebxml_fprocessor); fpoller_task (xml); arg++; ran = 0; } /* test message from queue */ if ((argc > arg) && (strcmp (argv[arg], "-m") == 0)) { if ((q = queue_find ("MemSendQ")) == NULL) error ("can't find MemSendQ"); else if ((r = queue_pop (q)) == NULL) error ("can't pop row\n"); /* else if ((m = ebxml_getsoap (xml, r)) == NULL) error ("can't get soap container\n"); */ else if ((m = ebxml_getmessage (xml, r)) == NULL) error ("can't get message\n"); else if ((ch = mime_format (m)) == NULL) error ("Can't format soap containter\n"); else debug ("message MIME\n%s\n", ch); free (ch); mime_free (m); queue_row_free (r); arg++; } /* test queue polling */ if ((argc > arg) && (strcmp (argv[arg], "-q") == 0)) { qpoller_register ("EbXmlSndQ", ebxml_qprocessor); qpoller_task (xml); arg++; ran = 0; } queue_shutdown (); xml_free (xml); info ("%s %s\n", argv[0], Errors ? "failed" : "passed"); exit (Errors); }
/* * send a message * return non-zero if message not sent successful with completed * queue info for status and transport */ int ebxml_send (XML*xml, QUEUEROW *r, MIME *msg) { DBUF *b; NETCON *conn; char host[MAX_PATH]; /* need buffers for redirect */ char path[MAX_PATH]; int port, route, timeout, delay, retry; SSL_CTX *ctx; char *rname, /* route name */ *content, /* message content */ buf[MAX_PATH]; /* format up the message */ if ((content = mime_format (msg)) == NULL) { queue_field_set (r, "PROCESSINGSTATUS", "done"); queue_field_set (r, "TRANSPORTSTATUS", "failed"); queue_field_set (r, "TRANSPORTERRORCODE", "failed formatting message"); return (-1); } debug ("Send content:\n%s\n", content); /* * get connection info from the record route */ if ((route = cfg_route_index (xml, queue_field_get (r, "ROUTEINFO"))) < 0) { queue_field_set (r, "PROCESSINGSTATUS", "done"); queue_field_set (r, "TRANSPORTSTATUS", "failed"); queue_field_set (r, "TRANSPORTERRORCODE", "bad route"); return (-1); } rname = cfg_route (xml, route, "Name"); ctx = ebxml_route_ctx (xml, route); strcpy (host, cfg_route (xml, route, "Host")); port = atoi (cfg_route (xml, route, "Port")); if ((retry = atoi (cfg_route (xml, route, "Retry"))) == 0) retry = cfg_retries (xml); timeout = atoi (cfg_route (xml, route, "Timeout")); delay = cfg_delay (xml); strcpy (path, cfg_route (xml, route, "Path")); sendmsg: info ("Sending ebXML %s:%d to %s\n", r->queue->name, r->rowid, rname); debug ("opening connection socket on port=%d retrys=%d timeout=%d\n", port, retry, timeout); if ((conn = net_open (host, port, 0, ctx)) == NULL) { error ("failed opening connection to %s:%d\n", host, port); goto retrysend; } /* set read timeout if given */ if (timeout) { net_timeout (conn, timeout * 1000); timeout <<= 1; /* bump each try */ } delay = 0; /* connection OK, don't delay */ queue_field_set (r, "MESSAGESENTTIME", ptime (NULL, buf)); sprintf (buf, "POST %s HTTP/1.1\r\n", path); // ch = ebxml_beautify (ch); /* all set... send the message */ debug ("sending message...\n"); net_write (conn, buf, strlen (buf)); net_write (conn, content, strlen (content)); debug ("reading response...\n"); b = ebxml_receive (conn); debug ("closing socket...\n"); net_close (conn); /* no reply? */ if (b == NULL) { warn ("Send response timed out or closed for %s\n", rname); retrysend: /* retry with a wait, or.. */ if (retry-- && phineas_running ()) { if (delay) { info ("Retrying send to %s in %d seconds\n", rname, delay); sleep (delay * 1000); delay <<= 1; } else /* reset connection delay */ delay = cfg_delay (xml); goto sendmsg; } if (ctx != NULL) /* give up! */ SSL_CTX_free (ctx); free (content); queue_field_set (r, "PROCESSINGSTATUS", "done"); queue_field_set (r, "TRANSPORTSTATUS", "failed"); queue_field_set (r, "TRANSPORTERRORCODE", "retries exhausted"); return (-1); } debug ("reply was %d bytes\n%.*s\n", dbuf_size (b), dbuf_size (b), dbuf_getbuf (b)); /* * handle redirects... * note this assumes the same SSL context should be used */ if (ebxml_redirect (dbuf_getbuf (b), host, &port, path)) { dbuf_free (b); goto sendmsg; } if (ctx != NULL) SSL_CTX_free (ctx); if (ebxml_parse_reply (dbuf_getbuf (b), r)) { queue_field_set (r, "PROCESSINGSTATUS", "done"); queue_field_set (r, "TRANSPORTSTATUS", "failed"); queue_field_set (r, "TRANSPORTERRORCODE", "garbled reply"); } debug ("send completed\n"); dbuf_free (b); free (content); return (0); }