vijay sharma
vijay sharma

Reputation: 131

How to pass data in Poco HTTPRequest

This is regarding to my project, Where I am write Poco SSL client to communicate with a server.

I am able to do (i) Basic Auth (ii) Cert exchange. But after sending post request I am facing "Error 500".

Let me explain it=>

I have a working curl:

curl -d '{"name":"com.my.session.value"}' -H 'Content-Type: application/json' -H 'Accept: application/json' -E MyCert.pem --key MyKey.pem -u testuser -k -vvv https://<server-ip>:<port>/Internal/directory/path

using this I am able to print data on console. So tried to write same in Poco/C++:

// I have handler for keyPassparse, cert, invalid-cert-handler and used them in below line
SSLManager::instance().initializeClient(parse_str, Cert, ptrContext);

URI uri(argv[1]);
Poco::Net::HTTPSClientSession session(uri.getHost(), uri.getPort());
session.setKeepAlive(true);
Poco::Net::HTTPRequest req(Poco::Net::HTTPRequest::HTTP_POST, uri.getPath(), Poco::Net::HTTPMessage::HTTP_1_1);
HTTPBasicCredentials cred("testuser", "secret");

    //Here I tried to add headers and data

    cred.authenticate(req);
    req.add("Content-Type","application/json");
    req.add("Accept","application/json");
    req.add("data","com.my.session.value"); // try-1 to add data
    req.setKeepAlive(true);
    std::ostream& myOStream = session.sendRequest(req);
    std::string body("name=com.my.session.value"); // try-2 to add data
    myOStream << body;

    Poco::Net::HTTPResponse response;
    std::istream& rs = session.receiveResponse(response);
    std::cout << response.getStatus() << " " << response.getReason() << std::endl;
}
catch (Exception& exc)
{
    std::cerr << exc.displayText() << std::endl;
    return 1;
}

return 0;

}

This is always returning Error:500 (Internal server error) Which means my data section is not reaching properly.

Please suggest me a way to pass proper "data" section to server.

Thanks in advance.

Upvotes: 1

Views: 2643

Answers (1)

vijay sharma
vijay sharma

Reputation: 131

I found the solution for this:

1) I sent data as json:

Poco::JSON::Object obj;
obj.set("name", "com.my.session.value");
std::stringstream ss; 
obj.stringify(ss);

2) Content herders should not be added by "add", used below for them:

req.setContentType("application/json");
req.setContentLength(ss.str().size());

3) Now sending body like this:

std::ostream& myOStream = session.sendRequest(req);
obj.stringify(myOStream);

Approach used: I wrote code for http. Sent same data by curl and exe, captured packets for both. Compared and fixed gaps one by one.

I hope this will help someone in future.

Upvotes: 2

Related Questions