| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/tools/flip_server/spdy_interface.h" | 5 #include "net/tools/flip_server/spdy_interface.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <string> | 8 #include <string> |
| 9 | 9 |
| 10 #include "net/spdy/spdy_framer.h" | 10 #include "net/spdy/spdy_framer.h" |
| 11 #include "net/spdy/spdy_protocol.h" | 11 #include "net/spdy/spdy_protocol.h" |
| 12 #include "net/tools/flip_server/constants.h" | 12 #include "net/tools/flip_server/constants.h" |
| 13 #include "net/tools/flip_server/flip_config.h" | 13 #include "net/tools/flip_server/flip_config.h" |
| 14 #include "net/tools/flip_server/http_interface.h" | 14 #include "net/tools/flip_server/http_interface.h" |
| 15 #include "net/tools/flip_server/spdy_util.h" | 15 #include "net/tools/flip_server/spdy_util.h" |
| 16 #include "net/tools/flip_server/url_utilities.h" | 16 #include "net/tools/flip_server/url_utilities.h" |
| 17 | 17 |
| 18 namespace net { | 18 namespace net { |
| 19 | 19 |
| 20 // static | 20 // static |
| 21 std::string SpdySM::forward_ip_header_; | 21 std::string SpdySM::forward_ip_header_; |
| 22 | 22 |
| 23 class SpdyFrameDataFrame : public DataFrame { | 23 class SpdyFrameDataFrame : public DataFrame { |
| 24 public: | 24 public: |
| 25 explicit SpdyFrameDataFrame(SpdyFrame* spdy_frame) : frame(spdy_frame) { | 25 explicit SpdyFrameDataFrame(SpdySerializedFrame* spdy_frame) |
| 26 : frame(spdy_frame) { |
| 26 data = spdy_frame->data(); | 27 data = spdy_frame->data(); |
| 27 size = spdy_frame->size(); | 28 size = spdy_frame->size(); |
| 28 } | 29 } |
| 29 | 30 |
| 30 ~SpdyFrameDataFrame() override { delete frame; } | 31 ~SpdyFrameDataFrame() override { delete frame; } |
| 31 | 32 |
| 32 const SpdyFrame* frame; | 33 const SpdySerializedFrame* frame; |
| 33 }; | 34 }; |
| 34 | 35 |
| 35 SpdySM::SpdySM(SMConnection* connection, | 36 SpdySM::SpdySM(SMConnection* connection, |
| 36 SMInterface* sm_http_interface, | 37 SMInterface* sm_http_interface, |
| 37 EpollServer* epoll_server, | 38 EpollServer* epoll_server, |
| 38 MemoryCache* memory_cache, | 39 MemoryCache* memory_cache, |
| 39 FlipAcceptor* acceptor, | 40 FlipAcceptor* acceptor, |
| 40 SpdyMajorVersion spdy_version) | 41 SpdyMajorVersion spdy_version) |
| 41 : buffered_spdy_framer_(new BufferedSpdyFramer(spdy_version)), | 42 : buffered_spdy_framer_(new BufferedSpdyFramer(spdy_version)), |
| 42 valid_spdy_session_(false), | 43 valid_spdy_session_(false), |
| (...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 337 next_outgoing_stream_id_ = 2; | 338 next_outgoing_stream_id_ = 2; |
| 338 } | 339 } |
| 339 | 340 |
| 340 // Send a settings frame | 341 // Send a settings frame |
| 341 int SpdySM::PostAcceptHook() { | 342 int SpdySM::PostAcceptHook() { |
| 342 // We should have buffered_spdy_framer_ set after reuse | 343 // We should have buffered_spdy_framer_ set after reuse |
| 343 DCHECK(buffered_spdy_framer_); | 344 DCHECK(buffered_spdy_framer_); |
| 344 SettingsMap settings; | 345 SettingsMap settings; |
| 345 settings[SETTINGS_MAX_CONCURRENT_STREAMS] = | 346 settings[SETTINGS_MAX_CONCURRENT_STREAMS] = |
| 346 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, 100); | 347 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, 100); |
| 347 SpdyFrame* settings_frame = buffered_spdy_framer_->CreateSettings(settings); | 348 SpdySerializedFrame* settings_frame = |
| 349 buffered_spdy_framer_->CreateSettings(settings); |
| 348 | 350 |
| 349 VLOG(1) << ACCEPTOR_CLIENT_IDENT << "Sending Settings Frame"; | 351 VLOG(1) << ACCEPTOR_CLIENT_IDENT << "Sending Settings Frame"; |
| 350 EnqueueDataFrame(new SpdyFrameDataFrame(settings_frame)); | 352 EnqueueDataFrame(new SpdyFrameDataFrame(settings_frame)); |
| 351 return 1; | 353 return 1; |
| 352 } | 354 } |
| 353 | 355 |
| 354 void SpdySM::NewStream(uint32_t stream_id, | 356 void SpdySM::NewStream(uint32_t stream_id, |
| 355 uint32_t priority, | 357 uint32_t priority, |
| 356 const std::string& filename) { | 358 const std::string& filename) { |
| 357 MemCacheIter mci; | 359 MemCacheIter mci; |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 460 block[":host"] = UrlUtilities::GetUrlPath(original_url); | 462 block[":host"] = UrlUtilities::GetUrlPath(original_url); |
| 461 } else { | 463 } else { |
| 462 block[":path"] = headers.request_uri().as_string(); | 464 block[":path"] = headers.request_uri().as_string(); |
| 463 if (block.find("host") != block.end()) { | 465 if (block.find("host") != block.end()) { |
| 464 block[":host"] = headers.GetHeader("Host").as_string(); | 466 block[":host"] = headers.GetHeader("Host").as_string(); |
| 465 block.erase("host"); | 467 block.erase("host"); |
| 466 } | 468 } |
| 467 } | 469 } |
| 468 | 470 |
| 469 DCHECK(buffered_spdy_framer_); | 471 DCHECK(buffered_spdy_framer_); |
| 470 SpdyFrame* fsrcf = buffered_spdy_framer_->CreateSynStream( | 472 SpdySerializedFrame* fsrcf = buffered_spdy_framer_->CreateSynStream( |
| 471 stream_id, 0, 0, CONTROL_FLAG_NONE, &block); | 473 stream_id, 0, 0, CONTROL_FLAG_NONE, &block); |
| 472 size_t df_size = fsrcf->size(); | 474 size_t df_size = fsrcf->size(); |
| 473 EnqueueDataFrame(new SpdyFrameDataFrame(fsrcf)); | 475 EnqueueDataFrame(new SpdyFrameDataFrame(fsrcf)); |
| 474 | 476 |
| 475 VLOG(2) << ACCEPTOR_CLIENT_IDENT << "SpdySM: Sending SynStreamheader " | 477 VLOG(2) << ACCEPTOR_CLIENT_IDENT << "SpdySM: Sending SynStreamheader " |
| 476 << stream_id; | 478 << stream_id; |
| 477 return df_size; | 479 return df_size; |
| 478 } | 480 } |
| 479 | 481 |
| 480 size_t SpdySM::SendSynReplyImpl(uint32_t stream_id, | 482 size_t SpdySM::SendSynReplyImpl(uint32_t stream_id, |
| 481 const BalsaHeaders& headers) { | 483 const BalsaHeaders& headers) { |
| 482 SpdyHeaderBlock block; | 484 SpdyHeaderBlock block; |
| 483 CopyHeaders(block, headers); | 485 CopyHeaders(block, headers); |
| 484 block[":status"] = headers.response_code().as_string() + " " + | 486 block[":status"] = headers.response_code().as_string() + " " + |
| 485 headers.response_reason_phrase().as_string(); | 487 headers.response_reason_phrase().as_string(); |
| 486 block[":version"] = headers.response_version().as_string(); | 488 block[":version"] = headers.response_version().as_string(); |
| 487 | 489 |
| 488 DCHECK(buffered_spdy_framer_); | 490 DCHECK(buffered_spdy_framer_); |
| 489 SpdyFrame* fsrcf = buffered_spdy_framer_->CreateSynReply( | 491 SpdySerializedFrame* fsrcf = buffered_spdy_framer_->CreateSynReply( |
| 490 stream_id, CONTROL_FLAG_NONE, &block); | 492 stream_id, CONTROL_FLAG_NONE, &block); |
| 491 size_t df_size = fsrcf->size(); | 493 size_t df_size = fsrcf->size(); |
| 492 EnqueueDataFrame(new SpdyFrameDataFrame(fsrcf)); | 494 EnqueueDataFrame(new SpdyFrameDataFrame(fsrcf)); |
| 493 | 495 |
| 494 VLOG(2) << ACCEPTOR_CLIENT_IDENT << "SpdySM: Sending SynReplyheader " | 496 VLOG(2) << ACCEPTOR_CLIENT_IDENT << "SpdySM: Sending SynReplyheader " |
| 495 << stream_id; | 497 << stream_id; |
| 496 return df_size; | 498 return df_size; |
| 497 } | 499 } |
| 498 | 500 |
| 499 void SpdySM::SendDataFrameImpl(uint32_t stream_id, | 501 void SpdySM::SendDataFrameImpl(uint32_t stream_id, |
| 500 const char* data, | 502 const char* data, |
| 501 int64_t len, | 503 int64_t len, |
| 502 SpdyDataFlags flags, | 504 SpdyDataFlags flags, |
| 503 bool compress) { | 505 bool compress) { |
| 504 DCHECK(buffered_spdy_framer_); | 506 DCHECK(buffered_spdy_framer_); |
| 505 // TODO(mbelshe): We can't compress here - before going into the | 507 // TODO(mbelshe): We can't compress here - before going into the |
| 506 // priority queue. Compression needs to be done | 508 // priority queue. Compression needs to be done |
| 507 // with late binding. | 509 // with late binding. |
| 508 if (len == 0) { | 510 if (len == 0) { |
| 509 SpdyFrame* fdf = | 511 SpdySerializedFrame* fdf = |
| 510 buffered_spdy_framer_->CreateDataFrame(stream_id, data, len, flags); | 512 buffered_spdy_framer_->CreateDataFrame(stream_id, data, len, flags); |
| 511 EnqueueDataFrame(new SpdyFrameDataFrame(fdf)); | 513 EnqueueDataFrame(new SpdyFrameDataFrame(fdf)); |
| 512 return; | 514 return; |
| 513 } | 515 } |
| 514 | 516 |
| 515 // Chop data frames into chunks so that one stream can't monopolize the | 517 // Chop data frames into chunks so that one stream can't monopolize the |
| 516 // output channel. | 518 // output channel. |
| 517 while (len > 0) { | 519 while (len > 0) { |
| 518 int64_t size = std::min(len, static_cast<int64_t>(kSpdySegmentSize)); | 520 int64_t size = std::min(len, static_cast<int64_t>(kSpdySegmentSize)); |
| 519 SpdyDataFlags chunk_flags = flags; | 521 SpdyDataFlags chunk_flags = flags; |
| 520 | 522 |
| 521 // If we chunked this block, and the FIN flag was set, there is more | 523 // If we chunked this block, and the FIN flag was set, there is more |
| 522 // data coming. So, remove the flag. | 524 // data coming. So, remove the flag. |
| 523 if ((size < len) && (flags & DATA_FLAG_FIN)) | 525 if ((size < len) && (flags & DATA_FLAG_FIN)) |
| 524 chunk_flags = static_cast<SpdyDataFlags>(chunk_flags & ~DATA_FLAG_FIN); | 526 chunk_flags = static_cast<SpdyDataFlags>(chunk_flags & ~DATA_FLAG_FIN); |
| 525 | 527 |
| 526 SpdyFrame* fdf = buffered_spdy_framer_->CreateDataFrame( | 528 SpdySerializedFrame* fdf = buffered_spdy_framer_->CreateDataFrame( |
| 527 stream_id, data, size, chunk_flags); | 529 stream_id, data, size, chunk_flags); |
| 528 EnqueueDataFrame(new SpdyFrameDataFrame(fdf)); | 530 EnqueueDataFrame(new SpdyFrameDataFrame(fdf)); |
| 529 | 531 |
| 530 VLOG(2) << ACCEPTOR_CLIENT_IDENT << "SpdySM: Sending data frame " | 532 VLOG(2) << ACCEPTOR_CLIENT_IDENT << "SpdySM: Sending data frame " |
| 531 << stream_id << " [" << size << "] shrunk to " | 533 << stream_id << " [" << size << "] shrunk to " |
| 532 << (fdf->size() - kSpdyOverhead) << ", flags=" << flags; | 534 << (fdf->size() - kSpdyOverhead) << ", flags=" << flags; |
| 533 | 535 |
| 534 data += size; | 536 data += size; |
| 535 len -= size; | 537 len -= size; |
| 536 } | 538 } |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 602 } | 604 } |
| 603 } | 605 } |
| 604 | 606 |
| 605 void SpdySM::CreateFramer(SpdyMajorVersion spdy_version) { | 607 void SpdySM::CreateFramer(SpdyMajorVersion spdy_version) { |
| 606 DCHECK(!buffered_spdy_framer_); | 608 DCHECK(!buffered_spdy_framer_); |
| 607 buffered_spdy_framer_.reset(new BufferedSpdyFramer(spdy_version)); | 609 buffered_spdy_framer_.reset(new BufferedSpdyFramer(spdy_version)); |
| 608 buffered_spdy_framer_->set_visitor(this); | 610 buffered_spdy_framer_->set_visitor(this); |
| 609 } | 611 } |
| 610 | 612 |
| 611 } // namespace net | 613 } // namespace net |
| OLD | NEW |