mirror of
https://github.com/cesanta/mongoose.git
synced 2024-12-28 07:28:13 +08:00
poll TLS to process outstanding data in receive buffer
This commit is contained in:
parent
be5d8b1d4f
commit
08cac802a4
22
mongoose.c
22
mongoose.c
@ -5497,6 +5497,17 @@ long mg_io_send(struct mg_connection *c, const void *buf, size_t len) {
|
|||||||
return (long) len;
|
return (long) len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void handle_tls_recv(struct mg_connection *c, struct mg_iobuf *io) {
|
||||||
|
long n = mg_tls_recv(c, &io->buf[io->len], io->size - io->len);
|
||||||
|
if (n == MG_IO_ERR) {
|
||||||
|
mg_error(c, "TLS recv error");
|
||||||
|
} else if (n > 0) {
|
||||||
|
// Decrypted successfully - trigger MG_EV_READ
|
||||||
|
io->len += (size_t) n;
|
||||||
|
mg_call(c, MG_EV_READ, &n);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void read_conn(struct mg_connection *c, struct pkt *pkt) {
|
static void read_conn(struct mg_connection *c, struct pkt *pkt) {
|
||||||
struct connstate *s = (struct connstate *) (c + 1);
|
struct connstate *s = (struct connstate *) (c + 1);
|
||||||
struct mg_iobuf *io = c->is_tls ? &c->rtls : &c->recv;
|
struct mg_iobuf *io = c->is_tls ? &c->rtls : &c->recv;
|
||||||
@ -5575,14 +5586,7 @@ static void read_conn(struct mg_connection *c, struct pkt *pkt) {
|
|||||||
mg_error(c, "oom");
|
mg_error(c, "oom");
|
||||||
} else {
|
} else {
|
||||||
// Decrypt data directly into c->recv
|
// Decrypt data directly into c->recv
|
||||||
long n = mg_tls_recv(c, &io->buf[io->len], io->size - io->len);
|
handle_tls_recv(c, io);
|
||||||
if (n == MG_IO_ERR) {
|
|
||||||
mg_error(c, "TLS recv error");
|
|
||||||
} else if (n > 0) {
|
|
||||||
// Decrypted successfully - trigger MG_EV_READ
|
|
||||||
io->len += (size_t) n;
|
|
||||||
mg_call(c, MG_EV_READ, &n);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Plain text connection, data is already in c->recv, trigger
|
// Plain text connection, data is already in c->recv, trigger
|
||||||
@ -5993,6 +5997,8 @@ void mg_mgr_poll(struct mg_mgr *mgr, int ms) {
|
|||||||
MG_VERBOSE(("%lu .. %c%c%c%c%c", c->id, c->is_tls ? 'T' : 't',
|
MG_VERBOSE(("%lu .. %c%c%c%c%c", c->id, c->is_tls ? 'T' : 't',
|
||||||
c->is_connecting ? 'C' : 'c', c->is_tls_hs ? 'H' : 'h',
|
c->is_connecting ? 'C' : 'c', c->is_tls_hs ? 'H' : 'h',
|
||||||
c->is_resolving ? 'R' : 'r', c->is_closing ? 'C' : 'c'));
|
c->is_resolving ? 'R' : 'r', c->is_closing ? 'C' : 'c'));
|
||||||
|
if (c->is_tls && mg_tls_pending(c) > 0)
|
||||||
|
handle_tls_recv(c, (struct mg_iobuf *) &c->rtls);
|
||||||
if (can_write(c)) write_conn(c);
|
if (can_write(c)) write_conn(c);
|
||||||
if (c->is_draining && c->send.len == 0 && s->ttype != MIP_TTYPE_FIN)
|
if (c->is_draining && c->send.len == 0 && s->ttype != MIP_TTYPE_FIN)
|
||||||
init_closure(c);
|
init_closure(c);
|
||||||
|
@ -613,6 +613,17 @@ long mg_io_send(struct mg_connection *c, const void *buf, size_t len) {
|
|||||||
return (long) len;
|
return (long) len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void handle_tls_recv(struct mg_connection *c, struct mg_iobuf *io) {
|
||||||
|
long n = mg_tls_recv(c, &io->buf[io->len], io->size - io->len);
|
||||||
|
if (n == MG_IO_ERR) {
|
||||||
|
mg_error(c, "TLS recv error");
|
||||||
|
} else if (n > 0) {
|
||||||
|
// Decrypted successfully - trigger MG_EV_READ
|
||||||
|
io->len += (size_t) n;
|
||||||
|
mg_call(c, MG_EV_READ, &n);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void read_conn(struct mg_connection *c, struct pkt *pkt) {
|
static void read_conn(struct mg_connection *c, struct pkt *pkt) {
|
||||||
struct connstate *s = (struct connstate *) (c + 1);
|
struct connstate *s = (struct connstate *) (c + 1);
|
||||||
struct mg_iobuf *io = c->is_tls ? &c->rtls : &c->recv;
|
struct mg_iobuf *io = c->is_tls ? &c->rtls : &c->recv;
|
||||||
@ -691,14 +702,7 @@ static void read_conn(struct mg_connection *c, struct pkt *pkt) {
|
|||||||
mg_error(c, "oom");
|
mg_error(c, "oom");
|
||||||
} else {
|
} else {
|
||||||
// Decrypt data directly into c->recv
|
// Decrypt data directly into c->recv
|
||||||
long n = mg_tls_recv(c, &io->buf[io->len], io->size - io->len);
|
handle_tls_recv(c, io);
|
||||||
if (n == MG_IO_ERR) {
|
|
||||||
mg_error(c, "TLS recv error");
|
|
||||||
} else if (n > 0) {
|
|
||||||
// Decrypted successfully - trigger MG_EV_READ
|
|
||||||
io->len += (size_t) n;
|
|
||||||
mg_call(c, MG_EV_READ, &n);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Plain text connection, data is already in c->recv, trigger
|
// Plain text connection, data is already in c->recv, trigger
|
||||||
@ -1109,6 +1113,8 @@ void mg_mgr_poll(struct mg_mgr *mgr, int ms) {
|
|||||||
MG_VERBOSE(("%lu .. %c%c%c%c%c", c->id, c->is_tls ? 'T' : 't',
|
MG_VERBOSE(("%lu .. %c%c%c%c%c", c->id, c->is_tls ? 'T' : 't',
|
||||||
c->is_connecting ? 'C' : 'c', c->is_tls_hs ? 'H' : 'h',
|
c->is_connecting ? 'C' : 'c', c->is_tls_hs ? 'H' : 'h',
|
||||||
c->is_resolving ? 'R' : 'r', c->is_closing ? 'C' : 'c'));
|
c->is_resolving ? 'R' : 'r', c->is_closing ? 'C' : 'c'));
|
||||||
|
if (c->is_tls && mg_tls_pending(c) > 0)
|
||||||
|
handle_tls_recv(c, (struct mg_iobuf *) &c->rtls);
|
||||||
if (can_write(c)) write_conn(c);
|
if (can_write(c)) write_conn(c);
|
||||||
if (c->is_draining && c->send.len == 0 && s->ttype != MIP_TTYPE_FIN)
|
if (c->is_draining && c->send.len == 0 && s->ttype != MIP_TTYPE_FIN)
|
||||||
init_closure(c);
|
init_closure(c);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user