Called from the http thread(s)
| 107 | |
| 108 | // Called from the http thread(s) |
| 109 | void HttpContent(dmHttpClient::HResponse response, void* user_data, int status_code, |
| 110 | const void* content_data, uint32_t content_data_size, int32_t content_length, |
| 111 | uint32_t range_start, uint32_t range_end, uint32_t document_size, |
| 112 | const char* method) |
| 113 | { |
| 114 | Worker* worker = (Worker*) user_data; |
| 115 | worker->m_Status = status_code; |
| 116 | worker->m_RangeStart = range_start; |
| 117 | worker->m_RangeEnd = range_end; |
| 118 | worker->m_DocumentSize = document_size; |
| 119 | dmArray<char>& r = worker->m_Response; |
| 120 | bool method_is_head = method && strcmp(method, "HEAD") == 0; |
| 121 | |
| 122 | if (!method_is_head && !content_data && !content_data_size) |
| 123 | { |
| 124 | r.SetSize(0); |
| 125 | return; |
| 126 | } |
| 127 | |
| 128 | uint32_t bytes_received = 0; |
| 129 | if (!method_is_head) |
| 130 | { |
| 131 | // do we have enough room to fit the content? if not, grow the array |
| 132 | uint32_t left = r.Capacity() - r.Size(); |
| 133 | if (content_data_size > left) |
| 134 | { |
| 135 | r.OffsetCapacity(content_data_size - left); |
| 136 | } |
| 137 | r.PushArray((char*) content_data, content_data_size); |
| 138 | bytes_received = r.Size(); |
| 139 | } |
| 140 | |
| 141 | if (worker->m_ReportProgress && (method_is_head || content_data_size > 0)) |
| 142 | { |
| 143 | assert(worker->m_Service->m_ReportProgressCallback); |
| 144 | |
| 145 | dmHttpDDF::HttpRequestProgress progress = {}; |
| 146 | progress.m_BytesReceived = bytes_received; |
| 147 | progress.m_BytesTotal = content_length; |
| 148 | progress.m_Url = worker->m_Request->m_Url; |
| 149 | worker->m_Service->m_ReportProgressCallback(&progress, &worker->m_CurrentRequesterURL, worker->m_ResponseUserData2); |
| 150 | } |
| 151 | } |
| 152 | |
| 153 | uint32_t HttpSendContentLength(dmHttpClient::HResponse response, void* user_data) |
| 154 | { |