phoenix-firestorm/indra/llmessage/llcorehttputil.cpp

140 lines
3.3 KiB
C++

/**
* @file llcorehttputil.cpp
* @date 2014-08-25
* @brief Implementation of adapter and utility classes expanding the llcorehttp interfaces.
*
* $LicenseInfo:firstyear=2014&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2014, Linden Research, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#include "linden_common.h"
#include <sstream>
#include "llcorehttputil.h"
#include "llsdserialize.h"
using namespace LLCore;
namespace LLCoreHttpUtil
{
// *TODO: Currently converts only from XML content. A mode
// to convert using fromBinary() might be useful as well. Mesh
// headers could use it.
bool responseToLLSD(HttpResponse * response, bool log, LLSD & out_llsd)
{
// Convert response to LLSD
BufferArray * body(response->getBody());
if (! body || ! body->size())
{
return false;
}
LLCore::BufferArrayStream bas(body);
LLSD body_llsd;
S32 parse_status(LLSDSerialize::fromXML(body_llsd, bas, log));
if (LLSDParser::PARSE_FAILURE == parse_status){
return false;
}
out_llsd = body_llsd;
return true;
}
HttpHandle requestPostWithLLSD(HttpRequest * request,
HttpRequest::policy_t policy_id,
HttpRequest::priority_t priority,
const std::string & url,
const LLSD & body,
HttpOptions * options,
HttpHeaders * headers,
HttpHandler * handler)
{
HttpHandle handle(LLCORE_HTTP_HANDLE_INVALID);
BufferArray * ba = new BufferArray();
BufferArrayStream bas(ba);
LLSDSerialize::toXML(body, bas);
handle = request->requestPost(policy_id,
priority,
url,
ba,
options,
headers,
handler);
ba->release();
return handle;
}
std::string responseToString(LLCore::HttpResponse * response)
{
static const std::string empty("[Empty]");
if (! response)
{
return empty;
}
BufferArray * body(response->getBody());
if (! body || ! body->size())
{
return empty;
}
// Attempt to parse as LLSD regardless of content-type
LLSD body_llsd;
if (responseToLLSD(response, false, body_llsd))
{
std::ostringstream tmp;
LLSDSerialize::toPrettyNotation(body_llsd, tmp);
std::size_t temp_len(tmp.tellp());
if (temp_len)
{
return tmp.str().substr(0, std::min(temp_len, std::size_t(1024)));
}
}
else
{
// *TODO: More elaborate forms based on Content-Type as needed.
char content[1024];
size_t len(body->read(0, content, sizeof(content)));
if (len)
{
return std::string(content, 0, len);
}
}
// Default
return empty;
}
} // end namespace LLCoreHttpUtil