| 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 |
no test coverage detected