internal void SendAsyncRequest(HttpMethod method, Uri url, Object body, RemoteRequestCompletionBlock completionHandler) { var message = new HttpRequestMessage(method, url); var mapper = Manager.GetObjectMapper(); if (body != null) { var bytes = mapper.WriteValueAsBytes(body).ToArray(); var byteContent = new ByteArrayContent(bytes); message.Content = byteContent; } message.Headers.Add("Accept", new[] { "multipart/related", "application/json" }); PreemptivelySetAuthCredentials(message); var client = clientFactory.GetHttpClient(); client.CancelPendingRequests(); client.SendAsync(message, HttpCompletionOption.ResponseHeadersRead, CancellationTokenSource.Token) .ContinueWith(response => { if (response.Status != TaskStatus.RanToCompletion) { Log.E(Tag, "SendAsyncRequest did not run to completion.", response.Exception); return(null); } return(response.Result); }, CancellationTokenSource.Token) .ContinueWith(response => { if (completionHandler != null) { var fullBody = mapper.ReadValue <Object>(response.Result.Content.ReadAsStreamAsync().Result); Exception error = response.Exception; if (error == null && !response.Result.IsSuccessStatusCode) { error = new HttpResponseException(response.Result.StatusCode); } completionHandler(fullBody, response.Exception); } }); }
protected internal virtual void ExecuteRequest(HttpClient httpClient, HttpRequestMessage request) { object fullBody = null; Exception error = null; HttpResponse response = null; try { Log.V(Log.TagSync, "%s: RemoteRequest executeRequest() called, url: %s", this, url ); if (request.IsAborted()) { Log.V(Log.TagSync, "%s: RemoteRequest has already been aborted", this); RespondWithResult(fullBody, new Exception(string.Format("%s: Request %s has been aborted" , this, request)), response); return; } Log.V(Log.TagSync, "%s: RemoteRequest calling httpClient.execute", this); response = httpClient.Execute(request); Log.V(Log.TagSync, "%s: RemoteRequest called httpClient.execute", this); // add in cookies to global store try { if (httpClient is DefaultHttpClient) { DefaultHttpClient defaultHttpClient = (DefaultHttpClient)httpClient; this.clientFactory.AddCookies(defaultHttpClient.GetCookieStore().GetCookies()); } } catch (Exception e) { Log.E(Log.TagRemoteRequest, "Unable to add in cookies to global store", e); } StatusLine status = response.GetStatusLine(); if (Utils.IsTransientError(status) && RetryRequest()) { return; } if (status.GetStatusCode() >= 300) { Log.E(Log.TagRemoteRequest, "Got error status: %d for %s. Reason: %s", status.GetStatusCode (), request, status.GetReasonPhrase()); error = new HttpResponseException(status.GetStatusCode(), status.GetReasonPhrase( )); } else { HttpEntity temp = response.GetEntity(); if (temp != null) { InputStream stream = null; try { stream = temp.GetContent(); fullBody = Manager.GetObjectMapper().ReadValue<object>(stream); } finally { try { stream.Close(); } catch (IOException) { } } } } } catch (IOException e) { Log.E(Log.TagRemoteRequest, "io exception", e); error = e; // Treat all IOExceptions as transient, per: // http://hc.apache.org/httpclient-3.x/exception-handling.html Log.V(Log.TagSync, "%s: RemoteRequest calling retryRequest()", this); if (RetryRequest()) { return; } } catch (Exception e) { Log.E(Log.TagRemoteRequest, "%s: executeRequest() Exception: ", e, this); error = e; } Log.V(Log.TagSync, "%s: RemoteRequest calling respondWithResult. error: %s", this , error); RespondWithResult(fullBody, error, response); }
protected internal override void ExecuteRequest(HttpClient httpClient, HttpRequestMessage request) { object fullBody = null; Exception error = null; HttpResponse response = null; try { if (request.IsAborted()) { RespondWithResult(fullBody, new Exception(string.Format("%s: Request %s has been aborted" , this, request)), response); return; } response = httpClient.Execute(request); try { // add in cookies to global store if (httpClient is DefaultHttpClient) { DefaultHttpClient defaultHttpClient = (DefaultHttpClient)httpClient; this.clientFactory.AddCookies(defaultHttpClient.GetCookieStore().GetCookies()); } } catch (Exception e) { Log.E(Log.TagRemoteRequest, "Unable to add in cookies to global store", e); } StatusLine status = response.GetStatusLine(); if (status.GetStatusCode() >= 300) { Log.E(Log.TagRemoteRequest, "Got error status: %d for %s. Reason: %s", status.GetStatusCode (), request, status.GetReasonPhrase()); error = new HttpResponseException(status.GetStatusCode(), status.GetReasonPhrase( )); } else { HttpEntity entity = response.GetEntity(); Header contentTypeHeader = entity.GetContentType(); InputStream inputStream = null; if (contentTypeHeader != null && contentTypeHeader.GetValue().Contains("multipart/related" )) { try { MultipartDocumentReader reader = new MultipartDocumentReader(response, db); reader.SetContentType(contentTypeHeader.GetValue()); inputStream = entity.GetContent(); int bufLen = 1024; byte[] buffer = new byte[bufLen]; int numBytesRead = 0; while ((numBytesRead = inputStream.Read(buffer)) != -1) { if (numBytesRead != bufLen) { byte[] bufferToAppend = Arrays.CopyOfRange(buffer, 0, numBytesRead); reader.AppendData(bufferToAppend); } else { reader.AppendData(buffer); } } reader.Finish(); fullBody = reader.GetDocumentProperties(); RespondWithResult(fullBody, error, response); } finally { try { inputStream.Close(); } catch (IOException) { } } } else { if (entity != null) { try { inputStream = entity.GetContent(); fullBody = Manager.GetObjectMapper().ReadValue<object>(inputStream); RespondWithResult(fullBody, error, response); } finally { try { inputStream.Close(); } catch (IOException) { } } } } } } catch (IOException e) { Log.E(Log.TagRemoteRequest, "%s: io exception", e, this); error = e; RespondWithResult(fullBody, e, response); } catch (Exception e) { Log.E(Log.TagRemoteRequest, "%s: executeRequest() Exception: ", e, this); error = e; RespondWithResult(fullBody, e, response); } finally { Log.E(Log.TagRemoteRequest, "%s: executeRequest() finally", this); } }
protected internal virtual void ExecuteRequest(HttpClient httpClient, HttpRequestMessage request) { object fullBody = null; Exception error = null; try { HttpResponse response = httpClient.Execute(request); // add in cookies to global store try { if (httpClient is DefaultHttpClient) { DefaultHttpClient defaultHttpClient = (DefaultHttpClient)httpClient; CouchbaseLiteHttpClientFactory.Instance.AddCookies(defaultHttpClient.GetCookieStore ().GetCookies()); } } catch (Exception e) { Log.E(Database.Tag, "Unable to add in cookies to global store", e); } StatusLine status = response.GetStatusLine(); if (status.GetStatusCode() >= 300) { Log.E(Database.Tag, "Got error " + Sharpen.Extensions.ToString(status.GetStatusCode ())); Log.E(Database.Tag, "Request was for: " + request.ToString()); Log.E(Database.Tag, "Status reason: " + status.GetReasonPhrase()); error = new HttpResponseException(status.GetStatusCode(), status.GetReasonPhrase( )); } else { HttpEntity temp = response.GetEntity(); if (temp != null) { InputStream stream = null; try { stream = temp.GetContent(); fullBody = Manager.GetObjectMapper().ReadValue<object>(stream); } finally { try { stream.Close(); } catch (IOException) { } } } } } catch (ClientProtocolException e) { Log.E(Database.Tag, "client protocol exception", e); error = e; } catch (IOException e) { Log.E(Database.Tag, "io exception", e); error = e; } RespondWithResult(fullBody, error); }
protected internal override void ExecuteRequest(HttpClient httpClient, HttpRequestMessage request) { object fullBody = null; Exception error = null; try { HttpResponse response = httpClient.Execute(request); try { // add in cookies to global store if (httpClient is DefaultHttpClient) { DefaultHttpClient defaultHttpClient = (DefaultHttpClient)httpClient; CouchbaseLiteHttpClientFactory.Instance.AddCookies(defaultHttpClient.GetCookieStore ().GetCookies()); } } catch (Exception e) { Log.E(Database.Tag, "Unable to add in cookies to global store", e); } StatusLine status = response.GetStatusLine(); if (status.GetStatusCode() >= 300) { Log.E(Database.Tag, "Got error " + Sharpen.Extensions.ToString(status.GetStatusCode ())); Log.E(Database.Tag, "Request was for: " + request.ToString()); Log.E(Database.Tag, "Status reason: " + status.GetReasonPhrase()); error = new HttpResponseException(status.GetStatusCode(), status.GetReasonPhrase( )); } else { HttpEntity entity = response.GetEntity(); Header contentTypeHeader = entity.GetContentType(); InputStream inputStream = null; if (contentTypeHeader != null && contentTypeHeader.GetValue().Contains("multipart/related" )) { try { MultipartDocumentReader reader = new MultipartDocumentReader(response, db); reader.SetContentType(contentTypeHeader.GetValue()); inputStream = entity.GetContent(); int bufLen = 1024; byte[] buffer = new byte[bufLen]; int numBytesRead = 0; while ((numBytesRead = inputStream.Read(buffer)) != -1) { if (numBytesRead != bufLen) { byte[] bufferToAppend = Arrays.CopyOfRange(buffer, 0, numBytesRead); reader.AppendData(bufferToAppend); } else { reader.AppendData(buffer); } } reader.Finish(); fullBody = reader.GetDocumentProperties(); RespondWithResult(fullBody, error); } finally { try { inputStream.Close(); } catch (IOException) { } } } else { if (entity != null) { try { inputStream = entity.GetContent(); fullBody = Manager.GetObjectMapper().ReadValue<object>(inputStream); RespondWithResult(fullBody, error); } finally { try { inputStream.Close(); } catch (IOException) { } } } } } } catch (ClientProtocolException e) { Log.E(Database.Tag, "client protocol exception", e); error = e; } catch (IOException e) { Log.E(Database.Tag, "io exception", e); error = e; } }