xref: /aosp_15_r20/external/cronet/net/server/http_connection.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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