Support request body on xmlhttprequest.
Allow XML property data to be submitted with a request; changes the request method from GET to POST. Supply nodes via the 'body' argument to the command.
This commit is contained in:
parent
bf0dbb22d0
commit
8a954f8338
1 changed files with 44 additions and 2 deletions
|
@ -1280,10 +1280,15 @@ public:
|
||||||
SGPropertyNode_ptr _failed;
|
SGPropertyNode_ptr _failed;
|
||||||
SGPropertyNode_ptr _target;
|
SGPropertyNode_ptr _target;
|
||||||
string propsData;
|
string propsData;
|
||||||
|
mutable string _requestBody;
|
||||||
|
int _requestBodyLength;
|
||||||
|
string _method;
|
||||||
|
|
||||||
RemoteXMLRequest(const std::string& url, SGPropertyNode* targetNode) :
|
RemoteXMLRequest(const std::string& url, SGPropertyNode* targetNode) :
|
||||||
simgear::HTTP::Request(url),
|
simgear::HTTP::Request(url),
|
||||||
_target(targetNode)
|
_target(targetNode),
|
||||||
|
_requestBodyLength(-1),
|
||||||
|
_method("GET")
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1301,7 +1306,39 @@ public:
|
||||||
{
|
{
|
||||||
_failed = p;
|
_failed = p;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void setRequestData(const SGPropertyNode* body)
|
||||||
|
{
|
||||||
|
_method = "POST";
|
||||||
|
std::stringstream buf;
|
||||||
|
writeProperties(buf, body, true);
|
||||||
|
_requestBody = buf.str();
|
||||||
|
_requestBodyLength = _requestBody.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual std::string method() const
|
||||||
|
{
|
||||||
|
return _method;
|
||||||
|
}
|
||||||
protected:
|
protected:
|
||||||
|
virtual int requestBodyLength() const
|
||||||
|
{
|
||||||
|
return _requestBodyLength;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void getBodyData(char* s, int& count) const
|
||||||
|
{
|
||||||
|
int toRead = std::min(count, (int) _requestBody.size());
|
||||||
|
memcpy(s, _requestBody.c_str(), toRead);
|
||||||
|
count = toRead;
|
||||||
|
_requestBody = _requestBody.substr(count);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual std::string requestBodyType() const
|
||||||
|
{
|
||||||
|
return "application/xml";
|
||||||
|
}
|
||||||
|
|
||||||
virtual void gotBodyData(const char* s, int n)
|
virtual void gotBodyData(const char* s, int n)
|
||||||
{
|
{
|
||||||
propsData += string(s, n);
|
propsData += string(s, n);
|
||||||
|
@ -1309,6 +1346,8 @@ protected:
|
||||||
|
|
||||||
virtual void responseComplete()
|
virtual void responseComplete()
|
||||||
{
|
{
|
||||||
|
simgear::HTTP::Request::responseComplete();
|
||||||
|
|
||||||
int response = responseCode();
|
int response = responseCode();
|
||||||
bool failed = false;
|
bool failed = false;
|
||||||
if (response == 200) {
|
if (response == 200) {
|
||||||
|
@ -1346,6 +1385,9 @@ do_load_xml_from_url(const SGPropertyNode * arg)
|
||||||
|
|
||||||
RemoteXMLRequest* req = new RemoteXMLRequest(url, targetnode);
|
RemoteXMLRequest* req = new RemoteXMLRequest(url, targetnode);
|
||||||
|
|
||||||
|
if (arg->hasChild("body"))
|
||||||
|
req->setRequestData(arg->getChild("body"));
|
||||||
|
|
||||||
// connect up optional reporting properties
|
// connect up optional reporting properties
|
||||||
if (arg->hasValue("complete"))
|
if (arg->hasValue("complete"))
|
||||||
req->setCompletionProp(fgGetNode(arg->getStringValue("complete"), true));
|
req->setCompletionProp(fgGetNode(arg->getStringValue("complete"), true));
|
||||||
|
|
Loading…
Reference in a new issue