moved case insensitive comparison utility functions into CString

from CHTTPProtocol.
This commit is contained in:
crs 2002-06-03 16:34:22 +00:00
parent 1cbdaee31b
commit 014b781fb0
6 changed files with 76 additions and 71 deletions

47
base/CString.cpp Normal file
View File

@ -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);
}

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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;

View File

@ -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();