MCPcopy Create free account
hub / github.com/IronsDu/brynet / ProcessWebSocket

Method ProcessWebSocket

include/brynet/net/http/HttpService.hpp:272–346  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

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)

Callers

nothing calls this directly

Calls 4

clearMethod · 0.80
cacheWSFrameTypeMethod · 0.80
getWSFrameTypeMethod · 0.80
emptyMethod · 0.45

Tested by

no test coverage detected