Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(481)

Side by Side Diff: net/socket/web_socket_server_socket.cc

Issue 8801005: base::Bind: Convert Socket::Read. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Review fixes. Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 #include "net/socket/web_socket_server_socket.h" 5 #include "net/socket/web_socket_server_socket.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <deque> 8 #include <deque>
9 #include <limits> 9 #include <limits>
10 #include <map> 10 #include <map>
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
128 DCHECK(transport_socket); 128 DCHECK(transport_socket);
129 DCHECK(delegate); 129 DCHECK(delegate);
130 } 130 }
131 131
132 virtual ~WebSocketServerSocketImpl() { 132 virtual ~WebSocketServerSocketImpl() {
133 std::deque<PendingReq>::iterator it = GetPendingReq(PendingReq::TYPE_READ); 133 std::deque<PendingReq>::iterator it = GetPendingReq(PendingReq::TYPE_READ);
134 if (it != pending_reqs_.end() && 134 if (it != pending_reqs_.end() &&
135 it->type == PendingReq::TYPE_READ && 135 it->type == PendingReq::TYPE_READ &&
136 it->io_buf != NULL && 136 it->io_buf != NULL &&
137 it->io_buf->data() != NULL && 137 it->io_buf->data() != NULL &&
138 it->callback != 0) { 138 (it->old_callback || !it->callback.is_null())) {
139 it->callback->Run(0); // Report EOF. 139 if (it->old_callback)
140 it->old_callback->Run(0); // Report EOF.
141 else
142 it->callback.Run(0);
140 } 143 }
141 } 144 }
142 145
143 private: 146 private:
144 enum Phase { 147 enum Phase {
145 // Before Accept() is called. 148 // Before Accept() is called.
146 PHASE_NYMPH, 149 PHASE_NYMPH,
147 150
148 // After Accept() is called and until handshake success/fail. 151 // After Accept() is called and until handshake success/fail.
149 PHASE_HANDSHAKE, 152 PHASE_HANDSHAKE,
(...skipping 18 matching lines...) Expand all
168 TYPE_WRITE = 1 << 2, 171 TYPE_WRITE = 1 << 2,
169 172
170 TYPE_READ_METADATA = TYPE_READ | TYPE_METADATA, 173 TYPE_READ_METADATA = TYPE_READ | TYPE_METADATA,
171 TYPE_WRITE_METADATA = TYPE_WRITE | TYPE_METADATA 174 TYPE_WRITE_METADATA = TYPE_WRITE | TYPE_METADATA
172 }; 175 };
173 176
174 PendingReq(Type type, net::DrainableIOBuffer* io_buf, 177 PendingReq(Type type, net::DrainableIOBuffer* io_buf,
175 net::OldCompletionCallback* callback) 178 net::OldCompletionCallback* callback)
176 : type(type), 179 : type(type),
177 io_buf(io_buf), 180 io_buf(io_buf),
181 old_callback(callback) {
182 switch (type) {
183 case PendingReq::TYPE_READ:
184 case PendingReq::TYPE_WRITE:
185 case PendingReq::TYPE_READ_METADATA:
186 case PendingReq::TYPE_WRITE_METADATA: {
187 DCHECK(io_buf);
188 break;
189 }
190 default: {
191 NOTREACHED();
192 break;
193 }
194 }
195 }
196 PendingReq(Type type, net::DrainableIOBuffer* io_buf,
197 const net::CompletionCallback& callback)
198 : type(type),
199 io_buf(io_buf),
200 old_callback(NULL),
178 callback(callback) { 201 callback(callback) {
179 switch (type) { 202 switch (type) {
180 case PendingReq::TYPE_READ: 203 case PendingReq::TYPE_READ:
181 case PendingReq::TYPE_WRITE: 204 case PendingReq::TYPE_WRITE:
182 case PendingReq::TYPE_READ_METADATA: 205 case PendingReq::TYPE_READ_METADATA:
183 case PendingReq::TYPE_WRITE_METADATA: { 206 case PendingReq::TYPE_WRITE_METADATA: {
184 DCHECK(io_buf); 207 DCHECK(io_buf);
185 break; 208 break;
186 } 209 }
187 default: { 210 default: {
188 NOTREACHED(); 211 NOTREACHED();
189 break; 212 break;
190 } 213 }
191 } 214 }
192 } 215 }
193 216
194 Type type; 217 Type type;
195 scoped_refptr<net::DrainableIOBuffer> io_buf; 218 scoped_refptr<net::DrainableIOBuffer> io_buf;
196 net::OldCompletionCallback* callback; 219 net::OldCompletionCallback* old_callback;
220 net::CompletionCallback callback;
197 }; 221 };
198 222
199 // Socket implementation. 223 // Socket implementation.
200 virtual int Read(net::IOBuffer* buf, int buf_len, 224 virtual int Read(net::IOBuffer* buf, int buf_len,
201 net::OldCompletionCallback* callback) OVERRIDE { 225 net::OldCompletionCallback* callback) OVERRIDE {
202 if (buf_len == 0) 226 if (buf_len == 0)
203 return 0; 227 return 0;
204 if (buf == NULL || buf_len < 0) { 228 if (buf == NULL || buf_len < 0) {
205 NOTREACHED(); 229 NOTREACHED();
206 return net::ERR_INVALID_ARGUMENT; 230 return net::ERR_INVALID_ARGUMENT;
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
254 } 278 }
255 case PHASE_NYMPH: 279 case PHASE_NYMPH:
256 case PHASE_HANDSHAKE: 280 case PHASE_HANDSHAKE:
257 default: { 281 default: {
258 NOTREACHED(); 282 NOTREACHED();
259 return net::ERR_UNEXPECTED; 283 return net::ERR_UNEXPECTED;
260 } 284 }
261 } 285 }
262 return net::ERR_IO_PENDING; 286 return net::ERR_IO_PENDING;
263 } 287 }
288 virtual int Read(net::IOBuffer* buf, int buf_len,
289 const net::CompletionCallback& callback) OVERRIDE {
290 if (buf_len == 0)
291 return 0;
292 if (buf == NULL || buf_len < 0) {
293 NOTREACHED();
294 return net::ERR_INVALID_ARGUMENT;
295 }
296 while (int bytes_remaining = fill_handshake_buf_->BytesConsumed() -
297 process_handshake_buf_->BytesConsumed()) {
298 DCHECK(!is_transport_read_pending_);
299 DCHECK(GetPendingReq(PendingReq::TYPE_READ) == pending_reqs_.end());
300 switch (phase_) {
301 case PHASE_FRAME_OUTSIDE:
302 case PHASE_FRAME_INSIDE:
303 case PHASE_FRAME_LENGTH:
304 case PHASE_FRAME_SKIP: {
305 int n = std::min(bytes_remaining, buf_len);
306 int rv = ProcessDataFrames(
307 process_handshake_buf_->data(), n, buf->data(), buf_len);
308 process_handshake_buf_->DidConsume(n);
309 if (rv == 0) {
310 // ProcessDataFrames may return zero for non-empty buffer if it
311 // contains only frame delimiters without real data. In this case:
312 // try again and do not just return zero (zero stands for EOF).
313 continue;
314 }
315 return rv;
316 }
317 case PHASE_SHUT: {
318 return 0;
319 }
320 case PHASE_NYMPH:
321 case PHASE_HANDSHAKE:
322 default: {
323 NOTREACHED();
324 return net::ERR_UNEXPECTED;
325 }
326 }
327 }
328 switch (phase_) {
329 case PHASE_FRAME_OUTSIDE:
330 case PHASE_FRAME_INSIDE:
331 case PHASE_FRAME_LENGTH:
332 case PHASE_FRAME_SKIP: {
333 pending_reqs_.push_back(PendingReq(
334 PendingReq::TYPE_READ,
335 new net::DrainableIOBuffer(buf, buf_len),
336 callback));
337 ConsiderTransportRead();
338 break;
339 }
340 case PHASE_SHUT: {
341 return 0;
342 }
343 case PHASE_NYMPH:
344 case PHASE_HANDSHAKE:
345 default: {
346 NOTREACHED();
347 return net::ERR_UNEXPECTED;
348 }
349 }
350 return net::ERR_IO_PENDING;
351 }
264 352
265 virtual int Write(net::IOBuffer* buf, int buf_len, 353 virtual int Write(net::IOBuffer* buf, int buf_len,
266 net::OldCompletionCallback* callback) OVERRIDE { 354 net::OldCompletionCallback* callback) OVERRIDE {
267 if (buf_len == 0) 355 if (buf_len == 0)
268 return 0; 356 return 0;
269 if (buf == NULL || buf_len < 0) { 357 if (buf == NULL || buf_len < 0) {
270 NOTREACHED(); 358 NOTREACHED();
271 return net::ERR_INVALID_ARGUMENT; 359 return net::ERR_INVALID_ARGUMENT;
272 } 360 }
273 DCHECK_EQ(std::find(buf->data(), buf->data() + buf_len, '\xff'), 361 DCHECK_EQ(std::find(buf->data(), buf->data() + buf_len, '\xff'),
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
390 &WebSocketServerSocketImpl::OnWrite, rv)); 478 &WebSocketServerSocketImpl::OnWrite, rv));
391 } 479 }
392 } 480 }
393 481
394 void Shut(int result) { 482 void Shut(int result) {
395 if (result > 0 || result == net::ERR_IO_PENDING) 483 if (result > 0 || result == net::ERR_IO_PENDING)
396 result = net::ERR_UNEXPECTED; 484 result = net::ERR_UNEXPECTED;
397 if (result != 0) { 485 if (result != 0) {
398 while (!pending_reqs_.empty()) { 486 while (!pending_reqs_.empty()) {
399 PendingReq& req = pending_reqs_.front(); 487 PendingReq& req = pending_reqs_.front();
400 if (req.callback) 488 if (req.old_callback)
401 req.callback->Run(result); 489 req.old_callback->Run(result);
490 else if (!req.callback.is_null())
491 req.callback.Run(result);
402 pending_reqs_.pop_front(); 492 pending_reqs_.pop_front();
403 } 493 }
404 transport_socket_.reset(); // terminate underlying connection. 494 transport_socket_.reset(); // terminate underlying connection.
405 } 495 }
406 phase_ = PHASE_SHUT; 496 phase_ = PHASE_SHUT;
407 } 497 }
408 498
409 // Callbacks for transport socket. 499 // Callbacks for transport socket.
410 void OnRead(int result) { 500 void OnRead(int result) {
411 if (!is_transport_read_pending_) { 501 if (!is_transport_read_pending_) {
(...skipping 28 matching lines...) Expand all
440 NOTREACHED(); 530 NOTREACHED();
441 Shut(net::ERR_UNEXPECTED); 531 Shut(net::ERR_UNEXPECTED);
442 return; 532 return;
443 } 533 }
444 fill_handshake_buf_->DidConsume(result); 534 fill_handshake_buf_->DidConsume(result);
445 // ProcessHandshake invalidates iterators for |pending_reqs_| 535 // ProcessHandshake invalidates iterators for |pending_reqs_|
446 int rv = ProcessHandshake(); 536 int rv = ProcessHandshake();
447 if (rv > 0) { 537 if (rv > 0) {
448 process_handshake_buf_->DidConsume(rv); 538 process_handshake_buf_->DidConsume(rv);
449 phase_ = PHASE_FRAME_OUTSIDE; 539 phase_ = PHASE_FRAME_OUTSIDE;
450 net::OldCompletionCallback* cb = pending_reqs_.front().callback; 540 net::OldCompletionCallback* old_cb =
541 pending_reqs_.front().old_callback;
542 net::CompletionCallback cb = pending_reqs_.front().callback;
451 pending_reqs_.pop_front(); 543 pending_reqs_.pop_front();
452 ConsiderTransportWrite(); // Schedule answer handshake. 544 ConsiderTransportWrite(); // Schedule answer handshake.
453 if (cb) 545 if (old_cb)
454 cb->Run(0); 546 old_cb->Run(0);
547 else if (!cb.is_null())
548 cb.Run(0);
455 } else if (rv == net::ERR_IO_PENDING) { 549 } else if (rv == net::ERR_IO_PENDING) {
456 if (fill_handshake_buf_->BytesRemaining() < 1) 550 if (fill_handshake_buf_->BytesRemaining() < 1)
457 Shut(net::ERR_LIMIT_VIOLATION); 551 Shut(net::ERR_LIMIT_VIOLATION);
458 } else if (rv < 0) { 552 } else if (rv < 0) {
459 Shut(rv); 553 Shut(rv);
460 } else { 554 } else {
461 Shut(net::ERR_UNEXPECTED); 555 Shut(net::ERR_UNEXPECTED);
462 } 556 }
463 break; 557 break;
464 } 558 }
465 case PHASE_FRAME_OUTSIDE: 559 case PHASE_FRAME_OUTSIDE:
466 case PHASE_FRAME_INSIDE: 560 case PHASE_FRAME_INSIDE:
467 case PHASE_FRAME_LENGTH: 561 case PHASE_FRAME_LENGTH:
468 case PHASE_FRAME_SKIP: { 562 case PHASE_FRAME_SKIP: {
469 int rv = ProcessDataFrames( 563 int rv = ProcessDataFrames(
470 it->io_buf->data(), result, 564 it->io_buf->data(), result,
471 it->io_buf->data(), it->io_buf->BytesRemaining()); 565 it->io_buf->data(), it->io_buf->BytesRemaining());
472 if (rv < 0) { 566 if (rv < 0) {
473 Shut(rv); 567 Shut(rv);
474 return; 568 return;
475 } 569 }
476 if (rv > 0 || phase_ == PHASE_SHUT) { 570 if (rv > 0 || phase_ == PHASE_SHUT) {
477 net::OldCompletionCallback* cb = it->callback; 571 net::OldCompletionCallback* old_cb = it->old_callback;
572 net::CompletionCallback cb = it->callback;
478 pending_reqs_.erase(it); 573 pending_reqs_.erase(it);
479 if (cb) 574 if (old_cb)
480 cb->Run(rv); 575 old_cb->Run(rv);
576 else if (!cb.is_null())
577 cb.Run(rv);
481 } 578 }
482 break; 579 break;
483 } 580 }
484 case PHASE_NYMPH: 581 case PHASE_NYMPH:
485 default: { 582 default: {
486 NOTREACHED(); 583 NOTREACHED();
487 Shut(net::ERR_UNEXPECTED); 584 Shut(net::ERR_UNEXPECTED);
488 break; 585 break;
489 } 586 }
490 } 587 }
(...skipping 17 matching lines...) Expand all
508 if (it == pending_reqs_.end() || 605 if (it == pending_reqs_.end() ||
509 it->io_buf == NULL || 606 it->io_buf == NULL ||
510 it->io_buf->data() == NULL) { 607 it->io_buf->data() == NULL) {
511 NOTREACHED(); 608 NOTREACHED();
512 Shut(net::ERR_UNEXPECTED); 609 Shut(net::ERR_UNEXPECTED);
513 return; 610 return;
514 } 611 }
515 DCHECK_LE(result, it->io_buf->BytesRemaining()); 612 DCHECK_LE(result, it->io_buf->BytesRemaining());
516 it->io_buf->DidConsume(result); 613 it->io_buf->DidConsume(result);
517 if (it->io_buf->BytesRemaining() == 0) { 614 if (it->io_buf->BytesRemaining() == 0) {
518 net::OldCompletionCallback* cb = it->callback; 615 net::OldCompletionCallback* old_cb = it->old_callback;
616 net::CompletionCallback cb = it->callback;
519 int bytes_written = it->io_buf->BytesConsumed(); 617 int bytes_written = it->io_buf->BytesConsumed();
520 DCHECK_GT(bytes_written, 0); 618 DCHECK_GT(bytes_written, 0);
521 pending_reqs_.erase(it); 619 pending_reqs_.erase(it);
522 if (cb) 620 if (old_cb)
523 cb->Run(bytes_written); 621 old_cb->Run(bytes_written);
622 else if (!cb.is_null())
623 cb.Run(bytes_written);
524 } 624 }
525 ConsiderTransportWrite(); 625 ConsiderTransportWrite();
526 } 626 }
527 627
528 // Returns (positive) number of consumed bytes on success. 628 // Returns (positive) number of consumed bytes on success.
529 // Returns ERR_IO_PENDING in case of incomplete input. 629 // Returns ERR_IO_PENDING in case of incomplete input.
530 // Returns ERR_WS_PROTOCOL_ERROR or ERR_LIMIT_VIOLATION in case of failure to 630 // Returns ERR_WS_PROTOCOL_ERROR or ERR_LIMIT_VIOLATION in case of failure to
531 // reasonably parse input. 631 // reasonably parse input.
532 int ProcessHandshake() { 632 int ProcessHandshake() {
533 static const char kGetPrefix[] = "GET "; 633 static const char kGetPrefix[] = "GET ";
(...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after
896 996
897 WebSocketServerSocket* CreateWebSocketServerSocket( 997 WebSocketServerSocket* CreateWebSocketServerSocket(
898 Socket* transport_socket, WebSocketServerSocket::Delegate* delegate) { 998 Socket* transport_socket, WebSocketServerSocket::Delegate* delegate) {
899 return new WebSocketServerSocketImpl(transport_socket, delegate); 999 return new WebSocketServerSocketImpl(transport_socket, delegate);
900 } 1000 }
901 1001
902 WebSocketServerSocket::~WebSocketServerSocket() { 1002 WebSocketServerSocket::~WebSocketServerSocket() {
903 } 1003 }
904 1004
905 } // namespace net; 1005 } // namespace net;
OLDNEW
« no previous file with comments | « net/socket/transport_client_socket_pool_unittest.cc ('k') | net/socket/web_socket_server_socket_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698