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; } }