| 1506 | } |
| 1507 | |
| 1508 | SC::Result SC::HttpClientOperation::processPendingEvents() |
| 1509 | { |
| 1510 | HttpClientOperationEvent event; |
| 1511 | while (dequeueEvent(event)) |
| 1512 | { |
| 1513 | switch (event.type) |
| 1514 | { |
| 1515 | case HttpClientOperationEvent::Type::ResponseHead: |
| 1516 | if (currentResponse != nullptr and currentListener != nullptr) |
| 1517 | { |
| 1518 | currentListener->onResponseHead(*currentResponse); |
| 1519 | } |
| 1520 | break; |
| 1521 | case HttpClientOperationEvent::Type::ResponseData: { |
| 1522 | if (event.bufferIndex >= responseBuffers.sizeInElements()) |
| 1523 | { |
| 1524 | return Result::Error("HttpClient: invalid response buffer index"); |
| 1525 | } |
| 1526 | const Span<char> writable = responseBuffers[event.bufferIndex].data; |
| 1527 | const Span<const char> readable = {writable.data(), event.size}; |
| 1528 | if (currentListener != nullptr) |
| 1529 | { |
| 1530 | currentListener->onResponseBody(readable); |
| 1531 | } |
| 1532 | releaseResponseBuffer(event.bufferIndex); |
| 1533 | break; |
| 1534 | } |
| 1535 | case HttpClientOperationEvent::Type::ResponseComplete: |
| 1536 | requestInFlight = false; |
| 1537 | eventMutex.lock(); |
| 1538 | eventCV.signal(); |
| 1539 | eventMutex.unlock(); |
| 1540 | if (currentListener != nullptr) |
| 1541 | { |
| 1542 | currentListener->onResponseComplete(); |
| 1543 | } |
| 1544 | resetRequestBodyState(); |
| 1545 | break; |
| 1546 | case HttpClientOperationEvent::Type::Error: |
| 1547 | requestInFlight = false; |
| 1548 | eventMutex.lock(); |
| 1549 | eventCV.signal(); |
| 1550 | eventMutex.unlock(); |
| 1551 | if (currentListener != nullptr) |
| 1552 | { |
| 1553 | currentListener->onError(event.error); |
| 1554 | } |
| 1555 | resetRequestBodyState(); |
| 1556 | break; |
| 1557 | } |
| 1558 | } |
| 1559 | return Result(true); |
| 1560 | } |
| 1561 | |
| 1562 | SC::Result SC::HttpClientOperation::poll(uint32_t timeoutMilliseconds) |
| 1563 | { |
nothing calls this directly
no test coverage detected