internal Body(RESTarStream stream, CachedProtocolProvider protocolProvider) { ContentType = (stream?.ContentType).GetValueOrDefault(); Stream = stream; ContentLength = stream?.Length; HasContent = ContentLength > 0; ProtocolProvider = protocolProvider; }
internal RemoteEntities(IRequestInternal request, RESTarStream stream, ulong entityCount) : base(request) { RequestInternal = request; Body = stream; EntityType = typeof(JObject); EntityCount = entityCount; IsSerialized = true; ContentTypeProvider = ContentTypeController.ResolveOutputContentTypeProvider(RequestInternal); }
/// <inheritdoc /> public IEnumerable <T> Populate <T>(IEnumerable <T> entities, byte[] body) where T : class { var jsonStream = new RESTarStream(ContentType.JSON); try { ProduceJsonArray(new MemoryStream(body), jsonStream); return(JsonProvider.Populate(entities, jsonStream.GetBytes())); } finally { jsonStream.CanClose = true; jsonStream.Dispose(); } }
/// <inheritdoc /> public IEnumerable <T> DeserializeCollection <T>(Stream stream) where T : class { var jsonStream = new RESTarStream(ContentType.JSON); try { ProduceJsonArray(stream, jsonStream); foreach (var item in JsonProvider.DeserializeCollection <T>(jsonStream.Rewind())) { yield return(item); } } finally { jsonStream.CanClose = true; jsonStream.Dispose(); } }
private async Task <IResult> _GetResult() { try { var sw = Stopwatch.StartNew(); var method = new HttpMethod(Method.ToString()); var message = new HttpRequestMessage(method, URI); switch (Method) { case Method.POST: case Method.PATCH: case Method.PUT: if (GetBody().HasContent) { message.Content = new StreamContent(GetBody().Stream); message.Content.Headers.ContentType = MediaTypeHeaderValue.Parse(Headers.ContentType.ToString()); } break; } Headers.Metadata = "full"; Headers.ContentType = null; Headers.ForEach(header => message.Headers.Add(header.Key, header.Value)); var response = await HttpClient.SendAsync(message); switch (response?.StatusCode) { case null: case HttpStatusCode.GatewayTimeout: case HttpStatusCode.RequestTimeout: return(new Timeout(URI.ToString()).AsResultOf(this)); case HttpStatusCode.BadGateway: return(new BadGateway(URI.ToString()).AsResultOf(this)); } var responseHeaders = new Headers(); response.Headers.ForEach(header => responseHeaders[header.Key] = header.Value.FirstOrDefault()); response.Content.Headers.ForEach(header => responseHeaders[header.Key] = header.Value.FirstOrDefault()); var metadata = responseHeaders.Metadata?.Split(';'); if (metadata?.Length != 3) { return(new ExternalServiceNotRESTar(URI).AsResultOf(this)); } var(resultType, resourceName, data) = (metadata[0], metadata[1], metadata[2]); if (string.IsNullOrWhiteSpace(resultType)) { return(new ExternalServiceNotRESTar(URI).AsResultOf(this)); } RemoteResource = new RemoteResource(resourceName); var stream = default(RESTarStream); if (response.Content != null) { if (!(responseHeaders.ContentType is ContentType contentType)) { return(new ExternalServiceNotRESTar(URI).AsResultOf(this)); } var _stream = new RESTarStream(contentType); await response.Content.CopyToAsync(_stream); stream = _stream.Rewind(); } IResult getResult() { int nr; ErrorCodes ec; switch (resultType) { case nameof(Entities <object>) when ulong.TryParse(responseHeaders.EntityCount, out var count): return(new RemoteEntities(this, stream, count)); case nameof(Head) when int.TryParse(data, out nr): return(new Head(this, nr)); case nameof(Report) when int.TryParse(data, out nr): return(new Report(this, nr)); case nameof(Binary): return(new Binary(this, stream, responseHeaders.ContentType ?? ContentType.DefaultOutput)); case nameof(NoContent): return(new NoContent(this)); case nameof(InsertedEntities) when int.TryParse(data, out nr): return(new InsertedEntities(this, nr)); case nameof(UpdatedEntities) when int.TryParse(data, out nr): return(new UpdatedEntities(this, nr)); case nameof(DeletedEntities) when int.TryParse(data, out nr): return(new DeletedEntities(this, nr)); case nameof(SafePostedEntities) when data.TSplit(',') is var vt && int.TryParse(vt.Item1, out var upd) && int.TryParse(vt.Item2, out var ins): return(new SafePostedEntities(this, upd, ins)); case nameof(BadRequest) when Enum.TryParse(data, out ec): return(new RemoteBadRequest(ec)); case nameof(NotFound) when Enum.TryParse(data, out ec): return(new RemoteNotFound(ec)); case nameof(Forbidden) when Enum.TryParse(data, out ec): return(new RemoteForbidden(ec)); case nameof(Results.Internal) when Enum.TryParse(data, out ec): return(new RemoteInternal(ec)); case nameof(FeatureNotImplemented): return(new FeatureNotImplemented(null)); case nameof(InfiniteLoop): return(new InfiniteLoop()); case nameof(MethodNotAllowed): return(new MethodNotAllowed(Method, Resource, false)); case nameof(NotAcceptable): return(new NotAcceptable(Headers.Accept.ToString())); case nameof(UnsupportedContent): return(new UnsupportedContent(Headers.ContentType.ToString())); case nameof(UpgradeRequired): return(new UpgradeRequired(Resource.Name)); default: return(new RemoteOther(this, response.StatusCode, response.ReasonPhrase)); } } var result = getResult(); if (result is Error error) { result = error.AsResultOf(this); } responseHeaders.ForEach(result.Headers.Put); TimeElapsed = sw.Elapsed; return(result); } catch (Exception e) { return(new ExternalServiceNotRESTar(URI, e).AsResultOf(this)); } }