diff options
Diffstat (limited to 'WebCore/websockets/WebSocketHandshake.cpp')
-rw-r--r-- | WebCore/websockets/WebSocketHandshake.cpp | 64 |
1 files changed, 43 insertions, 21 deletions
diff --git a/WebCore/websockets/WebSocketHandshake.cpp b/WebCore/websockets/WebSocketHandshake.cpp index d1da443..883f84b 100644 --- a/WebCore/websockets/WebSocketHandshake.cpp +++ b/WebCore/websockets/WebSocketHandshake.cpp @@ -76,9 +76,14 @@ static String extractResponseCode(const char* header, int len) static String resourceName(const KURL& url) { - if (url.query().isNull()) - return url.path(); - return url.path() + "?" + url.query(); + String name = url.path(); + if (name.isEmpty()) + name = "/"; + if (!url.query().isNull()) + name += "?" + url.query(); + ASSERT(!name.isEmpty()); + ASSERT(!name.contains(' ')); + return name; } WebSocketHandshake::WebSocketHandshake(const KURL& url, const String& protocol, ScriptExecutionContext* context) @@ -216,19 +221,22 @@ int WebSocketHandshake::readServerHandshake(const char* header, size_t len) else { const String& code = extractResponseCode(header, len); if (code.isNull()) { - LOG(Network, "short server handshake: %s", header); + m_context->addMessage(ConsoleDestination, JSMessageSource, LogMessageType, ErrorMessageLevel, "Short server handshake: " + String(header, len), 0, clientOrigin()); return -1; } if (code.isEmpty()) { - LOG(Network, "no response code found: %s", header); + m_mode = Failed; + m_context->addMessage(ConsoleDestination, JSMessageSource, LogMessageType, ErrorMessageLevel, "No response code found: " + String(header, len), 0, clientOrigin()); return len; } LOG(Network, "response code: %s", code.utf8().data()); if (code == "401") { - LOG(Network, "Authentication required"); + m_mode = Failed; + m_context->addMessage(ConsoleDestination, JSMessageSource, LogMessageType, ErrorMessageLevel, "Authentication required, but not implemented yet.", 0, clientOrigin()); return len; } else { - LOG(Network, "Mismatch server handshake: %s", header); + m_mode = Failed; + m_context->addMessage(ConsoleDestination, JSMessageSource, LogMessageType, ErrorMessageLevel, "Unexpected response code:" + code, 0, clientOrigin()); return len; } } @@ -237,19 +245,25 @@ int WebSocketHandshake::readServerHandshake(const char* header, size_t len) if (m_mode == Normal) { size_t headerSize = end - p; - if (headerSize < sizeof(webSocketUpgradeHeader) - 1) + if (headerSize < sizeof(webSocketUpgradeHeader) - 1) { + m_mode = Incomplete; return 0; + } if (memcmp(p, webSocketUpgradeHeader, sizeof(webSocketUpgradeHeader) - 1)) { - LOG(Network, "Bad upgrade header: %s", p); + m_mode = Failed; + m_context->addMessage(ConsoleDestination, JSMessageSource, LogMessageType, ErrorMessageLevel, "Bad Upgrade header: " + String(p, end - p), 0, clientOrigin()); return p - header + sizeof(webSocketUpgradeHeader) - 1; } p += sizeof(webSocketUpgradeHeader) - 1; headerSize = end - p; - if (headerSize < sizeof(webSocketConnectionHeader) - 1) + if (headerSize < sizeof(webSocketConnectionHeader) - 1) { + m_mode = Incomplete; return -1; + } if (memcmp(p, webSocketConnectionHeader, sizeof(webSocketConnectionHeader) - 1)) { - LOG(Network, "Bad connection header: %s", p); + m_mode = Failed; + m_context->addMessage(ConsoleDestination, JSMessageSource, LogMessageType, ErrorMessageLevel, "Bad Connection header: " + String(p, end - p), 0, clientOrigin()); return p - header + sizeof(webSocketConnectionHeader) - 1; } p += sizeof(webSocketConnectionHeader) - 1; @@ -257,6 +271,7 @@ int WebSocketHandshake::readServerHandshake(const char* header, size_t len) if (!strnstr(p, "\r\n\r\n", end - p)) { // Just hasn't been received fully yet. + m_mode = Incomplete; return -1; } HTTPHeaderMap headers; @@ -340,7 +355,8 @@ void WebSocketHandshake::setServerSetCookie2(const String& setCookie2) KURL WebSocketHandshake::httpURLForAuthenticationAndCookies() const { KURL url = m_url.copy(); - url.setProtocol(m_secure ? "https" : "http"); + bool couldSetProtocol = url.setProtocol(m_secure ? "https" : "http"); + ASSERT_UNUSED(couldSetProtocol, couldSetProtocol); return url; } @@ -358,13 +374,13 @@ const char* WebSocketHandshake::readHTTPHeaders(const char* start, const char* e if (name.isEmpty()) { if (p + 1 < end && *(p + 1) == '\n') return p + 2; - LOG(Network, "CR doesn't follow LF p=%p end=%p", p, end); + m_context->addMessage(ConsoleDestination, JSMessageSource, LogMessageType, ErrorMessageLevel, "CR doesn't follow LF at " + String(p, end - p), 0, clientOrigin()); return 0; } - LOG(Network, "Unexpected CR in name"); + m_context->addMessage(ConsoleDestination, JSMessageSource, LogMessageType, ErrorMessageLevel, "Unexpected CR in name at " + String(p, end - p), 0, clientOrigin()); return 0; case '\n': - LOG(Network, "Unexpected LF in name"); + m_context->addMessage(ConsoleDestination, JSMessageSource, LogMessageType, ErrorMessageLevel, "Unexpected LF in name at " + String(p, end - p), 0, clientOrigin()); return 0; case ':': break; @@ -388,7 +404,7 @@ const char* WebSocketHandshake::readHTTPHeaders(const char* start, const char* e case '\r': break; case '\n': - LOG(Network, "Unexpected LF in value"); + m_context->addMessage(ConsoleDestination, JSMessageSource, LogMessageType, ErrorMessageLevel, "Unexpected LF in value at " + String(p, end - p), 0, clientOrigin()); return 0; default: value.append(*p); @@ -399,7 +415,7 @@ const char* WebSocketHandshake::readHTTPHeaders(const char* start, const char* e } } if (p >= end || *p != '\n') { - LOG(Network, "CR doesn't follow LF after value p=%p end=%p", p, end); + m_context->addMessage(ConsoleDestination, JSMessageSource, LogMessageType, ErrorMessageLevel, "CR doesn't follow LF after value at " + String(p, end - p), 0, clientOrigin()); return 0; } AtomicString nameStr(String::fromUTF8(name.data(), name.size())); @@ -441,19 +457,25 @@ void WebSocketHandshake::checkResponseHeaders() { ASSERT(m_mode == Normal); m_mode = Failed; - if (m_wsOrigin.isNull() || m_wsLocation.isNull()) + if (m_wsOrigin.isNull()) { + m_context->addMessage(ConsoleDestination, JSMessageSource, LogMessageType, ErrorMessageLevel, "Error during WebSocket handshake: 'websocket-origin' header is missing", 0, clientOrigin()); return; + } + if (m_wsLocation.isNull()) { + m_context->addMessage(ConsoleDestination, JSMessageSource, LogMessageType, ErrorMessageLevel, "Error during WebSocket handshake: 'websocket-location' header is missing", 0, clientOrigin()); + return; + } if (clientOrigin() != m_wsOrigin) { - LOG(Network, "Mismatch origin: %s != %s", clientOrigin().utf8().data(), m_wsOrigin.utf8().data()); + m_context->addMessage(ConsoleDestination, JSMessageSource, LogMessageType, ErrorMessageLevel, "Error during WebSocket handshake: origin mismatch: " + clientOrigin() + " != " + m_wsOrigin, 0, clientOrigin()); return; } if (clientLocation() != m_wsLocation) { - LOG(Network, "Mismatch location: %s != %s", clientLocation().utf8().data(), m_wsLocation.utf8().data()); + m_context->addMessage(ConsoleDestination, JSMessageSource, LogMessageType, ErrorMessageLevel, "Error during WebSocket handshake: location mismatch: " + clientLocation() + " != " + m_wsLocation, 0, clientOrigin()); return; } if (!m_clientProtocol.isEmpty() && m_clientProtocol != m_wsProtocol) { - LOG(Network, "Mismatch protocol: %s != %s", m_clientProtocol.utf8().data(), m_wsProtocol.utf8().data()); + m_context->addMessage(ConsoleDestination, JSMessageSource, LogMessageType, ErrorMessageLevel, "Error during WebSocket handshake: protocol mismatch: " + m_clientProtocol + " != " + m_wsProtocol, 0, clientOrigin()); return; } m_mode = Connected; |