OLD | NEW |
| (Empty) |
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. | |
4 | |
5 #include "net/tools/flip_server/streamer_interface.h" | |
6 | |
7 #include <string> | |
8 | |
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" | |
13 | |
14 namespace net { | |
15 | |
16 std::string StreamerSM::forward_ip_header_; | |
17 | |
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); | |
32 } | |
33 | |
34 StreamerSM::~StreamerSM() { | |
35 VLOG(1) << ACCEPTOR_CLIENT_IDENT << "Destroying StreamerSM object"; | |
36 Reset(); | |
37 delete http_framer_; | |
38 } | |
39 | |
40 void StreamerSM::set_is_request() { | |
41 is_request_ = true; | |
42 http_framer_->set_is_request(true); | |
43 } | |
44 | |
45 void StreamerSM::InitSMInterface(SMInterface* sm_other_interface, | |
46 int32_t server_idx) { | |
47 sm_other_interface_ = sm_other_interface; | |
48 } | |
49 | |
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); | |
68 } | |
69 | |
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); | |
76 } | |
77 } | |
78 | |
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; | |
88 } | |
89 | |
90 bool StreamerSM::Error() const { return false; } | |
91 | |
92 const char* StreamerSM::ErrorAsString() const { return "(none)"; } | |
93 | |
94 bool StreamerSM::MessageFullyRead() const { | |
95 if (is_request_) { | |
96 return http_framer_->MessageFullyRead(); | |
97 } else { | |
98 return false; | |
99 } | |
100 } | |
101 | |
102 void StreamerSM::Reset() { | |
103 VLOG(1) << ACCEPTOR_CLIENT_IDENT << "StreamerSM: Reset"; | |
104 connection_->Cleanup("Server Reset"); | |
105 http_framer_->Reset(); | |
106 } | |
107 | |
108 void StreamerSM::ResetForNewConnection() { | |
109 http_framer_->Reset(); | |
110 sm_other_interface_->Reset(); | |
111 } | |
112 | |
113 void StreamerSM::Cleanup() { | |
114 if (is_request_) | |
115 http_framer_->Reset(); | |
116 } | |
117 | |
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; | |
125 } | |
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); | |
131 } | |
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_, | |
137 -1, | |
138 acceptor_->https_server_ip_, | |
139 acceptor_->https_server_port_, | |
140 std::string(), | |
141 false); | |
142 | |
143 return 1; | |
144 } | |
145 | |
146 size_t StreamerSM::SendSynStream(uint32_t stream_id, | |
147 const BalsaHeaders& headers) { | |
148 return 0; | |
149 } | |
150 | |
151 size_t StreamerSM::SendSynReply(uint32_t stream_id, | |
152 const BalsaHeaders& headers) { | |
153 return 0; | |
154 } | |
155 | |
156 void StreamerSM::ProcessBodyInput(const char* input, size_t size) { | |
157 VLOG(2) << ACCEPTOR_CLIENT_IDENT | |
158 << "StreamerHttpSM: Process Body Input Data: " | |
159 << "size " << size; | |
160 sm_other_interface_->ProcessWriteInput(input, size); | |
161 } | |
162 | |
163 void StreamerSM::MessageDone() { | |
164 if (acceptor_->flip_handler_type_ == FLIP_HANDLER_PROXY) { | |
165 VLOG(2) << ACCEPTOR_CLIENT_IDENT << "StreamerHttpSM: MessageDone."; | |
166 // TODO(kelindsay): anything need to be done ehre? | |
167 } else { | |
168 VLOG(2) << ACCEPTOR_CLIENT_IDENT << "StraemerHttpSM: MessageDone."; | |
169 } | |
170 } | |
171 | |
172 void StreamerSM::ProcessHeaders(const BalsaHeaders& headers) { | |
173 VLOG(2) << ACCEPTOR_CLIENT_IDENT << "HttpStreamerSM: Process Headers"; | |
174 BalsaHeaders mod_headers; | |
175 mod_headers.CopyFrom(headers); | |
176 if (forward_ip_header_.length()) { | |
177 LOG(INFO) << "Adding forward header: " << forward_ip_header_; | |
178 mod_headers.ReplaceOrAppendHeader(forward_ip_header_, | |
179 connection_->client_ip()); | |
180 } else { | |
181 LOG(INFO) << "NOT adding forward header."; | |
182 } | |
183 SimpleBuffer sb; | |
184 char* buffer; | |
185 int size; | |
186 mod_headers.WriteHeaderAndEndingToBuffer(&sb); | |
187 sb.GetReadablePtr(&buffer, &size); | |
188 sm_other_interface_->ProcessWriteInput(buffer, size); | |
189 } | |
190 | |
191 void StreamerSM::HandleHeaderError(BalsaFrame* framer) { HandleError(); } | |
192 | |
193 void StreamerSM::HandleChunkingError(BalsaFrame* framer) { HandleError(); } | |
194 | |
195 void StreamerSM::HandleBodyError(BalsaFrame* framer) { HandleError(); } | |
196 | |
197 void StreamerSM::HandleError() { | |
198 VLOG(1) << ACCEPTOR_CLIENT_IDENT << "Error detected"; | |
199 } | |
200 | |
201 } // namespace net | |
OLD | NEW |