diff options
-rw-r--r-- | src/unstable/protocolwebsocket.cpp | 36 |
1 files changed, 26 insertions, 10 deletions
diff --git a/src/unstable/protocolwebsocket.cpp b/src/unstable/protocolwebsocket.cpp index 756c177..3c0d091 100644 --- a/src/unstable/protocolwebsocket.cpp +++ b/src/unstable/protocolwebsocket.cpp | |||
@@ -158,14 +158,17 @@ bool Bu::ProtocolWebSocket::stateProtoId() | |||
158 | 158 | ||
159 | bool Bu::ProtocolWebSocket::stateHandshake() | 159 | bool Bu::ProtocolWebSocket::stateHandshake() |
160 | { | 160 | { |
161 | DEBUG( Bu::println("websocket: Begining handshake.") ); | 161 | DEBUG( Bu::println("websocket: Processing header line (stateHandshake).") ); |
162 | 162 | ||
163 | Bu::String sLine; | 163 | Bu::String sLine; |
164 | if( !readHttpHdrLine( sLine ) ) | 164 | if( !readHttpHdrLine( sLine ) ) |
165 | return false; | 165 | return false; |
166 | |||
167 | DEBUG( Bu::println("Hdr: >>%1<<").arg( sLine ) ); | ||
166 | 168 | ||
167 | if( sLine.getSize() == 0 ) | 169 | if( sLine.getSize() == 0 ) |
168 | { | 170 | { |
171 | DEBUG( Bu::println("websocket: Out of header lines, completing handshake.") ); | ||
169 | if( !processHeaders() ) | 172 | if( !processHeaders() ) |
170 | return false; | 173 | return false; |
171 | onHandshakeComplete(); | 174 | onHandshakeComplete(); |
@@ -191,26 +194,39 @@ bool Bu::ProtocolWebSocket::stateHandshake() | |||
191 | } | 194 | } |
192 | hHeader.get( sKey ).append( sValue ); | 195 | hHeader.get( sKey ).append( sValue ); |
193 | 196 | ||
194 | DEBUG( Bu::println("Hdr: >>%1<<").arg( sLine ) ); | 197 | DEBUG( Bu::println(" -->%1 = %2").arg( sKey ).arg( sValue ) ); |
195 | DEBUG( Bu::println("%1 = %2").arg( sKey ).arg( sValue ) ); | ||
196 | 198 | ||
197 | return true; | 199 | return true; |
198 | } | 200 | } |
199 | 201 | ||
200 | bool Bu::ProtocolWebSocket::readHttpHdrLine( Bu::String &sLine ) | 202 | bool Bu::ProtocolWebSocket::readHttpHdrLine( Bu::String &sLine ) |
201 | { | 203 | { |
202 | char buf[1024]; | 204 | #define BUF_SIZ 512 |
203 | int iSize = pClient->peek( buf, 1024 ); | 205 | char buf[BUF_SIZ]; |
204 | for( int j = 0; j < iSize-1; j++ ) | 206 | int iOffset = 0; |
207 | sLine.clear(); | ||
208 | for(;;) | ||
205 | { | 209 | { |
206 | if( buf[j] == '\r' && buf[j+1] == '\n' ) | 210 | int iSize = pClient->peek( buf, BUF_SIZ, iOffset ); |
211 | DEBUG( Bu::println(" $$ readHttpHdrLine: peek found %1 bytes (%1 offset).").arg( iSize ).arg( iOffset ) ); | ||
212 | for( int j = 0; j < iSize-1; j++ ) | ||
207 | { | 213 | { |
208 | pClient->seek(j+2); | 214 | if( buf[j] == '\r' && buf[j+1] == '\n' ) |
209 | sLine.set( buf, j ); | 215 | { |
210 | return true; | 216 | pClient->seek(iOffset+j+2); |
217 | sLine.append( buf, j ); | ||
218 | return true; | ||
219 | } | ||
211 | } | 220 | } |
221 | |||
222 | if( iSize < BUF_SIZ ) | ||
223 | return false; | ||
224 | |||
225 | sLine.append( buf, iSize ); | ||
226 | iOffset += BUF_SIZ; | ||
212 | } | 227 | } |
213 | return false; | 228 | return false; |
229 | #undef BUF_SIZ | ||
214 | } | 230 | } |
215 | 231 | ||
216 | bool Bu::ProtocolWebSocket::processHeaders() | 232 | bool Bu::ProtocolWebSocket::processHeaders() |