/net/websockets/websocket_handshake_stream_base.h
C Header | 157 lines | 80 code | 23 blank | 54 comment | 0 complexity | aa5893f02153a8e7b8442f35d55b5ff4 MD5 | raw file
Possible License(s): Apache-2.0, LGPL-2.0, BSD-2-Clause, LGPL-2.1, MPL-2.0, 0BSD, EPL-1.0, MPL-2.0-no-copyleft-exception, GPL-2.0, BitTorrent-1.0, CPL-1.0, LGPL-3.0, Unlicense, BSD-3-Clause, CC0-1.0, JSON, MIT, GPL-3.0, CC-BY-SA-3.0, AGPL-1.0
- // Copyright 2013 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #ifndef NET_WEBSOCKETS_WEBSOCKET_HANDSHAKE_STREAM_BASE_H_
- #define NET_WEBSOCKETS_WEBSOCKET_HANDSHAKE_STREAM_BASE_H_
- // This file is included from net/http files.
- // Since net/http can be built without linking net/websockets code,
- // this file must not introduce any link-time dependencies on websockets.
- #include <memory>
- #include <string>
- #include <vector>
- #include "base/macros.h"
- #include "base/memory/weak_ptr.h"
- #include "base/supports_user_data.h"
- #include "net/base/net_export.h"
- #include "net/http/http_stream.h"
- #include "net/websockets/websocket_deflate_parameters.h"
- #include "net/websockets/websocket_stream.h"
- namespace net {
- class ClientSocketHandle;
- class SpdySession;
- class HttpRequestHeaders;
- class HttpResponseHeaders;
- class WebSocketEndpointLockManager;
- // WebSocketHandshakeStreamBase is the base class of
- // WebSocketBasicHandshakeStream. net/http code uses this interface to handle
- // WebSocketBasicHandshakeStream when it needs to be treated differently from
- // HttpStreamBase.
- class NET_EXPORT WebSocketHandshakeStreamBase : public HttpStream {
- public:
- // These entries must match histogram Net.WebSocket.HandshakeResult2.
- // Do not change or reuse values.
- enum class HandshakeResult {
- // Handshake not completed via Upgrade over HTTP/1 connection.
- INCOMPLETE = 0,
- // Server responded to Upgrade request with invalid status.
- INVALID_STATUS = 1,
- // Server responded to Upgrade request with empty response.
- EMPTY_RESPONSE = 2,
- // Server responded to Upgrade request with 101 status but there was some
- // other network error.
- FAILED_SWITCHING_PROTOCOLS = 3,
- // Server responded to Upgrade request with invalid Upgrade header.
- FAILED_UPGRADE = 4,
- // Server responded to Upgrade request with invalid Sec-WebSocket-Accept
- // header.
- FAILED_ACCEPT = 5,
- // Server responded to Upgrade request with invalid Connection header.
- FAILED_CONNECTION = 6,
- // Server responded to Upgrade request with invalid Sec-WebSocket-Protocol
- // header.
- FAILED_SUBPROTO = 7,
- // Server responded to Upgrade request with invalid Sec-WebSocket-Extensions
- // header.
- FAILED_EXTENSIONS = 8,
- // Upgrade request failed due to other network error.
- FAILED = 9,
- // Connected via Upgrade over HTTP/1 connection.
- CONNECTED = 10,
- // Handshake not completed over an HTTP/2 connection.
- HTTP2_INCOMPLETE = 11,
- // Server responded to WebSocket request over an HTTP/2 connection with
- // invalid status code.
- HTTP2_INVALID_STATUS = 12,
- // Server responded to WebSocket request over an HTTP/2 connection with
- // invalid sec-websocket-protocol header.
- HTTP2_FAILED_SUBPROTO = 13,
- // Server responded to WebSocket request over an HTTP/2 connection with
- // invalid sec-websocket-extensions header.
- HTTP2_FAILED_EXTENSIONS = 14,
- // WebSocket request over an HTTP/2 connection failed with some other error.
- HTTP2_FAILED = 15,
- // Connected over an HTTP/2 connection.
- HTTP2_CONNECTED = 16,
- NUM_HANDSHAKE_RESULT_TYPES = 17
- };
- WebSocketHandshakeStreamBase() = default;
- ~WebSocketHandshakeStreamBase() override = default;
- // An object that stores data needed for the creation of a
- // WebSocketBasicHandshakeStream object. A new CreateHelper is used for each
- // WebSocket connection.
- class NET_EXPORT_PRIVATE CreateHelper : public base::SupportsUserData::Data {
- public:
- ~CreateHelper() override {}
- // Create a WebSocketBasicHandshakeStream. This is called after the
- // underlying connection has been established but before any handshake data
- // has been transferred. This can be called more than once in the case that
- // HTTP authentication is needed.
- virtual std::unique_ptr<WebSocketHandshakeStreamBase> CreateBasicStream(
- std::unique_ptr<ClientSocketHandle> connection,
- bool using_proxy,
- WebSocketEndpointLockManager* websocket_endpoint_lock_manager) = 0;
- // Create a WebSocketHttp2HandshakeStream. This is called after the
- // underlying HTTP/2 connection has been established but before the stream
- // has been opened. This cannot be called more than once.
- virtual std::unique_ptr<WebSocketHandshakeStreamBase> CreateHttp2Stream(
- base::WeakPtr<SpdySession> session) = 0;
- };
- // After the handshake has completed, this method creates a WebSocketStream
- // (of the appropriate type) from the WebSocketHandshakeStreamBase object.
- // The WebSocketHandshakeStreamBase object is unusable after Upgrade() has
- // been called.
- virtual std::unique_ptr<WebSocketStream> Upgrade() = 0;
- void SetRequestHeadersCallback(RequestHeadersCallback callback) override {}
- static std::string MultipleHeaderValuesMessage(
- const std::string& header_name);
- // Subclasses need to implement this method so that the resulting weak
- // pointers are invalidated as soon as the derived class is destroyed.
- virtual base::WeakPtr<WebSocketHandshakeStreamBase> GetWeakPtr() = 0;
- protected:
- // TODO(ricea): If more extensions are added, replace this with a more general
- // mechanism.
- struct WebSocketExtensionParams {
- bool deflate_enabled = false;
- WebSocketDeflateParameters deflate_parameters;
- };
- static void AddVectorHeaderIfNonEmpty(const char* name,
- const std::vector<std::string>& value,
- HttpRequestHeaders* headers);
- static bool ValidateSubProtocol(
- const HttpResponseHeaders* headers,
- const std::vector<std::string>& requested_sub_protocols,
- std::string* sub_protocol,
- std::string* failure_message);
- static bool ValidateExtensions(const HttpResponseHeaders* headers,
- std::string* accepted_extensions_descriptor,
- std::string* failure_message,
- WebSocketExtensionParams* params);
- void RecordHandshakeResult(HandshakeResult result);
- private:
- DISALLOW_COPY_AND_ASSIGN(WebSocketHandshakeStreamBase);
- };
- } // namespace net
- #endif // NET_WEBSOCKETS_WEBSOCKET_HANDSHAKE_STREAM_BASE_H_