curl-users
Fwd: Additionally, a 400 Bad Request error was encountered while trying to use an ErrorDocument to handle the request.
Date: Tue, 9 May 2017 18:52:59 -0400
Hello Bagdar and Jay,
Thank you for even responding to my post well, to be honest, I don’t even
know what to call my app it work like soapUI (https://www.soapui.org/#_ga=
2.231068255.1796044353.1494342082-2037242614.1494342082
<https://mail.gmgtransport.com/owa/redir.aspx?SURL=ZKrAFeN0IvFzmR9q8cz6h3fBG3Xn-DImkZxK_zh0d2VZskbaI5fUCGgAdAB0AHAAcwA6AC8ALwB3AHcAdwAuAHMAbwBhAHAAdQBpAC4AbwByAGcALwAjAF8AZwBhAD0AMgAuADIAMwAxADAANgA4ADIANQA1AC4AMQA3ADkANgAwADQANAAzADUAMwAuADEANAA5ADQAMwA0ADIAMAA4ADIALQAyADAAMwA3ADIANAAyADYAMQA0AC4AMQA0ADkANAAzADQAMgAwADgAMgA.&URL=https%3a%2f%2fwww.soapui.org%2f%23_ga%3d2.231068255.1796044353.1494342082-2037242614.1494342082>)
I have been fighting with this thing for 2 weeks. Every soap call works and
Rest call works. The only time the app does not work is when the username
and password have to be in the property. I have made the changes that jay
recommend thank you, however, I received a different error. Here is the
entire code for the app.
I pass this to the app (0004SOAP0053http://www.odfl.com/TraceWebServiceWeb/
services/Trace0027F:\soap\request\SOAA896.tmp0014GMGEMP:gmg65ny0000)
Content of file (<soapenv:Envelope xmlns:soapenv="http://schemas.
xmlsoap.org/soap/envelope/
<https://mail.gmgtransport.com/owa/redir.aspx?SURL=Dp4y4N4Q10FLu5timynde7SoA7eyWxKRErmFtDJIfApZskbaI5fUCGgAdAB0AHAAOgAvAC8AcwBjAGgAZQBtAGEAcwAuAHgAbQBsAHMAbwBhAHAALgBvAHIAZwAvAHMAbwBhAHAALwBlAG4AdgBlAGwAbwBwAGUALwA.&URL=http%3a%2f%2fschemas.xmlsoap.org%2fsoap%2fenvelope%2f>"
xmlns:trac="http://trace.odfl.com
<https://mail.gmgtransport.com/owa/redir.aspx?SURL=sekRn-r6pk1wNDNP70U1LIFrdylHTrP-eZxDpeufnnhZskbaI5fUCGgAdAB0AHAAOgAvAC8AdAByAGEAYwBlAC4AbwBkAGYAbAAuAGMAbwBtAA..&URL=http%3a%2f%2ftrace.odfl.com>
"><soapenv:Header/><soapenv:Body><trac:getTraceData><trac:pro>
1905027247</trac:pro><trac:type>P</trac:type></trac:
getTraceData></soapenv:Body></soapenv:Envelope>)
The 53 character is the end point
/*
How to import
This program can handle the http/https soap request as well as the Rest
request.
------------------------------------------------------------
----------------------------------------------------------
How to pass SOAP Request as command argument:
------------------------------------------------------------
----------------------------------------------------------
Soap request should be sent in below format. There should be only 1 command
line argument which will endpoint as well as request.
Soap request should come under the double quotes ("").
Any Request that have any quote should be put in a \ \ example \"islandia,
ny\"
you cant count back slash in the string len
Command argument ( 0008endpoint0007Request0000 ). This request must be in
this format.
soap Request Example
Endpoint (http://www.estes-express.com/shipmenttracking/services/
ShipmentTrackingService
<https://mail.gmgtransport.com/owa/redir.aspx?SURL=RZf8hJ1m-k9_TnQM1314Gcu4KDQTJbJLZVWDvg9OczFZskbaI5fUCGgAdAB0AHAAOgAvAC8AdwB3AHcALgBlAHMAdABlAHMALQBlAHgAcAByAGUAcwBzAC4AYwBvAG0ALwBzAGgAaQBwAG0AZQBuAHQAdAByAGEAYwBrAGkAbgBnAC8AcwBlAHIAdgBpAGMAZQBzAC8AUwBoAGkAcABtAGUAbgB0AFQAcgBhAGMAawBpAG4AZwBTAGUAcgB2AGkAYwBlAA..&URL=http%3a%2f%2fwww.estes-express.com%2fshipmenttracking%2fservices%2fShipmentTrackingService>
)
Payload ( <soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/
envelope/\
<https://mail.gmgtransport.com/owa/redir.aspx?SURL=Dp4y4N4Q10FLu5timynde7SoA7eyWxKRErmFtDJIfApZskbaI5fUCGgAdAB0AHAAOgAvAC8AcwBjAGgAZQBtAGEAcwAuAHgAbQBsAHMAbwBhAHAALgBvAHIAZwAvAHMAbwBhAHAALwBlAG4AdgBlAGwAbwBwAGUALwA.&URL=http%3a%2f%2fschemas.xmlsoap.org%2fsoap%2fenvelope%2f>"
xmlns:ship=\"http://ws.estesexpress.com/shipmenttracking\
<https://mail.gmgtransport.com/owa/redir.aspx?SURL=rTt6cod4IkvKHKIRmwboGv2Xzcdnd7wCDZp1SHGKjhJZskbaI5fUCGgAdAB0AHAAOgAvAC8AdwBzAC4AZQBzAHQAZQBzAGUAeABwAHIAZQBzAHMALgBjAG8AbQAvAHMAaABpAHAAbQBlAG4AdAB0AHIAYQBjAGsAaQBuAGcALwA.&URL=http%3a%2f%2fws.estesexpress.com%2fshipmenttracking%2f>"
xmlns:ship1=\"http://ws.estesexpress.com/schema/2012/12/shipmenttracking\
<https://mail.gmgtransport.com/owa/redir.aspx?SURL=VDSMiMQiWoo8KbhEQno16YjtuD-3Wsz2jzkDpASF6fZZskbaI5fUCGgAdAB0AHAAOgAvAC8AdwBzAC4AZQBzAHQAZQBzAGUAeABwAHIAZQBzAHMALgBjAG8AbQAvAHMAYwBoAGUAbQBhAC8AMgAwADEAMgAvADEAMgAvAHMAaABpAHAAbQBlAG4AdAB0AHIAYQBjAGsAaQBuAGcALwA.&URL=http%3a%2f%2fws.estesexpress.com%2fschema%2f2012%2f12%2fshipmenttracking%2f>
"><soapenv:Header><ship:auth><ship:user>GMGTRANS</ship:user>
<ship:password>GMG#65NY</ship:password></ship:auth></
soapenv:Header><soapenv:Body><ship1:search><ship1:requestID>
GMGID</ship1:requestID><ship1:pro>0841615035</ship1:pro></
ship1:search></soapenv:Body></soapenv:Envelope>)
CommandLine Argument "0078http://www.estes-express.
com/shipmenttracking/services/ShipmentTrackingService0488<soapenv:Envelope
xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\
<https://mail.gmgtransport.com/owa/redir.aspx?SURL=Dp4y4N4Q10FLu5timynde7SoA7eyWxKRErmFtDJIfApZskbaI5fUCGgAdAB0AHAAOgAvAC8AcwBjAGgAZQBtAGEAcwAuAHgAbQBsAHMAbwBhAHAALgBvAHIAZwAvAHMAbwBhAHAALwBlAG4AdgBlAGwAbwBwAGUALwA.&URL=http%3a%2f%2fschemas.xmlsoap.org%2fsoap%2fenvelope%2f>"
xmlns:ship=\"http://ws.estesexpress.com/shipmenttracking\
<https://mail.gmgtransport.com/owa/redir.aspx?SURL=rTt6cod4IkvKHKIRmwboGv2Xzcdnd7wCDZp1SHGKjhJZskbaI5fUCGgAdAB0AHAAOgAvAC8AdwBzAC4AZQBzAHQAZQBzAGUAeABwAHIAZQBzAHMALgBjAG8AbQAvAHMAaABpAHAAbQBlAG4AdAB0AHIAYQBjAGsAaQBuAGcALwA.&URL=http%3a%2f%2fws.estesexpress.com%2fshipmenttracking%2f>"
xmlns:ship1=\"http://ws.estesexpress.com/schema/2012/12/shipmenttracking\
<https://mail.gmgtransport.com/owa/redir.aspx?SURL=VDSMiMQiWoo8KbhEQno16YjtuD-3Wsz2jzkDpASF6fZZskbaI5fUCGgAdAB0AHAAOgAvAC8AdwBzAC4AZQBzAHQAZQBzAGUAeABwAHIAZQBzAHMALgBjAG8AbQAvAHMAYwBoAGUAbQBhAC8AMgAwADEAMgAvADEAMgAvAHMAaABpAHAAbQBlAG4AdAB0AHIAYQBjAGsAaQBuAGcALwA.&URL=http%3a%2f%2fws.estesexpress.com%2fschema%2f2012%2f12%2fshipmenttracking%2f>
"><soapenv:Header><ship:auth><ship:user>GMGTRANS</ship:user>
<ship:password>GMG#65NY</ship:password></ship:auth></
soapenv:Header><soapenv:Body><ship1:search><ship1:requestID>
GMGID</ship1:requestID><ship1:pro>0841615035</ship1:pro></
ship1:search></soapenv:Body></soapenv:Envelope>0000"
Rest Request Example
Endpoint (http://query.yahooapis.com/v1/public/yql
<https://mail.gmgtransport.com/owa/redir.aspx?SURL=gTcXVE7D6YV1jMStk60TjcjhpWQMFZEJDFgN3kmtGZRZskbaI5fUCGgAdAB0AHAAOgAvAC8AcQB1AGUAcgB5AC4AeQBhAGgAbwBvAGEAcABpAHMALgBjAG8AbQAvAHYAMQAvAHAAdQBiAGwAaQBjAC8AeQBxAGwA&URL=http%3a%2f%2fquery.yahooapis.com%2fv1%2fpublic%2fyql>
)
Payload (q=select * from geo.places where text="islandia, ny")
first 4 digit(0008) represt the length of endpoint string example
0008endpoint
endpoint will contain the SOAP url like (http://www.estes-express.com/
shipmenttracking/services/ShipmentTrackingService
<https://mail.gmgtransport.com/owa/redir.aspx?SURL=RZf8hJ1m-k9_TnQM1314Gcu4KDQTJbJLZVWDvg9OczFZskbaI5fUCGgAdAB0AHAAOgAvAC8AdwB3AHcALgBlAHMAdABlAHMALQBlAHgAcAByAGUAcwBzAC4AYwBvAG0ALwBzAGgAaQBwAG0AZQBuAHQAdAByAGEAYwBrAGkAbgBnAC8AcwBlAHIAdgBpAGMAZQBzAC8AUwBoAGkAcABtAGUAbgB0AFQAcgBhAGMAawBpAG4AZwBTAGUAcgB2AGkAYwBlAA..&URL=http%3a%2f%2fwww.estes-express.com%2fshipmenttracking%2fservices%2fShipmentTrackingService>
)
Next 4 digit(0007) will represent lenght of request which will come after
this digits example 0007Request
After this mentioned lenght Request (Envelope) will come
Last 0000 digit represent end of request example 0000
Sample soap request which need to as command argument
"0078http://www.estes-express.com/shipmenttracking/services/
ShipmentTrackingService0488<soapenv:Envelope xmlns:soapenv=\"http://
schemas.xmlsoap.org/soap/envelope/\
<https://mail.gmgtransport.com/owa/redir.aspx?SURL=Dp4y4N4Q10FLu5timynde7SoA7eyWxKRErmFtDJIfApZskbaI5fUCGgAdAB0AHAAOgAvAC8AcwBjAGgAZQBtAGEAcwAuAHgAbQBsAHMAbwBhAHAALgBvAHIAZwAvAHMAbwBhAHAALwBlAG4AdgBlAGwAbwBwAGUALwA.&URL=http%3a%2f%2fschemas.xmlsoap.org%2fsoap%2fenvelope%2f>"
xmlns:ship=\"http://ws.estesexpress.com/shipmenttracking\
<https://mail.gmgtransport.com/owa/redir.aspx?SURL=rTt6cod4IkvKHKIRmwboGv2Xzcdnd7wCDZp1SHGKjhJZskbaI5fUCGgAdAB0AHAAOgAvAC8AdwBzAC4AZQBzAHQAZQBzAGUAeABwAHIAZQBzAHMALgBjAG8AbQAvAHMAaABpAHAAbQBlAG4AdAB0AHIAYQBjAGsAaQBuAGcALwA.&URL=http%3a%2f%2fws.estesexpress.com%2fshipmenttracking%2f>"
xmlns:ship1=\"http://ws.estesexpress.com/schema/2012/12/shipmenttracking\
<https://mail.gmgtransport.com/owa/redir.aspx?SURL=VDSMiMQiWoo8KbhEQno16YjtuD-3Wsz2jzkDpASF6fZZskbaI5fUCGgAdAB0AHAAOgAvAC8AdwBzAC4AZQBzAHQAZQBzAGUAeABwAHIAZQBzAHMALgBjAG8AbQAvAHMAYwBoAGUAbQBhAC8AMgAwADEAMgAvADEAMgAvAHMAaABpAHAAbQBlAG4AdAB0AHIAYQBjAGsAaQBuAGcALwA.&URL=http%3a%2f%2fws.estesexpress.com%2fschema%2f2012%2f12%2fshipmenttracking%2f>
"><soapenv:Header><ship:auth><ship:user>GMGTRANS</ship:user>
<ship:password>GMG#65NY</ship:password></ship:auth></
soapenv:Header><soapenv:Body><ship1:search><ship1:requestID>
GMGID</ship1:requestID><ship1:pro>0841615035</ship1:pro></
ship1:search></soapenv:Body></soapenv:Envelope>0000"
------------------------------------------------------------
-------------------------------------------------------
How to pass Rest Request as command argument:
------------------------------------------------------------
--------------------------------------------------------
Soap request should be sent in below format. There should be only 1 command
line argument which will endpoint as well as request.
Soap request should come under the double quotes ("").
//Command argument ( 0004REST0003url0010Querystring0000 ). This request
must be in this format.
first 4 digit(0008) represt the length of "REST" keyword string
Next is having "REST" keyword
Next 4 digit(0003) will represent lenght of endpoint which will come after
this digits
url will contain the Rest url like (http://query.yahooapis.com/v1/public/yql
<https://mail.gmgtransport.com/owa/redir.aspx?SURL=gTcXVE7D6YV1jMStk60TjcjhpWQMFZEJDFgN3kmtGZRZskbaI5fUCGgAdAB0AHAAOgAvAC8AcQB1AGUAcgB5AC4AeQBhAGgAbwBvAGEAcABpAHMALgBjAG8AbQAvAHYAMQAvAHAAdQBiAGwAaQBjAC8AeQBxAGwA&URL=http%3a%2f%2fquery.yahooapis.com%2fv1%2fpublic%2fyql>
)
Next 4 digit(0010) will represent lenght of Querystring which will come
after this
After this mentioned lenght Querystring (q=select * from geo.places where
text=\"islandia, ny\") will come
Last 0000 digit represent end of request
Sample Rest request which need to as command argument
0004REST0040http://query.yahooapis.com/v1/public/yql0052q=select * from
geo.places where text=\"islandia, ny\"0000
------------------------------------------------------------
----------------------------------------------------------
------------------------------------------------------------
----------------------------------------------------------
*/
#define WIN32_LEAN_AND_MEAN
#include <stdio.h>
#include <winsock2.h>
#include <io.h>
#include <string.h>
#include <fcntl.h>
#include <time.h>
#include <curl/curl.h>
#include <stdlib.h>
// Need to link with Ws2_32.lib
#pragma comment (lib, "Ws2_32.lib")
#define BUFFER_SIZE 4096
#define REQUEST_BUFFER_SIZE 32767
#define RESULT_BUFFER_SIZE 100000
#define FileName_Len 40
#define TRUE 1
#define FALSE 0
int flag;
char request[REQUEST_BUFFER_SIZE]; //request buffer
int sizeof_request;
char credential[50];
char *username;
char *password;
char request_type[16];
char request_file[512];
char endpoint[BUFFER_SIZE]; //endpoint buffer to hold url
char response[RESULT_BUFFER_SIZE]; //Respont buffer
char errors[CURL_ERROR_SIZE];
FILE *logfile;
FILE *outfile;
FILE *inpfile;
int inBufLen, sbufLen, nCode;
char inBuf[BUFFER_SIZE], sbuf[BUFFER_SIZE], response_file[BUFFER_SIZE];
////////////////////////////////////////////////////////////////////////
// prototypes for compression routines
int compress(void *compr, int *compLen, void *reqstr, int uncompLen);
int compress2(void *compr, int *compLen, void *reqstr, int uncompLen, int
level);
int uncompress(void *uncompr, int *uncomprLen, void *compr, int comprLen);
time_t aclock;
struct tm *currtime;
errno_t err;
char FileName[FileName_Len];
void ErrorExit(const char* msg)
{
fprintf(logfile, "%s: %d\n" ,msg, WSAGetLastError());
fflush(logfile);
fclose(logfile);
WSACleanup();
exit(-1);
}
//Function to Parse command line argument and store them in char * array
char* ParseString(char* str, char *rbuf, int nrbuf)
{
int i, n;
// get the length of the data
for(n=0, i=0; i<4; i++)
n = (n * 10) + (str[i] - '0');
str += 4;
// str is too long
if(n >= nrbuf)
{
return NULL;
}
//move str to the result
for(i=0; i<n; i++)
rbuf[i] = str[i];
rbuf[i] = 0;
str += n;
// return what is left
return str;
}
int postrequest(int is_https)
{
//writing to file initially
struct curl_slist *header = NULL;
CURL *curl;
CURLcode res;
//For header below function is getting used with different header
contenthttps://curl.haxx.se/libcurl/c/curl_slist_append.html
<https://mail.gmgtransport.com/owa/redir.aspx?SURL=9x3s-cVyBNZkewwKry_JVYDUNubn4-0niGqTkpJt7P5ZskbaI5fUCGgAdAB0AHAAcwA6AC8ALwBjAHUAcgBsAC4AaABhAHgAeAAuAHMAZQAvAGwAaQBiAGMAdQByAGwALwBjAC8AYwB1AHIAbABfAHMAbABpAHMAdABfAGEAcABwAGUAbgBkAC4AaAB0AG0AbAA.&URL=https%3a%2f%2fcurl.haxx.se%2flibcurl%2fc%2fcurl_slist_append.html>
header = curl_slist_append (header, "Content-Type:
text/xml;charset=UTF-8");
// header = curl_slist_append (header, "SOAPAction: myur1");
header = curl_slist_append (header, "SOAPAction: """);
header = curl_slist_append (header, "Transfer-Encoding: gzip");
//header = curl_slist_append (header, "Transfer-Encoding: chunked");
//header = curl_slist_append (header, "Expect:");
//https://curl.haxx.se/libcurl/c/curl_easy_init.html
curl = curl_easy_init();
if(is_https == 1)//if https url is getting used
{
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, TRUE);//
https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYPEER.html
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2);//
https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYHOST.html
curl_easy_setopt (curl, CURLOPT_CAINFO, ".\\cacert.pem"); //
https://curl.haxx.se/libcurl/c/CURLOPT_CAINFO.html
}
if(curl)
{
//https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPALIVE.html
/* enable TCP keep-alive for this transfer */
curl_easy_setopt(curl, CURLOPT_TCP_KEEPALIVE, 1L);
/* keep-alive idle time to 120 seconds */
curl_easy_setopt(curl, CURLOPT_TCP_KEEPIDLE, 120L);
/* interval time between keep-alive probes: 60 seconds */
curl_easy_setopt(curl, CURLOPT_TCP_KEEPINTVL, 60L);
/* ask libcurl to show us the verbose output */
//curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(curl, CURLOPT_URL, endpoint);//https://curl.haxx.
se/libcurl/c/CURLOPT_URL.html
if (flag == TRUE)
{
curl_easy_setopt(curl, CURLOPT_ACCEPT_ENCODING, "
gzip,deflate");
// curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "
http://www.odfl.com/TraceWebServiceWeb/services/Trace
<https://mail.gmgtransport.com/owa/redir.aspx?SURL=vpGznilSl6o5DZewcUBjvPcXA-1Iazhw07LAtve46CxZskbaI5fUCGgAdAB0AHAAOgAvAC8AdwB3AHcALgBvAGQAZgBsAC4AYwBvAG0ALwBUAHIAYQBjAGUAVwBlAGIAUwBlAHIAdgBpAGMAZQBXAGUAYgAvAHMAZQByAHYAaQBjAGUAcwAvAFQAcgBhAGMAZQA.&URL=http%3a%2f%2fwww.odfl.com%2fTraceWebServiceWeb%2fservices%2fTrace>
");
curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_easy_setopt(curl, CURLOPT_USERAGENT, "libcurl-
agent/1.0");
curl_easy_setopt(curl, CURLOPT_USERNAME, username);
curl_easy_setopt(curl, CURLOPT_PASSWORD, password);
// curl_easy_setopt(curl, CURLOPT_NETRC,
CURL_NETRC_REQUIRED);
//curl_easy_setopt(curl, CURLOPT_USERPWD, credential);
//"myname:thesecret" //
}
curl_easy_setopt(curl, CURLOPT_POST, 1L);//https://curl.haxx.se/
libcurl/c/CURLOPT_POST.html
curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL); //Reads xml
request from file (https://curl.haxx.se/libcurl/c/CURLOPT_READFUNCTION.html
<https://mail.gmgtransport.com/owa/redir.aspx?SURL=ZpVnZf4KY30XBx48s5kAObiij_fHbWJZKoCIVB_JYZRZskbaI5fUCGgAdAB0AHAAcwA6AC8ALwBjAHUAcgBsAC4AaABhAHgAeAAuAHMAZQAvAGwAaQBiAGMAdQByAGwALwBjAC8AQwBVAFIATABPAFAAVABfAFIARQBBAEQARgBVAE4AQwBUAEkATwBOAC4AaAB0AG0AbAA.&URL=https%3a%2f%2fcurl.haxx.se%2flibcurl%2fc%2fCURLOPT_READFUNCTION.html>
)
curl_easy_setopt(curl, CURLOPT_READDATA, (void *)inpfile);//https://
curl.haxx.se/libcurl/c/CURLOPT_READDATA.html
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, NULL); //Writes data
to file (https://curl.haxx.se/libcurl/c/CURLOPT_WRITEFUNCTION.html
<https://mail.gmgtransport.com/owa/redir.aspx?SURL=7gCRn1SaOqH5_1kb-sebNSnqN1MaJXcDPWdg8QyrEu9ZskbaI5fUCGgAdAB0AHAAcwA6AC8ALwBjAHUAcgBsAC4AaABhAHgAeAAuAHMAZQAvAGwAaQBiAGMAdQByAGwALwBjAC8AQwBVAFIATABPAFAAVABfAFcAUgBJAFQARQBGAFUATgBDAFQASQBPAE4ALgBoAHQAbQBsAA..&URL=https%3a%2f%2fcurl.haxx.se%2flibcurl%2fc%2fCURLOPT_WRITEFUNCTION.html>
)
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)outfile); //(
https://curl.haxx.se/libcurl/c/CURLOPT_WRITEDATA.html
<https://mail.gmgtransport.com/owa/redir.aspx?SURL=_OXXiV4bXexM_wi-Mtj6JvogtY7YymFGWiD2_etKPZhZskbaI5fUCGgAdAB0AHAAcwA6AC8ALwBjAHUAcgBsAC4AaABhAHgAeAAuAHMAZQAvAGwAaQBiAGMAdQByAGwALwBjAC8AQwBVAFIATABPAFAAVABfAFcAUgBJAFQARQBEAEEAVABBAC4AaAB0AG0AbAA.&URL=https%3a%2f%2fcurl.haxx.se%2flibcurl%2fc%2fCURLOPT_WRITEDATA.html>
)
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header);//
https://curl.haxx.se/libcurl/c/CURLOPT_HTTPHEADER.html
//curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE_LARGE,
(curl_off_t)-1); //https://curl.haxx.se/libcurl/c/CURLOPT_
POSTFIELDSIZE_LARGE.html
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE_LARGE,
(curl_off_t)REQUEST_BUFFER_SIZE);
curl_easy_setopt(curl, CURLOPT_VERBOSE,1L); //https:/
/curl.haxx.se/libcurl/c/CURLOPT_VERBOSE.html
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errors);//
https://curl.haxx.se/libcurl/c/CURLOPT_ERRORBUFFER.html
res = curl_easy_perform(curl);//First set all the parameters using
above function then perform action (https://curl.haxx.se/libcurl/
c/curl_easy_perform.html
<https://mail.gmgtransport.com/owa/redir.aspx?SURL=iY8quubopvYqU22oJQldDhIAUVB40OgDsQForuydeTBZskbaI5fUCGgAdAB0AHAAcwA6AC8ALwBjAHUAcgBsAC4AaABhAHgAeAAuAHMAZQAvAGwAaQBiAGMAdQByAGwALwBjAC8AYwB1AHIAbABfAGUAYQBzAHkAXwBwAGUAcgBmAG8AcgBtAC4AaAB0AG0AbAA.&URL=https%3a%2f%2fcurl.haxx.se%2flibcurl%2fc%2fcurl_easy_perform.html>
)
if (res != CURLE_OK)
{
strcat(response, "\n");
strcat(response, "\n");
strcat(response, "-----Curl Readable Error
Text...-----\n");
strcat(response, errors);
strcat(response, curl_easy_strerror(res));
strcat(response, "----------
---------------------------\n");
fprintf(logfile, response);
fflush(logfile);
}
curl_slist_free_all(header);
curl_easy_cleanup(curl); //Cleaning up all the set data (
https://curl.haxx.se/libcurl/c/curl_easy_cleanup.html
<https://mail.gmgtransport.com/owa/redir.aspx?SURL=XthUjfoSvxDykcS5grcZTJMh6x1YXkNLk0Zro-P3qDtZskbaI5fUCGgAdAB0AHAAcwA6AC8ALwBjAHUAcgBsAC4AaABhAHgAeAAuAHMAZQAvAGwAaQBiAGMAdQByAGwALwBjAC8AYwB1AHIAbABfAGUAYQBzAHkAXwBjAGwAZQBhAG4AdQBwAC4AaAB0AG0AbAA.&URL=https%3a%2f%2fcurl.haxx.se%2flibcurl%2fc%2fcurl_easy_cleanup.html>
)
return 1;
}
return 0;
}
// This post request is to make REST call
void postrestrequest()
{
CURL *curl;
CURLcode res;
//https://curl.haxx.se/libcurl/c/curl_easy_init.html
curl = curl_easy_init();
if(curl)
{
//https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPALIVE.html
/* enable TCP keep-alive for this transfer */
res = curl_easy_setopt(curl, CURLOPT_TCP_KEEPALIVE, 1L);
/* keep-alive idle time to 120 seconds */
res = curl_easy_setopt(curl, CURLOPT_TCP_KEEPIDLE, 120L);
/* interval time between keep-alive probes: 60 seconds */
res = curl_easy_setopt(curl, CURLOPT_TCP_KEEPINTVL, 60L);
/* ask libcurl to show us the verbose output */
//curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(curl, CURLOPT_URL, endpoint);//
https://curl.haxx.se/libcurl/c/CURLOPT_URL.html
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, NULL); //Gets data
to be written to string (https://curl.haxx.se/libcurl/
c/CURLOPT_WRITEFUNCTION.html
<https://mail.gmgtransport.com/owa/redir.aspx?SURL=7gCRn1SaOqH5_1kb-sebNSnqN1MaJXcDPWdg8QyrEu9ZskbaI5fUCGgAdAB0AHAAcwA6AC8ALwBjAHUAcgBsAC4AaABhAHgAeAAuAHMAZQAvAGwAaQBiAGMAdQByAGwALwBjAC8AQwBVAFIATABPAFAAVABfAFcAUgBJAFQARQBGAFUATgBDAFQASQBPAE4ALgBoAHQAbQBsAA..&URL=https%3a%2f%2fcurl.haxx.se%2flibcurl%2fc%2fCURLOPT_WRITEFUNCTION.html>
)
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)outfile); //Writes
result to response string (https://curl.haxx.se/libcurl/
c/CURLOPT_WRITEDATA.html
<https://mail.gmgtransport.com/owa/redir.aspx?SURL=_OXXiV4bXexM_wi-Mtj6JvogtY7YymFGWiD2_etKPZhZskbaI5fUCGgAdAB0AHAAcwA6AC8ALwBjAHUAcgBsAC4AaABhAHgAeAAuAHMAZQAvAGwAaQBiAGMAdQByAGwALwBjAC8AQwBVAFIATABPAFAAVABfAFcAUgBJAFQARQBEAEEAVABBAC4AaAB0AG0AbAA.&URL=https%3a%2f%2fcurl.haxx.se%2flibcurl%2fc%2fCURLOPT_WRITEDATA.html>
)
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, sizeof_request);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, request);//
https://curl.haxx.se/libcurl/c/CURLOPT_POSTFIELDS.html
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errors);//
https://curl.haxx.se/libcurl/c/CURLOPT_ERRORBUFFER.html
res = curl_easy_perform(curl);//First set all the parameters
using above function then perform action (https://curl.haxx.se/libcurl/
c/curl_easy_perform.html
<https://mail.gmgtransport.com/owa/redir.aspx?SURL=iY8quubopvYqU22oJQldDhIAUVB40OgDsQForuydeTBZskbaI5fUCGgAdAB0AHAAcwA6AC8ALwBjAHUAcgBsAC4AaABhAHgAeAAuAHMAZQAvAGwAaQBiAGMAdQByAGwALwBjAC8AYwB1AHIAbABfAGUAYQBzAHkAXwBwAGUAcgBmAG8AcgBtAC4AaAB0AG0AbAA.&URL=https%3a%2f%2fcurl.haxx.se%2flibcurl%2fc%2fcurl_easy_perform.html>
)
if (res != CURLE_OK)
{
strcat(response, "\n");
strcat(response, "\n");
strcat(response, "-----Curl Readable Error
Text...-----\n");
strcat(response, errors);
strcat(response, curl_easy_strerror(res));
strcat(response, "----------
---------------------------\n");
fprintf(logfile, response);
fflush(logfile);
}
curl_easy_cleanup(curl); //Cleaning up all the set data (
https://curl.haxx.se/libcurl/c/curl_easy_cleanup.html
<https://mail.gmgtransport.com/owa/redir.aspx?SURL=XthUjfoSvxDykcS5grcZTJMh6x1YXkNLk0Zro-P3qDtZskbaI5fUCGgAdAB0AHAAcwA6AC8ALwBjAHUAcgBsAC4AaABhAHgAeAAuAHMAZQAvAGwAaQBiAGMAdQByAGwALwBjAC8AYwB1AHIAbABfAGUAYQBzAHkAXwBjAGwAZQBhAG4AdQBwAC4AaAB0AG0AbAA.&URL=https%3a%2f%2fcurl.haxx.se%2flibcurl%2fc%2fcurl_easy_cleanup.html>
)
}
}
int main ()
{
struct sockaddr_in listen, from;
SOCKET listen_socket;
int fromlen , recv_len;
char ibuf[BUFFER_SIZE], *ibufptr;
int count = 0;
u_short listenPort = 5599;
int rc;
int lasterror;
int timeout = 60000; // milliseconds
int nt;
char tbuf[5000];
WSADATA wsaData;
// wait 5 seconds for the other servers to start
Sleep(5000);
// get the current time and open the logfile
time(&aclock);
currtime = localtime(&aclock);
CreateDirectory("c:\\serverlogs", NULL);
if( (logfile = fopen("c:\\serverlogs\\Curl_SOAP_UDP.log", "a")) ==
NULL )
{
return -1;
}
rc = 0;
while( rc != -1 )
{
time(&aclock);
currtime = localtime(&aclock);
fprintf(logfile, "\nStart: %s\n", asctime(currtime));
fflush(logfile);
fprintf(logfile, "Initialising Winsock...");
fflush(logfile);
if( WSAStartup(0x202, &wsaData) == SOCKET_ERROR )
{
ErrorExit("WSAStartup failed with error");
}
fprintf(logfile, "Initialised.\n");
fflush(logfile);
//Create the listening socket
listen.sin_family = AF_INET;
listen.sin_addr.s_addr = INADDR_ANY;
listen.sin_port = htons(listenPort);
if((listen_socket = socket(AF_INET , SOCK_DGRAM , 0 )) ==
INVALID_SOCKET)
{
ErrorExit("Could not create socket");
}
if( setsockopt(listen_socket, SOL_SOCKET, SO_RCVTIMEO, (char
*)&timeout,sizeof(timeout)) != NO_ERROR )
{
ErrorExit("could not set recv timeout for local.\n");
}
if( setsockopt(listen_socket, SOL_SOCKET, SO_SNDTIMEO, (char
*)&timeout,sizeof(timeout)) != NO_ERROR )
{
ErrorExit("could not set send timeout for local.\n");
}
//Bind
if( bind(listen_socket ,(struct sockaddr *)&listen ,
sizeof(listen))
== SOCKET_ERROR)
{
ErrorExit("Bind failed with error code.\n");
}
//keep listening for data
while(1)
{
// check the log file size
if( _filelength(_fileno(logfile)) > 2000000 )
{
fclose(logfile);
remove("c:\\serverlogs\\Curl_SOAP_UDP.old");
rename("c:\\serverlogs\\Curl_SOAP_UDP.log",
"c:\\serverlogs\\Curl_SOAP_UDP.old");
logfile = fopen("c:\\serverlogs\\Curl_
SOAP_UDP.log", "a");
}
//clear the buffer by filling null, it might have
previously received data
memset(ibuf, 0, BUFFER_SIZE);
fprintf(logfile, "Listening on port %d\n", listenPort);
fflush(logfile);
//try to receive some data, this is a blocking call
fromlen = sizeof(from);
recv_len = recvfrom(listen_socket, ibuf, sizeof(ibuf),
0, (struct sockaddr *)&from, &fromlen);
if( recv_len == WSAETIMEDOUT )
{
continue;
}
if( recv_len == SOCKET_ERROR )
{
lasterror = WSAGetLastError();
if( lasterror == WSAETIMEDOUT ) continue;
fprintf(logfile, "recvfrom() failed: error %d\n",
lasterror);
fflush(logfile);
break;
}
////////////////////////////////////////
////////////////////////////////////////////
// we got a message which contains the request type
and the full path of the request
////////////////////////////////////////
////////////////////////////////////////////
ibuf[recv_len] = 0;
fprintf(logfile, "%s\n", ibuf);
fflush(logfile);
if (strcmp(ibuf, "CLOSE") > 0 )
{
ErrorExit("UDP Client Request to shutdown the
UDP Server.\n");
}
//Parse the request_type.
ibufptr = ibuf;
ibufptr = ParseString(ibufptr, request_type, sizeof
(request_type));
if( ibufptr == NULL || strstr("RESTSOAP",
request_type) == NULL )
{
fprintf(logfile, "Request is invalid.\n");
continue;
}
// parse the endpoint
ibufptr = ParseString(ibufptr, endpoint, sizeof
(endpoint));
if( (ibufptr == NULL) || (*endpoint == 0) )
{
fprintf(logfile, "Endpoint is invalid.\n");
continue;
}
//Parse the request_file.
ibufptr = ParseString(ibufptr, request_file, sizeof
(request_file));
if( (ibufptr == NULL) || (*request_file == 0) )
{
fprintf(logfile, "Request file is invalid.\n");
continue;
}
ibufptr = ParseString(ibufptr, credential, sizeof
(credential));
if(!(ibufptr == NULL) && !(*credential == 0) )
{
flag = TRUE;
username = strtok(credential,":");
password = strtok( NULL, ":");
}
// open the request file and make sure it is good
if( (inpfile = fopen(request_file, "rb")) == NULL )
{
fprintf(logfile,"Failed to open inpfile.\n");
continue;
}
nt = 0;
while( (rc = fread(tbuf, 1, 4096, inpfile)) > 0 )
{
nt += 1;
}
fclose(inpfile);
if( nt < 1 )
{
fprintf(logfile,"input file empty.\n");
continue;
}
// it is good so reopen it
inpfile = fopen(request_file, "rb");
// create and open the output file
strcpy(response_file, "f:\\soap\\result");
strcat(response_file, strrchr(request_file, '\\'));
if( (outfile = fopen(response_file, "wb")) == NULL )
{
ErrorExit("Failed to open outfile.\n");
}
// make the request
if( strcmp(request_type, "REST")==0 )
{
// load the request for CURL as it is past in
memory
sizeof_request = fread(request, 1,
REQUEST_BUFFER_SIZE, inpfile);
postrestrequest(); //this function is above in
program to call rest request
}
else if( strcmp(request_type, "SOAP")== 0 ) //This
will be for SOAP Request
{
if(strstr(endpoint, "https:")) //If
endpoint of SOAP request is containing https that means it is secured
called else it is nonsecured called
postrequest(1);
else
postrequest(0);
}
fclose(inpfile);
fclose(outfile);
//Delete request file
//remove(request_file);
//now reply the client with the same data
fprintf(logfile, "sendto %s\n", response_file);
fflush(logfile);
if (sendto(listen_socket, response_file,
strlen(response_file) + 1, 0, (struct sockaddr*) &from, fromlen) ==
SOCKET_ERROR)
{
ErrorExit("sendto() failed with error code.\n");
}
time(&aclock);
currtime = localtime(&aclock);
fprintf(logfile, "\nEnd: %s\n", asctime(currtime));
fflush(logfile);
//strcpy(username,"");
//strcpy(password,"");
flag = FALSE;
}
// Shut Winsock back down and clean up.
closesocket(listen_socket);
WSACleanup();
}
fclose(logfile);
}
What Curl send :
* STATE: INIT => CONNECT handle 0x2b4c0b0; line 1402 (connection #-5000)
* Added connection 0. The cache now contains 1 members
* STATE: CONNECT => WAITRESOLVE handle 0x2b4c0b0; line 1439 (connection #0)
* Trying 23.36.92.238...
* STATE: WAITRESOLVE => WAITCONNECT handle 0x2b4c0b0; line 1520 (connection
#0)
* Connected to www.odfl.com
<https://mail.gmgtransport.com/owa/redir.aspx?SURL=4gu2F9xm-O3QLoS2aasMTgXcLDp9XNtg2Wu3Cz-60KCoFEnaI5fUCGgAdAB0AHAAOgAvAC8AdwB3AHcALgBvAGQAZgBsAC4AYwBvAG0A&URL=http%3a%2f%2fwww.odfl.com>
(23.36.92.238)
port 80 (#0)
* STATE: WAITCONNECT => SENDPROTOCONNECT handle 0x2b4c0b0; line 1562
(connection
#0)
* STATE: SENDPROTOCONNECT => DO handle 0x2b4c0b0; line 1580 (connection #0)
> POST /TraceWebServiceWeb/services/Trace HTTP/1.1
Host: www.odfl.com
<https://mail.gmgtransport.com/owa/redir.aspx?SURL=4gu2F9xm-O3QLoS2aasMTgXcLDp9XNtg2Wu3Cz-60KCoFEnaI5fUCGgAdAB0AHAAOgAvAC8AdwB3AHcALgBvAGQAZgBsAC4AYwBvAG0A&URL=http%3a%2f%2fwww.odfl.com>
User-Agent: libcurl-agent/1.0
Accept: */*
Accept-Encoding: gzip,deflate
Content-Type: text/xml;charset=UTF-8
Transfer-Encoding: gzip
Content-Length: 32767
Expect: 100-continue
* STATE: DO => DO_DONE handle 0x2b4c0b0; line 1659 (connection #0)
* STATE: DO_DONE => WAITPERFORM handle 0x2b4c0b0; line 1786 (connection #0)
* STATE: WAITPERFORM => PERFORM handle 0x2b4c0b0; line 1796 (connection #0)
* HTTP 1.1 or later with persistent connection, pipelining supported
< HTTP/1.1 400 Bad Request
* Server Oracle-HTTP-Server-12c is not blacklisted
< Server: Oracle-HTTP-Server-12c
< Vary: Accept-Encoding
< Content-Type: text/html; charset=iso-8859-1
< Date: Tue, 09 May 2017 14:51:08 GMT
< Connection: close
< Set-Cookie: DCID=DC1
< Set-Cookie: NSC_MCWT_Psbdmf_xxx.pegm.dpn-80=ffffffffaf17e46945525d5f4f5845
5e44
5a4a4229a0;Version=1;Max-Age=3600;path=/;httponly
<
* nread <= 0, server closed connection, bailing
* STATE: PERFORM => DONE handle 0x2b4c0b0; line 1955 (connection #0)
* multi_done
* Closing connection 0
* The cache now contains 0 members
* Expire cleared
Result :
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The request could not be understood by server due to
malformed syntax.</p>
<p>Additionally, a 400 Bad Request
error was encountered while trying to use an ErrorDocument to handle the
request.</p>
</body></html>
I am supposed to be sending this or something close
SoupUI :
POST http://www.odfl.com/TraceWebServiceWeb/services/Trace
<https://mail.gmgtransport.com/owa/redir.aspx?SURL=c-xxYerAOy1rnijzQ37NLeL-stZAisMddpV8A8EKqJmoFEnaI5fUCGgAdAB0AHAAOgAvAC8AdwB3AHcALgBvAGQAZgBsAC4AYwBvAG0ALwBUAHIAYQBjAGUAVwBlAGIAUwBlAHIAdgBpAGMAZQBXAGUAYgAvAHMAZQByAHYAaQBjAGUAcwAvAFQAcgBhAGMAZQA.&URL=http%3a%2f%2fwww.odfl.com%2fTraceWebServiceWeb%2fservices%2fTrace>
HTTP/1.1
Accept-Encoding: gzip,deflate
Content-Type: text/xml;charset=UTF-8
SOAPAction: ""
Content-Length: 325
Host: www.odfl.com
<https://mail.gmgtransport.com/owa/redir.aspx?SURL=4gu2F9xm-O3QLoS2aasMTgXcLDp9XNtg2Wu3Cz-60KCoFEnaI5fUCGgAdAB0AHAAOgAvAC8AdwB3AHcALgBvAGQAZgBsAC4AYwBvAG0A&URL=http%3a%2f%2fwww.odfl.com>
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
SoupUI response :
HTTP/1.1 200 OK
Server: Oracle-HTTP-Server
Vary: Accept-Encoding
Content-Encoding: gzip
Cache-Control: max-age=0
Expires: Mon, 08 May 2017 19:02:31 GMT
X-UA-Compatible: IE=edge
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
Content-Type: text/xml; charset=utf-8
Content-Length: 928
Date: Mon, 08 May 2017 19:02:28 GMT
Connection: keep-alive
Set-Cookie: DCID=DC1
Set-Cookie: NSC_MCWT_Psbdmf_xxx.pegm.dpn-80=ffffffffaf17e66845525d5f4f5845
5e445a4a4229a0;Version=1;Max-Age=3600;path=/;httponly
<?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S="http://schemas.
xmlsoap.org/soap/envelope/
<https://mail.gmgtransport.com/owa/redir.aspx?SURL=Sa67aTmt_AoGeFyrKKv9-hPJSX9DH8vfiRHmGtCfspKoFEnaI5fUCGgAdAB0AHAAOgAvAC8AcwBjAGgAZQBtAGEAcwAuAHgAbQBsAHMAbwBhAHAALgBvAHIAZwAvAHMAbwBhAHAALwBlAG4AdgBlAGwAbwBwAGUALwA.&URL=http%3a%2f%2fschemas.xmlsoap.org%2fsoap%2fenvelope%2f>
"><S:Header><WorkContext xmlns="http://oracle.com/weblogic/soap/workarea/
<https://mail.gmgtransport.com/owa/redir.aspx?SURL=aPT71eLlzov-7-Lq3kgES3T5sHpRG3Akmtt8lg2UK8ioFEnaI5fUCGgAdAB0AHAAOgAvAC8AbwByAGEAYwBsAGUALgBjAG8AbQAvAHcAZQBiAGwAbwBnAGkAYwAvAHMAbwBhAHAALwB3AG8AcgBrAGEAcgBlAGEALwA.&URL=http%3a%2f%2foracle.com%2fweblogic%2fsoap%2fworkarea%2f>
">rO0ABXetACF3ZWJsb2dpYy5hcHAudHJhY2Utd2Vic2VydmljZS1hcHAAAADW
AAAAI3dlYmxvZ2ljLndvcmthcmVhLlN0cmluZ1dvcmtDb250ZXh0AAUxLjAu
OAAhd2VibG9naWMuYXBwLmZ1bGwtcHJvLWhpc3RvcnktYXBwAAAA1gAAACN3
ZWJsb2dpYy53b3JrYXJlYS5TdHJpbmdXb3JrQ29udGV4dAAGMS4wLjExAAA=
</WorkContext></S:Header><S:Body><p231:getTraceDataResponse xmlns:p231="
http://trace.odfl.com
<https://mail.gmgtransport.com/owa/redir.aspx?SURL=xF6Dt1IP8IRLrRcF15J-tDMcpmjHYpaP8snqW3qr1AOoFEnaI5fUCGgAdAB0AHAAOgAvAC8AdAByAGEAYwBlAC4AbwBkAGYAbAAuAGMAbwBtAA..&URL=http%3a%2f%2ftrace.odfl.com>
"><p231:getTraceDataReturn><p231:proNum>06916221036</
p231:proNum><p231:proDate>05/09/2017 Estimated </p231:proDate><p231:
statusCode>TPD</p231:statusCode><p231:status>Awaiting
Delivery</p231:status><p231:appointment>Set for 05/09/2017
11:00AM</p231:appointment><p231:pieces>4</p231:pieces><
p231:weight>2915</p231:weight><p231:po>507346</p231:po><
p231:bol>B004678</p231:bol><p231:trailer></p231:trailer><
p231:signature></p231:signature><p231:origTerminal>
SPL</p231:origTerminal><p231:origAddress>180 TALMADGE
ROAD</p231:origAddress><p231:origState>NJ</p231:origState><p231:origName>SOUTH
PLAINFIELD, NJ</p231:origName><p231:origCity>EDISON</p231:
origCity><p231:origZip>08817</p231:origZip><p231:origPhone>(800)
554-6335</p231:origPhone><p231:origFax>(732) 248-9618</p231:origFax><p231:
destTerminal>LAS</p231:destTerminal><p231:destAddress>1225 W. WASHINGTON
BLVD.</p231:destAddress><p231:destState>CA</p231:destState><p231:destName>LOS
ANGELES, CA</p231:destName><p231:destCity>MONTEBELLO</p231:
destCity><p231:destZip>90640</p231:destZip><p231:destPhone>(800)
245-6533</p231:destPhone><p231:destFax>(323) 887-8091</p231:destFax><p231:
delivered>N</p231:delivered><p231:url></p231:url><p231:
type>P</p231:type><p231:scac></p231:scac><p231:errorMessage>
</p231:errorMessage><p231:guaranteed>N</p231:guaranteed>
<p231:call>N</p231:call></p231:getTraceDataReturn></
p231:getTraceDataResponse></S:Body></S:Envelope>
Any Help is Appreciated
Reynard Harrison
Software Architect/IT Manager
Phone: 631-983-7324 <(631)%20983-7324>
Email: Shaka212002_at_gmail.com
-----------------------------------------------------------
Unsubscribe: https://cool.haxx.se/list/listinfo/curl-users
Etiquette: https://curl.haxx.se/mail/etiquette.html
Received on 2017-05-10