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 FskErr sHTTPServerGotSocket(struct FskSocketRecord *skt, void *refCon) { FskHTTPServerListener listener = (FskHTTPServerListener)refCon; listener->handshaking = false; if (listener->http && FskNetSocketGetLastError(skt) == kFskErrNone) return httpServerListenerStart(listener, skt); else { FskHTTPServerListenerDispose(listener); return kFskErrOperationFailed; } }
static FskErr sHTTPServerGotSocket(struct FskSocketRecord *skt, void *refCon) { FskHTTPServerListener listener = (FskHTTPServerListener)refCon; listener->handshaking = false; FskErr err = skt != NULL ? FskNetSocketGetLastError(skt) : kFskErrOperationFailed; if (listener->http && err == kFskErrNone) return httpServerListenerStart(listener, skt); else { if (skt != NULL) FskNetSocketClose(skt); if (err != kFskErrSSLHandshakeFailed) FskHTTPServerListenerDispose(listener); return err; } }