moved case insensitive comparison utility functions into CString
from CHTTPProtocol.
This commit is contained in:
parent
1cbdaee31b
commit
014b781fb0
|
@ -0,0 +1,47 @@
|
||||||
|
#include "CString.h"
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
//
|
||||||
|
// CStringUtil::CaselessCmp
|
||||||
|
//
|
||||||
|
|
||||||
|
bool CStringUtil::CaselessCmp::cmpEqual(
|
||||||
|
const CString::value_type& a,
|
||||||
|
const CString::value_type& b)
|
||||||
|
{
|
||||||
|
// FIXME -- use std::tolower
|
||||||
|
return tolower(a) == tolower(b);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CStringUtil::CaselessCmp::cmpLess(
|
||||||
|
const CString::value_type& a,
|
||||||
|
const CString::value_type& b)
|
||||||
|
{
|
||||||
|
// FIXME -- use std::tolower
|
||||||
|
return tolower(a) < tolower(b);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CStringUtil::CaselessCmp::less(
|
||||||
|
const CString& a,
|
||||||
|
const CString& b)
|
||||||
|
{
|
||||||
|
return std::lexicographical_compare(
|
||||||
|
a.begin(), a.end(),
|
||||||
|
b.begin(), b.end(),
|
||||||
|
&CStringUtil::CaselessCmp::cmpLess);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CStringUtil::CaselessCmp::equal(
|
||||||
|
const CString& a,
|
||||||
|
const CString& b)
|
||||||
|
{
|
||||||
|
return !(less(a, b) || less(b, a));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CStringUtil::CaselessCmp::operator()(
|
||||||
|
const CString& a,
|
||||||
|
const CString& b) const
|
||||||
|
{
|
||||||
|
return less(a, b);
|
||||||
|
}
|
|
@ -44,6 +44,20 @@ public:
|
||||||
_Myt(_f, _l CSTRING_ALLOC2) { }
|
_Myt(_f, _l CSTRING_ALLOC2) { }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class CStringUtil {
|
||||||
|
public:
|
||||||
|
class CaselessCmp {
|
||||||
|
public:
|
||||||
|
bool operator()(const CString&, const CString&) const;
|
||||||
|
static bool less(const CString&, const CString&);
|
||||||
|
static bool equal(const CString&, const CString&);
|
||||||
|
static bool cmpLess(const CString::value_type&,
|
||||||
|
const CString::value_type&);
|
||||||
|
static bool cmpEqual(const CString::value_type&,
|
||||||
|
const CString::value_type&);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER)
|
||||||
#pragma warning(pop)
|
#pragma warning(pop)
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -16,6 +16,7 @@ CXXFILES = \
|
||||||
CLog.cpp \
|
CLog.cpp \
|
||||||
CFunctionJob.cpp \
|
CFunctionJob.cpp \
|
||||||
CStopwatch.cpp \
|
CStopwatch.cpp \
|
||||||
|
CString.cpp \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
targets: $(LIBTARGET)
|
targets: $(LIBTARGET)
|
||||||
|
|
|
@ -99,6 +99,10 @@ SOURCE=.\CStopwatch.cpp
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\CString.cpp
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=.\XBase.cpp
|
SOURCE=.\XBase.cpp
|
||||||
# End Source File
|
# End Source File
|
||||||
# End Group
|
# End Group
|
||||||
|
|
|
@ -5,57 +5,10 @@
|
||||||
#include "IOutputStream.h"
|
#include "IOutputStream.h"
|
||||||
#include "stdsstream.h"
|
#include "stdsstream.h"
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <ctype.h>
|
|
||||||
#include <locale.h>
|
#include <locale.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
//
|
|
||||||
// CHTTPUtil::CaselessCmp
|
|
||||||
//
|
|
||||||
|
|
||||||
inline
|
|
||||||
bool CHTTPUtil::CaselessCmp::cmpEqual(
|
|
||||||
const CString::value_type& a,
|
|
||||||
const CString::value_type& b)
|
|
||||||
{
|
|
||||||
// FIXME -- use std::tolower
|
|
||||||
return tolower(a) == tolower(b);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline
|
|
||||||
bool CHTTPUtil::CaselessCmp::cmpLess(
|
|
||||||
const CString::value_type& a,
|
|
||||||
const CString::value_type& b)
|
|
||||||
{
|
|
||||||
// FIXME -- use std::tolower
|
|
||||||
return tolower(a) < tolower(b);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CHTTPUtil::CaselessCmp::less(
|
|
||||||
const CString& a,
|
|
||||||
const CString& b)
|
|
||||||
{
|
|
||||||
return std::lexicographical_compare(
|
|
||||||
a.begin(), a.end(),
|
|
||||||
b.begin(), b.end(),
|
|
||||||
&CHTTPUtil::CaselessCmp::cmpLess);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CHTTPUtil::CaselessCmp::equal(
|
|
||||||
const CString& a,
|
|
||||||
const CString& b)
|
|
||||||
{
|
|
||||||
return !(less(a, b) || less(b, a));
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CHTTPUtil::CaselessCmp::operator()(
|
|
||||||
const CString& a,
|
|
||||||
const CString& b) const
|
|
||||||
{
|
|
||||||
return less(a, b);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// CHTTPRequest
|
// CHTTPRequest
|
||||||
//
|
//
|
||||||
|
@ -217,7 +170,7 @@ CHTTPRequest* CHTTPProtocol::readRequest(
|
||||||
CString header;
|
CString header;
|
||||||
if (!(header = request->getHeader("Transfer-Encoding")).empty()) {
|
if (!(header = request->getHeader("Transfer-Encoding")).empty()) {
|
||||||
// we only understand "chunked" encodings
|
// we only understand "chunked" encodings
|
||||||
if (!CHTTPUtil::CaselessCmp::equal(header, "chunked")) {
|
if (!CStringUtil::CaselessCmp::equal(header, "chunked")) {
|
||||||
log((CLOG_DEBUG1 "unsupported Transfer-Encoding %s", header.c_str()));
|
log((CLOG_DEBUG1 "unsupported Transfer-Encoding %s", header.c_str()));
|
||||||
throw XHTTP(501);
|
throw XHTTP(501);
|
||||||
}
|
}
|
||||||
|
@ -295,9 +248,9 @@ void CHTTPProtocol::reply(
|
||||||
const CString& header = index->first;
|
const CString& header = index->first;
|
||||||
|
|
||||||
// remove certain headers
|
// remove certain headers
|
||||||
if (CHTTPUtil::CaselessCmp::equal(header, "Content-Length") ||
|
if (CStringUtil::CaselessCmp::equal(header, "Content-Length") ||
|
||||||
CHTTPUtil::CaselessCmp::equal(header, "Date") ||
|
CStringUtil::CaselessCmp::equal(header, "Date") ||
|
||||||
CHTTPUtil::CaselessCmp::equal(header, "Transfer-Encoding")) {
|
CStringUtil::CaselessCmp::equal(header, "Transfer-Encoding")) {
|
||||||
// FIXME -- Transfer-Encoding should be left as-is if
|
// FIXME -- Transfer-Encoding should be left as-is if
|
||||||
// not "chunked" and if the version is 1.1 or up.
|
// not "chunked" and if the version is 1.1 or up.
|
||||||
index = reply.m_headers.erase(index);
|
index = reply.m_headers.erase(index);
|
||||||
|
@ -376,7 +329,7 @@ bool CHTTPProtocol::parseFormData(
|
||||||
CString::const_iterator index = std::search(
|
CString::const_iterator index = std::search(
|
||||||
contentType.begin(), contentType.end(),
|
contentType.begin(), contentType.end(),
|
||||||
formData, formData + sizeof(formData) - 1,
|
formData, formData + sizeof(formData) - 1,
|
||||||
CHTTPUtil::CaselessCmp::cmpEqual);
|
CStringUtil::CaselessCmp::cmpEqual);
|
||||||
if (index == contentType.end()) {
|
if (index == contentType.end()) {
|
||||||
// not form-data
|
// not form-data
|
||||||
return false;
|
return false;
|
||||||
|
@ -384,7 +337,7 @@ bool CHTTPProtocol::parseFormData(
|
||||||
index += sizeof(formData) - 1;
|
index += sizeof(formData) - 1;
|
||||||
index = std::search(index, contentType.end(),
|
index = std::search(index, contentType.end(),
|
||||||
boundary, boundary + sizeof(boundary) - 1,
|
boundary, boundary + sizeof(boundary) - 1,
|
||||||
CHTTPUtil::CaselessCmp::cmpEqual);
|
CStringUtil::CaselessCmp::cmpEqual);
|
||||||
if (index == contentType.end()) {
|
if (index == contentType.end()) {
|
||||||
// no boundary
|
// no boundary
|
||||||
return false;
|
return false;
|
||||||
|
@ -436,7 +389,7 @@ bool CHTTPProtocol::parseFormData(
|
||||||
body.begin() + endOfHeaders,
|
body.begin() + endOfHeaders,
|
||||||
disposition,
|
disposition,
|
||||||
disposition + sizeof(disposition) - 1,
|
disposition + sizeof(disposition) - 1,
|
||||||
CHTTPUtil::CaselessCmp::cmpEqual);
|
CStringUtil::CaselessCmp::cmpEqual);
|
||||||
if (index == contentType.begin() + endOfHeaders) {
|
if (index == contentType.begin() + endOfHeaders) {
|
||||||
// bad part
|
// bad part
|
||||||
return false;
|
return false;
|
||||||
|
@ -451,7 +404,7 @@ bool CHTTPProtocol::parseFormData(
|
||||||
}
|
}
|
||||||
index = std::search(index, body.begin() + endOfHeader,
|
index = std::search(index, body.begin() + endOfHeader,
|
||||||
nameAttr, nameAttr + sizeof(nameAttr) - 1,
|
nameAttr, nameAttr + sizeof(nameAttr) - 1,
|
||||||
CHTTPUtil::CaselessCmp::cmpEqual);
|
CStringUtil::CaselessCmp::cmpEqual);
|
||||||
if (index == body.begin() + endOfHeader) {
|
if (index == body.begin() + endOfHeader) {
|
||||||
// no name
|
// no name
|
||||||
return false;
|
return false;
|
||||||
|
@ -466,7 +419,7 @@ bool CHTTPProtocol::parseFormData(
|
||||||
CString::size_type namePos = index - body.begin();
|
CString::size_type namePos = index - body.begin();
|
||||||
index = std::search(index, body.begin() + endOfHeader,
|
index = std::search(index, body.begin() + endOfHeader,
|
||||||
quote, quote + 1,
|
quote, quote + 1,
|
||||||
CHTTPUtil::CaselessCmp::cmpEqual);
|
CStringUtil::CaselessCmp::cmpEqual);
|
||||||
if (index == body.begin() + endOfHeader) {
|
if (index == body.begin() + endOfHeader) {
|
||||||
// missing close quote
|
// missing close quote
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -10,25 +10,11 @@
|
||||||
class IInputStream;
|
class IInputStream;
|
||||||
class IOutputStream;
|
class IOutputStream;
|
||||||
|
|
||||||
class CHTTPUtil {
|
|
||||||
public:
|
|
||||||
class CaselessCmp {
|
|
||||||
public:
|
|
||||||
bool operator()(const CString&, const CString&) const;
|
|
||||||
static bool less(const CString&, const CString&);
|
|
||||||
static bool equal(const CString&, const CString&);
|
|
||||||
static bool cmpLess(const CString::value_type&,
|
|
||||||
const CString::value_type&);
|
|
||||||
static bool cmpEqual(const CString::value_type&,
|
|
||||||
const CString::value_type&);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
class CHTTPRequest {
|
class CHTTPRequest {
|
||||||
public:
|
public:
|
||||||
typedef std::list<std::pair<CString, CString> > CHeaderList;
|
typedef std::list<std::pair<CString, CString> > CHeaderList;
|
||||||
typedef std::map<CString, CHeaderList::iterator,
|
typedef std::map<CString, CHeaderList::iterator,
|
||||||
CHTTPUtil::CaselessCmp> CHeaderMap;
|
CStringUtil::CaselessCmp> CHeaderMap;
|
||||||
typedef CHeaderList::const_iterator const_iterator;
|
typedef CHeaderList::const_iterator const_iterator;
|
||||||
|
|
||||||
CHTTPRequest();
|
CHTTPRequest();
|
||||||
|
|
Loading…
Reference in New Issue