Skip to content

Commit db6730c

Browse files
authored
Merge pull request #2706 from cesanta/tlspoll
poll TLS to process outstanding data in receive buffer
2 parents af6a52e + 08cac80 commit db6730c

File tree

2 files changed

+28
-16
lines changed

2 files changed

+28
-16
lines changed

mongoose.c

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5497,6 +5497,17 @@ long mg_io_send(struct mg_connection *c, const void *buf, size_t len) {
54975497
return (long) len;
54985498
}
54995499

5500+
static void handle_tls_recv(struct mg_connection *c, struct mg_iobuf *io) {
5501+
long n = mg_tls_recv(c, &io->buf[io->len], io->size - io->len);
5502+
if (n == MG_IO_ERR) {
5503+
mg_error(c, "TLS recv error");
5504+
} else if (n > 0) {
5505+
// Decrypted successfully - trigger MG_EV_READ
5506+
io->len += (size_t) n;
5507+
mg_call(c, MG_EV_READ, &n);
5508+
}
5509+
}
5510+
55005511
static void read_conn(struct mg_connection *c, struct pkt *pkt) {
55015512
struct connstate *s = (struct connstate *) (c + 1);
55025513
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) {
55755586
mg_error(c, "oom");
55765587
} else {
55775588
// Decrypt data directly into c->recv
5578-
long n = mg_tls_recv(c, &io->buf[io->len], io->size - io->len);
5579-
if (n == MG_IO_ERR) {
5580-
mg_error(c, "TLS recv error");
5581-
} else if (n > 0) {
5582-
// Decrypted successfully - trigger MG_EV_READ
5583-
io->len += (size_t) n;
5584-
mg_call(c, MG_EV_READ, &n);
5585-
}
5589+
handle_tls_recv(c, io);
55865590
}
55875591
} else {
55885592
// Plain text connection, data is already in c->recv, trigger
@@ -5993,6 +5997,8 @@ void mg_mgr_poll(struct mg_mgr *mgr, int ms) {
59935997
MG_VERBOSE(("%lu .. %c%c%c%c%c", c->id, c->is_tls ? 'T' : 't',
59945998
c->is_connecting ? 'C' : 'c', c->is_tls_hs ? 'H' : 'h',
59955999
c->is_resolving ? 'R' : 'r', c->is_closing ? 'C' : 'c'));
6000+
if (c->is_tls && mg_tls_pending(c) > 0)
6001+
handle_tls_recv(c, (struct mg_iobuf *) &c->rtls);
59966002
if (can_write(c)) write_conn(c);
59976003
if (c->is_draining && c->send.len == 0 && s->ttype != MIP_TTYPE_FIN)
59986004
init_closure(c);

src/net_builtin.c

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -613,6 +613,17 @@ long mg_io_send(struct mg_connection *c, const void *buf, size_t len) {
613613
return (long) len;
614614
}
615615

616+
static void handle_tls_recv(struct mg_connection *c, struct mg_iobuf *io) {
617+
long n = mg_tls_recv(c, &io->buf[io->len], io->size - io->len);
618+
if (n == MG_IO_ERR) {
619+
mg_error(c, "TLS recv error");
620+
} else if (n > 0) {
621+
// Decrypted successfully - trigger MG_EV_READ
622+
io->len += (size_t) n;
623+
mg_call(c, MG_EV_READ, &n);
624+
}
625+
}
626+
616627
static void read_conn(struct mg_connection *c, struct pkt *pkt) {
617628
struct connstate *s = (struct connstate *) (c + 1);
618629
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) {
691702
mg_error(c, "oom");
692703
} else {
693704
// Decrypt data directly into c->recv
694-
long n = mg_tls_recv(c, &io->buf[io->len], io->size - io->len);
695-
if (n == MG_IO_ERR) {
696-
mg_error(c, "TLS recv error");
697-
} else if (n > 0) {
698-
// Decrypted successfully - trigger MG_EV_READ
699-
io->len += (size_t) n;
700-
mg_call(c, MG_EV_READ, &n);
701-
}
705+
handle_tls_recv(c, io);
702706
}
703707
} else {
704708
// Plain text connection, data is already in c->recv, trigger
@@ -1109,6 +1113,8 @@ void mg_mgr_poll(struct mg_mgr *mgr, int ms) {
11091113
MG_VERBOSE(("%lu .. %c%c%c%c%c", c->id, c->is_tls ? 'T' : 't',
11101114
c->is_connecting ? 'C' : 'c', c->is_tls_hs ? 'H' : 'h',
11111115
c->is_resolving ? 'R' : 'r', c->is_closing ? 'C' : 'c'));
1116+
if (c->is_tls && mg_tls_pending(c) > 0)
1117+
handle_tls_recv(c, (struct mg_iobuf *) &c->rtls);
11121118
if (can_write(c)) write_conn(c);
11131119
if (c->is_draining && c->send.len == 0 && s->ttype != MIP_TTYPE_FIN)
11141120
init_closure(c);

0 commit comments

Comments
 (0)