OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef CHROME_BROWSER_EXTENSIONS_API_CAST_CHANNEL_CAST_SOCKET_H_ | 5 #ifndef CHROME_BROWSER_EXTENSIONS_API_CAST_CHANNEL_CAST_SOCKET_H_ |
6 #define CHROME_BROWSER_EXTENSIONS_API_CAST_CHANNEL_CAST_SOCKET_H_ | 6 #define CHROME_BROWSER_EXTENSIONS_API_CAST_CHANNEL_CAST_SOCKET_H_ |
7 | 7 |
8 #include <queue> | 8 #include <queue> |
9 #include <string> | 9 #include <string> |
10 | 10 |
11 #include "base/basictypes.h" | 11 #include "base/basictypes.h" |
12 #include "base/callback.h" | 12 #include "base/callback.h" |
13 #include "base/gtest_prod_util.h" | 13 #include "base/gtest_prod_util.h" |
14 #include "base/memory/ref_counted.h" | 14 #include "base/memory/ref_counted.h" |
15 #include "base/memory/weak_ptr.h" | 15 #include "base/memory/weak_ptr.h" |
16 #include "base/threading/thread_checker.h" | 16 #include "base/threading/thread_checker.h" |
17 #include "chrome/browser/extensions/api/api_resource.h" | 17 #include "chrome/browser/extensions/api/api_resource.h" |
18 #include "chrome/browser/extensions/api/api_resource_manager.h" | 18 #include "chrome/browser/extensions/api/api_resource_manager.h" |
19 #include "chrome/browser/extensions/api/cast_channel/cast_channel.pb.h" | |
19 #include "chrome/common/extensions/api/cast_channel.h" | 20 #include "chrome/common/extensions/api/cast_channel.h" |
20 #include "net/base/completion_callback.h" | 21 #include "net/base/completion_callback.h" |
21 #include "net/base/io_buffer.h" | 22 #include "net/base/io_buffer.h" |
22 #include "net/base/ip_endpoint.h" | 23 #include "net/base/ip_endpoint.h" |
23 #include "net/base/net_log.h" | 24 #include "net/base/net_log.h" |
24 #include "url/gurl.h" | 25 #include "url/gurl.h" |
25 | 26 |
26 namespace net { | 27 namespace net { |
27 class AddressList; | 28 class AddressList; |
28 class CertVerifier; | 29 class CertVerifier; |
29 class SSLClientSocket; | 30 class SSLClientSocket; |
31 class StreamSocket; | |
30 class TCPClientSocket; | 32 class TCPClientSocket; |
31 class TransportSecurityState; | 33 class TransportSecurityState; |
32 } | 34 } |
33 | 35 |
34 namespace extensions { | 36 namespace extensions { |
35 namespace api { | 37 namespace api { |
36 namespace cast_channel { | 38 namespace cast_channel { |
37 | 39 |
38 class CastMessage; | |
39 | |
40 // Size, in bytes, of the largest allowed message payload on the wire (without | 40 // Size, in bytes, of the largest allowed message payload on the wire (without |
41 // the header). | 41 // the header). |
42 extern const uint32 kMaxMessageSize; | 42 extern const uint32 kMaxMessageSize; |
43 | 43 |
44 // This class implements a channel between Chrome and a Cast device using a TCP | 44 // This class implements a channel between Chrome and a Cast device using a TCP |
45 // socket. The channel may be unauthenticated (cast://) or authenticated | 45 // socket. The channel may be unauthenticated (cast://) or authenticated |
46 // (casts://). All CastSocket objects must be used only on the IO thread. | 46 // (casts://). All CastSocket objects must be used only on the IO thread. |
47 // | 47 // |
48 // NOTE: Not called "CastChannel" to reduce confusion with the generated API | 48 // NOTE: Not called "CastChannel" to reduce confusion with the generated API |
49 // code. | 49 // code. |
50 class CastSocket : public ApiResource, | 50 class CastSocket : public ApiResource, |
51 public base::SupportsWeakPtr<CastSocket> { | 51 public base::SupportsWeakPtr<CastSocket> { |
Ryan Sleevi
2013/12/11 08:14:14
See https://groups.google.com/a/chromium.org/d/msg
Munjal (Google)
2013/12/11 23:39:41
Yes. I will work on removing that in a separate pa
| |
52 public: | 52 public: |
53 // Object to be informed of incoming messages and errors. | 53 // Object to be informed of incoming messages and errors. |
54 class Delegate { | 54 class Delegate { |
55 public: | 55 public: |
56 // An error occurred on the channel. | 56 // An error occurred on the channel. |
57 // It is fine to delete the socket in this callback. | |
Ryan Sleevi
2013/12/11 08:14:14
Design nit: Within net/, the delegates tend not to
Munjal (Google)
2013/12/11 23:39:41
I agree with your feedback. Since this change requ
| |
57 virtual void OnError(const CastSocket* socket, | 58 virtual void OnError(const CastSocket* socket, |
58 ChannelError error) = 0; | 59 ChannelError error) = 0; |
59 // A string message was received on the channel. | 60 // A message was received on the channel. |
61 // Do NOT delete the socket in this callback. | |
60 virtual void OnMessage(const CastSocket* socket, | 62 virtual void OnMessage(const CastSocket* socket, |
61 const MessageInfo& message) = 0; | 63 const MessageInfo& message) = 0; |
62 protected: | 64 protected: |
63 virtual ~Delegate() {} | 65 virtual ~Delegate() {} |
64 }; | 66 }; |
65 | 67 |
66 // Creates a new CastSocket to |url|. |owner_extension_id| is the id of the | 68 // Creates a new CastSocket to |url|. |owner_extension_id| is the id of the |
67 // extension that opened the socket. | 69 // extension that opened the socket. |
68 CastSocket(const std::string& owner_extension_id, | 70 CastSocket(const std::string& owner_extension_id, |
69 const GURL& url, | 71 const GURL& url, |
70 CastSocket::Delegate* delegate, | 72 CastSocket::Delegate* delegate, |
71 net::NetLog* net_log); | 73 net::NetLog* net_log); |
72 virtual ~CastSocket(); | 74 virtual ~CastSocket(); |
73 | 75 |
74 // The URL for the channel. | 76 // The URL for the channel. |
75 const GURL& url() const; | 77 const GURL& url() const; |
76 | 78 |
77 // Whether to perform receiver authentication. | 79 // Whether to perform receiver authentication. |
78 bool auth_required() const { return auth_required_; } | 80 bool auth_required() const { return auth_required_; } |
79 | 81 |
80 // Channel id for the ApiResourceManager. | 82 // Channel id for the ApiResourceManager. |
81 int id() const { return channel_id_; } | 83 int id() const { return channel_id_; } |
82 | 84 |
83 // Sets the channel id. | 85 // Sets the channel id. |
84 void set_id(int channel_id) { channel_id_ = channel_id; } | 86 void set_id(int channel_id) { channel_id_ = channel_id; } |
85 | 87 |
86 // Returns the state of the channel. | 88 // Returns the state of the channel. |
87 ReadyState ready_state() const { return ready_state_; } | 89 ReadyState ready_state() const { return ready_state_; } |
88 | 90 |
89 // Returns the last error that occurred on this channel, or CHANNEL_ERROR_NONE | 91 // Returns the last error that occurred on this channel, or |
90 // if no error has occurred. | 92 // CHANNEL_ERROR_NONE if no error has occurred. |
91 ChannelError error_state() const { return error_state_; } | 93 ChannelError error_state() const { return error_state_; } |
92 | 94 |
93 // Connects the channel to the peer. If successful, the channel will be in | 95 // Connects the channel to the peer. If successful, the channel will be in |
94 // READY_STATE_OPEN. | 96 // READY_STATE_OPEN. |
97 // It is fine to delete the CastSocket object in |callback|. | |
95 virtual void Connect(const net::CompletionCallback& callback); | 98 virtual void Connect(const net::CompletionCallback& callback); |
96 | 99 |
97 // Sends a message over a connected channel. The channel must be in | 100 // Sends a message over a connected channel. The channel must be in |
98 // READY_STATE_OPEN. | 101 // READY_STATE_OPEN. |
102 // | |
103 // Note that if an error occurs the following happens: | |
104 // 1. Completion callbacks for all pending writes are invoked with error. | |
105 // 2. Delegate::OnError is called once. | |
106 // 3. Castsocket is closed. | |
107 // | |
108 // DO NOT delete the CastSocket object in write completion callback. | |
109 // But it is fine to delete the socket in Delegate::ONError | |
Ryan Sleevi
2013/12/11 08:14:14
Typo (ONError = OnError)
Munjal (Google)
2013/12/11 23:39:41
Done.
| |
99 virtual void SendMessage(const MessageInfo& message, | 110 virtual void SendMessage(const MessageInfo& message, |
100 const net::CompletionCallback& callback); | 111 const net::CompletionCallback& callback); |
101 | 112 |
102 // Closes the channel. On completion, the channel will be in | 113 // Closes the channel. On completion, the channel will be in |
103 // READY_STATE_CLOSED. | 114 // READY_STATE_CLOSED. |
115 // It is fine to delete the CastSocket object in |callback|. | |
104 virtual void Close(const net::CompletionCallback& callback); | 116 virtual void Close(const net::CompletionCallback& callback); |
105 | 117 |
106 // Fills |channel_info| with the status of this channel. | 118 // Fills |channel_info| with the status of this channel. |
107 virtual void FillChannelInfo(ChannelInfo* channel_info) const; | 119 virtual void FillChannelInfo(ChannelInfo* channel_info) const; |
108 | 120 |
109 protected: | 121 protected: |
Ryan Sleevi
2013/12/11 08:14:14
Why are these methods protected?
Seems like they
Munjal (Google)
2013/12/11 23:39:41
They are overridden in tests to inject mock result
Ryan Sleevi
2013/12/12 00:48:14
If they are overridden in tests, they can be priva
| |
110 // Creates an instance of TCPClientSocket. | 122 // Creates an instance of TCPClientSocket. |
111 virtual scoped_ptr<net::TCPClientSocket> CreateTcpSocket(); | 123 virtual scoped_ptr<net::TCPClientSocket> CreateTcpSocket(); |
112 // Creates an instance of SSLClientSocket. | 124 // Creates an instance of SSLClientSocket with the given underlying |socket|. |
113 virtual scoped_ptr<net::SSLClientSocket> CreateSslSocket(); | 125 virtual scoped_ptr<net::SSLClientSocket> CreateSslSocket( |
126 scoped_ptr<net::StreamSocket> socket); | |
127 // Returns IPEndPoint for the URL to connect to. | |
128 const net::IPEndPoint& ip_endpoint() const { return ip_endpoint_; } | |
114 // Extracts peer certificate from SSLClientSocket instance when the socket | 129 // Extracts peer certificate from SSLClientSocket instance when the socket |
115 // is in cert error state. | 130 // is in cert error state. |
116 // Returns whether certificate is successfully extracted. | 131 // Returns whether certificate is successfully extracted. |
117 virtual bool ExtractPeerCert(std::string* cert); | 132 virtual bool ExtractPeerCert(std::string* cert); |
118 // Sends a challenge request to the receiver. | |
119 virtual int SendAuthChallenge(); | |
120 // Reads auth challenge reply from the receiver. | |
121 virtual int ReadAuthChallengeReply(); | |
122 // Verifies whether the challenge reply received from the peer is valid: | 133 // Verifies whether the challenge reply received from the peer is valid: |
123 // 1. Signature in the reply is valid. | 134 // 1. Signature in the reply is valid. |
124 // 2. Certificate is rooted to a trusted CA. | 135 // 2. Certificate is rooted to a trusted CA. |
125 virtual bool VerifyChallengeReply(); | 136 virtual bool VerifyChallengeReply(); |
126 | 137 |
127 // Returns whether we are executing in a valid thread. | 138 // Returns whether we are executing in a valid thread. |
128 virtual bool CalledOnValidThread() const; | 139 virtual bool CalledOnValidThread() const; |
129 | 140 |
130 private: | 141 private: |
131 friend class ApiResourceManager<CastSocket>; | 142 friend class ApiResourceManager<CastSocket>; |
132 friend class CastSocketTest; | 143 friend class CastSocketTest; |
133 | 144 |
134 static const char* service_name() { | 145 static const char* service_name() { |
135 return "CastSocketManager"; | 146 return "CastSocketManager"; |
136 } | 147 } |
137 | 148 |
138 // Internal connection states. | 149 // Internal connection states. |
139 enum ConnectionState { | 150 enum ConnectionState { |
140 CONN_STATE_NONE, | 151 CONN_STATE_NONE, |
141 CONN_STATE_TCP_CONNECT, | 152 CONN_STATE_TCP_CONNECT, |
142 CONN_STATE_TCP_CONNECT_COMPLETE, | 153 CONN_STATE_TCP_CONNECT_COMPLETE, |
143 CONN_STATE_SSL_CONNECT, | 154 CONN_STATE_SSL_CONNECT, |
144 CONN_STATE_SSL_CONNECT_COMPLETE, | 155 CONN_STATE_SSL_CONNECT_COMPLETE, |
145 CONN_STATE_AUTH_CHALLENGE_SEND, | 156 CONN_STATE_AUTH_CHALLENGE_SEND, |
146 CONN_STATE_AUTH_CHALLENGE_SEND_COMPLETE, | 157 CONN_STATE_AUTH_CHALLENGE_SEND_COMPLETE, |
147 CONN_STATE_AUTH_CHALLENGE_REPLY_COMPLETE, | 158 CONN_STATE_AUTH_CHALLENGE_REPLY_COMPLETE, |
148 }; | 159 }; |
149 | 160 |
161 // Internal write states. | |
162 enum WriteState { | |
163 WRITE_STATE_NONE, | |
164 WRITE_STATE_WRITE, | |
165 WRITE_STATE_WRITE_COMPLETE, | |
166 WRITE_STATE_DO_CALLBACK, | |
167 WRITE_STATE_ERROR, | |
168 }; | |
169 | |
170 // Internal read states. | |
171 enum ReadState { | |
172 READ_STATE_NONE, | |
173 READ_STATE_READ, | |
174 READ_STATE_READ_COMPLETE, | |
175 READ_STATE_DO_CALLBACK, | |
176 READ_STATE_ERROR, | |
177 }; | |
178 | |
150 ///////////////////////////////////////////////////////////////////////////// | 179 ///////////////////////////////////////////////////////////////////////////// |
151 // Following methods work together to implement the following flow: | 180 // Following methods work together to implement the following flow: |
152 // 1. Create a new TCP socket and connect to it | 181 // 1. Create a new TCP socket and connect to it |
153 // 2. Create a new SSL socket and try connecting to it | 182 // 2. Create a new SSL socket and try connecting to it |
154 // 3. If connection fails due to invalid cert authority, then extract the | 183 // 3. If connection fails due to invalid cert authority, then extract the |
155 // peer certificate from the error. | 184 // peer certificate from the error. |
156 // 4. Whitelist the peer certificate and try #1 and #2 again. | 185 // 4. Whitelist the peer certificate and try #1 and #2 again. |
157 // 5. If SSL socket is connected successfully, and if protocol is casts:// | 186 // 5. If SSL socket is connected successfully, and if protocol is casts:// |
158 // then issue an auth challenge request. | 187 // then issue an auth challenge request. |
159 // 6. Validate the auth challenge response. | 188 // 6. Validate the auth challenge response. |
160 | 189 // |
161 // Main method that performs connection state transitions. | 190 // Main method that performs connection state transitions. |
162 int DoConnectLoop(int result); | 191 void DoConnectLoop(int result); |
163 // Each of the below Do* method is executed in the corresponding | 192 // Each of the below Do* method is executed in the corresponding |
164 // connection state. For e.g. when connection state is TCP_CONNECT | 193 // connection state. For e.g. when connection state is TCP_CONNECT |
165 // DoTcpConnect is called, and so on. | 194 // DoTcpConnect is called, and so on. |
166 int DoTcpConnect(); | 195 int DoTcpConnect(); |
167 int DoTcpConnectComplete(int result); | 196 int DoTcpConnectComplete(int result); |
168 int DoSslConnect(); | 197 int DoSslConnect(); |
169 int DoSslConnectComplete(int result); | 198 int DoSslConnectComplete(int result); |
170 int DoAuthChallengeSend(); | 199 int DoAuthChallengeSend(); |
171 int DoAuthChallengeSendComplete(int result); | 200 int DoAuthChallengeSendComplete(int result); |
172 int DoAuthChallengeReplyComplete(int result); | 201 int DoAuthChallengeReplyComplete(int result); |
173 ///////////////////////////////////////////////////////////////////////////// | 202 ///////////////////////////////////////////////////////////////////////////// |
174 | 203 |
175 // Callback method for callbacks from underlying sockets. | 204 ///////////////////////////////////////////////////////////////////////////// |
176 void OnConnectComplete(int result); | 205 // Following methods work together to implement write flow. |
206 // | |
207 // Main method that performs write flow state transitions. | |
208 void DoWriteLoop(int result); | |
209 // Each of the below Do* method is executed in the corresponding | |
210 // write state. For e.g. when write state is WRITE_STATE_WRITE_COMPLETE | |
Ryan Sleevi
2013/12/11 08:14:14
For example or e.g. , but not For e.g.
Munjal (Google)
2013/12/11 23:39:41
Done.
| |
211 // DowriteComplete is called, and so on. | |
212 int DoWrite(); | |
213 int DoWriteComplete(int result); | |
214 int DoWriteCallback(); | |
215 int DoWriteError(int result); | |
216 ///////////////////////////////////////////////////////////////////////////// | |
177 | 217 |
178 // Callback method when a challenge request is sent or a reply is received. | 218 ///////////////////////////////////////////////////////////////////////////// |
179 void OnChallengeEvent(int result); | 219 // Following methods work together to implement read flow. |
220 // | |
221 // Main method that performs write flow state transitions. | |
222 void DoReadLoop(int result); | |
223 // Each of the below Do* method is executed in the corresponding | |
224 // write state. For e.g. when write state is READ_STATE_READ_COMPLETE | |
225 // DoReadComplete is called, and so on. | |
226 int DoRead(); | |
227 int DoReadComplete(int result); | |
228 int DoReadCallback(); | |
229 int DoReadError(int result); | |
230 ///////////////////////////////////////////////////////////////////////////// | |
180 | 231 |
181 // Runs the external connection callback and resets it. | 232 // Runs the external connection callback and resets it. |
182 void DoConnectCallback(int result); | 233 void DoConnectCallback(int result); |
183 | |
184 // Verifies that the URL is a valid cast:// or casts:// URL and sets url_ to | 234 // Verifies that the URL is a valid cast:// or casts:// URL and sets url_ to |
185 // the result. | 235 // the result. |
186 bool ParseChannelUrl(const GURL& url); | 236 bool ParseChannelUrl(const GURL& url); |
187 | 237 // Adds |message| to the write queue and starts the write loop if needed. |
188 // Sends the given |message| and invokes the given callback when done. | 238 void SendCastMessageInternal(const CastMessage& message, |
189 int SendMessageInternal(const CastMessage& message, | 239 const net::CompletionCallback& callback); |
190 const net::CompletionCallback& callback); | 240 // Posts a task tostart the connect loop with the given |result|. |
Ryan Sleevi
2013/12/11 08:14:14
typo: tostart -> to start
That said, these commen
Munjal (Google)
2013/12/11 23:39:41
Done.
| |
191 | 241 void PostTaskToStartConnectLoop(int result); |
192 // Writes data to the socket from the WriteRequest at the head of the queue. | 242 // Posts a task to start the read loop. |
193 // Calls OnWriteData() on completion. | 243 void PostTaskToStartReadLoop(); |
194 int WriteData(); | 244 // Stars the read loop if not already started. |
195 void OnWriteData(int result); | 245 void StartReadLoop(); |
196 | 246 // Parses the contents of header_read_buffer_ and sets current_message_size_ |
197 // Reads data from the socket into one of the read buffers. Calls | 247 // to the size of the body of the message. |
198 // OnReadData() on completion. | |
199 int ReadData(); | |
200 void OnReadData(int result); | |
201 | |
202 // Processes the contents of header_read_buffer_ and returns true on success. | |
203 bool ProcessHeader(); | 248 bool ProcessHeader(); |
204 // Processes the contents of body_read_buffer_ and returns true on success. | 249 // Parses the contents of body_read_buffer_ and sets current_message_ to |
250 // the message received. | |
205 bool ProcessBody(); | 251 bool ProcessBody(); |
206 // Parses the message held in body_read_buffer_ and notifies |delegate_| if a | 252 // Closes the socket and sets |error_state_|. Also signals |error| via |
207 // message was extracted from the buffer. Returns true on success. | 253 // |delegate_|. |
208 bool ParseMessageFromBody(); | 254 void CloseWithError(ChannelError error); |
Ryan Sleevi
2013/12/11 08:14:14
comment nit:
// Closes socket, updating the error
Munjal (Google)
2013/12/11 23:39:41
Done.
Once I make the change you suggest of remov
| |
209 | |
210 // Serializes the content of message_proto (with a header) to |message_data|. | 255 // Serializes the content of message_proto (with a header) to |message_data|. |
211 static bool Serialize(const CastMessage& message_proto, | 256 static bool Serialize(const CastMessage& message_proto, |
212 std::string* message_data); | 257 std::string* message_data); |
213 | 258 |
214 // Closes the socket and sets |error_state_|. Also signals |error| via | |
215 // |delegate_|. | |
216 void CloseWithError(ChannelError error); | |
217 | |
218 base::ThreadChecker thread_checker_; | 259 base::ThreadChecker thread_checker_; |
219 | 260 |
220 // The id of the channel. | 261 // The id of the channel. |
221 int channel_id_; | 262 int channel_id_; |
222 | 263 |
223 // The URL of the peer (cast:// or casts://). | 264 // The URL of the peer (cast:// or casts://). |
224 GURL url_; | 265 GURL url_; |
225 // Delegate to inform of incoming messages and errors. | 266 // Delegate to inform of incoming messages and errors. |
226 Delegate* delegate_; | 267 Delegate* delegate_; |
227 // True if we should perform receiver authentication. | 268 // True if we should perform receiver authentication. |
228 bool auth_required_; | 269 bool auth_required_; |
229 // The IP endpoint of the peer. | 270 // The IP endpoint of the peer. |
230 net::IPEndPoint ip_endpoint_; | 271 net::IPEndPoint ip_endpoint_; |
231 // The last error encountered by the channel. | |
232 ChannelError error_state_; | |
233 // The current status of the channel. | |
234 ReadyState ready_state_; | |
235 | |
236 // True when there is a write callback pending. | |
237 bool write_callback_pending_; | |
238 // True when there is a read callback pending. | |
239 bool read_callback_pending_; | |
240 | 272 |
241 // IOBuffer for reading the message header. | 273 // IOBuffer for reading the message header. |
242 scoped_refptr<net::GrowableIOBuffer> header_read_buffer_; | 274 scoped_refptr<net::GrowableIOBuffer> header_read_buffer_; |
243 // IOBuffer for reading the message body. | 275 // IOBuffer for reading the message body. |
244 scoped_refptr<net::GrowableIOBuffer> body_read_buffer_; | 276 scoped_refptr<net::GrowableIOBuffer> body_read_buffer_; |
245 // IOBuffer we are currently reading into. | 277 // IOBuffer we are currently reading into. |
246 scoped_refptr<net::GrowableIOBuffer> current_read_buffer_; | 278 scoped_refptr<net::GrowableIOBuffer> current_read_buffer_; |
247 // The number of bytes in the current message body. | 279 // The number of bytes in the current message body. |
248 uint32 current_message_size_; | 280 uint32 current_message_size_; |
281 // Last message received on the socket. | |
282 CastMessage current_message_; | |
249 | 283 |
250 // The NetLog for this service. | 284 // The NetLog for this service. |
251 net::NetLog* net_log_; | 285 net::NetLog* net_log_; |
252 // The NetLog source for this service. | 286 // The NetLog source for this service. |
253 net::NetLog::Source net_log_source_; | 287 net::NetLog::Source net_log_source_; |
254 | 288 |
255 // Next connection state to transition to. | |
256 ConnectionState next_state_; | |
257 // Owned ptr to the underlying TCP socket. | 289 // Owned ptr to the underlying TCP socket. |
258 scoped_ptr<net::TCPClientSocket> tcp_socket_; | 290 scoped_ptr<net::TCPClientSocket> tcp_socket_; |
259 // Owned ptr to the underlying SSL socket. | 291 // Owned ptr to the underlying SSL socket. |
260 scoped_ptr<net::SSLClientSocket> socket_; | 292 scoped_ptr<net::SSLClientSocket> socket_; |
261 // Certificate of the peer. This field may be empty if the peer | 293 // Certificate of the peer. This field may be empty if the peer |
262 // certificate is not yet fetched. | 294 // certificate is not yet fetched. |
263 std::string peer_cert_; | 295 std::string peer_cert_; |
264 scoped_ptr<net::CertVerifier> cert_verifier_; | 296 scoped_ptr<net::CertVerifier> cert_verifier_; |
265 scoped_ptr<net::TransportSecurityState> transport_security_state_; | 297 scoped_ptr<net::TransportSecurityState> transport_security_state_; |
266 // Reply received from the receiver to a challenge request. | 298 // Reply received from the receiver to a challenge request. |
267 scoped_ptr<CastMessage> challenge_reply_; | 299 scoped_ptr<CastMessage> challenge_reply_; |
268 | 300 |
269 // Callback invoked when the socket is connected. | 301 // Callback invoked when the socket is connected. |
270 net::CompletionCallback connect_callback_; | 302 net::CompletionCallback connect_callback_; |
271 | 303 |
304 // Connection flow state machine state. | |
305 ConnectionState connect_state_; | |
306 // Write flow state machine state. | |
307 WriteState write_state_; | |
308 // Read flow state machine state. | |
309 ReadState read_state_; | |
310 // The last error encountered by the channel. | |
311 ChannelError error_state_; | |
312 // The current status of the channel. | |
313 ReadyState ready_state_; | |
314 | |
272 // Message header struct. If fields are added, be sure to update | 315 // Message header struct. If fields are added, be sure to update |
273 // kMessageHeaderSize in the .cc. | 316 // kMessageHeaderSize in the .cc. |
274 struct MessageHeader { | 317 struct MessageHeader { |
275 MessageHeader(); | 318 MessageHeader(); |
276 // Sets the message size. | 319 // Sets the message size. |
277 void SetMessageSize(size_t message_size); | 320 void SetMessageSize(size_t message_size); |
278 // Prepends this header to |str|. | 321 // Prepends this header to |str|. |
279 void PrependToString(std::string* str); | 322 void PrependToString(std::string* str); |
280 // Reads |header| from the beginning of |buffer|. | 323 // Reads |header| from the beginning of |buffer|. |
281 static void ReadFromIOBuffer(net::GrowableIOBuffer* buffer, | 324 static void ReadFromIOBuffer(net::GrowableIOBuffer* buffer, |
(...skipping 12 matching lines...) Expand all Loading... | |
294 // and prepending the header. Must only be called once. | 337 // and prepending the header. Must only be called once. |
295 bool SetContent(const CastMessage& message_proto); | 338 bool SetContent(const CastMessage& message_proto); |
296 | 339 |
297 net::CompletionCallback callback; | 340 net::CompletionCallback callback; |
298 scoped_refptr<net::DrainableIOBuffer> io_buffer; | 341 scoped_refptr<net::DrainableIOBuffer> io_buffer; |
299 }; | 342 }; |
300 // Queue of pending writes. The message at the front of the queue is the one | 343 // Queue of pending writes. The message at the front of the queue is the one |
301 // being written. | 344 // being written. |
302 std::queue<WriteRequest> write_queue_; | 345 std::queue<WriteRequest> write_queue_; |
303 | 346 |
304 // Used to protect against DoConnectLoop() re-entrancy. | |
305 bool in_connect_loop_; | |
306 | |
307 FRIEND_TEST_ALL_PREFIXES(CastSocketTest, TestCastURLs); | 347 FRIEND_TEST_ALL_PREFIXES(CastSocketTest, TestCastURLs); |
308 FRIEND_TEST_ALL_PREFIXES(CastSocketTest, TestRead); | 348 FRIEND_TEST_ALL_PREFIXES(CastSocketTest, TestRead); |
309 FRIEND_TEST_ALL_PREFIXES(CastSocketTest, TestReadMany); | 349 FRIEND_TEST_ALL_PREFIXES(CastSocketTest, TestReadMany); |
310 DISALLOW_COPY_AND_ASSIGN(CastSocket); | 350 DISALLOW_COPY_AND_ASSIGN(CastSocket); |
311 }; | 351 }; |
312 | 352 |
313 } // namespace cast_channel | 353 } // namespace cast_channel |
314 } // namespace api | 354 } // namespace api |
315 } // namespace extensions | 355 } // namespace extensions |
316 | 356 |
317 #endif // CHROME_BROWSER_EXTENSIONS_API_CAST_CHANNEL_CAST_SOCKET_H_ | 357 #endif // CHROME_BROWSER_EXTENSIONS_API_CAST_CHANNEL_CAST_SOCKET_H_ |
OLD | NEW |