// ------------------------------------------------------------------------ int FskHeaderGenerateOutputBlob(char *blob, int blobLength, Boolean withTerminator, FskHeaders *headers) { FskHeaderIterator iter; int blobLoc = 0, amt; iter = FskHeaderIteratorNew(headers); if (blob) { while ((amt = FskHeaderGenerateOutputLine(iter, &blob[blobLoc], blobLength - blobLoc)) > 0) { blobLoc += amt; iter = FskHeaderIteratorNext(iter); } if (withTerminator) FskStrCat(blob, "\r\n"); } else { while ((amt = FskHeaderGenerateOutputLine(iter, NULL, blobLength - blobLoc)) > 0) { blobLoc += amt; iter = FskHeaderIteratorNext(iter); } } if (withTerminator) blobLoc += 2; FskHeaderIteratorDispose(iter); return blobLoc; }
static Boolean KprWebSocketEndpointValidateResponse(KprWebSocketEndpoint self, FskHeaders *response) { FskErr err; char *value; char *encoded = NULL; Boolean result = false; { FskHeaderIterator iter = FskHeaderIteratorNew(response); FskDebugStr("HANDSHAKE: response headers\n"); while (iter) { FskDebugStr("> %s: %s\n", iter->name, iter->value); iter = FskHeaderIteratorNext(iter); } FskHeaderIteratorDispose(iter); } if (response->responseCode != 101) return false; if (!KprWebSocketEndpointCheckHeaderValue(response, "Upgrade", "websocket")) return false; if (!KprWebSocketEndpointCheckHeaderValue(response, "Connection", "Upgrade")) return false; value = FskHeaderFind("Sec-WebSocket-Accept", response); if (!value) return false; bailIfError(KprWebSocketCalculateHash(self->key, &encoded)); result = (FskStrCompare(value, encoded) == 0); bail: if (encoded) FskMemPtrDispose(encoded); return result; }