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

Unified Diff: net/tools/flip_server/spdy_interface.cc

Issue 2169503002: Remove flip_server. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 5 months 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/tools/flip_server/spdy_interface.h ('k') | net/tools/flip_server/spdy_interface_test.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/tools/flip_server/spdy_interface.cc
diff --git a/net/tools/flip_server/spdy_interface.cc b/net/tools/flip_server/spdy_interface.cc
deleted file mode 100644
index 10cf7d4fb6f984a80cb56fe8a4cb57d94ce40e88..0000000000000000000000000000000000000000
--- a/net/tools/flip_server/spdy_interface.cc
+++ /dev/null
@@ -1,571 +0,0 @@
-// Copyright (c) 2012 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.
-
-#include "net/tools/flip_server/spdy_interface.h"
-
-#include <algorithm>
-#include <string>
-#include <utility>
-
-#include "net/spdy/spdy_framer.h"
-#include "net/spdy/spdy_protocol.h"
-#include "net/tools/flip_server/constants.h"
-#include "net/tools/flip_server/flip_config.h"
-#include "net/tools/flip_server/http_interface.h"
-#include "net/tools/flip_server/spdy_util.h"
-#include "net/tools/flip_server/url_utilities.h"
-
-namespace net {
-
-// static
-std::string SpdySM::forward_ip_header_;
-
-class SpdyFrameDataFrame : public DataFrame {
- public:
- explicit SpdyFrameDataFrame(SpdySerializedFrame* spdy_frame)
- : frame(spdy_frame) {
- data = spdy_frame->data();
- size = spdy_frame->size();
- }
-
- ~SpdyFrameDataFrame() override { delete frame; }
-
- const SpdySerializedFrame* frame;
-};
-
-SpdySM::SpdySM(SMConnection* connection,
- SMInterface* sm_http_interface,
- EpollServer* epoll_server,
- MemoryCache* memory_cache,
- FlipAcceptor* acceptor)
- : buffered_spdy_framer_(new BufferedSpdyFramer()),
- valid_spdy_session_(false),
- connection_(connection),
- client_output_list_(connection->output_list()),
- client_output_ordering_(connection),
- next_outgoing_stream_id_(2),
- epoll_server_(epoll_server),
- acceptor_(acceptor),
- memory_cache_(memory_cache),
- close_on_error_(false) {
- buffered_spdy_framer_->set_visitor(this);
-}
-
-SpdySM::~SpdySM() { }
-
-void SpdySM::InitSMConnection(SMConnectionPoolInterface* connection_pool,
- SMInterface* sm_interface,
- EpollServer* epoll_server,
- int fd,
- std::string server_ip,
- std::string server_port,
- std::string remote_ip,
- bool use_ssl) {
- VLOG(2) << ACCEPTOR_CLIENT_IDENT << "SpdySM: Initializing server connection.";
- connection_->InitSMConnection(connection_pool,
- sm_interface,
- epoll_server,
- fd,
- server_ip,
- server_port,
- remote_ip,
- use_ssl);
-}
-
-SMInterface* SpdySM::NewConnectionInterface() {
- SMConnection* server_connection =
- SMConnection::NewSMConnection(epoll_server_,
- NULL,
- memory_cache_,
- acceptor_,
- "http_conn: ");
- if (server_connection == NULL) {
- LOG(ERROR) << "SpdySM: Could not create server connection";
- return NULL;
- }
- VLOG(2) << ACCEPTOR_CLIENT_IDENT << "SpdySM: Creating new HTTP interface";
- SMInterface* sm_http_interface =
- new HttpSM(server_connection, this, memory_cache_, acceptor_);
- return sm_http_interface;
-}
-
-SMInterface* SpdySM::FindOrMakeNewSMConnectionInterface(
- const std::string& server_ip,
- const std::string& server_port) {
- SMInterface* sm_http_interface;
- int32_t server_idx;
- if (unused_server_interface_list.empty()) {
- sm_http_interface = NewConnectionInterface();
- server_idx = server_interface_list.size();
- server_interface_list.push_back(sm_http_interface);
- VLOG(2) << ACCEPTOR_CLIENT_IDENT
- << "SpdySM: Making new server connection on index: " << server_idx;
- } else {
- server_idx = unused_server_interface_list.back();
- unused_server_interface_list.pop_back();
- sm_http_interface = server_interface_list.at(server_idx);
- VLOG(2) << ACCEPTOR_CLIENT_IDENT << "SpdySM: Reusing connection on "
- << "index: " << server_idx;
- }
-
- sm_http_interface->InitSMInterface(this, server_idx);
- sm_http_interface->InitSMConnection(NULL,
- sm_http_interface,
- epoll_server_,
- -1,
- server_ip,
- server_port,
- std::string(),
- false);
-
- return sm_http_interface;
-}
-
-int SpdySM::SpdyHandleNewStream(SpdyStreamId stream_id,
- SpdyPriority priority,
- const SpdyHeaderBlock& headers,
- std::string& http_data,
- bool* is_https_scheme) {
- *is_https_scheme = false;
- VLOG(2) << ACCEPTOR_CLIENT_IDENT << "SpdySM: OnSyn(" << stream_id << ")";
- VLOG(2) << ACCEPTOR_CLIENT_IDENT << "SpdySM: # headers: " << headers.size();
-
- SpdyHeaderBlock::const_iterator method = headers.end();
- SpdyHeaderBlock::const_iterator host = headers.end();
- SpdyHeaderBlock::const_iterator path = headers.end();
- SpdyHeaderBlock::const_iterator scheme = headers.end();
- SpdyHeaderBlock::const_iterator version = headers.end();
- SpdyHeaderBlock::const_iterator url = headers.end();
-
- std::string path_string, host_string, version_string;
-
- method = headers.find(":method");
- host = headers.find(":host");
- path = headers.find(":path");
- scheme = headers.find(":scheme");
- if (method == headers.end() || host == headers.end() ||
- path == headers.end() || scheme == headers.end()) {
- VLOG(2) << ACCEPTOR_CLIENT_IDENT << "SpdySM: A mandatory header is "
- << "missing. Not creating stream";
- return 0;
- }
- host_string = host->second.as_string();
- path_string = path->second.as_string();
- version_string = "HTTP/1.1";
-
- if (scheme->second.compare("https") == 0) {
- *is_https_scheme = true;
- }
-
- if (acceptor_->flip_handler_type_ == FLIP_HANDLER_SPDY_SERVER) {
- VLOG(1) << ACCEPTOR_CLIENT_IDENT << "Request: " << method->second
- << " " << path_string;
- std::string filename =
- EncodeURL(path_string, host_string, method->second.as_string());
- NewStream(stream_id, priority, filename);
- } else {
- http_data += method->second.as_string() + " " + path_string + " " +
- version_string + "\r\n";
- VLOG(1) << ACCEPTOR_CLIENT_IDENT << "Request: " << method->second << " "
- << path_string << " " << version_string;
- http_data += "Host: " + (*is_https_scheme ?
- acceptor_->https_server_ip_ :
- acceptor_->http_server_ip_) + "\r\n";
- for (SpdyHeaderBlock::const_iterator i = headers.begin();
- i != headers.end(); ++i) {
- if ((i->first.size() > 0 && i->first[0] == ':') ||
- i->first == "host" ||
- i == method ||
- i == host ||
- i == path ||
- i == scheme ||
- i == version ||
- i == url) {
- // Ignore the entry.
- } else {
- http_data +=
- i->first.as_string() + ": " + i->second.as_string() + "\r\n";
- VLOG(2) << ACCEPTOR_CLIENT_IDENT << i->first << ":" << i->second;
- }
- }
- if (forward_ip_header_.length()) {
- // X-Client-Cluster-IP header
- http_data += forward_ip_header_ + ": " +
- connection_->client_ip() + "\r\n";
- }
- http_data += "\r\n";
- }
-
- VLOG(3) << ACCEPTOR_CLIENT_IDENT << "SpdySM: HTTP Request:\n" << http_data;
- return 1;
-}
-
-void SpdySM::OnStreamFrameData(SpdyStreamId stream_id,
- const char* data,
- size_t len) {
- VLOG(2) << ACCEPTOR_CLIENT_IDENT << "SpdySM: StreamData(" << stream_id
- << ", [" << len << "])";
- StreamToSmif::iterator it = stream_to_smif_.find(stream_id);
- if (it == stream_to_smif_.end()) {
- VLOG(2) << "Dropping frame from unknown stream " << stream_id;
- if (!valid_spdy_session_)
- close_on_error_ = true;
- return;
- }
-
- SMInterface* interface = it->second;
- if (acceptor_->flip_handler_type_ == FLIP_HANDLER_PROXY)
- interface->ProcessWriteInput(data, len);
-}
-
-void SpdySM::OnStreamEnd(SpdyStreamId stream_id) {
- VLOG(2) << ACCEPTOR_CLIENT_IDENT << "SpdySM: StreamEnd(" << stream_id << ")";
- StreamToSmif::iterator it = stream_to_smif_.find(stream_id);
- if (it == stream_to_smif_.end()) {
- VLOG(2) << "Dropping frame from unknown stream " << stream_id;
- if (!valid_spdy_session_)
- close_on_error_ = true;
- return;
- }
-
- SMInterface* interface = it->second;
- if (acceptor_->flip_handler_type_ == FLIP_HANDLER_PROXY)
- interface->ProcessWriteInput(nullptr, 0);
-}
-
-void SpdySM::OnStreamPadding(SpdyStreamId stream_id, size_t len) {
- VLOG(2) << ACCEPTOR_CLIENT_IDENT << "SpdySM: StreamPadding(" << stream_id
- << ", [" << len << "])";
-}
-
-void SpdySM::OnHeaders(SpdyStreamId stream_id,
- bool has_priority,
- int weight,
- SpdyStreamId parent_stream_id,
- bool exclusive,
- bool fin,
- const SpdyHeaderBlock& headers) {
- VLOG(2) << ACCEPTOR_CLIENT_IDENT << "SpdySM: OnHeaders(" << stream_id << ")";
-}
-
-void SpdySM::OnRstStream(SpdyStreamId stream_id, SpdyRstStreamStatus status) {
- VLOG(2) << ACCEPTOR_CLIENT_IDENT << "SpdySM: OnRstStream(" << stream_id
- << ")";
- client_output_ordering_.RemoveStreamId(stream_id);
-}
-
-bool SpdySM::OnUnknownFrame(SpdyStreamId stream_id, int frame_type) {
- return false;
-}
-
-size_t SpdySM::ProcessReadInput(const char* data, size_t len) {
- DCHECK(buffered_spdy_framer_);
- return buffered_spdy_framer_->ProcessInput(data, len);
-}
-
-size_t SpdySM::ProcessWriteInput(const char* data, size_t len) { return 0; }
-
-bool SpdySM::MessageFullyRead() const {
- DCHECK(buffered_spdy_framer_);
- return buffered_spdy_framer_->MessageFullyRead();
-}
-
-bool SpdySM::Error() const {
- DCHECK(buffered_spdy_framer_);
- return close_on_error_ || buffered_spdy_framer_->HasError();
-}
-
-const char* SpdySM::ErrorAsString() const {
- DCHECK(Error());
- DCHECK(buffered_spdy_framer_);
- return SpdyFramer::ErrorCodeToString(buffered_spdy_framer_->error_code());
-}
-
-void SpdySM::ResetForNewInterface(int32_t server_idx) {
- VLOG(2) << ACCEPTOR_CLIENT_IDENT << "SpdySM: Reset for new interface: "
- << "server_idx: " << server_idx;
- unused_server_interface_list.push_back(server_idx);
-}
-
-void SpdySM::ResetForNewConnection() {
- // seq_num is not cleared, intentionally.
- buffered_spdy_framer_.reset();
- valid_spdy_session_ = false;
- client_output_ordering_.Reset();
- next_outgoing_stream_id_ = 2;
-}
-
-// Send a settings frame
-int SpdySM::PostAcceptHook() {
- // We should have buffered_spdy_framer_ set after reuse
- DCHECK(buffered_spdy_framer_);
- SettingsMap settings;
- settings[SETTINGS_MAX_CONCURRENT_STREAMS] =
- SettingsFlagsAndValue(SETTINGS_FLAG_NONE, 100);
- SpdySerializedFrame* settings_frame =
- buffered_spdy_framer_->CreateSettings(settings);
-
- VLOG(1) << ACCEPTOR_CLIENT_IDENT << "Sending Settings Frame";
- EnqueueDataFrame(new SpdyFrameDataFrame(settings_frame));
- return 1;
-}
-
-void SpdySM::NewStream(uint32_t stream_id,
- uint32_t priority,
- const std::string& filename) {
- MemCacheIter mci;
- mci.stream_id = stream_id;
- mci.priority = priority;
- // TODO(yhirano): The program will crash when
- // acceptor_->flip_handler_type_ != FLIP_HANDLER_SPDY_SERVER.
- // It should be fixed or an assertion should be placed.
- if (acceptor_->flip_handler_type_ == FLIP_HANDLER_SPDY_SERVER) {
- if (!memory_cache_->AssignFileData(filename, &mci)) {
- // error creating new stream.
- VLOG(1) << ACCEPTOR_CLIENT_IDENT << "Sending ErrorNotFound";
- SendErrorNotFound(stream_id);
- } else {
- AddToOutputOrder(mci);
- }
- } else {
- AddToOutputOrder(mci);
- }
-}
-
-void SpdySM::AddToOutputOrder(const MemCacheIter& mci) {
- client_output_ordering_.AddToOutputOrder(mci);
-}
-
-void SpdySM::SendEOF(uint32_t stream_id) {
- SendEOFImpl(stream_id);
-}
-
-void SpdySM::SendErrorNotFound(uint32_t stream_id) {
- SendErrorNotFoundImpl(stream_id);
-}
-
-size_t SpdySM::SendSynStream(uint32_t stream_id, const BalsaHeaders& headers) {
- return SendSynStreamImpl(stream_id, headers);
-}
-
-size_t SpdySM::SendSynReply(uint32_t stream_id, const BalsaHeaders& headers) {
- return SendSynReplyImpl(stream_id, headers);
-}
-
-void SpdySM::SendDataFrame(uint32_t stream_id,
- const char* data,
- int64_t len,
- uint32_t flags,
- bool compress) {
- SpdyDataFlags spdy_flags = static_cast<SpdyDataFlags>(flags);
- SendDataFrameImpl(stream_id, data, len, spdy_flags, compress);
-}
-
-void SpdySM::SendEOFImpl(uint32_t stream_id) {
- SendDataFrame(stream_id, NULL, 0, DATA_FLAG_FIN, false);
- VLOG(2) << ACCEPTOR_CLIENT_IDENT << "SpdySM: Sending EOF: " << stream_id;
- KillStream(stream_id);
- stream_to_smif_.erase(stream_id);
-}
-
-void SpdySM::SendErrorNotFoundImpl(uint32_t stream_id) {
- BalsaHeaders my_headers;
- my_headers.SetFirstlineFromStringPieces("HTTP/1.1", "404", "Not Found");
- SendSynReplyImpl(stream_id, my_headers);
- SendDataFrame(stream_id, "wtf?", 4, DATA_FLAG_FIN, false);
- client_output_ordering_.RemoveStreamId(stream_id);
-}
-
-void SpdySM::KillStream(uint32_t stream_id) {
- client_output_ordering_.RemoveStreamId(stream_id);
-}
-
-void SpdySM::CopyHeaders(SpdyHeaderBlock& dest, const BalsaHeaders& headers) {
- for (BalsaHeaders::const_header_lines_iterator hi =
- headers.header_lines_begin();
- hi != headers.header_lines_end();
- ++hi) {
- // It is illegal to send SPDY headers with empty value or header
- // names.
- if (!hi->first.length() || !hi->second.length())
- continue;
-
- // Key must be all lower case in SPDY headers.
- std::string key = hi->first.as_string();
- std::transform(key.begin(), key.end(), key.begin(), ::tolower);
- SpdyHeaderBlock::iterator fhi = dest.find(key);
- if (fhi == dest.end()) {
- dest[key] = hi->second.as_string();
- } else {
- dest[key] = (std::string(fhi->second.data(), fhi->second.size()) + "\0" +
- std::string(hi->second.data(), hi->second.size()));
- }
- }
-
- // These headers have no value
- dest.erase("X-Associated-Content"); // TODO(mbelshe): case-sensitive
- dest.erase("X-Original-Url"); // TODO(mbelshe): case-sensitive
-}
-
-size_t SpdySM::SendSynStreamImpl(uint32_t stream_id,
- const BalsaHeaders& headers) {
- SpdyHeaderBlock block;
- CopyHeaders(block, headers);
- block[":method"] = headers.request_method().as_string();
- block[":version"] = headers.request_version().as_string();
- if (headers.HasHeader("X-Original-Url")) {
- std::string original_url = headers.GetHeader("X-Original-Url").as_string();
- block[":path"] = UrlUtilities::GetUrlPath(original_url);
- block[":host"] = UrlUtilities::GetUrlPath(original_url);
- } else {
- block[":path"] = headers.request_uri().as_string();
- if (block.find("host") != block.end()) {
- block[":host"] = headers.GetHeader("Host").as_string();
- block.erase("host");
- }
- }
-
- DCHECK(buffered_spdy_framer_);
- SpdySerializedFrame* fsrcf = buffered_spdy_framer_->CreateSynStream(
- stream_id, 0, 0, CONTROL_FLAG_NONE, std::move(block));
- size_t df_size = fsrcf->size();
- EnqueueDataFrame(new SpdyFrameDataFrame(fsrcf));
-
- VLOG(2) << ACCEPTOR_CLIENT_IDENT << "SpdySM: Sending SynStreamheader "
- << stream_id;
- return df_size;
-}
-
-size_t SpdySM::SendSynReplyImpl(uint32_t stream_id,
- const BalsaHeaders& headers) {
- SpdyHeaderBlock block;
- CopyHeaders(block, headers);
- block[":status"] = headers.response_code().as_string() + " " +
- headers.response_reason_phrase().as_string();
- block[":version"] = headers.response_version().as_string();
-
- DCHECK(buffered_spdy_framer_);
- SpdySerializedFrame* fsrcf = buffered_spdy_framer_->CreateSynReply(
- stream_id, CONTROL_FLAG_NONE, std::move(block));
- size_t df_size = fsrcf->size();
- EnqueueDataFrame(new SpdyFrameDataFrame(fsrcf));
-
- VLOG(2) << ACCEPTOR_CLIENT_IDENT << "SpdySM: Sending SynReplyheader "
- << stream_id;
- return df_size;
-}
-
-void SpdySM::SendDataFrameImpl(uint32_t stream_id,
- const char* data,
- int64_t len,
- SpdyDataFlags flags,
- bool compress) {
- DCHECK(buffered_spdy_framer_);
- // TODO(mbelshe): We can't compress here - before going into the
- // priority queue. Compression needs to be done
- // with late binding.
- if (len == 0) {
- SpdySerializedFrame* fdf =
- buffered_spdy_framer_->CreateDataFrame(stream_id, data, len, flags);
- EnqueueDataFrame(new SpdyFrameDataFrame(fdf));
- return;
- }
-
- // Chop data frames into chunks so that one stream can't monopolize the
- // output channel.
- while (len > 0) {
- int64_t size = std::min(len, static_cast<int64_t>(kSpdySegmentSize));
- SpdyDataFlags chunk_flags = flags;
-
- // If we chunked this block, and the FIN flag was set, there is more
- // data coming. So, remove the flag.
- if ((size < len) && (flags & DATA_FLAG_FIN))
- chunk_flags = static_cast<SpdyDataFlags>(chunk_flags & ~DATA_FLAG_FIN);
-
- SpdySerializedFrame* fdf = buffered_spdy_framer_->CreateDataFrame(
- stream_id, data, size, chunk_flags);
- EnqueueDataFrame(new SpdyFrameDataFrame(fdf));
-
- VLOG(2) << ACCEPTOR_CLIENT_IDENT << "SpdySM: Sending data frame "
- << stream_id << " [" << size << "] shrunk to "
- << (fdf->size() - kSpdyOverhead) << ", flags=" << flags;
-
- data += size;
- len -= size;
- }
-}
-
-void SpdySM::EnqueueDataFrame(DataFrame* df) {
- connection_->EnqueueDataFrame(df);
-}
-
-void SpdySM::GetOutput() {
- while (client_output_list_->size() < 2) {
- MemCacheIter* mci = client_output_ordering_.GetIter();
- if (mci == NULL) {
- VLOG(2) << ACCEPTOR_CLIENT_IDENT
- << "SpdySM: GetOutput: nothing to output!?";
- return;
- }
- if (!mci->transformed_header) {
- mci->transformed_header = true;
- VLOG(2) << ACCEPTOR_CLIENT_IDENT << "SpdySM: GetOutput transformed "
- << "header stream_id: [" << mci->stream_id << "]";
- if ((mci->stream_id % 2) == 0) {
- // this is a server initiated stream.
- // Ideally, we'd do a 'syn-push' here, instead of a syn-reply.
- BalsaHeaders headers;
- headers.CopyFrom(*(mci->file_data->headers()));
- headers.ReplaceOrAppendHeader("status", "200");
- headers.ReplaceOrAppendHeader("version", "http/1.1");
- headers.SetRequestFirstlineFromStringPieces(
- "PUSH", mci->file_data->filename(), "");
- mci->bytes_sent = SendSynStream(mci->stream_id, headers);
- } else {
- BalsaHeaders headers;
- headers.CopyFrom(*(mci->file_data->headers()));
- mci->bytes_sent = SendSynReply(mci->stream_id, headers);
- }
- return;
- }
- if (mci->body_bytes_consumed >= mci->file_data->body().size()) {
- VLOG(2) << ACCEPTOR_CLIENT_IDENT << "SpdySM: GetOutput "
- << "remove_stream_id: [" << mci->stream_id << "]";
- SendEOF(mci->stream_id);
- return;
- }
- size_t num_to_write =
- mci->file_data->body().size() - mci->body_bytes_consumed;
- if (num_to_write > mci->max_segment_size)
- num_to_write = mci->max_segment_size;
-
- bool should_compress = false;
- if (!mci->file_data->headers()->HasHeader("content-encoding")) {
- if (mci->file_data->headers()->HasHeader("content-type")) {
- std::string content_type =
- mci->file_data->headers()->GetHeader("content-type").as_string();
- if (content_type.find("image") == content_type.npos)
- should_compress = true;
- }
- }
-
- SendDataFrame(mci->stream_id,
- mci->file_data->body().data() + mci->body_bytes_consumed,
- num_to_write,
- 0,
- should_compress);
- VLOG(2) << ACCEPTOR_CLIENT_IDENT << "SpdySM: GetOutput SendDataFrame["
- << mci->stream_id << "]: " << num_to_write;
- mci->body_bytes_consumed += num_to_write;
- mci->bytes_sent += num_to_write;
- }
-}
-
-void SpdySM::CreateFramer() {
- DCHECK(!buffered_spdy_framer_);
- buffered_spdy_framer_.reset(new BufferedSpdyFramer());
- buffered_spdy_framer_->set_visitor(this);
-}
-
-} // namespace net
« no previous file with comments | « net/tools/flip_server/spdy_interface.h ('k') | net/tools/flip_server/spdy_interface_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698