zframe_t* zwshandshake_get_response(zwshandshake_t *self)
{
	const char * sec_websocket_key_name = "sec-websocket-key";
	const char * magic_string = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";

	char * key = (char *)zhash_lookup(self->header_fields, sec_websocket_key_name);

	int len = strlen(key) + strlen(magic_string);

	char plain[150];

	strcpy(plain, key);
	strcat(plain, magic_string);

	zdigest_t* digest = zdigest_new();
	zdigest_update(digest, (byte *) plain, len);
	
	byte* hash = zdigest_data(digest);
		
	char accept_key[150];

	int accept_key_len = encode_base64(hash, zdigest_size(digest), accept_key, 150);

	int response_len = strlen("HTTP/1.1 101 Switching Protocols\r\n"
		"Upgrade: websocket\r\n"
		"Connection: Upgrade\r\n"
		"Sec-WebSocket-Accept: \r\n"
		"Sec-WebSocket-Protocol: WSNetMQ\r\n\r\n") + accept_key_len;

	char* response = (char *)zmalloc(sizeof(char) * (response_len+1));
	
	strcpy(response, "HTTP/1.1 101 Switching Protocols\r\n"
		"Upgrade: websocket\r\n"
		"Connection: Upgrade\r\n"
		"Sec-WebSocket-Accept: ");
	strncat(response, accept_key, accept_key_len);
	strcat(response, "\r\nSec-WebSocket-Protocol: WSNetMQ\r\n\r\n");	

	return zframe_new(response, response_len);
}
Exemplo n.º 2
0
///
//  Return final digest hash size
size_t QmlZdigest::size () {
    return zdigest_size (self);
};