Hello list,
I'm afraid I can't make head or tail of the sparse documentation, probably
because I haven't been programming in C/C++ long enough to be used to such
sparseness. But I digress.
I'm trying to implement a cheap and nasty proof of concept implementation of an
Amazon Glacier interface to enable me to test some stuff. To save you reading
the Amazon docs, on both successful and bad attempts, you get back an
"x-amzn-RequestId" HTTP header. Then on a good attempt, you get another HTTP
header called "x-amzn-ArchiveID", and on a bad attempt, you get a JSON
formatted error message in the body.
The goal of my libcurl coolness is to pick this stuff up and stick it in an
SQLITE db table for future parsing at leisure.
So far, I've cobbled together the code below, it picks up x-amzn-Requestid
ok...... but then I can't get it to deal with the JSON error and the program
segfaults.
Not understanding libcurl much, I'm thinking its something do do with the fact
that HTTP header and body are dealt with by seperate functions and so my class
is getting terribly confused trying to find stuff in memory that doesn't exist.
Problem is (a) I'm not sure this is the correct interpretation of my problem,
and (b) I've no idea where to start fixing it..... I've tried various CURLOPT
additions/removals but that seems to have no effect.
Thanks in advance for your help, keep up the great work on Curl and apologies
for the poor quality of the code that follows......
P.S. Is the curl c++ wrapper project dead ? I see it hasn't been touched since
2009 ? Hence I've been just using good old libcurl straight from the horse's
mouth.
/*****
***** SNIPPET FROM THE MAIN ROUTINE
****/
void mynamespace::curlEasy::curlPostFile {
mynamespace::HttpHeaders curlHeaderParser;
curl_easy_setopt(curlCtx, CURLOPT_HEADERDATA, &curlHeaderParser);
}
/*****
***** MY CALLBACK
****/
std::size_t mynamespace::curlEasy::curlHeaderCallback(void* data, std::size_t
blockSize, std::size_t numBlocks, void* userPtr) {
std::size_t dataSz = blockSize * numBlocks;
char *d = (char*) data;
mynamespace::HttpHeaders *pHeaders = (mynamespace::HttpHeaders *)(userPtr);
int result = 0;
if (pHeaders != NULL) {
std::string s = "";
s.append(d, dataSz);
pHeaders->addHeader(s);
}
//
return dataSz;
}
/*****
***** MY CALLBACK FUNCTION
****/
void mynamespace::HttpHeaders::addHeader(std::string& s) {
std::string curlKey;
boost::trim(s);
std::stringstream curlSS(s);
std::string curlVal;
// HTTP/1.1
if (s.compare(0, 1, vJSONOpen, 0, 1) == 0) {
if (s.compare(vJSONEmpty) != 0) {
mynamespace::SQLite sqlDbx;
sqlDbx.logAmzGlacierError(sqlDB,amzRid,s);
}
} else if (s.compare(0, 8, vGoodHeader, 0, 8) == 0) {
uploadedOK = false;
if (s.compare(vGoodHeader) == 0) {
uploadedOK = true;
++httpHeaderCount;
} else if (s.compare(v100Continue) != 0) {
uploadedOK = false;
b100Continue = true;
httpHeaderCount = 1;
} else {
uploadedOK = false;
++httpHeaderCount;
}
} else {
if (s.size() > 2) {
//
if (getline(curlSS, curlKey, ':')) {
getline(curlSS, curlVal);
}
boost::trim(curlKey);
boost::trim(curlVal);
if (curlKey.compare("x-amzn-RequestId") == 0) {
mynamespace::SQLite sqlDbx;
sqlDbx.logAmzGlacierNewRecord(sqlDB,curlVal,vFilName);
amzRid = curlVal;
}
//
if (uploadedOK) {
hdrVals.insert(std::pair<std::string, std::string > (curlKey,
curlVal));
if (verboseMode) {
std::cout << "upload successful....key:" + curlKey <<
std::endl;
std::cout << "upload successful....val:" + curlVal <<
std::endl;
}
} else if (!uploadedOK) {
hdrVals.insert(std::pair<std::string, std::string > (curlKey,
curlVal));
if (verboseMode) {
std::cout << "upload failed....key:" + curlKey << std::endl;
std::cout << "upload failed....val:" + curlVal << std::endl;
}
}
}
}
}-------------------------------------------------------------------
List admin: http://cool.haxx.se/list/listinfo/curl-library
Etiquette: http://curl.haxx.se/mail/etiquette.html