static FskErr httpServerListenerAcceptNewConnection(FskThreadDataHandler handler, FskThreadDataSource source, void *refCon) { FskErr err = kFskErrNone; FskHTTPServerListener listener = (FskHTTPServerListener)handler->refCon; FskSocket skt; err = FskNetAcceptConnection((FskSocket)source, &skt, "HTTP Acceptor"); if (err != kFskErrNone) return err; FskNetSocketMakeNonblocking(skt); #if CLOSED_SSL if (listener->http->ssl) { void *ssl; err = FskSSLAttach(&ssl, skt); if (err != kFskErrNone) { FskNetSocketClose(skt); return err; } if (listener->http->certs != NULL) FskSSLLoadCerts(ssl, listener->http->certs); listener->handshaking = true; err = FskSSLHandshake(ssl, sHTTPServerGotSocket, listener, false, kFskHTTPSSLHandshakeTimeout); if (err != kFskErrNone) { FskSSLDispose(ssl); /* skt has been attached to ssl so it should be closed all together */ return err; } return err; } else #endif return httpServerListenerStart(listener, skt); }
static void time_callback(FskTimeCallBack callback, const FskTime time, void *param) { FskSSL *fssl = param; FskSocket skt; void *refCon; FskTimeCallbackDispose(callback); fssl->timer = NULL; skt = fssl->skt; refCon = fssl->callbackData; if (fssl->skt == NULL) /* check if some error has occurred and dispose everything here in that case as there's no chance to do after this point */ FskSSLDispose(fssl); (*fssl->socketCallback)(skt, refCon); /* nothing should be here! */ }
static FskErr KprSocketStartTSL(KprSocket self) { FskErr err; void *ssl = NULL; if (self->sslState != kKprSocketSSLStateInsecure) return kFskErrBadState; bailIfError(FskSSLAttach(&ssl, self->socket)); if (self->server && self->server->certs != NULL) FskSSLLoadCerts(ssl, self->server->certs); self->sslState = kKprSocketSSLStateHandshaking; err = FskSSLHandshake(ssl, KprSocketSSLHandshakeFinished, self, (self->server == NULL), 0); bail: if (err != kFskErrNone) { FskSSLDispose(ssl); } return err; }