/// <summary>This method is called to append data to a part's body.</summary> /// <remarks>This method is called to append data to a part's body.</remarks> public void AppendToPart(IEnumerable <byte> data) { if (_docReader == null) { throw new InvalidOperationException("_docReader is not defined"); } _docReader.AppendData(data); }
/// <summary>This method is called to append data to a part's body.</summary> /// <remarks>This method is called to append data to a part's body.</remarks> public virtual void AppendToPart(byte[] data) { if (_docReader == null) { throw new InvalidOperationException("_docReader is not defined"); } _docReader.AppendData(data); }
/// <summary>This method is called to append data to a part's body.</summary> /// <remarks>This method is called to append data to a part's body.</remarks> public void AppendToPart(IEnumerable <byte> data) { if (_docReader == null) { Log.To.Sync.E(Tag, "AppendPart called on a non-started object"); throw new InvalidOperationException("AppendPart called on a non-started object"); } _docReader.AppendData(data); }
// Factors out the logic of opening the database and reading the document body from the HTTP request // and performs the specified logic on the body received in the request, barring any problems private static CouchbaseLiteResponse PerformLogicWithDocumentBody(ICouchbaseListenerContext context, Func <Database, Body, CouchbaseLiteResponse> callback) { return(DatabaseMethods.PerformLogicWithDatabase(context, true, db => { MultipartDocumentReader reader = new MultipartDocumentReader(db); reader.SetContentType(context.RequestHeaders["Content-Type"]); reader.AppendData(context.BodyStream.ReadAllBytes()); try { reader.Finish(); } catch (InvalidOperationException) { return context.CreateResponse(StatusCode.BadRequest); } return callback(db, new Body(reader.GetDocumentProperties())); })); }
// Factors out the logic of opening the database and reading the document body from the HTTP request // and performs the specified logic on the body received in the request, barring any problems private static CouchbaseLiteResponse PerformLogicWithDocumentBody(ICouchbaseListenerContext context, Func <Database, Body, CouchbaseLiteResponse> callback) { return(DatabaseMethods.PerformLogicWithDatabase(context, true, db => { MultipartDocumentReader reader = new MultipartDocumentReader(db); reader.SetContentType(context.RequestHeaders["Content-Type"]); try { reader.AppendData(context.BodyStream.ReadAllBytes()); reader.Finish(); } catch (InvalidOperationException e) { Log.To.Router.E(TAG, "Exception trying to read data from multipart upload", e); return context.CreateResponse(StatusCode.BadRequest); } catch (IOException e) { Log.To.Router.E(TAG, "IOException while reading context body", e); return context.CreateResponse(StatusCode.RequestTimeout); } return callback(db, new Body(reader.GetDocumentProperties())); })); }
internal void SendAsyncMultipartDownloaderRequest(HttpMethod method, string relativePath, object body, Database db, RemoteRequestCompletionBlock onCompletion) { try { var url = _baseUrl.Append(relativePath); var message = new HttpRequestMessage(method, url); message.Headers.Add("Accept", "*/*"); AddRequestHeaders(message); var client = default(CouchbaseLiteHttpClient); if (!_client.AcquireFor(TimeSpan.FromSeconds(1), out client)) { Log.To.Sync.I(Tag, "Client is disposed, aborting request to {0}", new SecureLogString(relativePath, LogMessageSensitivity.PotentiallyInsecure)); return; } client.Authenticator = Authenticator; var request = client.SendAsync(message, _cancellationTokenSource.Token).ContinueWith(new Action <Task <HttpResponseMessage> >(responseMessage => { object fullBody = null; Exception error = null; try { if (responseMessage.IsFaulted) { error = responseMessage.Exception.InnerException; if (onCompletion != null) { onCompletion(null, error); } return; } var response = responseMessage.Result; // add in cookies to global store //CouchbaseLiteHttpClientFactory.Instance.AddCoIokies(clientFactory.HttpHandler.CookieContainer.GetCookies(url)); var status = response.StatusCode; if ((Int32)status.GetStatusCode() >= 300) { Log.To.Sync.W(Tag, "Got error {0}", status.GetStatusCode()); Log.To.Sync.W(Tag, "Request was for: " + message); Log.To.Sync.W(Tag, "Status reason: " + response.ReasonPhrase); Log.To.Sync.W(Tag, "Passing error onto callback..."); error = new HttpResponseException(status); if (onCompletion != null) { onCompletion(null, error); } } else { var entity = response.Content; var contentTypeHeader = response.Content.Headers.ContentType; Stream inputStream = null; if (contentTypeHeader != null && contentTypeHeader.ToString().Contains("multipart/related")) { try { var reader = new MultipartDocumentReader(db); var contentType = contentTypeHeader.ToString(); reader.SetContentType(contentType); var inputStreamTask = entity.ReadAsStreamAsync(); //inputStreamTask.Wait(90000, CancellationTokenSource.Token); inputStream = inputStreamTask.Result; const int bufLen = 1024; var buffer = new byte[bufLen]; int numBytesRead = 0; while ((numBytesRead = inputStream.Read(buffer, 0, buffer.Length)) > 0) { if (numBytesRead != bufLen) { var bufferToAppend = new Couchbase.Lite.Util.ArraySegment <Byte>(buffer, 0, numBytesRead); reader.AppendData(bufferToAppend); } else { reader.AppendData(buffer); } } reader.Finish(); fullBody = reader.GetDocumentProperties(); if (onCompletion != null) { onCompletion(fullBody, error); } } catch (Exception ex) { Log.To.Sync.W(Tag, "SendAsyncMultipartDownloaderRequest got an exception, aborting...", ex); } finally { try { inputStream.Close(); } catch (Exception) { } } } else { if (entity != null) { try { var readTask = entity.ReadAsStreamAsync(); //readTask.Wait(); // TODO: This should be scaled based on content length. inputStream = readTask.Result; fullBody = Manager.GetObjectMapper().ReadValue <Object>(inputStream); if (onCompletion != null) { onCompletion(fullBody, error); } } catch (Exception ex) { Log.To.Sync.W(Tag, "SendAsyncMultipartDownloaderRequest got an exception, aborting...", ex); } finally { try { inputStream.Close(); } catch (Exception) { } } } } } } catch (Exception e) { Log.To.Sync.W(Tag, "Got exception during SendAsyncMultipartDownload, aborting..."); error = e; } finally { Task dummy; _requests.TryRemove(message, out dummy); responseMessage.Result.Dispose(); } }), _workExecutor.Scheduler); _requests.TryAdd(message, request); } catch (UriFormatException e) { Log.To.Sync.W(Tag, "Malformed URL for async request, aborting...", e); } }
internal void SendAsyncMultipartDownloaderRequest(HttpMethod method, string relativePath, object body, Database db, RemoteRequestCompletionBlock onCompletion) { try { var urlStr = BuildRelativeURLString(relativePath); var url = new Uri(urlStr); var message = new HttpRequestMessage(method, url); message.Headers.Add("Accept", "*/*"); AddRequestHeaders(message); var httpClient = clientFactory.GetHttpClient(); httpClient.SendAsync(message, HttpCompletionOption.ResponseHeadersRead, CancellationTokenSource.Token) .ContinueWith(new Action <Task <HttpResponseMessage> >(responseMessage => { object fullBody = null; Exception error = null; try { var response = responseMessage.Result; // add in cookies to global store CouchbaseLiteHttpClientFactory.Instance.AddCookies(clientFactory.HttpHandler.CookieContainer.GetCookies(url)); var status = response.StatusCode; if ((Int32)status.GetStatusCode() >= 300) { Log.E(Database.Tag, "Got error " + Sharpen.Extensions.ToString(status.GetStatusCode ())); Log.E(Database.Tag, "Request was for: " + message); Log.E(Database.Tag, "Status reason: " + response.ReasonPhrase); error = new HttpException((Int32)status.GetStatusCode(), response.ReasonPhrase); } else { var entity = response.Content; var contentTypeHeader = response.Content.Headers.ContentType; InputStream inputStream = null; if (contentTypeHeader != null && contentTypeHeader.ToString().Contains("multipart/related")) { try { var reader = new MultipartDocumentReader(responseMessage.Result, LocalDatabase); reader.SetContentType(contentTypeHeader.MediaType); var inputStreamTask = entity.ReadAsStreamAsync(); inputStreamTask.Wait(90000, CancellationTokenSource.Token); const int bufLen = 1024; var buffer = new byte[bufLen]; int numBytesRead = 0; while ((numBytesRead = inputStream.Read(buffer)) != -1) { if (numBytesRead != bufLen) { var bufferToAppend = new ArraySegment <Byte>(buffer, 0, numBytesRead).Array; reader.AppendData(bufferToAppend); } else { reader.AppendData(buffer); } } reader.Finish(); fullBody = reader.GetDocumentProperties(); if (onCompletion != null) { onCompletion(fullBody, error); } } finally { try { inputStream.Close(); } catch (IOException) { // NOTE: swallow? } } } else { if (entity != null) { try { var readTask = entity.ReadAsStreamAsync(); readTask.Wait(); // TODO: This should be scaled based on content length. inputStream = readTask.Result; fullBody = Manager.GetObjectMapper().ReadValue <Object>(inputStream); if (onCompletion != null) { onCompletion(fullBody, error); } } catch (Exception ex) { Log.E(Tag, ex.Message); } finally { try { inputStream.Close(); } catch (IOException) { } } } } } } catch (ProtocolViolationException e) { Log.E(Database.Tag, "client protocol exception", e); error = e; } catch (IOException e) { Log.E(Database.Tag, "io exception", e); error = e; } })); } catch (UriFormatException e) { Log.E(Database.Tag, "Malformed URL for async request", e); } }