Changeset 87883 in webkit


Ignore:
Timestamp:
Jun 2, 2011 1:12:04 AM (13 years ago)
Author:
yutak@chromium.org
Message:

2011-06-02 Yuta Kitamura <yutak@chromium.org>

Reviewed by Kent Tamura.

WebSocket: Call WebSocketChannel::fail() when WebSocketHandshake has failed
https://bugs.webkit.org/show_bug.cgi?id=61841

  • http/tests/websocket/tests/bad-handshake-crash-expected.txt: Now the error message starts with a capital letter.

2011-06-02 Yuta Kitamura <yutak@chromium.org>

Reviewed by Kent Tamura.

WebSocket: Call WebSocketChannel::fail() when WebSocketHandshake has failed
https://bugs.webkit.org/show_bug.cgi?id=61841

There is no change in behavior except that capitalization of a few error messages
has been changed. No new tests are added.

  • websockets/WebSocketChannel.cpp: (WebCore::WebSocketChannel::processBuffer): Pass m_handshake.failureReason() to fail() if the handshake has failed.
  • websockets/WebSocketHandshake.cpp: Replace occurrences of m_handle->addMessage() with assignments to m_failureReason. Change capitalization of a few messages so that all messages start with a capital letter. (WebCore::WebSocketHandshake::readServerHandshake): (WebCore::WebSocketHandshake::failureReason): (WebCore::WebSocketHandshake::readStatusLine): (WebCore::WebSocketHandshake::readHTTPHeaders): (WebCore::WebSocketHandshake::checkResponseHeaders):
  • websockets/WebSocketHandshake.h: Add failureReason(), which returns a string that describes why WebSocket handshake has failed.
Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r87881 r87883  
     12011-06-02  Yuta Kitamura  <yutak@chromium.org>
     2
     3        Reviewed by Kent Tamura.
     4
     5        WebSocket: Call WebSocketChannel::fail() when WebSocketHandshake has failed
     6        https://bugs.webkit.org/show_bug.cgi?id=61841
     7
     8        * http/tests/websocket/tests/bad-handshake-crash-expected.txt:
     9        Now the error message starts with a capital letter.
     10
    1112011-06-01  Kent Tamura  <tkent@chromium.org>
    212
  • trunk/LayoutTests/http/tests/websocket/tests/bad-handshake-crash-expected.txt

    r57760 r87883  
    1 CONSOLE MESSAGE: line 0: invalid UTF-8 sequence in header name
     1CONSOLE MESSAGE: line 0: Invalid UTF-8 sequence in header name
    22Make sure WebSocket doesn't crash with bad handshake message.
    33
  • trunk/Source/WebCore/ChangeLog

    r87882 r87883  
     12011-06-02  Yuta Kitamura  <yutak@chromium.org>
     2
     3        Reviewed by Kent Tamura.
     4
     5        WebSocket: Call WebSocketChannel::fail() when WebSocketHandshake has failed
     6        https://bugs.webkit.org/show_bug.cgi?id=61841
     7
     8        There is no change in behavior except that capitalization of a few error messages
     9        has been changed. No new tests are added.
     10
     11        * websockets/WebSocketChannel.cpp:
     12        (WebCore::WebSocketChannel::processBuffer):
     13        Pass m_handshake.failureReason() to fail() if the handshake has failed.
     14        * websockets/WebSocketHandshake.cpp:
     15        Replace occurrences of m_handle->addMessage() with assignments to m_failureReason.
     16        Change capitalization of a few messages so that all messages start with a capital letter.
     17        (WebCore::WebSocketHandshake::readServerHandshake):
     18        (WebCore::WebSocketHandshake::failureReason):
     19        (WebCore::WebSocketHandshake::readStatusLine):
     20        (WebCore::WebSocketHandshake::readHTTPHeaders):
     21        (WebCore::WebSocketHandshake::checkResponseHeaders):
     22        * websockets/WebSocketHandshake.h:
     23        Add failureReason(), which returns a string that describes why WebSocket handshake
     24        has failed.
     25
    1262011-06-01  Dan Bernstein  <mitz@apple.com>
    227
  • trunk/Source/WebCore/websockets/WebSocketChannel.cpp

    r87876 r87883  
    331331            return m_buffer;
    332332        }
     333        ASSERT(m_handshake.mode() == WebSocketHandshake::Failed);
    333334        LOG(Network, "WebSocketChannel %p connection failed", this);
    334335        skipBuffer(headerLength);
    335336        m_shouldDiscardReceivedData = true;
    336         if (!m_closed)
    337             m_handle->disconnect();
     337        fail(m_handshake.failureReason());
    338338        return false;
    339339    }
  • trunk/Source/WebCore/websockets/WebSocketHandshake.cpp

    r86659 r87883  
    11/*
    2  * Copyright (C) 2009 Google Inc.  All rights reserved.
     2 * Copyright (C) 2011 Google Inc.  All rights reserved.
    33 * Copyright (C) Research In Motion Limited 2011. All rights reserved.
    44 *
     
    320320        return -1;
    321321    if (statusCode == -1) {
    322         m_mode = Failed;
     322        m_mode = Failed; // m_failureReason is set inside readStatusLine().
    323323        return len;
    324324    }
     
    328328    if (statusCode != 101) {
    329329        m_mode = Failed;
    330         m_context->addMessage(JSMessageSource, LogMessageType, ErrorMessageLevel, "Unexpected response code: " + String::number(statusCode), 0, clientOrigin(), 0);
     330        m_failureReason = "Unexpected response code: " + String::number(statusCode);
    331331        return len;
    332332    }
     
    340340    if (!p) {
    341341        LOG(Network, "readHTTPHeaders failed");
    342         m_mode = Failed;
     342        m_mode = Failed; // m_failureReason is set inside readHTTPHeaders().
    343343        return len;
    344344    }
     
    365365{
    366366    return m_mode;
     367}
     368
     369String WebSocketHandshake::failureReason() const
     370{
     371    return m_failureReason;
    367372}
    368373
     
    441446            // The caller isn't prepared to deal with null bytes in status
    442447            // line. WebSockets specification doesn't prohibit this, but HTTP
    443             // does, so we'll just treat this as an error. 
    444             m_context->addMessage(JSMessageSource, LogMessageType, ErrorMessageLevel, "Status line contains embedded null", 0, clientOrigin(), 0);
     448            // does, so we'll just treat this as an error.
     449            m_failureReason = "Status line contains embedded null";
    445450            return p + 1 - header;
    446451        } else if (*p == '\n')
     
    453458    int lineLength = end - header;
    454459    if (lineLength > maximumLength) {
    455         m_context->addMessage(JSMessageSource, LogMessageType, ErrorMessageLevel, "Status line is too long", 0, clientOrigin(), 0);
     460        m_failureReason = "Status line is too long";
    456461        return maximumLength;
    457462    }
     
    459464    // The line must end with "\r\n".
    460465    if (lineLength < 2 || *(end - 2) != '\r') {
    461         m_context->addMessage(JSMessageSource, LogMessageType, ErrorMessageLevel, "Status line does not end with CRLF", 0, clientOrigin(), 0);
     466        m_failureReason = "Status line does not end with CRLF";
    462467        return lineLength;
    463468    }
    464469
    465470    if (!space1 || !space2) {
    466         m_context->addMessage(JSMessageSource, LogMessageType, ErrorMessageLevel, "No response code found: " + trimConsoleMessage(header, lineLength - 2), 0, clientOrigin(), 0);
     471        m_failureReason = "No response code found: " + trimConsoleMessage(header, lineLength - 2);
    467472        return lineLength;
    468473    }
     
    473478    for (int i = 0; i < 3; ++i)
    474479        if (statusCodeString[i] < '0' || statusCodeString[i] > '9') {
    475             m_context->addMessage(JSMessageSource, LogMessageType, ErrorMessageLevel, "Invalid status code: " + statusCodeString, 0, clientOrigin(), 0);
     480            m_failureReason = "Invalid status code: " + statusCodeString;
    476481            return lineLength;
    477482        }
     
    501506                    if (p + 1 < end && *(p + 1) == '\n')
    502507                        return p + 2;
    503                     m_context->addMessage(JSMessageSource, LogMessageType, ErrorMessageLevel, "CR doesn't follow LF at " + trimConsoleMessage(p, end - p), 0, clientOrigin(), 0);
     508                    m_failureReason = "CR doesn't follow LF at " + trimConsoleMessage(p, end - p);
    504509                    return 0;
    505510                }
    506                 m_context->addMessage(JSMessageSource, LogMessageType, ErrorMessageLevel, "Unexpected CR in name at " + trimConsoleMessage(name.data(), name.size()), 0, clientOrigin(), 0);
     511                m_failureReason = "Unexpected CR in name at " + trimConsoleMessage(name.data(), name.size());
    507512                return 0;
    508513            case '\n':
    509                 m_context->addMessage(JSMessageSource, LogMessageType, ErrorMessageLevel, "Unexpected LF in name at " + trimConsoleMessage(name.data(), name.size()), 0, clientOrigin(), 0);
     514                m_failureReason = "Unexpected LF in name at " + trimConsoleMessage(name.data(), name.size());
    510515                return 0;
    511516            case ':':
     
    528533                break;
    529534            case '\n':
    530                 m_context->addMessage(JSMessageSource, LogMessageType, ErrorMessageLevel, "Unexpected LF in value at " + trimConsoleMessage(value.data(), value.size()), 0, clientOrigin(), 0);
     535                m_failureReason = "Unexpected LF in value at " + trimConsoleMessage(value.data(), value.size());
    531536                return 0;
    532537            default:
     
    539544        }
    540545        if (p >= end || *p != '\n') {
    541             m_context->addMessage(JSMessageSource, LogMessageType, ErrorMessageLevel, "CR doesn't follow LF after value at " + trimConsoleMessage(p, end - p), 0, clientOrigin(), 0);
     546            m_failureReason = "CR doesn't follow LF after value at " + trimConsoleMessage(p, end - p);
    542547            return 0;
    543548        }
     
    545550        String valueStr = String::fromUTF8(value.data(), value.size());
    546551        if (nameStr.isNull()) {
    547             m_context->addMessage(JSMessageSource, LogMessageType, ErrorMessageLevel, "invalid UTF-8 sequence in header name", 0, clientOrigin(), 0);
     552            m_failureReason = "Invalid UTF-8 sequence in header name";
    548553            return 0;
    549554        }
    550555        if (valueStr.isNull()) {
    551             m_context->addMessage(JSMessageSource, LogMessageType, ErrorMessageLevel, "invalid UTF-8 sequence in header value", 0, clientOrigin(), 0);
     556            m_failureReason = "Invalid UTF-8 sequence in header value";
    552557            return 0;
    553558        }
     
    568573
    569574    if (serverUpgrade.isNull()) {
    570         m_context->addMessage(JSMessageSource, LogMessageType, ErrorMessageLevel, "Error during WebSocket handshake: 'Upgrade' header is missing", 0, clientOrigin(), 0);
     575        m_failureReason = "Error during WebSocket handshake: 'Upgrade' header is missing";
    571576        return false;
    572577    }
    573578    if (serverConnection.isNull()) {
    574         m_context->addMessage(JSMessageSource, LogMessageType, ErrorMessageLevel, "Error during WebSocket handshake: 'Connection' header is missing", 0, clientOrigin(), 0);
     579        m_failureReason = "Error during WebSocket handshake: 'Connection' header is missing";
    575580        return false;
    576581    }
    577582    if (serverWebSocketOrigin.isNull()) {
    578         m_context->addMessage(JSMessageSource, LogMessageType, ErrorMessageLevel, "Error during WebSocket handshake: 'Sec-WebSocket-Origin' header is missing", 0, clientOrigin(), 0);
     583        m_failureReason = "Error during WebSocket handshake: 'Sec-WebSocket-Origin' header is missing";
    579584        return false;
    580585    }
    581586    if (serverWebSocketLocation.isNull()) {
    582         m_context->addMessage(JSMessageSource, LogMessageType, ErrorMessageLevel, "Error during WebSocket handshake: 'Sec-WebSocket-Location' header is missing", 0, clientOrigin(), 0);
     587        m_failureReason = "Error during WebSocket handshake: 'Sec-WebSocket-Location' header is missing";
    583588        return false;
    584589    }
    585590
    586591    if (!equalIgnoringCase(serverUpgrade, "websocket")) {
    587         m_context->addMessage(JSMessageSource, LogMessageType, ErrorMessageLevel, "Error during WebSocket handshake: 'Upgrade' header value is not 'WebSocket'", 0, clientOrigin(), 0);
     592        m_failureReason = "Error during WebSocket handshake: 'Upgrade' header value is not 'WebSocket'";
    588593        return false;
    589594    }
    590595    if (!equalIgnoringCase(serverConnection, "upgrade")) {
    591         m_context->addMessage(JSMessageSource, LogMessageType, ErrorMessageLevel, "Error during WebSocket handshake: 'Connection' header value is not 'Upgrade'", 0, clientOrigin(), 0);
     596        m_failureReason = "Error during WebSocket handshake: 'Connection' header value is not 'Upgrade'";
    592597        return false;
    593598    }
    594599
    595600    if (clientOrigin() != serverWebSocketOrigin) {
    596         m_context->addMessage(JSMessageSource, LogMessageType, ErrorMessageLevel, "Error during WebSocket handshake: origin mismatch: " + clientOrigin() + " != " + serverWebSocketOrigin, 0, clientOrigin(), 0);
     601        m_failureReason = "Error during WebSocket handshake: origin mismatch: " + clientOrigin() + " != " + serverWebSocketOrigin;
    597602        return false;
    598603    }
    599604    if (clientLocation() != serverWebSocketLocation) {
    600         m_context->addMessage(JSMessageSource, LogMessageType, ErrorMessageLevel, "Error during WebSocket handshake: location mismatch: " + clientLocation() + " != " + serverWebSocketLocation, 0, clientOrigin(), 0);
     605        m_failureReason = "Error during WebSocket handshake: location mismatch: " + clientLocation() + " != " + serverWebSocketLocation;
    601606        return false;
    602607    }
    603608    if (!m_clientProtocol.isEmpty() && m_clientProtocol != serverWebSocketProtocol) {
    604         m_context->addMessage(JSMessageSource, LogMessageType, ErrorMessageLevel, "Error during WebSocket handshake: protocol mismatch: " + m_clientProtocol + " != " + serverWebSocketProtocol, 0, clientOrigin(), 0);
     609        m_failureReason = "Error during WebSocket handshake: protocol mismatch: " + m_clientProtocol + " != " + serverWebSocketProtocol;
    605610        return false;
    606611    }
  • trunk/Source/WebCore/websockets/WebSocketHandshake.h

    r80252 r87883  
    7272        int readServerHandshake(const char* header, size_t len);
    7373        Mode mode() const;
     74        String failureReason() const; // Returns a string indicating the reason of failure if mode() == Failed.
    7475
    7576        String serverWebSocketOrigin() const;
     
    106107
    107108        WebSocketHandshakeResponse m_response;
     109
     110        String m_failureReason;
    108111    };
    109112
Note: See TracChangeset for help on using the changeset viewer.