| OLD | NEW | 
|---|
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "net/tools/flip_server/http_interface.h" | 5 #include "net/tools/flip_server/http_interface.h" | 
| 6 | 6 | 
| 7 #include "net/tools/balsa/balsa_frame.h" | 7 #include "net/tools/balsa/balsa_frame.h" | 
| 8 #include "net/tools/dump_cache/url_utilities.h" | 8 #include "net/tools/dump_cache/url_utilities.h" | 
| 9 #include "net/tools/flip_server/flip_config.h" | 9 #include "net/tools/flip_server/flip_config.h" | 
| 10 #include "net/tools/flip_server/sm_connection.h" | 10 #include "net/tools/flip_server/sm_connection.h" | 
| (...skipping 28 matching lines...) Expand all  Loading... | 
| 39   if (acceptor_->flip_handler_type_ == FLIP_HANDLER_PROXY) { | 39   if (acceptor_->flip_handler_type_ == FLIP_HANDLER_PROXY) { | 
| 40     VLOG(2) << ACCEPTOR_CLIENT_IDENT << "HttpSM: Process Body Data: stream " | 40     VLOG(2) << ACCEPTOR_CLIENT_IDENT << "HttpSM: Process Body Data: stream " | 
| 41             << stream_id_ << ": size " << size; | 41             << stream_id_ << ": size " << size; | 
| 42     sm_spdy_interface_->SendDataFrame(stream_id_, input, size, 0, false); | 42     sm_spdy_interface_->SendDataFrame(stream_id_, input, size, 0, false); | 
| 43   } | 43   } | 
| 44 } | 44 } | 
| 45 | 45 | 
| 46 void HttpSM::ProcessHeaders(const BalsaHeaders& headers) { | 46 void HttpSM::ProcessHeaders(const BalsaHeaders& headers) { | 
| 47   if (acceptor_->flip_handler_type_ == FLIP_HANDLER_HTTP_SERVER) { | 47   if (acceptor_->flip_handler_type_ == FLIP_HANDLER_HTTP_SERVER) { | 
| 48     std::string host = | 48     std::string host = | 
| 49       UrlUtilities::GetUrlHost(headers.GetHeader("Host").as_string()); | 49         UrlUtilities::GetUrlHost(headers.GetHeader("Host").as_string()); | 
| 50     std::string method = headers.request_method().as_string(); | 50     std::string method = headers.request_method().as_string(); | 
| 51     VLOG(1) << ACCEPTOR_CLIENT_IDENT << "Received Request: " | 51     VLOG(1) << ACCEPTOR_CLIENT_IDENT | 
| 52             << headers.request_uri().as_string() << " " << method; | 52             << "Received Request: " << headers.request_uri().as_string() << " " | 
| 53     std::string filename = EncodeURL(headers.request_uri().as_string(), | 53             << method; | 
| 54                                 host, method); | 54     std::string filename = | 
|  | 55         EncodeURL(headers.request_uri().as_string(), host, method); | 
| 55     NewStream(stream_id_, 0, filename); | 56     NewStream(stream_id_, 0, filename); | 
| 56     stream_id_ += 2; | 57     stream_id_ += 2; | 
| 57   } else { | 58   } else { | 
| 58     VLOG(1) << ACCEPTOR_CLIENT_IDENT << "HttpSM: Received Response from " | 59     VLOG(1) << ACCEPTOR_CLIENT_IDENT << "HttpSM: Received Response from " | 
| 59             << connection_->server_ip_ << ":" | 60             << connection_->server_ip_ << ":" << connection_->server_port_ | 
| 60             << connection_->server_port_ << " "; | 61             << " "; | 
| 61     sm_spdy_interface_->SendSynReply(stream_id_, headers); | 62     sm_spdy_interface_->SendSynReply(stream_id_, headers); | 
| 62   } | 63   } | 
| 63 } | 64 } | 
| 64 | 65 | 
| 65 void HttpSM::MessageDone() { | 66 void HttpSM::MessageDone() { | 
| 66   if (acceptor_->flip_handler_type_ == FLIP_HANDLER_PROXY) { | 67   if (acceptor_->flip_handler_type_ == FLIP_HANDLER_PROXY) { | 
| 67     VLOG(2) << ACCEPTOR_CLIENT_IDENT << "HttpSM: MessageDone. Sending EOF: " | 68     VLOG(2) << ACCEPTOR_CLIENT_IDENT << "HttpSM: MessageDone. Sending EOF: " | 
| 68             << "stream " << stream_id_; | 69             << "stream " << stream_id_; | 
| 69     sm_spdy_interface_->SendEOF(stream_id_); | 70     sm_spdy_interface_->SendEOF(stream_id_); | 
| 70   } else { | 71   } else { | 
| 71     VLOG(2) << ACCEPTOR_CLIENT_IDENT << "HttpSM: MessageDone."; | 72     VLOG(2) << ACCEPTOR_CLIENT_IDENT << "HttpSM: MessageDone."; | 
| 72   } | 73   } | 
| 73 } | 74 } | 
| 74 | 75 | 
| 75 void HttpSM::HandleHeaderError(BalsaFrame* framer) { | 76 void HttpSM::HandleHeaderError(BalsaFrame* framer) { HandleError(); } | 
| 76   HandleError(); |  | 
| 77 } |  | 
| 78 | 77 | 
| 79 void HttpSM::HandleChunkingError(BalsaFrame* framer) { | 78 void HttpSM::HandleChunkingError(BalsaFrame* framer) { HandleError(); } | 
| 80   HandleError(); |  | 
| 81 } |  | 
| 82 | 79 | 
| 83 void HttpSM::HandleBodyError(BalsaFrame* framer) { | 80 void HttpSM::HandleBodyError(BalsaFrame* framer) { HandleError(); } | 
| 84   HandleError(); |  | 
| 85 } |  | 
| 86 | 81 | 
| 87 void HttpSM::HandleError() { | 82 void HttpSM::HandleError() { | 
| 88   VLOG(1) << ACCEPTOR_CLIENT_IDENT << "Error detected"; | 83   VLOG(1) << ACCEPTOR_CLIENT_IDENT << "Error detected"; | 
| 89 } | 84 } | 
| 90 | 85 | 
| 91 void HttpSM::AddToOutputOrder(const MemCacheIter& mci) { | 86 void HttpSM::AddToOutputOrder(const MemCacheIter& mci) { | 
| 92   output_ordering_.AddToOutputOrder(mci); | 87   output_ordering_.AddToOutputOrder(mci); | 
| 93 } | 88 } | 
| 94 | 89 | 
| 95 void HttpSM::InitSMInterface(SMInterface* sm_spdy_interface, | 90 void HttpSM::InitSMInterface(SMInterface* sm_spdy_interface, int32 server_idx) { | 
| 96                              int32 server_idx) { |  | 
| 97   sm_spdy_interface_ = sm_spdy_interface; | 91   sm_spdy_interface_ = sm_spdy_interface; | 
| 98   server_idx_ = server_idx; | 92   server_idx_ = server_idx; | 
| 99 } | 93 } | 
| 100 | 94 | 
| 101 void HttpSM::InitSMConnection(SMConnectionPoolInterface* connection_pool, | 95 void HttpSM::InitSMConnection(SMConnectionPoolInterface* connection_pool, | 
| 102                               SMInterface* sm_interface, | 96                               SMInterface* sm_interface, | 
| 103                               EpollServer* epoll_server, | 97                               EpollServer* epoll_server, | 
| 104                               int fd, | 98                               int fd, | 
| 105                               std::string server_ip, | 99                               std::string server_ip, | 
| 106                               std::string server_port, | 100                               std::string server_port, | 
| (...skipping 27 matching lines...) Expand all  Loading... | 
| 134   data_frame->size = len; | 128   data_frame->size = len; | 
| 135   data_frame->delete_when_done = true; | 129   data_frame->delete_when_done = true; | 
| 136   connection_->EnqueueDataFrame(data_frame); | 130   connection_->EnqueueDataFrame(data_frame); | 
| 137   return len; | 131   return len; | 
| 138 } | 132 } | 
| 139 | 133 | 
| 140 bool HttpSM::MessageFullyRead() const { | 134 bool HttpSM::MessageFullyRead() const { | 
| 141   return http_framer_->MessageFullyRead(); | 135   return http_framer_->MessageFullyRead(); | 
| 142 } | 136 } | 
| 143 | 137 | 
| 144 void HttpSM::SetStreamID(uint32 stream_id) { | 138 void HttpSM::SetStreamID(uint32 stream_id) { stream_id_ = stream_id; } | 
| 145   stream_id_ = stream_id; |  | 
| 146 } |  | 
| 147 | 139 | 
| 148 bool HttpSM::Error() const { | 140 bool HttpSM::Error() const { return http_framer_->Error(); } | 
| 149   return http_framer_->Error(); |  | 
| 150 } |  | 
| 151 | 141 | 
| 152 const char* HttpSM::ErrorAsString() const { | 142 const char* HttpSM::ErrorAsString() const { | 
| 153   return BalsaFrameEnums::ErrorCodeToString(http_framer_->ErrorCode()); | 143   return BalsaFrameEnums::ErrorCodeToString(http_framer_->ErrorCode()); | 
| 154 } | 144 } | 
| 155 | 145 | 
| 156 void HttpSM::Reset() { | 146 void HttpSM::Reset() { | 
| 157   VLOG(1) << ACCEPTOR_CLIENT_IDENT << "HttpSM: Reset: stream " | 147   VLOG(1) << ACCEPTOR_CLIENT_IDENT << "HttpSM: Reset: stream " << stream_id_; | 
| 158           << stream_id_; |  | 
| 159   http_framer_->Reset(); | 148   http_framer_->Reset(); | 
| 160 } | 149 } | 
| 161 | 150 | 
| 162 void HttpSM::ResetForNewConnection() { | 151 void HttpSM::ResetForNewConnection() { | 
| 163   if (acceptor_->flip_handler_type_ == FLIP_HANDLER_PROXY) { | 152   if (acceptor_->flip_handler_type_ == FLIP_HANDLER_PROXY) { | 
| 164     VLOG(1) << ACCEPTOR_CLIENT_IDENT << "HttpSM: Server connection closing " | 153     VLOG(1) << ACCEPTOR_CLIENT_IDENT << "HttpSM: Server connection closing " | 
| 165       << "to: " << connection_->server_ip_ << ":" | 154             << "to: " << connection_->server_ip_ << ":" | 
| 166       << connection_->server_port_ << " "; | 155             << connection_->server_port_ << " "; | 
| 167   } | 156   } | 
| 168   // Message has not been fully read, either it is incomplete or the | 157   // Message has not been fully read, either it is incomplete or the | 
| 169   // server is closing the connection to signal message end. | 158   // server is closing the connection to signal message end. | 
| 170   if (!MessageFullyRead()) { | 159   if (!MessageFullyRead()) { | 
| 171     VLOG(2) << "HTTP response closed before end of file detected. " | 160     VLOG(2) << "HTTP response closed before end of file detected. " | 
| 172             << "Sending EOF to spdy."; | 161             << "Sending EOF to spdy."; | 
| 173     sm_spdy_interface_->SendEOF(stream_id_); | 162     sm_spdy_interface_->SendEOF(stream_id_); | 
| 174   } | 163   } | 
| 175   output_ordering_.Reset(); | 164   output_ordering_.Reset(); | 
| 176   http_framer_->Reset(); | 165   http_framer_->Reset(); | 
| 177   if (sm_spdy_interface_) { | 166   if (sm_spdy_interface_) { | 
| 178     sm_spdy_interface_->ResetForNewInterface(server_idx_); | 167     sm_spdy_interface_->ResetForNewInterface(server_idx_); | 
| 179   } | 168   } | 
| 180 } | 169 } | 
| 181 | 170 | 
| 182 void HttpSM::Cleanup() { | 171 void HttpSM::Cleanup() { | 
| 183   if (!(acceptor_->flip_handler_type_ == FLIP_HANDLER_HTTP_SERVER)) { | 172   if (!(acceptor_->flip_handler_type_ == FLIP_HANDLER_HTTP_SERVER)) { | 
| 184     VLOG(2) << "HttpSM Request Fully Read; stream_id: " << stream_id_; | 173     VLOG(2) << "HttpSM Request Fully Read; stream_id: " << stream_id_; | 
| 185     connection_->Cleanup("request complete"); | 174     connection_->Cleanup("request complete"); | 
| 186   } | 175   } | 
| 187 } | 176 } | 
| 188 | 177 | 
| 189 int HttpSM::PostAcceptHook() { | 178 int HttpSM::PostAcceptHook() { return 1; } | 
| 190   return 1; |  | 
| 191 } |  | 
| 192 | 179 | 
| 193 void HttpSM::NewStream(uint32 stream_id, uint32 priority, | 180 void HttpSM::NewStream(uint32 stream_id, | 
|  | 181                        uint32 priority, | 
| 194                        const std::string& filename) { | 182                        const std::string& filename) { | 
| 195   MemCacheIter mci; | 183   MemCacheIter mci; | 
| 196   mci.stream_id = stream_id; | 184   mci.stream_id = stream_id; | 
| 197   mci.priority = priority; | 185   mci.priority = priority; | 
| 198   if (!memory_cache_->AssignFileData(filename, &mci)) { | 186   if (!memory_cache_->AssignFileData(filename, &mci)) { | 
| 199     // error creating new stream. | 187     // error creating new stream. | 
| 200     VLOG(2) << ACCEPTOR_CLIENT_IDENT << "Sending ErrorNotFound"; | 188     VLOG(2) << ACCEPTOR_CLIENT_IDENT << "Sending ErrorNotFound"; | 
| 201     SendErrorNotFound(stream_id); | 189     SendErrorNotFound(stream_id); | 
| 202   } else { | 190   } else { | 
| 203     AddToOutputOrder(mci); | 191     AddToOutputOrder(mci); | 
| (...skipping 12 matching lines...) Expand all  Loading... | 
| 216 } | 204 } | 
| 217 | 205 | 
| 218 size_t HttpSM::SendSynStream(uint32 stream_id, const BalsaHeaders& headers) { | 206 size_t HttpSM::SendSynStream(uint32 stream_id, const BalsaHeaders& headers) { | 
| 219   return 0; | 207   return 0; | 
| 220 } | 208 } | 
| 221 | 209 | 
| 222 size_t HttpSM::SendSynReply(uint32 stream_id, const BalsaHeaders& headers) { | 210 size_t HttpSM::SendSynReply(uint32 stream_id, const BalsaHeaders& headers) { | 
| 223   return SendSynReplyImpl(stream_id, headers); | 211   return SendSynReplyImpl(stream_id, headers); | 
| 224 } | 212 } | 
| 225 | 213 | 
| 226 void HttpSM::SendDataFrame(uint32 stream_id, const char* data, int64 len, | 214 void HttpSM::SendDataFrame(uint32 stream_id, | 
| 227                    uint32 flags, bool compress) { | 215                            const char* data, | 
|  | 216                            int64 len, | 
|  | 217                            uint32 flags, | 
|  | 218                            bool compress) { | 
| 228   SendDataFrameImpl(stream_id, data, len, flags, compress); | 219   SendDataFrameImpl(stream_id, data, len, flags, compress); | 
| 229 } | 220 } | 
| 230 | 221 | 
| 231 void HttpSM::SendEOFImpl(uint32 stream_id) { | 222 void HttpSM::SendEOFImpl(uint32 stream_id) { | 
| 232   DataFrame* df = new DataFrame; | 223   DataFrame* df = new DataFrame; | 
| 233   df->data = "0\r\n\r\n"; | 224   df->data = "0\r\n\r\n"; | 
| 234   df->size = 5; | 225   df->size = 5; | 
| 235   df->delete_when_done = false; | 226   df->delete_when_done = false; | 
| 236   EnqueueDataFrame(df); | 227   EnqueueDataFrame(df); | 
| 237   if (acceptor_->flip_handler_type_ == FLIP_HANDLER_HTTP_SERVER) { | 228   if (acceptor_->flip_handler_type_ == FLIP_HANDLER_HTTP_SERVER) { | 
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 276   df->data = buffer; | 267   df->data = buffer; | 
| 277   df->delete_when_done = true; | 268   df->delete_when_done = true; | 
| 278   sb.Read(buffer, df->size); | 269   sb.Read(buffer, df->size); | 
| 279   VLOG(2) << ACCEPTOR_CLIENT_IDENT << "Sending HTTP Reply header " | 270   VLOG(2) << ACCEPTOR_CLIENT_IDENT << "Sending HTTP Reply header " | 
| 280           << stream_id_; | 271           << stream_id_; | 
| 281   size_t df_size = df->size; | 272   size_t df_size = df->size; | 
| 282   EnqueueDataFrame(df); | 273   EnqueueDataFrame(df); | 
| 283   return df_size; | 274   return df_size; | 
| 284 } | 275 } | 
| 285 | 276 | 
| 286 void HttpSM::SendDataFrameImpl(uint32 stream_id, const char* data, int64 len, | 277 void HttpSM::SendDataFrameImpl(uint32 stream_id, | 
| 287                        uint32 flags, bool compress) { | 278                                const char* data, | 
|  | 279                                int64 len, | 
|  | 280                                uint32 flags, | 
|  | 281                                bool compress) { | 
| 288   char chunk_buf[128]; | 282   char chunk_buf[128]; | 
| 289   snprintf(chunk_buf, sizeof(chunk_buf), "%x\r\n", (unsigned int)len); | 283   snprintf(chunk_buf, sizeof(chunk_buf), "%x\r\n", (unsigned int)len); | 
| 290   std::string chunk_description(chunk_buf); | 284   std::string chunk_description(chunk_buf); | 
| 291   DataFrame* df = new DataFrame; | 285   DataFrame* df = new DataFrame; | 
| 292   df->size = chunk_description.size() + len + 2; | 286   df->size = chunk_description.size() + len + 2; | 
| 293   char* buffer = new char[df->size]; | 287   char* buffer = new char[df->size]; | 
| 294   df->data = buffer; | 288   df->data = buffer; | 
| 295   df->delete_when_done = true; | 289   df->delete_when_done = true; | 
| 296   memcpy(buffer, chunk_description.data(), chunk_description.size()); | 290   memcpy(buffer, chunk_description.data(), chunk_description.size()); | 
| 297   memcpy(buffer + chunk_description.size(), data, len); | 291   memcpy(buffer + chunk_description.size(), data, len); | 
| 298   memcpy(buffer + chunk_description.size() + len, "\r\n", 2); | 292   memcpy(buffer + chunk_description.size() + len, "\r\n", 2); | 
| 299   EnqueueDataFrame(df); | 293   EnqueueDataFrame(df); | 
| 300 } | 294 } | 
| 301 | 295 | 
| 302 void HttpSM::EnqueueDataFrame(DataFrame* df) { | 296 void HttpSM::EnqueueDataFrame(DataFrame* df) { | 
| 303   VLOG(2) << ACCEPTOR_CLIENT_IDENT << "HttpSM: Enqueue data frame: stream " | 297   VLOG(2) << ACCEPTOR_CLIENT_IDENT << "HttpSM: Enqueue data frame: stream " | 
| 304           << stream_id_; | 298           << stream_id_; | 
| 305   connection_->EnqueueDataFrame(df); | 299   connection_->EnqueueDataFrame(df); | 
| 306 } | 300 } | 
| 307 | 301 | 
| 308 void HttpSM::GetOutput() { | 302 void HttpSM::GetOutput() { | 
| 309   MemCacheIter* mci = output_ordering_.GetIter(); | 303   MemCacheIter* mci = output_ordering_.GetIter(); | 
| 310   if (mci == NULL) { | 304   if (mci == NULL) { | 
| 311     VLOG(2) << ACCEPTOR_CLIENT_IDENT << "HttpSM: GetOutput: nothing to " | 305     VLOG(2) << ACCEPTOR_CLIENT_IDENT << "HttpSM: GetOutput: nothing to " | 
| 312             << "output!?: stream " << stream_id_; | 306             << "output!?: stream " << stream_id_; | 
| 313     return; | 307     return; | 
| 314   } | 308   } | 
| 315   if (!mci->transformed_header) { | 309   if (!mci->transformed_header) { | 
| 316     mci->bytes_sent = SendSynReply(mci->stream_id, | 310     mci->bytes_sent = | 
| 317                                    *(mci->file_data->headers())); | 311         SendSynReply(mci->stream_id, *(mci->file_data->headers())); | 
| 318     mci->transformed_header = true; | 312     mci->transformed_header = true; | 
| 319     VLOG(2) << ACCEPTOR_CLIENT_IDENT << "HttpSM: GetOutput transformed " | 313     VLOG(2) << ACCEPTOR_CLIENT_IDENT << "HttpSM: GetOutput transformed " | 
| 320             << "header stream_id: [" << mci->stream_id << "]"; | 314             << "header stream_id: [" << mci->stream_id << "]"; | 
| 321     return; | 315     return; | 
| 322   } | 316   } | 
| 323   if (mci->body_bytes_consumed >= mci->file_data->body().size()) { | 317   if (mci->body_bytes_consumed >= mci->file_data->body().size()) { | 
| 324     SendEOF(mci->stream_id); | 318     SendEOF(mci->stream_id); | 
| 325     output_ordering_.RemoveStreamId(mci->stream_id); | 319     output_ordering_.RemoveStreamId(mci->stream_id); | 
| 326     VLOG(2) << ACCEPTOR_CLIENT_IDENT << "GetOutput remove_stream_id: [" | 320     VLOG(2) << ACCEPTOR_CLIENT_IDENT << "GetOutput remove_stream_id: [" | 
| 327             << mci->stream_id << "]"; | 321             << mci->stream_id << "]"; | 
| 328     return; | 322     return; | 
| 329   } | 323   } | 
| 330   size_t num_to_write = | 324   size_t num_to_write = | 
| 331       mci->file_data->body().size() - mci->body_bytes_consumed; | 325       mci->file_data->body().size() - mci->body_bytes_consumed; | 
| 332   if (num_to_write > mci->max_segment_size) | 326   if (num_to_write > mci->max_segment_size) | 
| 333     num_to_write = mci->max_segment_size; | 327     num_to_write = mci->max_segment_size; | 
| 334 | 328 | 
| 335   SendDataFrame(mci->stream_id, | 329   SendDataFrame(mci->stream_id, | 
| 336                 mci->file_data->body().data() + mci->body_bytes_consumed, | 330                 mci->file_data->body().data() + mci->body_bytes_consumed, | 
| 337                 num_to_write, 0, true); | 331                 num_to_write, | 
|  | 332                 0, | 
|  | 333                 true); | 
| 338   VLOG(2) << ACCEPTOR_CLIENT_IDENT << "HttpSM: GetOutput SendDataFrame[" | 334   VLOG(2) << ACCEPTOR_CLIENT_IDENT << "HttpSM: GetOutput SendDataFrame[" | 
| 339           << mci->stream_id << "]: " << num_to_write; | 335           << mci->stream_id << "]: " << num_to_write; | 
| 340   mci->body_bytes_consumed += num_to_write; | 336   mci->body_bytes_consumed += num_to_write; | 
| 341   mci->bytes_sent += num_to_write; | 337   mci->bytes_sent += num_to_write; | 
| 342 } | 338 } | 
| 343 | 339 | 
| 344 }  // namespace net | 340 }  // namespace net | 
| OLD | NEW | 
|---|