28#if defined(HTTPS_SUPPORT) && defined(UPGRADE_SUPPORT)
38MHD_upgrade_response_handle_process_ (
struct MHD_UpgradeResponseHandle *urh)
56 if (! urh->was_closed)
59 MHD_SC_DAEMON_ALREADY_SHUTDOWN,
61 "Initiated daemon shutdown while \"upgraded\" connection was not closed.\n"));
64 urh->was_closed =
true;
66 was_closed = urh->was_closed;
71 if (0 < urh->in_buffer_used)
75 MHD_SC_UPGRADE_FORWARD_INCOMPLETE,
77 "Failed to forward to application "
79 " bytes of data received from remote side: application shut down socket.\n"),
88if (0 != urh->out_buffer_size)
91 urh->in_buffer_used = 0;
93 urh->mhd.celi &= ~MHD_EPOLL_STATE_WRITE_READY;
95 urh->in_buffer_size = 0;
96 urh->app.celi &= ~MHD_EPOLL_STATE_READ_READY;
115 (urh->in_buffer_used < urh->in_buffer_size) )
120 buf_size = urh->in_buffer_size - urh->in_buffer_used;
127 &urh->in_buffer[urh->in_buffer_used],
132 if (GNUTLS_E_INTERRUPTED != res)
134 urh->app.celi &= ~MHD_EPOLL_STATE_READ_READY;
135 if (GNUTLS_E_AGAIN != res)
140 urh->in_buffer_size = 0;
146 urh->in_buffer_used += res;
147 if (buf_size > (
size_t) res)
148 urh->app.celi &= ~MHD_EPOLL_STATE_READ_READY;
159 urh->in_buffer_size = 0;
167 (urh->out_buffer_used < urh->out_buffer_size) )
172 buf_size = urh->out_buffer_size - urh->out_buffer_used;
177 &urh->out_buffer[urh->out_buffer_used],
186 urh->mhd.celi &= ~MHD_EPOLL_STATE_READ_READY;
196 urh->out_buffer_size = 0;
202 urh->out_buffer_used += res;
203 if (buf_size > (
size_t) res)
204 urh->mhd.celi &= ~MHD_EPOLL_STATE_READ_READY;
213 urh->out_buffer_size = 0;
221 (urh->out_buffer_used > 0) )
226 data_size = urh->out_buffer_used;
237 if (GNUTLS_E_INTERRUPTED != res)
239 urh->app.celi &= ~MHD_EPOLL_STATE_WRITE_READY;
240 if (GNUTLS_E_INTERRUPTED != res)
246 MHD_SC_UPGRADE_FORWARD_INCOMPLETE,
248 "Failed to forward to remote client "
250 " bytes of data received from application: %s\n"),
256 urh->out_buffer_used = 0;
258 urh->out_buffer_size = 0;
259 urh->mhd.celi &= ~MHD_EPOLL_STATE_READ_READY;
265 const size_t next_out_buffer_used = urh->out_buffer_used - res;
266 if (0 != next_out_buffer_used)
268 memmove (urh->out_buffer,
269 &urh->out_buffer[res],
270 next_out_buffer_used);
271 if (data_size > (
size_t) res)
272 urh->app.celi &= ~MHD_EPOLL_STATE_WRITE_READY;
274 urh->out_buffer_used = next_out_buffer_used;
276 if ( (0 == urh->out_buffer_used) &&
282 urh->app.celi &= ~MHD_EPOLL_STATE_WRITE_READY;
284 urh->out_buffer_size = 0;
285 urh->mhd.celi &= ~MHD_EPOLL_STATE_READ_READY;
293 (urh->in_buffer_used > 0) )
298 data_size = urh->in_buffer_used;
311 urh->mhd.celi &= ~MHD_EPOLL_STATE_WRITE_READY;
318 MHD_SC_UPGRADE_FORWARD_INCOMPLETE,
320 "Failed to forward to application "
322 " bytes of data received from remote side: %s\n"),
327 urh->in_buffer_used = 0;
329 urh->in_buffer_size = 0;
330 urh->app.celi &= ~MHD_EPOLL_STATE_READ_READY;
337 const size_t next_in_buffer_used = urh->in_buffer_used - res;
338 if (0 != next_in_buffer_used)
340 memmove (urh->in_buffer,
341 &urh->in_buffer[res],
342 next_in_buffer_used);
343 if (data_size > (
size_t) res)
344 urh->mhd.celi &= ~MHD_EPOLL_STATE_WRITE_READY;
346 urh->in_buffer_used = next_in_buffer_used;
348 if ( (0 == urh->in_buffer_used) &&
352 urh->mhd.celi &= ~MHD_EPOLL_STATE_WRITE_READY;
354 urh->in_buffer_size = 0;
355 urh->app.celi &= ~MHD_EPOLL_STATE_READ_READY;
363 (urh->in_buffer_used < urh->in_buffer_size) &&
368 ( (0 != urh->out_buffer_size) ||
369 (0 != urh->out_buffer_used) ) )
373 if (0 < urh->out_buffer_used)
375 MHD_SC_UPGRADE_FORWARD_INCOMPLETE,
377 "Failed to forward to remote client "
379 " bytes of data received from application: daemon shut down.\n"),
383 urh->out_buffer_used = 0;
385 urh->app.celi &= ~MHD_EPOLL_STATE_WRITE_READY;
387 urh->out_buffer_size = 0;
388 urh->mhd.celi &= ~MHD_EPOLL_STATE_READ_READY;
@ MHD_EPOLL_STATE_READ_READY
@ MHD_EPOLL_STATE_WRITE_READY
#define MHD_SCKT_ERR_IS_EAGAIN_(err)
#define MHD_SCKT_ERR_IS_LOW_RESOURCES_(err)
#define MHD_socket_strerr_(err)
#define MHD_socket_get_error_()
#define MHD_SCKT_ERR_IS_EINTR_(err)
#define MHD_SCKT_SEND_MAX_SIZE_
#define MHD_recv_(s, b, l)
#define MHD_send_(s, b, l)
MHD internal shared structures.
#define MHD_UNSIGNED_LONG_LONG
#define MHD_UNSIGNED_LONG_LONG_PRINTF
struct MHD_Daemon * daemon
bool data_already_pending
enum MHD_ThreadingMode threading_mode
ssize_t(* recv)(void *cls, struct MHD_TLS_ConnectionState *cs, void *buf, size_t buf_size)
enum MHD_Bool(* check_record_pending)(void *cls, struct MHD_TLS_ConnectionState *cs)
const char *(* strerror)(void *cls, int ec)
ssize_t(* send)(void *cls, struct MHD_TLS_ConnectionState *cs, const void *buf, size_t buf_size)
function to process upgrade activity (over TLS)