summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2012-04-08 19:00:07 +0900
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2012-04-08 19:00:07 +0900
commit1e0068e4d4ce79d10a2ea4f6462242bee3708dc8 (patch)
treed6c66da3c986b2b51455d0400b7a7033f75454ac /src
parentc648ca0c5c328827327f0973ec4f8a06bacf912f (diff)
WebSocket: Check keyword string in comma separeted values in HTTP
header field.
Diffstat (limited to 'src')
-rw-r--r--src/HttpHeader.cc24
-rw-r--r--src/HttpHeader.h5
-rw-r--r--src/HttpServerCommand.cc6
3 files changed, 31 insertions, 4 deletions
diff --git a/src/HttpHeader.cc b/src/HttpHeader.cc
index 8513cb56..1bba0ad2 100644
--- a/src/HttpHeader.cc
+++ b/src/HttpHeader.cc
@@ -293,4 +293,28 @@ const std::string& HttpHeader::getRequestPath() const
return requestPath_;
}
+bool HttpHeader::fieldContains(const std::string& name,
+ const std::string& value)
+{
+ std::pair<std::multimap<std::string, std::string>::const_iterator,
+ std::multimap<std::string, std::string>::const_iterator> range =
+ equalRange(name);
+ for(std::multimap<std::string, std::string>::const_iterator i = range.first;
+ i != range.second; ++i) {
+ std::vector<Scip> values;
+ util::splitIter((*i).second.begin(), (*i).second.end(),
+ std::back_inserter(values),
+ ',',
+ true // doStrip
+ );
+ for(std::vector<Scip>::const_iterator j = values.begin(),
+ eoj = values.end(); j != eoj; ++j) {
+ if(util::strieq((*j).first, (*j).second, value.begin(), value.end())) {
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
} // namespace aria2
diff --git a/src/HttpHeader.h b/src/HttpHeader.h
index b337e089..8791a4c5 100644
--- a/src/HttpHeader.h
+++ b/src/HttpHeader.h
@@ -66,6 +66,7 @@ public:
HttpHeader();
~HttpHeader();
+ // For all methods, use lowercased header field name.
void put(const std::string& name, const std::string& value);
bool defined(const std::string& name) const;
const std::string& find(const std::string& name) const;
@@ -121,6 +122,10 @@ public:
// Clears table_. responseStatus_ and version_ are unchanged.
void clearField();
+ // Returns true if heder field |name| contains |value|. This method
+ // assumes the values of the header field is delimited by ','.
+ bool fieldContains(const std::string& name, const std::string& value);
+
static const std::string LOCATION;
static const std::string TRANSFER_ENCODING;
static const std::string CONTENT_ENCODING;
diff --git a/src/HttpServerCommand.cc b/src/HttpServerCommand.cc
index 026c2627..0e13094e 100644
--- a/src/HttpServerCommand.cc
+++ b/src/HttpServerCommand.cc
@@ -174,10 +174,8 @@ bool HttpServerCommand::execute()
e_->setNoWait(true);
return true;
}
- const std::string& upgradeHd = header->find("upgrade");
- const std::string& connectionHd = header->find("connection");
- if(util::strieq(upgradeHd.begin(), upgradeHd.end(), "websocket") &&
- util::strieq(connectionHd.begin(), connectionHd.end(), "upgrade")) {
+ if(header->fieldContains("upgrade", "websocket") &&
+ header->fieldContains("connection", "upgrade")) {
#ifdef ENABLE_WEBSOCKET
int status = websocketHandshake(header);
Command* command;