1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef NET_SERVER_HTTP_CONNECTION_H_ 6*6777b538SAndroid Build Coastguard Worker #define NET_SERVER_HTTP_CONNECTION_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <memory> 9*6777b538SAndroid Build Coastguard Worker #include <string> 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Worker #include "base/containers/queue.h" 12*6777b538SAndroid Build Coastguard Worker #include "base/memory/scoped_refptr.h" 13*6777b538SAndroid Build Coastguard Worker #include "net/base/io_buffer.h" 14*6777b538SAndroid Build Coastguard Worker 15*6777b538SAndroid Build Coastguard Worker namespace net { 16*6777b538SAndroid Build Coastguard Worker 17*6777b538SAndroid Build Coastguard Worker class StreamSocket; 18*6777b538SAndroid Build Coastguard Worker class WebSocket; 19*6777b538SAndroid Build Coastguard Worker 20*6777b538SAndroid Build Coastguard Worker // A container which has all information of an http connection. It includes 21*6777b538SAndroid Build Coastguard Worker // id, underlying socket, and pending read/write data. 22*6777b538SAndroid Build Coastguard Worker class HttpConnection { 23*6777b538SAndroid Build Coastguard Worker public: 24*6777b538SAndroid Build Coastguard Worker // IOBuffer for data read. It's a wrapper around GrowableIOBuffer, with more 25*6777b538SAndroid Build Coastguard Worker // functions for buffer management. It moves unconsumed data to the start of 26*6777b538SAndroid Build Coastguard Worker // buffer. 27*6777b538SAndroid Build Coastguard Worker class ReadIOBuffer : public IOBuffer { 28*6777b538SAndroid Build Coastguard Worker public: 29*6777b538SAndroid Build Coastguard Worker static const int kInitialBufSize = 1024; 30*6777b538SAndroid Build Coastguard Worker static const int kMinimumBufSize = 128; 31*6777b538SAndroid Build Coastguard Worker static const int kCapacityIncreaseFactor = 2; 32*6777b538SAndroid Build Coastguard Worker static const int kDefaultMaxBufferSize = 1 * 1024 * 1024; // 1 Mbytes. 33*6777b538SAndroid Build Coastguard Worker 34*6777b538SAndroid Build Coastguard Worker ReadIOBuffer(); 35*6777b538SAndroid Build Coastguard Worker 36*6777b538SAndroid Build Coastguard Worker ReadIOBuffer(const ReadIOBuffer&) = delete; 37*6777b538SAndroid Build Coastguard Worker ReadIOBuffer& operator=(const ReadIOBuffer&) = delete; 38*6777b538SAndroid Build Coastguard Worker 39*6777b538SAndroid Build Coastguard Worker // Capacity. 40*6777b538SAndroid Build Coastguard Worker int GetCapacity() const; 41*6777b538SAndroid Build Coastguard Worker void SetCapacity(int capacity); 42*6777b538SAndroid Build Coastguard Worker // Increases capacity and returns true if capacity is not beyond the limit. 43*6777b538SAndroid Build Coastguard Worker bool IncreaseCapacity(); 44*6777b538SAndroid Build Coastguard Worker 45*6777b538SAndroid Build Coastguard Worker // Start of read data. 46*6777b538SAndroid Build Coastguard Worker char* StartOfBuffer() const; 47*6777b538SAndroid Build Coastguard Worker // Returns the bytes of read data. 48*6777b538SAndroid Build Coastguard Worker int GetSize() const; 49*6777b538SAndroid Build Coastguard Worker // More read data was appended. 50*6777b538SAndroid Build Coastguard Worker void DidRead(int bytes); 51*6777b538SAndroid Build Coastguard Worker // Capacity for which more read data can be appended. 52*6777b538SAndroid Build Coastguard Worker int RemainingCapacity() const; 53*6777b538SAndroid Build Coastguard Worker 54*6777b538SAndroid Build Coastguard Worker // Removes consumed data and moves unconsumed data to the start of buffer. 55*6777b538SAndroid Build Coastguard Worker void DidConsume(int bytes); 56*6777b538SAndroid Build Coastguard Worker 57*6777b538SAndroid Build Coastguard Worker // Limit of how much internal capacity can increase. max_buffer_size()58*6777b538SAndroid Build Coastguard Worker int max_buffer_size() const { return max_buffer_size_; } set_max_buffer_size(int max_buffer_size)59*6777b538SAndroid Build Coastguard Worker void set_max_buffer_size(int max_buffer_size) { 60*6777b538SAndroid Build Coastguard Worker max_buffer_size_ = max_buffer_size; 61*6777b538SAndroid Build Coastguard Worker } 62*6777b538SAndroid Build Coastguard Worker 63*6777b538SAndroid Build Coastguard Worker private: 64*6777b538SAndroid Build Coastguard Worker ~ReadIOBuffer() override; 65*6777b538SAndroid Build Coastguard Worker 66*6777b538SAndroid Build Coastguard Worker scoped_refptr<GrowableIOBuffer> base_; 67*6777b538SAndroid Build Coastguard Worker int max_buffer_size_ = kDefaultMaxBufferSize; 68*6777b538SAndroid Build Coastguard Worker }; 69*6777b538SAndroid Build Coastguard Worker 70*6777b538SAndroid Build Coastguard Worker // IOBuffer of pending data to write which has a queue of pending data. Each 71*6777b538SAndroid Build Coastguard Worker // pending data is stored in std::string. data() is the data of first 72*6777b538SAndroid Build Coastguard Worker // std::string stored. 73*6777b538SAndroid Build Coastguard Worker class QueuedWriteIOBuffer : public IOBuffer { 74*6777b538SAndroid Build Coastguard Worker public: 75*6777b538SAndroid Build Coastguard Worker static const int kDefaultMaxBufferSize = 1 * 1024 * 1024; // 1 Mbytes. 76*6777b538SAndroid Build Coastguard Worker 77*6777b538SAndroid Build Coastguard Worker QueuedWriteIOBuffer(); 78*6777b538SAndroid Build Coastguard Worker 79*6777b538SAndroid Build Coastguard Worker QueuedWriteIOBuffer(const QueuedWriteIOBuffer&) = delete; 80*6777b538SAndroid Build Coastguard Worker QueuedWriteIOBuffer& operator=(const QueuedWriteIOBuffer&) = delete; 81*6777b538SAndroid Build Coastguard Worker 82*6777b538SAndroid Build Coastguard Worker // Whether or not pending data exists. 83*6777b538SAndroid Build Coastguard Worker bool IsEmpty() const; 84*6777b538SAndroid Build Coastguard Worker 85*6777b538SAndroid Build Coastguard Worker // Appends new pending data and returns true if total size doesn't exceed 86*6777b538SAndroid Build Coastguard Worker // the limit, |total_size_limit_|. It would change data() if new data is 87*6777b538SAndroid Build Coastguard Worker // the first pending data. 88*6777b538SAndroid Build Coastguard Worker bool Append(const std::string& data); 89*6777b538SAndroid Build Coastguard Worker 90*6777b538SAndroid Build Coastguard Worker // Consumes data and changes data() accordingly. It cannot be more than 91*6777b538SAndroid Build Coastguard Worker // GetSizeToWrite(). 92*6777b538SAndroid Build Coastguard Worker void DidConsume(int size); 93*6777b538SAndroid Build Coastguard Worker 94*6777b538SAndroid Build Coastguard Worker // Gets size of data to write this time. It is NOT total data size. 95*6777b538SAndroid Build Coastguard Worker int GetSizeToWrite() const; 96*6777b538SAndroid Build Coastguard Worker 97*6777b538SAndroid Build Coastguard Worker // Total size of all pending data. total_size()98*6777b538SAndroid Build Coastguard Worker int total_size() const { return total_size_; } 99*6777b538SAndroid Build Coastguard Worker 100*6777b538SAndroid Build Coastguard Worker // Limit of how much data can be pending. max_buffer_size()101*6777b538SAndroid Build Coastguard Worker int max_buffer_size() const { return max_buffer_size_; } set_max_buffer_size(int max_buffer_size)102*6777b538SAndroid Build Coastguard Worker void set_max_buffer_size(int max_buffer_size) { 103*6777b538SAndroid Build Coastguard Worker max_buffer_size_ = max_buffer_size; 104*6777b538SAndroid Build Coastguard Worker } 105*6777b538SAndroid Build Coastguard Worker 106*6777b538SAndroid Build Coastguard Worker private: 107*6777b538SAndroid Build Coastguard Worker ~QueuedWriteIOBuffer() override; 108*6777b538SAndroid Build Coastguard Worker 109*6777b538SAndroid Build Coastguard Worker // This needs to indirect since we need pointer stability for the payload 110*6777b538SAndroid Build Coastguard Worker // chunks, as they may be handed out via net::IOBuffer::data(). 111*6777b538SAndroid Build Coastguard Worker base::queue<std::unique_ptr<std::string>> pending_data_; 112*6777b538SAndroid Build Coastguard Worker int total_size_ = 0; 113*6777b538SAndroid Build Coastguard Worker int max_buffer_size_ = kDefaultMaxBufferSize; 114*6777b538SAndroid Build Coastguard Worker }; 115*6777b538SAndroid Build Coastguard Worker 116*6777b538SAndroid Build Coastguard Worker HttpConnection(int id, std::unique_ptr<StreamSocket> socket); 117*6777b538SAndroid Build Coastguard Worker 118*6777b538SAndroid Build Coastguard Worker HttpConnection(const HttpConnection&) = delete; 119*6777b538SAndroid Build Coastguard Worker HttpConnection& operator=(const HttpConnection&) = delete; 120*6777b538SAndroid Build Coastguard Worker 121*6777b538SAndroid Build Coastguard Worker ~HttpConnection(); 122*6777b538SAndroid Build Coastguard Worker id()123*6777b538SAndroid Build Coastguard Worker int id() const { return id_; } socket()124*6777b538SAndroid Build Coastguard Worker StreamSocket* socket() const { return socket_.get(); } read_buf()125*6777b538SAndroid Build Coastguard Worker ReadIOBuffer* read_buf() const { return read_buf_.get(); } write_buf()126*6777b538SAndroid Build Coastguard Worker QueuedWriteIOBuffer* write_buf() const { return write_buf_.get(); } 127*6777b538SAndroid Build Coastguard Worker web_socket()128*6777b538SAndroid Build Coastguard Worker WebSocket* web_socket() const { return web_socket_.get(); } 129*6777b538SAndroid Build Coastguard Worker void SetWebSocket(std::unique_ptr<WebSocket> web_socket); 130*6777b538SAndroid Build Coastguard Worker 131*6777b538SAndroid Build Coastguard Worker private: 132*6777b538SAndroid Build Coastguard Worker const int id_; 133*6777b538SAndroid Build Coastguard Worker const std::unique_ptr<StreamSocket> socket_; 134*6777b538SAndroid Build Coastguard Worker const scoped_refptr<ReadIOBuffer> read_buf_; 135*6777b538SAndroid Build Coastguard Worker const scoped_refptr<QueuedWriteIOBuffer> write_buf_; 136*6777b538SAndroid Build Coastguard Worker 137*6777b538SAndroid Build Coastguard Worker std::unique_ptr<WebSocket> web_socket_; 138*6777b538SAndroid Build Coastguard Worker }; 139*6777b538SAndroid Build Coastguard Worker 140*6777b538SAndroid Build Coastguard Worker } // namespace net 141*6777b538SAndroid Build Coastguard Worker 142*6777b538SAndroid Build Coastguard Worker #endif // NET_SERVER_HTTP_CONNECTION_H_ 143