src/server/proxy/httpclient.h

changeset 698
fea7c3d74cc6
parent 694
a5aa94800b59
child 700
658f4c02b4c5
equal deleted inserted replaced
697:3ddfd45d4e47 698:fea7c3d74cc6
108 */ 108 */
109 ssize_t (*response_body_write)(HttpClient *, void *, size_t, void *); 109 ssize_t (*response_body_write)(HttpClient *, void *, size_t, void *);
110 void *response_body_write_userdata; 110 void *response_body_write_userdata;
111 111
112 /* 112 /*
113 * Websocket write callback function
114 *
115 * ssize_t ws_write(HttpClient *client, void *buf, size_t size, void *userdata)
116 *
117 * Return: number of processed bytes,
118 * HTTP_CLIENT_CALLBACK_WOULD_BLOCK or HTTP_CLIENT_CALLBACK_ERROR.
119 */
120 ssize_t (*ws_write)(HttpClient *, void *, size_t, void *);
121 void *ws_write_userdata;
122
123 /*
124 * Websocket message IO available
125 *
126 * This function is called, when client->socketfd is ready to accept
127 * new messages (http_client_add_message)
128 */
129 int (*ws_msg_ready)(HttpClient *, void *);
130 void *ws_msg_ready_userdata;
131
132 /*
113 * Response finished callback 133 * Response finished callback
114 * 134 *
115 * After this callback, the client object is no longer used. The callback 135 * After this callback, the client object is no longer used. The callback
116 * is allowed to free the client object or reuse it. 136 * is allowed to free the client object or reuse it.
117 * 137 *
123 143
124 // internals 144 // internals
125 HttpParser *parser; 145 HttpParser *parser;
126 netbuf buffer; 146 netbuf buffer;
127 147
148 // transfer_buffer: buffer for sending data to socketfd
128 char *transfer_buffer; 149 char *transfer_buffer;
129 size_t transfer_buffer_alloc; 150 size_t transfer_buffer_alloc;
130 size_t transfer_buffer_len; 151 size_t transfer_buffer_len;
131 size_t transfer_buffer_pos; 152 size_t transfer_buffer_pos;
132 153
154 // transfer2_buffer: buffer for response_body_write or ws_write
155 char *transfer2_buffer;
156 size_t transfer2_buffer_alloc;
157 size_t transfer2_buffer_len;
158 size_t transfer2_buffer_pos;
159
133 size_t req_contentlength_pos; 160 size_t req_contentlength_pos;
134 161
135 int stage; // 0: request, 1: response 162 int stage; // 0: request, 1: response, 2: websocket
136 int request_body_complete; 163 int request_body_complete;
137 int request_body_terminated; 164 int request_body_terminated;
138 int response_header_complete; 165 int response_header_complete;
166 int keep_alive;
139 167
140 Event event; 168 Event event;
141 }; 169 };
142 170
143 HttpClient* http_client_new(EventHandler *ev); 171 HttpClient* http_client_new(EventHandler *ev);
178 /* 206 /*
179 * Enables a request body with a chunked transfer encoding 207 * Enables a request body with a chunked transfer encoding
180 */ 208 */
181 int http_client_enable_chunked_transfer_encoding(HttpClient *client); 209 int http_client_enable_chunked_transfer_encoding(HttpClient *client);
182 210
211 /*
212 * Start request processing
213 */
183 int http_client_start(HttpClient *client); 214 int http_client_start(HttpClient *client);
215
216 /*
217 * Handle HttpClient IO and process the request/response
218 */
219 int http_client_process(HttpClient *client);
220
221 /*
222 * Adds message data, that will be sent to client->socketfd. This function
223 * should only be called when processing websockets.
224 */
225 int http_client_add_message(HttpClient *client, const void *buf, size_t size);
226
227 size_t http_client_message_buf_size_available(HttpClient *client);
184 228
185 229
186 void http_client_add_tests(CxTestSuite *suite); 230 void http_client_add_tests(CxTestSuite *suite);
187 231
188 #ifdef __cplusplus 232 #ifdef __cplusplus

mercurial