summaryrefslogtreecommitdiff
path: root/Source/WebCore/websockets/WebSocketHandshake.cpp
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@nokia.com>2012-02-24 16:36:50 +0100
committerSimon Hausmann <simon.hausmann@nokia.com>2012-02-24 16:36:50 +0100
commitad0d549d4cc13433f77c1ac8f0ab379c83d93f28 (patch)
treeb34b0daceb7c8e7fdde4b4ec43650ab7caadb0a9 /Source/WebCore/websockets/WebSocketHandshake.cpp
parent03e12282df9aa1e1fb05a8b90f1cfc2e08764cec (diff)
downloadqtwebkit-ad0d549d4cc13433f77c1ac8f0ab379c83d93f28.tar.gz
Imported WebKit commit bb52bf3c0119e8a128cd93afe5572413a8617de9 (http://svn.webkit.org/repository/webkit/trunk@108790)
Diffstat (limited to 'Source/WebCore/websockets/WebSocketHandshake.cpp')
-rw-r--r--Source/WebCore/websockets/WebSocketHandshake.cpp34
1 files changed, 23 insertions, 11 deletions
diff --git a/Source/WebCore/websockets/WebSocketHandshake.cpp b/Source/WebCore/websockets/WebSocketHandshake.cpp
index 8909efaf1..8cc509e59 100644
--- a/Source/WebCore/websockets/WebSocketHandshake.cpp
+++ b/Source/WebCore/websockets/WebSocketHandshake.cpp
@@ -287,6 +287,9 @@ CString WebSocketHandshake::clientHandshakeMessage() const
} else {
fields.append("Sec-WebSocket-Key: " + m_secWebSocketKey);
fields.append("Sec-WebSocket-Version: 13");
+ const String extensionValue = m_extensionDispatcher.createHeaderValue();
+ if (extensionValue.length())
+ fields.append("Sec-WebSocket-Extensions: " + extensionValue);
}
// Fields in the handshake are sent by the client in a random order; the
@@ -344,6 +347,9 @@ WebSocketHandshakeRequest WebSocketHandshake::clientHandshakeRequest() const
} else {
request.addHeaderField("Sec-WebSocket-Key", m_secWebSocketKey);
request.addHeaderField("Sec-WebSocket-Version", "13");
+ const String extensionValue = m_extensionDispatcher.createHeaderValue();
+ if (extensionValue.length())
+ request.addHeaderField("Sec-WebSocket-Extensions", extensionValue);
}
return request;
@@ -352,6 +358,7 @@ WebSocketHandshakeRequest WebSocketHandshake::clientHandshakeRequest() const
void WebSocketHandshake::reset()
{
m_mode = Incomplete;
+ m_extensionDispatcher.reset();
}
void WebSocketHandshake::clearScriptExecutionContext()
@@ -469,9 +476,9 @@ String WebSocketHandshake::serverWebSocketAccept() const
return m_response.headerFields().get("sec-websocket-accept");
}
-String WebSocketHandshake::serverWebSocketExtensions() const
+String WebSocketHandshake::acceptedExtensions() const
{
- return m_response.headerFields().get("sec-websocket-extensions");
+ return m_extensionDispatcher.acceptedExtensions();
}
const WebSocketHandshakeResponse& WebSocketHandshake::serverHandshakeResponse() const
@@ -479,6 +486,11 @@ const WebSocketHandshakeResponse& WebSocketHandshake::serverHandshakeResponse()
return m_response;
}
+void WebSocketHandshake::addExtensionProcessor(PassOwnPtr<WebSocketExtensionProcessor> processor)
+{
+ m_extensionDispatcher.addProcessor(processor);
+}
+
KURL WebSocketHandshake::httpURLForAuthenticationAndCookies() const
{
KURL url = m_url.copy();
@@ -625,7 +637,15 @@ const char* WebSocketHandshake::readHTTPHeaders(const char* start, const char* e
return 0;
}
LOG(Network, "name=%s value=%s", nameStr.string().utf8().data(), valueStr.utf8().data());
- m_response.addHeaderField(nameStr, valueStr);
+ // Sec-WebSocket-Extensions may be split. We parse and check the
+ // header value every time the header appears.
+ if (equalIgnoringCase("sec-websocket-extensions", nameStr)) {
+ if (!m_extensionDispatcher.processHeaderValue(valueStr)) {
+ m_failureReason = m_extensionDispatcher.failureReason();
+ return 0;
+ }
+ } else
+ m_response.addHeaderField(nameStr, valueStr);
}
ASSERT_NOT_REACHED();
return 0;
@@ -639,7 +659,6 @@ bool WebSocketHandshake::checkResponseHeaders()
const String& serverUpgrade = this->serverUpgrade();
const String& serverConnection = this->serverConnection();
const String& serverWebSocketAccept = this->serverWebSocketAccept();
- const String& serverWebSocketExtensions = this->serverWebSocketExtensions();
if (serverUpgrade.isNull()) {
m_failureReason = "Error during WebSocket handshake: 'Upgrade' header is missing";
@@ -692,13 +711,6 @@ bool WebSocketHandshake::checkResponseHeaders()
m_failureReason = "Error during WebSocket handshake: Sec-WebSocket-Accept mismatch";
return false;
}
- if (!serverWebSocketExtensions.isNull()) {
- // WebSocket protocol extensions are not supported yet.
- // We do not send Sec-WebSocket-Extensions header in our request, thus
- // servers should not return this header, either.
- m_failureReason = "Error during WebSocket handshake: Sec-WebSocket-Extensions header is invalid";
- return false;
- }
}
return true;
}