11package net .tootallnate .websocket .drafts ;
22import java .math .BigInteger ;
3- import java .nio .Buffer ;
43import java .nio .ByteBuffer ;
5- import java .nio .charset .Charset ;
64import java .security .MessageDigest ;
75import java .security .NoSuchAlgorithmException ;
86import java .util .Collections ;
@@ -46,12 +44,13 @@ public static int readVersion(Handshakedata handshakedata){
4644 }
4745 return -1 ;
4846 }
47+
4948 private ByteBuffer incompleteframe ;
5049
5150 @ Override
5251 public HandshakeState acceptHandshakeAsClient ( Handshakedata request , Handshakedata response ) throws InvalidHandshakeException {
5352 if ( !request .hasFieldValue ( "Sec-WebSocket-Key" ) || !response .hasFieldValue ( "Sec-WebSocket-Accept" ) )
54- throw new InvalidHandshakeException ( "missing Sec-WebSocket-Key" ) ;
53+ return HandshakeState . NOT_MATCHED ;
5554
5655 String seckey_answere = response .getFieldValue ( "Sec-WebSocket-Accept" );
5756 String seckey_challenge = request .getFieldValue ( "Sec-WebSocket-Key" );
@@ -64,10 +63,10 @@ public HandshakeState acceptHandshakeAsClient( Handshakedata request , Handshake
6463
6564 @ Override
6665 public HandshakeState acceptHandshakeAsServer ( Handshakedata handshakedata ) throws InvalidHandshakeException {
67- //TODO Do a more detailed formal handshake test
66+ //Sec-WebSocket-Origin is only required for browser clients
6867 int v = readVersion ( handshakedata );
6968 if ( v == 7 || v == 8 )//g
70- return HandshakeState .MATCHED ;
69+ return basicAccept ( handshakedata ) ? HandshakeState .MATCHED : HandshakeState . NOT_MATCHED ;
7170 return HandshakeState .NOT_MATCHED ;
7271 }
7372
@@ -105,7 +104,7 @@ else if( sizebytes == 8 ){
105104
106105 if ( mask ){
107106 ByteBuffer maskkey = ByteBuffer .allocate ( 4 );
108- maskkey .putInt ( Integer . MIN_VALUE );
107+ maskkey .putInt ( new Random (). nextInt () );
109108 buf .put ( maskkey .array () );
110109 for ( int i = 0 ; i < mes .length ; i ++){
111110 buf .put ( ( byte ) ( mes [i ] ^ maskkey .get ( i % 4 ) ) );
@@ -170,7 +169,7 @@ public HandshakeBuilder postProcessHandshakeRequestAsClient( HandshakeBuilder re
170169
171170 byte [] random = new byte [16 ];
172171 new Random ().nextBytes ( random );
173- request .put ( "Sec-WebSocket-Key" , new BASE64Encoder ().encode ( random ) );
172+ request .put ( "Sec-WebSocket-Key" , new BASE64Encoder ().encode ( random ) );
174173
175174 return request ;
176175 }
@@ -223,18 +222,26 @@ public List<Framedata> translateFrame( ByteBuffer buffer , int available ) {
223222 Framedata cur ;
224223
225224 if ( incompleteframe != null ){
226- int keptformlastsegment = incompleteframe .limit (); //the number of bytes kept from the previous segments, belonging to incomplete frame
227225 while (true ){
228226 try {
229- int ext = incompleteframe .limit () - keptformlastsegment ; //the growth of this incomplete frame
230- if ( incompleteframe .remaining () > buffer .limit () - ext ){
231- return frames ; //the given segment is to small to complete the incomplete frame ; awaiting more segments
227+ int available_next_byte_count = available ;// The number of bytes received
228+ int expected_next_byte_count = incompleteframe .remaining ();// The number of bytes to complete the incomplete frame
229+
230+ if ( expected_next_byte_count > available_next_byte_count ){
231+ //did not receive enough bytes to complete the frame
232+ incompleteframe .put ( buffer .array () , 0 , available_next_byte_count );
233+ //assert( buffer.limit() == available_next_byte_count + buffer.position() );
234+ //buffer.position( available );
235+ return frames ;
232236 }
233- int frombuffer = incompleteframe .remaining ();
234- incompleteframe .put ( buffer .array () , ext , frombuffer );
237+
238+ incompleteframe .put ( buffer .array () , 0 , expected_next_byte_count );
239+ //buffer.position( buffer.position() + expected_next_byte_count );
240+
235241 cur = translateSingleFrame ( incompleteframe , 0 , incompleteframe .limit () );
242+ System .out .println (cur );
236243 frames .add ( cur );
237- offset = ext + frombuffer ;
244+ offset = expected_next_byte_count ;
238245 incompleteframe = null ;
239246 break ; // go on with the normal frame receival
240247 } catch ( IncompleteException e ) {
0 commit comments