| 270 | } |
| 271 | |
| 272 | static size_t ProcessWebSocket(const char* buffer, |
| 273 | size_t len, |
| 274 | const HTTPParser::Ptr& httpParser, |
| 275 | const HttpSession::Ptr& httpSession) |
| 276 | { |
| 277 | size_t leftLen = len; |
| 278 | |
| 279 | const auto& wsCallback = httpSession->getWSCallback(); |
| 280 | auto& cacheFrame = httpParser->getWSCacheFrame(); |
| 281 | auto& parseString = httpParser->getWSParseString(); |
| 282 | |
| 283 | while (leftLen > 0) |
| 284 | { |
| 285 | parseString.clear(); |
| 286 | |
| 287 | auto opcode = WebSocketFormat::WebSocketFrameType::ERROR_FRAME; |
| 288 | size_t frameSize = 0; |
| 289 | bool isFin = false; |
| 290 | |
| 291 | if (!WebSocketFormat::wsFrameExtractBuffer(buffer, |
| 292 | leftLen, |
| 293 | parseString, |
| 294 | opcode, |
| 295 | frameSize, |
| 296 | isFin)) |
| 297 | { |
| 298 | // 如果没有解析出完整的ws frame则退出函数 |
| 299 | break; |
| 300 | } |
| 301 | |
| 302 | // 如果当前fram的fin为false或者opcode为延续包 |
| 303 | // 则将当前frame的payload添加到cache |
| 304 | if (!isFin || |
| 305 | opcode == WebSocketFormat::WebSocketFrameType::CONTINUATION_FRAME) |
| 306 | { |
| 307 | cacheFrame += parseString; |
| 308 | parseString.clear(); |
| 309 | } |
| 310 | // 如果当前fram的fin为false,并且opcode不为延续包 |
| 311 | // 则表示收到分段payload的第一个段(frame),需要缓存当前frame的opcode |
| 312 | if (!isFin && |
| 313 | opcode != WebSocketFormat::WebSocketFrameType::CONTINUATION_FRAME) |
| 314 | { |
| 315 | httpParser->cacheWSFrameType(opcode); |
| 316 | } |
| 317 | |
| 318 | leftLen -= frameSize; |
| 319 | buffer += frameSize; |
| 320 | |
| 321 | if (!isFin) |
| 322 | { |
| 323 | continue; |
| 324 | } |
| 325 | |
| 326 | // 如果fin为true,并且opcode为延续包 |
| 327 | // 则表示分段payload全部接受完毕 |
| 328 | // 因此需要获取之前第一次收到分段frame的opcode作为整个payload的类型 |
| 329 | if (opcode == WebSocketFormat::WebSocketFrameType::CONTINUATION_FRAME) |
nothing calls this directly
no test coverage detected