summaryrefslogtreecommitdiff
path: root/chromium/net/tools/flip_server/streamer_interface.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/net/tools/flip_server/streamer_interface.cc')
-rw-r--r--chromium/net/tools/flip_server/streamer_interface.cc207
1 files changed, 207 insertions, 0 deletions
diff --git a/chromium/net/tools/flip_server/streamer_interface.cc b/chromium/net/tools/flip_server/streamer_interface.cc
new file mode 100644
index 00000000000..b1612e73321
--- /dev/null
+++ b/chromium/net/tools/flip_server/streamer_interface.cc
@@ -0,0 +1,207 @@
+// 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/streamer_interface.h"
+
+#include <string>
+
+#include "net/tools/flip_server/balsa_frame.h"
+#include "net/tools/flip_server/constants.h"
+#include "net/tools/flip_server/flip_config.h"
+#include "net/tools/flip_server/sm_connection.h"
+
+namespace net {
+
+std::string StreamerSM::forward_ip_header_;
+
+StreamerSM::StreamerSM(SMConnection* connection,
+ SMInterface* sm_other_interface,
+ EpollServer* epoll_server,
+ FlipAcceptor* acceptor)
+ : connection_(connection),
+ sm_other_interface_(sm_other_interface),
+ epoll_server_(epoll_server),
+ acceptor_(acceptor),
+ is_request_(false),
+ http_framer_(new BalsaFrame) {
+ VLOG(2) << ACCEPTOR_CLIENT_IDENT << "Creating StreamerSM object";
+ http_framer_->set_balsa_visitor(this);
+ http_framer_->set_balsa_headers(&headers_);
+ http_framer_->set_is_request(false);
+}
+
+StreamerSM::~StreamerSM() {
+ VLOG(1) << ACCEPTOR_CLIENT_IDENT << "Destroying StreamerSM object";
+ Reset();
+ delete http_framer_;
+}
+
+void StreamerSM::set_is_request() {
+ is_request_ = true;
+ http_framer_->set_is_request(true);
+}
+
+void StreamerSM::InitSMInterface(SMInterface* sm_other_interface,
+ int32 server_idx) {
+ sm_other_interface_ = sm_other_interface;
+}
+
+void StreamerSM::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 << "StreamerSM: Initializing server "
+ << "connection.";
+ connection_->InitSMConnection(connection_pool, sm_interface,
+ epoll_server, fd, server_ip,
+ server_port, remote_ip, use_ssl);
+}
+
+size_t StreamerSM::ProcessReadInput(const char* data, size_t len) {
+ // For now we only want to parse http requests. Just stream responses
+ if (is_request_) {
+ return http_framer_->ProcessInput(data, len);
+ } else {
+ return sm_other_interface_->ProcessWriteInput(data, len);
+ }
+}
+
+size_t StreamerSM::ProcessWriteInput(const char* data, size_t len) {
+ char * dataPtr = new char[len];
+ memcpy(dataPtr, data, len);
+ DataFrame* df = new DataFrame;
+ df->data = (const char *)dataPtr;
+ df->size = len;
+ df->delete_when_done = true;
+ connection_->EnqueueDataFrame(df);
+ return len;
+}
+
+bool StreamerSM::Error() const {
+ return false;
+}
+
+const char* StreamerSM::ErrorAsString() const {
+ return "(none)";
+}
+
+bool StreamerSM::MessageFullyRead() const {
+ if (is_request_) {
+ return http_framer_->MessageFullyRead();
+ } else {
+ return false;
+ }
+}
+
+void StreamerSM::Reset() {
+ VLOG(1) << ACCEPTOR_CLIENT_IDENT << "StreamerSM: Reset";
+ connection_->Cleanup("Server Reset");
+ http_framer_->Reset();
+}
+
+void StreamerSM::ResetForNewConnection() {
+ http_framer_->Reset();
+ sm_other_interface_->Reset();
+}
+
+void StreamerSM::Cleanup() {
+ if (is_request_)
+ http_framer_->Reset();
+}
+
+int StreamerSM::PostAcceptHook() {
+ if (!sm_other_interface_) {
+ SMConnection *server_connection =
+ SMConnection::NewSMConnection(epoll_server_, NULL, NULL,
+ acceptor_, "server_conn: ");
+ if (server_connection == NULL) {
+ LOG(ERROR) << "StreamerSM: Could not create server conenction.";
+ return 0;
+ }
+ VLOG(2) << ACCEPTOR_CLIENT_IDENT << "StreamerSM: Creating new server "
+ << "connection.";
+ sm_other_interface_ = new StreamerSM(server_connection, this,
+ epoll_server_, acceptor_);
+ sm_other_interface_->InitSMInterface(this, 0);
+ }
+ // The Streamer interface is used to stream HTTPS connections, so we
+ // will always use the https_server_ip/port here.
+ sm_other_interface_->InitSMConnection(NULL,
+ sm_other_interface_,
+ epoll_server_,
+ -1,
+ acceptor_->https_server_ip_,
+ acceptor_->https_server_port_,
+ std::string(),
+ false);
+
+ return 1;
+}
+
+size_t StreamerSM::SendSynStream(uint32 stream_id,
+ const BalsaHeaders& headers) {
+ return 0;
+}
+
+size_t StreamerSM::SendSynReply(uint32 stream_id, const BalsaHeaders& headers) {
+ return 0;
+}
+
+void StreamerSM::ProcessBodyInput(const char *input, size_t size) {
+ VLOG(2) << ACCEPTOR_CLIENT_IDENT
+ << "StreamerHttpSM: Process Body Input Data: "
+ << "size " << size;
+ sm_other_interface_->ProcessWriteInput(input, size);
+}
+
+void StreamerSM::MessageDone() {
+ if (acceptor_->flip_handler_type_ == FLIP_HANDLER_PROXY) {
+ VLOG(2) << ACCEPTOR_CLIENT_IDENT << "StreamerHttpSM: MessageDone.";
+ // TODO(kelindsay): anything need to be done ehre?
+ } else {
+ VLOG(2) << ACCEPTOR_CLIENT_IDENT << "StraemerHttpSM: MessageDone.";
+ }
+}
+
+void StreamerSM::ProcessHeaders(const BalsaHeaders& headers) {
+ VLOG(2) << ACCEPTOR_CLIENT_IDENT << "HttpStreamerSM: Process Headers";
+ BalsaHeaders mod_headers;
+ mod_headers.CopyFrom(headers);
+ if (forward_ip_header_.length()) {
+ LOG(INFO) << "Adding forward header: " << forward_ip_header_;
+ mod_headers.ReplaceOrAppendHeader(forward_ip_header_,
+ connection_->client_ip());
+ } else {
+ LOG(INFO) << "NOT adding forward header.";
+ }
+ SimpleBuffer sb;
+ char* buffer;
+ int size;
+ mod_headers.WriteHeaderAndEndingToBuffer(&sb);
+ sb.GetReadablePtr(&buffer, &size);
+ sm_other_interface_->ProcessWriteInput(buffer, size);
+}
+
+void StreamerSM::HandleHeaderError(BalsaFrame* framer) {
+ HandleError();
+}
+
+void StreamerSM::HandleChunkingError(BalsaFrame* framer) {
+ HandleError();
+}
+
+void StreamerSM::HandleBodyError(BalsaFrame* framer) {
+ HandleError();
+}
+
+void StreamerSM::HandleError() {
+ VLOG(1) << ACCEPTOR_CLIENT_IDENT << "Error detected";
+}
+
+} // namespace net
+