void OnAsyncDataAvailable(IntPtr sender, IntPtr calldata, IntPtr closure)
{
IntPtr data = IntPtr.Zero;
uint length = 0;
BrowserHttpWebResponse response = async_result.Response as BrowserHttpWebResponse;
try {
data = NativeMethods.http_request_write_event_args_get_data(calldata);
length = NativeMethods.http_request_write_event_args_get_count(calldata);
bytes_read += length;
if (progress != null)
{
// if Content-Encoding is gzip (or other compressed) then Content-Length cannot be trusted,
// if present, since it does not (generally) correspond to the uncompressed length
long content_length = response.ContentLength;
bool compressed = (response.IsCompressed || (content_length == 0));
long total_bytes_to_receive = compressed ? -1 : content_length;
progress(bytes_read, total_bytes_to_receive);
}
} catch (Exception e) {
async_result.Exception = e;
}
try {
if (data != IntPtr.Zero && length != 0)
{
response.Write(data, checked ((int)length));
}
} catch (Exception e) {
async_result.Exception = e;
}
}