summaryrefslogtreecommitdiffstats
path: root/WebCore/websockets/WebSocketHandshake.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/websockets/WebSocketHandshake.cpp')
-rw-r--r--WebCore/websockets/WebSocketHandshake.cpp64
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;