Mercurial > hg > nginx-quic
view src/os/unix/ngx_udp_send.c @ 6642:72282dd5884e
HTTP/2: flushing of the SSL buffer in transition to the idle state.
It fixes potential connection leak if some unsent data was left in the SSL
buffer. Particularly, that could happen when a client canceled the stream
after the HEADERS frame has already been created. In this case no other
frames might be produced and the HEADERS frame alone didn't flush the buffer.
author | Valentin Bartenev <vbart@nginx.com> |
---|---|
date | Tue, 19 Jul 2016 20:34:17 +0300 |
parents | 8f038068f4bc |
children |
line wrap: on
line source
/* * Copyright (C) Igor Sysoev * Copyright (C) Nginx, Inc. */ #include <ngx_config.h> #include <ngx_core.h> #include <ngx_event.h> ssize_t ngx_udp_unix_send(ngx_connection_t *c, u_char *buf, size_t size) { ssize_t n; ngx_err_t err; ngx_event_t *wev; wev = c->write; for ( ;; ) { n = sendto(c->fd, buf, size, 0, c->sockaddr, c->socklen); ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0, "sendto: fd:%d %z of %uz to \"%V\"", c->fd, n, size, &c->addr_text); if (n >= 0) { if ((size_t) n != size) { wev->error = 1; (void) ngx_connection_error(c, 0, "sendto() incomplete"); return NGX_ERROR; } c->sent += n; return n; } err = ngx_socket_errno; if (err == NGX_EAGAIN) { wev->ready = 0; ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, NGX_EAGAIN, "sendto() not ready"); return NGX_AGAIN; } if (err != NGX_EINTR) { wev->error = 1; (void) ngx_connection_error(c, err, "sendto() failed"); return NGX_ERROR; } } }