202 lines
3.9 KiB
C++
Executable File
202 lines
3.9 KiB
C++
Executable File
/**
|
|
* @file httpheaders.cpp
|
|
* @brief Implementation of the HTTPHeaders class
|
|
*
|
|
* $LicenseInfo:firstyear=2012&license=viewerlgpl$
|
|
* Second Life Viewer Source Code
|
|
* Copyright (C) 2012-2013, 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 "httpheaders.h"
|
|
|
|
#include "llstring.h"
|
|
|
|
|
|
namespace LLCore
|
|
{
|
|
|
|
|
|
HttpHeaders::HttpHeaders()
|
|
: RefCounted(true)
|
|
{}
|
|
|
|
|
|
HttpHeaders::~HttpHeaders()
|
|
{}
|
|
|
|
|
|
void
|
|
HttpHeaders::clear()
|
|
{
|
|
mHeaders.clear();
|
|
}
|
|
|
|
|
|
void HttpHeaders::append(const std::string & name, const std::string & value)
|
|
{
|
|
mHeaders.push_back(value_type(name, value));
|
|
}
|
|
|
|
|
|
void HttpHeaders::append(const char * name, const char * value)
|
|
{
|
|
mHeaders.push_back(value_type(name, value));
|
|
}
|
|
|
|
|
|
void HttpHeaders::appendNormal(const char * header, size_t size)
|
|
{
|
|
std::string name;
|
|
std::string value;
|
|
|
|
int col_pos(0);
|
|
for (; col_pos < size; ++col_pos)
|
|
{
|
|
if (':' == header[col_pos])
|
|
break;
|
|
}
|
|
|
|
if (col_pos < size)
|
|
{
|
|
// Looks like a header, split it and normalize.
|
|
// Name is everything before the colon, may be zero-length.
|
|
name.assign(header, col_pos);
|
|
|
|
// Value is everything after the colon, may also be zero-length.
|
|
const size_t val_len(size - col_pos - 1);
|
|
if (val_len)
|
|
{
|
|
value.assign(header + col_pos + 1, val_len);
|
|
}
|
|
|
|
// Clean the strings
|
|
LLStringUtil::toLower(name);
|
|
LLStringUtil::trim(name);
|
|
LLStringUtil::trimHead(value);
|
|
}
|
|
else
|
|
{
|
|
// Uncertain what this is, we'll pack it as
|
|
// a name without a value. Won't clean as we don't
|
|
// know what it is...
|
|
name.assign(header, size);
|
|
}
|
|
|
|
mHeaders.push_back(value_type(name, value));
|
|
}
|
|
|
|
|
|
// Find from end to simulate a tradition of using single-valued
|
|
// std::map for this in the past.
|
|
const std::string * HttpHeaders::find(const std::string &name) const
|
|
{
|
|
const_reverse_iterator iend(rend());
|
|
for (const_reverse_iterator iter(rbegin()); iend != iter; ++iter)
|
|
{
|
|
if ((*iter).first == name)
|
|
{
|
|
return &(*iter).second;
|
|
}
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
void HttpHeaders::remove(const char *name)
|
|
{
|
|
remove(std::string(name));
|
|
}
|
|
|
|
void HttpHeaders::remove(const std::string &name)
|
|
{
|
|
iterator iend(end());
|
|
for (iterator iter(begin()); iend != iter; ++iter)
|
|
{
|
|
if ((*iter).first == name)
|
|
{
|
|
mHeaders.erase(iter);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// Standard Iterators
|
|
HttpHeaders::iterator HttpHeaders::begin()
|
|
{
|
|
return mHeaders.begin();
|
|
}
|
|
|
|
|
|
HttpHeaders::const_iterator HttpHeaders::begin() const
|
|
{
|
|
return mHeaders.begin();
|
|
}
|
|
|
|
|
|
HttpHeaders::iterator HttpHeaders::end()
|
|
{
|
|
return mHeaders.end();
|
|
}
|
|
|
|
|
|
HttpHeaders::const_iterator HttpHeaders::end() const
|
|
{
|
|
return mHeaders.end();
|
|
}
|
|
|
|
|
|
// Standard Reverse Iterators
|
|
HttpHeaders::reverse_iterator HttpHeaders::rbegin()
|
|
{
|
|
return mHeaders.rbegin();
|
|
}
|
|
|
|
|
|
HttpHeaders::const_reverse_iterator HttpHeaders::rbegin() const
|
|
{
|
|
return mHeaders.rbegin();
|
|
}
|
|
|
|
|
|
HttpHeaders::reverse_iterator HttpHeaders::rend()
|
|
{
|
|
return mHeaders.rend();
|
|
}
|
|
|
|
|
|
HttpHeaders::const_reverse_iterator HttpHeaders::rend() const
|
|
{
|
|
return mHeaders.rend();
|
|
}
|
|
|
|
|
|
// Return the raw container to the caller.
|
|
//
|
|
// To be used FOR UNIT TESTS ONLY.
|
|
//
|
|
HttpHeaders::container_t & HttpHeaders::getContainerTESTONLY()
|
|
{
|
|
return mHeaders;
|
|
}
|
|
|
|
|
|
} // end namespace LLCore
|
|
|