return 0;
if (tport_is_closed(self)) {
+
+again:
if (self->tp_refs == 0) {
SU_DEBUG_7(("tport(%p): set timer at %u ms because %s\n",
(void *)self, 0, "zap"));
}
}
- if (self->tp_pri->pri_vtable->vtp_next_secondary_timer)
- self->tp_pri->pri_vtable->
- vtp_next_secondary_timer(self, &target, &why);
+ if (self->tp_pri->pri_vtable->vtp_next_secondary_timer) {
+ if (self->tp_pri->pri_vtable->
+ vtp_next_secondary_timer(self, &target, &why) == -1) {
+ if (tport_is_closed(self)) {
+ goto again;
+ }
+ }
+ }
if (su_time_cmp(target, infinity)) {
SU_DEBUG_7(("tport(%p): set timer at %ld ms because %s\n",
SU_DEBUG_7(("%s(%p): %s to " TPN_FORMAT "%s\n",
__func__, (void *)self,
(punt == 2 ? "Timeout establishing SSL" : "Error establishing SSL"), TPN_ARGS(self->tp_name), ""));
+ if (wstp->ws.secure)
+ return -1;
}
/** WS timer. */
void tport_ws_timer(tport_t *self, su_time_t now)
{
- tport_recv_timeout_timer(self, now);
- tport_keepalive_timer(self, now);
+ tport_ws_t *wstp = (tport_ws_t *)self;
+
+ if (!strcmp("wss", self->tp_protoname) && !wstp->ws.secure_established) {
+ tport_close(self);
+ } else {
+ tport_recv_timeout_timer(self, now);
+ tport_keepalive_timer(self, now);
+ }
tport_base_timer(self, now);
}