Index: net/tools/flip_server/http_interface.cc |
diff --git a/net/tools/flip_server/http_interface.cc b/net/tools/flip_server/http_interface.cc |
deleted file mode 100644 |
index 8d5e173878831a8112cad12a4c00c80110bcc692..0000000000000000000000000000000000000000 |
--- a/net/tools/flip_server/http_interface.cc |
+++ /dev/null |
@@ -1,343 +0,0 @@ |
-// Copyright (c) 2009 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/http_interface.h" |
- |
-#include "net/tools/balsa/balsa_frame.h" |
-#include "net/tools/flip_server/flip_config.h" |
-#include "net/tools/flip_server/sm_connection.h" |
-#include "net/tools/flip_server/spdy_util.h" |
-#include "net/tools/flip_server/url_utilities.h" |
- |
-namespace net { |
- |
-HttpSM::HttpSM(SMConnection* connection, |
- SMInterface* sm_spdy_interface, |
- MemoryCache* memory_cache, |
- FlipAcceptor* acceptor) |
- : http_framer_(new BalsaFrame), |
- stream_id_(0), |
- server_idx_(-1), |
- connection_(connection), |
- sm_spdy_interface_(sm_spdy_interface), |
- output_list_(connection->output_list()), |
- output_ordering_(connection), |
- memory_cache_(connection->memory_cache()), |
- acceptor_(acceptor) { |
- http_framer_->set_balsa_visitor(this); |
- http_framer_->set_balsa_headers(&headers_); |
- if (acceptor_->flip_handler_type_ == FLIP_HANDLER_PROXY) |
- http_framer_->set_is_request(false); |
-} |
-HttpSM::~HttpSM() { |
- Reset(); |
-} |
- |
-void HttpSM::ProcessBodyData(const char* input, size_t size) { |
- if (acceptor_->flip_handler_type_ == FLIP_HANDLER_PROXY) { |
- VLOG(2) << ACCEPTOR_CLIENT_IDENT << "HttpSM: Process Body Data: stream " |
- << stream_id_ << ": size " << size; |
- sm_spdy_interface_->SendDataFrame(stream_id_, input, size, 0, false); |
- } |
-} |
- |
-void HttpSM::ProcessHeaders(const BalsaHeaders& headers) { |
- if (acceptor_->flip_handler_type_ == FLIP_HANDLER_HTTP_SERVER) { |
- std::string host = |
- UrlUtilities::GetUrlHost(headers.GetHeader("Host").as_string()); |
- std::string method = headers.request_method().as_string(); |
- VLOG(1) << ACCEPTOR_CLIENT_IDENT |
- << "Received Request: " << headers.request_uri().as_string() << " " |
- << method; |
- std::string filename = |
- EncodeURL(headers.request_uri().as_string(), host, method); |
- NewStream(stream_id_, 0, filename); |
- stream_id_ += 2; |
- } else { |
- VLOG(1) << ACCEPTOR_CLIENT_IDENT << "HttpSM: Received Response from " |
- << connection_->server_ip_ << ":" << connection_->server_port_ |
- << " "; |
- sm_spdy_interface_->SendSynReply(stream_id_, headers); |
- } |
-} |
- |
-void HttpSM::MessageDone() { |
- if (acceptor_->flip_handler_type_ == FLIP_HANDLER_PROXY) { |
- VLOG(2) << ACCEPTOR_CLIENT_IDENT << "HttpSM: MessageDone. Sending EOF: " |
- << "stream " << stream_id_; |
- sm_spdy_interface_->SendEOF(stream_id_); |
- } else { |
- VLOG(2) << ACCEPTOR_CLIENT_IDENT << "HttpSM: MessageDone."; |
- } |
-} |
- |
-void HttpSM::HandleHeaderError(BalsaFrame* framer) { HandleError(); } |
- |
-void HttpSM::HandleChunkingError(BalsaFrame* framer) { HandleError(); } |
- |
-void HttpSM::HandleBodyError(BalsaFrame* framer) { HandleError(); } |
- |
-void HttpSM::HandleError() { |
- VLOG(1) << ACCEPTOR_CLIENT_IDENT << "Error detected"; |
-} |
- |
-void HttpSM::AddToOutputOrder(const MemCacheIter& mci) { |
- output_ordering_.AddToOutputOrder(mci); |
-} |
- |
-void HttpSM::InitSMInterface(SMInterface* sm_spdy_interface, |
- int32_t server_idx) { |
- sm_spdy_interface_ = sm_spdy_interface; |
- server_idx_ = server_idx; |
-} |
- |
-void HttpSM::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 << "HttpSM: Initializing server " |
- << "connection."; |
- connection_->InitSMConnection(connection_pool, |
- sm_interface, |
- epoll_server, |
- fd, |
- server_ip, |
- server_port, |
- remote_ip, |
- use_ssl); |
-} |
- |
-size_t HttpSM::ProcessReadInput(const char* data, size_t len) { |
- VLOG(2) << ACCEPTOR_CLIENT_IDENT << "HttpSM: Process read input: stream " |
- << stream_id_; |
- return http_framer_->ProcessInput(data, len); |
-} |
- |
-size_t HttpSM::ProcessWriteInput(const char* data, size_t len) { |
- VLOG(2) << ACCEPTOR_CLIENT_IDENT << "HttpSM: Process write input: size " |
- << len << ": stream " << stream_id_; |
- char* dataPtr = new char[len]; |
- memcpy(dataPtr, data, len); |
- DataFrame* data_frame = new DataFrame; |
- data_frame->data = dataPtr; |
- data_frame->size = len; |
- data_frame->delete_when_done = true; |
- connection_->EnqueueDataFrame(data_frame); |
- return len; |
-} |
- |
-bool HttpSM::MessageFullyRead() const { |
- return http_framer_->MessageFullyRead(); |
-} |
- |
-void HttpSM::SetStreamID(uint32_t stream_id) { |
- stream_id_ = stream_id; |
-} |
- |
-bool HttpSM::Error() const { return http_framer_->Error(); } |
- |
-const char* HttpSM::ErrorAsString() const { |
- return BalsaFrameEnums::ErrorCodeToString(http_framer_->ErrorCode()); |
-} |
- |
-void HttpSM::Reset() { |
- VLOG(1) << ACCEPTOR_CLIENT_IDENT << "HttpSM: Reset: stream " << stream_id_; |
- http_framer_->Reset(); |
-} |
- |
-void HttpSM::ResetForNewConnection() { |
- if (acceptor_->flip_handler_type_ == FLIP_HANDLER_PROXY) { |
- VLOG(1) << ACCEPTOR_CLIENT_IDENT << "HttpSM: Server connection closing " |
- << "to: " << connection_->server_ip_ << ":" |
- << connection_->server_port_ << " "; |
- } |
- // Message has not been fully read, either it is incomplete or the |
- // server is closing the connection to signal message end. |
- if (!MessageFullyRead()) { |
- VLOG(2) << "HTTP response closed before end of file detected. " |
- << "Sending EOF to spdy."; |
- sm_spdy_interface_->SendEOF(stream_id_); |
- } |
- output_ordering_.Reset(); |
- http_framer_->Reset(); |
- if (sm_spdy_interface_) { |
- sm_spdy_interface_->ResetForNewInterface(server_idx_); |
- } |
-} |
- |
-void HttpSM::Cleanup() { |
- if (!(acceptor_->flip_handler_type_ == FLIP_HANDLER_HTTP_SERVER)) { |
- VLOG(2) << "HttpSM Request Fully Read; stream_id: " << stream_id_; |
- connection_->Cleanup("request complete"); |
- } |
-} |
- |
-int HttpSM::PostAcceptHook() { return 1; } |
- |
-void HttpSM::NewStream(uint32_t stream_id, |
- uint32_t priority, |
- const std::string& filename) { |
- MemCacheIter mci; |
- mci.stream_id = stream_id; |
- mci.priority = priority; |
- if (!memory_cache_->AssignFileData(filename, &mci)) { |
- // error creating new stream. |
- VLOG(2) << ACCEPTOR_CLIENT_IDENT << "Sending ErrorNotFound"; |
- SendErrorNotFound(stream_id); |
- } else { |
- AddToOutputOrder(mci); |
- } |
-} |
- |
-void HttpSM::SendEOF(uint32_t stream_id) { |
- SendEOFImpl(stream_id); |
- if (acceptor_->flip_handler_type_ == FLIP_HANDLER_PROXY) { |
- sm_spdy_interface_->ResetForNewInterface(server_idx_); |
- } |
-} |
- |
-void HttpSM::SendErrorNotFound(uint32_t stream_id) { |
- SendErrorNotFoundImpl(stream_id); |
-} |
- |
-size_t HttpSM::SendSynStream(uint32_t stream_id, const BalsaHeaders& headers) { |
- return 0; |
-} |
- |
-size_t HttpSM::SendSynReply(uint32_t stream_id, const BalsaHeaders& headers) { |
- return SendSynReplyImpl(stream_id, headers); |
-} |
- |
-void HttpSM::SendDataFrame(uint32_t stream_id, |
- const char* data, |
- int64_t len, |
- uint32_t flags, |
- bool compress) { |
- SendDataFrameImpl(stream_id, data, len, flags, compress); |
-} |
- |
-void HttpSM::SendEOFImpl(uint32_t stream_id) { |
- DataFrame* df = new DataFrame; |
- df->data = "0\r\n\r\n"; |
- df->size = 5; |
- df->delete_when_done = false; |
- EnqueueDataFrame(df); |
- if (acceptor_->flip_handler_type_ == FLIP_HANDLER_HTTP_SERVER) { |
- Reset(); |
- } |
-} |
- |
-void HttpSM::SendErrorNotFoundImpl(uint32_t stream_id) { |
- BalsaHeaders my_headers; |
- my_headers.SetFirstlineFromStringPieces("HTTP/1.1", "404", "Not Found"); |
- my_headers.RemoveAllOfHeader("content-length"); |
- my_headers.AppendHeader("transfer-encoding", "chunked"); |
- SendSynReplyImpl(stream_id, my_headers); |
- SendDataFrame(stream_id, "page not found", 14, 0, false); |
- SendEOFImpl(stream_id); |
- output_ordering_.RemoveStreamId(stream_id); |
-} |
- |
-size_t HttpSM::SendSynReplyImpl(uint32_t stream_id, |
- const BalsaHeaders& headers) { |
- SimpleBuffer sb; |
- headers.WriteHeaderAndEndingToBuffer(&sb); |
- DataFrame* df = new DataFrame; |
- df->size = sb.ReadableBytes(); |
- char* buffer = new char[df->size]; |
- df->data = buffer; |
- df->delete_when_done = true; |
- sb.Read(buffer, df->size); |
- VLOG(2) << ACCEPTOR_CLIENT_IDENT << "Sending HTTP Reply header " |
- << stream_id_; |
- size_t df_size = df->size; |
- EnqueueDataFrame(df); |
- return df_size; |
-} |
- |
-size_t HttpSM::SendSynStreamImpl(uint32_t stream_id, |
- const BalsaHeaders& headers) { |
- SimpleBuffer sb; |
- headers.WriteHeaderAndEndingToBuffer(&sb); |
- DataFrame* df = new DataFrame; |
- df->size = sb.ReadableBytes(); |
- char* buffer = new char[df->size]; |
- df->data = buffer; |
- df->delete_when_done = true; |
- sb.Read(buffer, df->size); |
- VLOG(2) << ACCEPTOR_CLIENT_IDENT << "Sending HTTP Reply header " |
- << stream_id_; |
- size_t df_size = df->size; |
- EnqueueDataFrame(df); |
- return df_size; |
-} |
- |
-void HttpSM::SendDataFrameImpl(uint32_t stream_id, |
- const char* data, |
- int64_t len, |
- uint32_t flags, |
- bool compress) { |
- char chunk_buf[128]; |
- snprintf(chunk_buf, sizeof(chunk_buf), "%x\r\n", (unsigned int)len); |
- std::string chunk_description(chunk_buf); |
- DataFrame* df = new DataFrame; |
- df->size = chunk_description.size() + len + 2; |
- char* buffer = new char[df->size]; |
- df->data = buffer; |
- df->delete_when_done = true; |
- memcpy(buffer, chunk_description.data(), chunk_description.size()); |
- memcpy(buffer + chunk_description.size(), data, len); |
- memcpy(buffer + chunk_description.size() + len, "\r\n", 2); |
- EnqueueDataFrame(df); |
-} |
- |
-void HttpSM::EnqueueDataFrame(DataFrame* df) { |
- VLOG(2) << ACCEPTOR_CLIENT_IDENT << "HttpSM: Enqueue data frame: stream " |
- << stream_id_; |
- connection_->EnqueueDataFrame(df); |
-} |
- |
-void HttpSM::GetOutput() { |
- MemCacheIter* mci = output_ordering_.GetIter(); |
- if (mci == NULL) { |
- VLOG(2) << ACCEPTOR_CLIENT_IDENT << "HttpSM: GetOutput: nothing to " |
- << "output!?: stream " << stream_id_; |
- return; |
- } |
- if (!mci->transformed_header) { |
- mci->bytes_sent = |
- SendSynReply(mci->stream_id, *(mci->file_data->headers())); |
- mci->transformed_header = true; |
- VLOG(2) << ACCEPTOR_CLIENT_IDENT << "HttpSM: GetOutput transformed " |
- << "header stream_id: [" << mci->stream_id << "]"; |
- return; |
- } |
- if (mci->body_bytes_consumed >= mci->file_data->body().size()) { |
- SendEOF(mci->stream_id); |
- output_ordering_.RemoveStreamId(mci->stream_id); |
- VLOG(2) << ACCEPTOR_CLIENT_IDENT << "GetOutput remove_stream_id: [" |
- << 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; |
- |
- SendDataFrame(mci->stream_id, |
- mci->file_data->body().data() + mci->body_bytes_consumed, |
- num_to_write, |
- 0, |
- true); |
- VLOG(2) << ACCEPTOR_CLIENT_IDENT << "HttpSM: GetOutput SendDataFrame[" |
- << mci->stream_id << "]: " << num_to_write; |
- mci->body_bytes_consumed += num_to_write; |
- mci->bytes_sent += num_to_write; |
-} |
- |
-} // namespace net |