string ~ ubyte
Bob Cowdery
bob at bobcowdery.plus.com
Sun Oct 31 08:58:13 PDT 2010
On 31/10/2010 13:13, div0 wrote:
> On 31/10/2010 11:36, Bob Cowdery wrote:
>> Hi
>> I'm implementing a web sockets server as part of the UI for my
>> application. It's almost working but the connection closes on me just
>> after the handshake. I'm pretty sure the handshake response I'm sending
>> is incorrect.
>>
>> This is the last bit of the code (I've missed ot the bit that creates
>> the parts as I think that is ok):
>>
>> // Create the challenge response
>> // The response is formed by a concatenation of
>> // part_1 + part_2 + key (where parts are 32 bit integers and
>> key is 8 bytes)
>> // The parts must be in big endian order and the whole forms a
>> 128 bit value
>> // The response is then the MD5 hash of this value
>> writeln("Creating response");
>> auto response = new ubyte[16];
>> response[0] = part_1& 0xFF;
>> response[1] = (part_1>> 8)& 0xFF;
>> response[2] = (part_1>> 16)& 0xFF;
>> response[3] = (part_1>> 24)& 0xFF;
>> response[4] = part_2& 0xFF;
>> response[5] = (part_2>> 8)& 0xFF;
>> response[6] = (part_2>> 16)& 0xFF;
>> response[7] = (part_2>> 24)& 0xFF;
>> foreach(i, value; key) {
>> response[i+8] = value;
>> }
>>
>> // Create an MD5 hash of the result.
>> ubyte digest[16];
>> sum(digest, response);
>>
>> // Send the handshake
>> writeln("Handshake sending: ", handshake ~
>> digestToString(digest));
>> this.sock.send(handshake ~ digestToString(digest));
>>
>> The result of running gives me a handshake respose of:
>>
>> Creating response
>> Handshake sending: HTTP/1.1 101 Web Socket Protocol Handshake
>> Upgrade: WebSocket
>> Connection: Upgrade
>> WebSocket-Origin: http://localhost:9000
>> WebSocket-Location: ws://localhost:9999/
>> Sec-Websocket-Origin: http://localhost:9000
>> Sec-Websocket-Location: ws://localhost:9999/
>>
>> 5C368EF0F874025639911E2BC5F01412
>>
>> This all looks good except the string at the end (the digest) which has
>> 32 characters whereas I think the client is expecting 16. I'm guessing
>> the string is created as UTF16. Is there a way to get this to be 16
>> characters?
>>
>> bob
>
> If the client is expecting 16 bytes, then it wants the response in
> binary. You're converting it to hex text which is why you've got twice
> as many characters as you are expecting. just remove the
> digestToString bit and send the raw ubyte array.
>
> You may or may not need to reverse the md5 as well.
> Not sure if Endianess applies to a md5.
>
Thanks. If I do :
this.sock.send(cast(ubyte[])handshake ~ digest);
it looks better but stil closes the connection. I guess I will have to
look at the protocol spec again and see if I can figure what I'm doing
wrong.
bob
More information about the Digitalmars-d-learn
mailing list