Pin Chrome's shortcut to the Win10 Start menu on install and OS upgrade.
[chromium-blink-merge.git] / net / tools / flip_server / streamer_interface.cc
blob25a496497ba5eafd3e2fe8d2d4aafeecd005a4df
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "net/tools/flip_server/streamer_interface.h"
7 #include <string>
9 #include "net/tools/balsa/balsa_frame.h"
10 #include "net/tools/flip_server/constants.h"
11 #include "net/tools/flip_server/flip_config.h"
12 #include "net/tools/flip_server/sm_connection.h"
14 namespace net {
16 std::string StreamerSM::forward_ip_header_;
18 StreamerSM::StreamerSM(SMConnection* connection,
19 SMInterface* sm_other_interface,
20 EpollServer* epoll_server,
21 FlipAcceptor* acceptor)
22 : connection_(connection),
23 sm_other_interface_(sm_other_interface),
24 epoll_server_(epoll_server),
25 acceptor_(acceptor),
26 is_request_(false),
27 http_framer_(new BalsaFrame) {
28 VLOG(2) << ACCEPTOR_CLIENT_IDENT << "Creating StreamerSM object";
29 http_framer_->set_balsa_visitor(this);
30 http_framer_->set_balsa_headers(&headers_);
31 http_framer_->set_is_request(false);
34 StreamerSM::~StreamerSM() {
35 VLOG(1) << ACCEPTOR_CLIENT_IDENT << "Destroying StreamerSM object";
36 Reset();
37 delete http_framer_;
40 void StreamerSM::set_is_request() {
41 is_request_ = true;
42 http_framer_->set_is_request(true);
45 void StreamerSM::InitSMInterface(SMInterface* sm_other_interface,
46 int32 server_idx) {
47 sm_other_interface_ = sm_other_interface;
50 void StreamerSM::InitSMConnection(SMConnectionPoolInterface* connection_pool,
51 SMInterface* sm_interface,
52 EpollServer* epoll_server,
53 int fd,
54 std::string server_ip,
55 std::string server_port,
56 std::string remote_ip,
57 bool use_ssl) {
58 VLOG(2) << ACCEPTOR_CLIENT_IDENT << "StreamerSM: Initializing server "
59 << "connection.";
60 connection_->InitSMConnection(connection_pool,
61 sm_interface,
62 epoll_server,
63 fd,
64 server_ip,
65 server_port,
66 remote_ip,
67 use_ssl);
70 size_t StreamerSM::ProcessReadInput(const char* data, size_t len) {
71 // For now we only want to parse http requests. Just stream responses
72 if (is_request_) {
73 return http_framer_->ProcessInput(data, len);
74 } else {
75 return sm_other_interface_->ProcessWriteInput(data, len);
79 size_t StreamerSM::ProcessWriteInput(const char* data, size_t len) {
80 char* dataPtr = new char[len];
81 memcpy(dataPtr, data, len);
82 DataFrame* df = new DataFrame;
83 df->data = (const char*)dataPtr;
84 df->size = len;
85 df->delete_when_done = true;
86 connection_->EnqueueDataFrame(df);
87 return len;
90 bool StreamerSM::Error() const { return false; }
92 const char* StreamerSM::ErrorAsString() const { return "(none)"; }
94 bool StreamerSM::MessageFullyRead() const {
95 if (is_request_) {
96 return http_framer_->MessageFullyRead();
97 } else {
98 return false;
102 void StreamerSM::Reset() {
103 VLOG(1) << ACCEPTOR_CLIENT_IDENT << "StreamerSM: Reset";
104 connection_->Cleanup("Server Reset");
105 http_framer_->Reset();
108 void StreamerSM::ResetForNewConnection() {
109 http_framer_->Reset();
110 sm_other_interface_->Reset();
113 void StreamerSM::Cleanup() {
114 if (is_request_)
115 http_framer_->Reset();
118 int StreamerSM::PostAcceptHook() {
119 if (!sm_other_interface_) {
120 SMConnection* server_connection = SMConnection::NewSMConnection(
121 epoll_server_, NULL, NULL, acceptor_, "server_conn: ");
122 if (server_connection == NULL) {
123 LOG(ERROR) << "StreamerSM: Could not create server conenction.";
124 return 0;
126 VLOG(2) << ACCEPTOR_CLIENT_IDENT << "StreamerSM: Creating new server "
127 << "connection.";
128 sm_other_interface_ =
129 new StreamerSM(server_connection, this, epoll_server_, acceptor_);
130 sm_other_interface_->InitSMInterface(this, 0);
132 // The Streamer interface is used to stream HTTPS connections, so we
133 // will always use the https_server_ip/port here.
134 sm_other_interface_->InitSMConnection(NULL,
135 sm_other_interface_,
136 epoll_server_,
138 acceptor_->https_server_ip_,
139 acceptor_->https_server_port_,
140 std::string(),
141 false);
143 return 1;
146 size_t StreamerSM::SendSynStream(uint32 stream_id,
147 const BalsaHeaders& headers) {
148 return 0;
151 size_t StreamerSM::SendSynReply(uint32 stream_id, const BalsaHeaders& headers) {
152 return 0;
155 void StreamerSM::ProcessBodyInput(const char* input, size_t size) {
156 VLOG(2) << ACCEPTOR_CLIENT_IDENT
157 << "StreamerHttpSM: Process Body Input Data: "
158 << "size " << size;
159 sm_other_interface_->ProcessWriteInput(input, size);
162 void StreamerSM::MessageDone() {
163 if (acceptor_->flip_handler_type_ == FLIP_HANDLER_PROXY) {
164 VLOG(2) << ACCEPTOR_CLIENT_IDENT << "StreamerHttpSM: MessageDone.";
165 // TODO(kelindsay): anything need to be done ehre?
166 } else {
167 VLOG(2) << ACCEPTOR_CLIENT_IDENT << "StraemerHttpSM: MessageDone.";
171 void StreamerSM::ProcessHeaders(const BalsaHeaders& headers) {
172 VLOG(2) << ACCEPTOR_CLIENT_IDENT << "HttpStreamerSM: Process Headers";
173 BalsaHeaders mod_headers;
174 mod_headers.CopyFrom(headers);
175 if (forward_ip_header_.length()) {
176 LOG(INFO) << "Adding forward header: " << forward_ip_header_;
177 mod_headers.ReplaceOrAppendHeader(forward_ip_header_,
178 connection_->client_ip());
179 } else {
180 LOG(INFO) << "NOT adding forward header.";
182 SimpleBuffer sb;
183 char* buffer;
184 int size;
185 mod_headers.WriteHeaderAndEndingToBuffer(&sb);
186 sb.GetReadablePtr(&buffer, &size);
187 sm_other_interface_->ProcessWriteInput(buffer, size);
190 void StreamerSM::HandleHeaderError(BalsaFrame* framer) { HandleError(); }
192 void StreamerSM::HandleChunkingError(BalsaFrame* framer) { HandleError(); }
194 void StreamerSM::HandleBodyError(BalsaFrame* framer) { HandleError(); }
196 void StreamerSM::HandleError() {
197 VLOG(1) << ACCEPTOR_CLIENT_IDENT << "Error detected";
200 } // namespace net