diff options
author | Simon Hausmann <simon.hausmann@nokia.com> | 2012-02-24 16:36:50 +0100 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@nokia.com> | 2012-02-24 16:36:50 +0100 |
commit | ad0d549d4cc13433f77c1ac8f0ab379c83d93f28 (patch) | |
tree | b34b0daceb7c8e7fdde4b4ec43650ab7caadb0a9 /Source/WebCore/websockets/WebSocketHandshake.cpp | |
parent | 03e12282df9aa1e1fb05a8b90f1cfc2e08764cec (diff) | |
download | qtwebkit-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.cpp | 34 |
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; } |