| 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 |