diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2012-04-08 19:00:07 +0900 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2012-04-08 19:00:07 +0900 |
| commit | 1e0068e4d4ce79d10a2ea4f6462242bee3708dc8 (patch) | |
| tree | d6c66da3c986b2b51455d0400b7a7033f75454ac /src | |
| parent | c648ca0c5c328827327f0973ec4f8a06bacf912f (diff) | |
WebSocket: Check keyword string in comma separeted values in HTTP
header field.
Diffstat (limited to 'src')
| -rw-r--r-- | src/HttpHeader.cc | 24 | ||||
| -rw-r--r-- | src/HttpHeader.h | 5 | ||||
| -rw-r--r-- | src/HttpServerCommand.cc | 6 |
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; |
