MCPcopy Create free account
hub / github.com/defold/defold / DoTransfer

Function DoTransfer

engine/dlib/src/dlib/http_client.cpp:711–804  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

709 }
710
711 static Result DoTransfer(HClient client, Response* response, int to_transfer, HttpContent http_content, bool add_to_cache, const char* method)
712 {
713 // to_transfer can be set to -1 when the "Content-Length" is unknown
714 int total_transferred = 0;
715
716#if defined(DM_NO_HTTP_CACHE)
717 (void) add_to_cache;
718#endif
719
720 while (true)
721 {
722 int n;
723 if (to_transfer == -1) {
724 // Unknown "Content-Length". Read as much as we can.
725 n = response->m_TotalReceived - response->m_ContentOffset;
726 } else {
727 n = dmMath::Min(to_transfer - total_transferred, response->m_TotalReceived - response->m_ContentOffset);
728 }
729 http_content(response, client->m_Userdata, response->m_Status, client->m_Buffer + response->m_ContentOffset, n, response->m_ContentLength,
730 response->m_RangeStart, response->m_RangeEnd, response->m_DocumentSize,
731 method);
732
733#if !defined(DM_NO_HTTP_CACHE)
734 if (response->m_CacheCreator && add_to_cache)
735 {
736 dmHttpCache::Add(client->m_HttpCache, response->m_CacheCreator, client->m_Buffer + response->m_ContentOffset, n);
737 }
738#endif
739
740 total_transferred += n;
741 assert(total_transferred <= to_transfer || to_transfer == -1);
742 response->m_ContentOffset += n;
743
744 if (total_transferred == to_transfer)
745 {
746 // Move "extra" bytes to buffer start
747 memmove(client->m_Buffer, client->m_Buffer + response->m_ContentOffset, response->m_TotalReceived - response->m_ContentOffset);
748 response->m_TotalReceived = response->m_TotalReceived - response->m_ContentOffset;
749 response->m_ContentOffset = 0;
750 break;
751 }
752
753 assert(response->m_TotalReceived - response->m_ContentOffset == 0);
754 response->m_ContentOffset = 0;
755 response->m_TotalReceived = 0;
756
757 int recv_bytes;
758 dmSocket::Result sock_res = Receive(response, client->m_Buffer, BUFFER_SIZE, &recv_bytes);
759
760 if( sock_res == dmSocket::RESULT_WOULDBLOCK )
761 {
762 sock_res = dmSocket::RESULT_TRY_AGAIN;
763 }
764 if( (sock_res == dmSocket::RESULT_OK || sock_res == dmSocket::RESULT_TRY_AGAIN) && HasRequestTimedOut(client) )
765 {
766 sock_res = dmSocket::RESULT_WOULDBLOCK;
767 }
768

Callers 1

HandleResponseFunction · 0.85

Calls 5

MinFunction · 0.85
HasRequestTimedOutFunction · 0.85
AddFunction · 0.70
ReceiveFunction · 0.70
assertFunction · 0.50

Tested by

no test coverage detected