public Stream Upload(string url, string filename, Stream fileStream) { HttpContent stringContent = new StringContent(filename); HttpContent fileStreamContent = new StreamContent(fileStream); using (var handler = new ProgressMessageHandler()) using (var client = HttpClientFactory.Create(handler)) using (var formData = new MultipartFormDataContent()) { client.Timeout = new TimeSpan(1, 0, 0); // 1 hour should be enough probably formData.Add(fileStreamContent, "file", filename); handler.HttpSendProgress += (s, e) => { float prog = (float)e.BytesTransferred / (float)fileStream.Length; prog = prog > 1 ? 1 : prog; if (FileProgress != null) FileProgress(filename, prog); }; var response_raw = client.PostAsync(url, formData); var response = response_raw.Result; if (!response.IsSuccessStatusCode) { return null; } return response.Content.ReadAsStreamAsync().Result; } }
public async Task<Models.Media> File(Stream fileStream, string name = "", string description = "", string projectId = null) { using (var formData = new MultipartFormDataContent()) { AddStringContent(formData, _client.Authentication.FieldName, _client.Authentication.Value); AddStringContent(formData, "project_id", projectId); AddStringContent(formData, "name", name); AddStringContent(formData, "description", description); // Add the file stream var fileContent = new StreamContent(fileStream); fileContent.Headers.Add("Content-Type", "application/octet-stream"); fileContent.Headers.Add("Content-Disposition", "form-data; name=\"file\"; filename=\"" + name + "\""); formData.Add(fileContent, "file", name); // HttpClient problem workaround var boundaryValue = formData.Headers.ContentType.Parameters.FirstOrDefault(p => p.Name == "boundary"); if (boundaryValue != null) { boundaryValue.Value = boundaryValue.Value.Replace("\"", string.Empty); } // Upload the file var response = await _client.Post(Client.UploadUrl, formData); return _client.Hydrate<Models.Media>(response); } }
/// <summary> /// Add a <see cref="Stream"/> to interplanetary file system. /// </summary> /// <param name="stream"></param> public async Task<MerkleNode> AddAsync(Stream stream) { var content = new MultipartFormDataContent(); var streamContent = new StreamContent(stream); streamContent.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); content.Add(streamContent, "file"); try { var url = BuildCommand("add"); if (log.IsDebugEnabled) log.Debug("POST " + url.ToString()); using (var response = await Api().PostAsync(url, content)) { await ThrowOnError(response); var json = await response.Content.ReadAsStringAsync(); if (log.IsDebugEnabled) log.Debug("RSP " + json); var r = JObject.Parse(json); return new MerkleNode((string)r["Hash"]); } } catch (IpfsException) { throw; } catch (Exception e) { throw new IpfsException(e); } }
/// <summary>Creates a GZip content based on the given content.</summary> /// <param name="content">Content to GZip.</param> /// <returns>GZiped HTTP content.</returns> internal static HttpContent CreateZipContent(string content) { var stream = CreateGZipStream(content); var sc = new StreamContent(stream); sc.Headers.ContentEncoding.Add("gzip"); return sc; }
public static async Task<ImgurEntity> UploadImgur(IRandomAccessStream fileStream) { try { var imageData = new byte[fileStream.Size]; for (int i = 0; i < imageData.Length; i++) { imageData[i] = (byte)fileStream.AsStreamForRead().ReadByte(); } var theAuthClient = new HttpClient(); var request = new HttpRequestMessage(HttpMethod.Post, "https://api.imgur.com/3/image"); request.Headers.Authorization = new AuthenticationHeaderValue("Client-ID", "e5c018ac1f4c157"); var form = new MultipartFormDataContent(); var t = new StreamContent(fileStream.AsStream()); // TODO: See if this is the correct way to use imgur's v3 api. I can't see why we would still need to convert images to base64. string base64Img = Convert.ToBase64String(imageData); t.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg"); form.Add(new StringContent(base64Img), @"image"); form.Add(new StringContent("file"), "type"); request.Content = form; HttpResponseMessage response = await theAuthClient.SendAsync(request); string responseString = await response.Content.ReadAsStringAsync(); if (responseString == null) return null; var imgurEntity = JsonConvert.DeserializeObject<ImgurEntity>(responseString); return imgurEntity; } catch (WebException) { } catch (IOException) { return null; } return null; }
protected override HttpResponseMessage Send(HttpRequestMessage request, CancellationToken cancellationToken) { receivedRequest = new HttpRequestMessage {Method = request.Method, RequestUri = request.RequestUri, Version = request.Version}; foreach (var h in request.Headers) { receivedRequest.Headers.Add(h.Key, h.Value); } if (request.Content != null) { var stream = new MemoryStream(); request.Content.CopyTo(stream); stream.Seek(0, SeekOrigin.Begin); var content = new StreamContent(stream); foreach (var h in request.Content.Headers) { content.Headers.Add(h.Key, h.Value); } receivedRequest.Content = content; } return response; }
/// <summary> /// Генерация заголовков /// </summary> /// <param name="request"></param> /// <param name="uri"></param> /// <returns></returns> private static HttpRequestMessage CreateProxyHttpRequest(Microsoft.AspNetCore.Http.HttpRequest request, Uri uri) { var requestMessage = new HttpRequestMessage(); var requestMethod = request.Method; if (!HttpMethods.IsGet(requestMethod) && !HttpMethods.IsHead(requestMethod) && !HttpMethods.IsDelete(requestMethod) && !HttpMethods.IsTrace(requestMethod)) { var streamContent = new StreamContent(request.Body); requestMessage.Content = streamContent; } // Copy the request headers foreach (var header in request.Headers) { if (string.Compare(header.Key, "port", StringComparison.OrdinalIgnoreCase) == 0) { continue; } if (!requestMessage.Headers.TryAddWithoutValidation(header.Key, header.Value.ToArray()) && requestMessage.Content != null) { requestMessage.Content?.Headers.TryAddWithoutValidation(header.Key, header.Value.ToArray()); } } requestMessage.Headers.Host = uri.Authority; requestMessage.RequestUri = uri; requestMessage.Method = new HttpMethod(request.Method); return(requestMessage); }
public async Task <string> UploadFirmware(string fileName, Stream binFile) { CameraInfo.UpdatingFirmware = true; try { string requestStr = String.Format("http://{0}/upgrade_firmware.cgi", CameraInfo.IpAddress); var fileContents = new System.Net.Http.StreamContent(binFile); fileContents.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream"); var content = new System.Net.Http.MultipartFormDataContent("---------------------------7deef381d07b6"); content.Add(fileContents, "file", fileName); // override the content disposition var contentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("form-data"); contentDisposition.Name = "file"; contentDisposition.FileName = fileName; fileContents.Headers.ContentDisposition = contentDisposition; return(await PostFormRequest(requestStr, content)); } finally { // actually, let's wait for next ping to succeed which means the reboot is finished. // CameraInfo.UpdatingFirmware = false; } }
private StreamContent ConvertToStreamContent(HttpContent originalContent) { if (originalContent == null) { return null; } StreamContent streamContent = originalContent as StreamContent; if (streamContent != null) { return streamContent; } MemoryStream ms = new MemoryStream(); originalContent.CopyToAsync(ms).Wait(); ms.Position = 0; streamContent = new StreamContent(ms); foreach (KeyValuePair<string, IEnumerable<string>> header in originalContent.Headers) { streamContent.Headers.TryAddWithoutValidation(header.Key, header.Value); } return streamContent; }
protected override Task<HttpResponseMessage> SendAsync( HttpRequestMessage request, CancellationToken cancellationToken) { OwinRequest owinRequest = OwinRequest.Create(); owinRequest.Scheme = request.RequestUri.Scheme; owinRequest.Method = request.Method.ToString(); owinRequest.Path = request.RequestUri.AbsolutePath; owinRequest.QueryString = request.RequestUri.Query.TrimStart('?'); owinRequest.CallCancelled = cancellationToken; foreach (var header in request.Headers) { owinRequest.AddHeaderUnmodified(header.Key, header.Value); } HttpContent requestContent = request.Content; if (requestContent != null) { foreach (var header in request.Content.Headers) { owinRequest.AddHeaderUnmodified(header.Key, header.Value); } } else { requestContent = new StreamContent(Stream.Null); } return requestContent.ReadAsStreamAsync() .Then(requestBody => { owinRequest.Body = requestBody; var responseMemoryStream = new MemoryStream(); var owinResponse = new OwinResponse(owinRequest) { Body = responseMemoryStream }; return _invoke.Invoke(owinRequest.Dictionary) .Then(() => { var response = new HttpResponseMessage(); response.StatusCode = (HttpStatusCode)owinResponse.StatusCode; response.ReasonPhrase = owinResponse.ReasonPhrase; response.RequestMessage = request; // response.Version = owinResponse.Protocol; responseMemoryStream.Seek(0, SeekOrigin.Begin); response.Content = new StreamContent(responseMemoryStream); foreach (var header in owinResponse.Headers) { if (!response.Headers.TryAddWithoutValidation(header.Key, header.Value)) { response.Content.Headers.TryAddWithoutValidation(header.Key, header.Value); } } return response; }); }); }
public static void AddContent(this MultipartContent multipart, string name, Guid content) { var streamContent = new StreamContent(new MemoryStream(Encoding.UTF8.GetBytes(content.ToString()))); streamContent.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("string"); streamContent.Headers.ContentDisposition.Name = String.Format("\"{0}\"", name); multipart.Add(streamContent); }
public void PutBlob(string containerName, string key, Stream stream, Dictionary<string, string> metadata) { var url = GetUrl(containerName) + "/" + key; var now = SystemTime.UtcNow; var content = new StreamContent(stream) { Headers = { { "x-ms-date", now.ToString("R") }, { "x-ms-version", "2011-08-18" }, { "x-ms-blob-type", "BlockBlob" }, { "Content-Length", stream.Length.ToString(CultureInfo.InvariantCulture) } } }; foreach (var metadataKey in metadata.Keys) content.Headers.Add("x-ms-meta-" + metadataKey.ToLower(), metadata[metadataKey]); var client = GetClient(TimeSpan.FromHours(1)); client.DefaultRequestHeaders.Authorization = CalculateAuthorizationHeaderValue("PUT", url, content.Headers); var response = AsyncHelpers.RunSync(() => client.PutAsync(url, content)); if (response.IsSuccessStatusCode) return; throw ErrorResponseException.FromResponseMessage(response); }
HttpContent IHttpContentEncryptor.Decrypt(HttpContent encryptedContent) { if (encryptedContent == null) { throw new ArgumentNullException("encryptedContent"); } var encodedString = encryptedContent.ReadAsStringAsync().Result; using (var encryptedData = new MemoryStream(Convert.FromBase64String(encodedString))) { if (encryptedData.Length == 0) { return encryptedContent; } this.algorithm.Key = this.keyProvider.Key; this.algorithm.IV = this.keyProvider.IV; using (var decryptor = algorithm.CreateDecryptor()) { var cryptoStream = new CryptoStream(encryptedData, decryptor, CryptoStreamMode.Read); var originData = new MemoryStream((int)encryptedData.Length); cryptoStream.CopyTo(originData); originData.Flush(); originData.Position = 0; var originContent = new StreamContent(originData); originContent.Headers.ContentType = encryptedContent.Headers.ContentType; return originContent; } } }
public async Task<HttpResponseMessage> UploadFileAsync(string path, CancellationToken token, IProgress<double> progress) { int bufferSize = ResolveBufferSize(path); using (var client = new HttpClient()) using (var content = new MultipartFormDataContent()) using (var fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize, FileOptions.Asynchronous)) using (var stream = progress == null ? new ReportableStream(fileStream) : new ReportableStream(fileStream, progress)) using (var streamContent = new StreamContent(stream, bufferSize)) { content.Add(streamContent); var mediaType = IOUtil.GetMimeType(path); streamContent.Headers.ContentType = new MediaTypeHeaderValue(mediaType); var disposition = CreateContentDispositionHeader(path); streamContent.Headers.ContentDisposition = disposition; client.DefaultRequestHeaders.UserAgent.ParseAdd(Settings.UserAgent); string uriString = string.Format(QueryString, Settings.Host, Settings.SessionId); var uri = new Uri(uriString); return await client.PostAsync(uri, content, token).ConfigureAwait(false); } }
/// <summary> /// Post request /// </summary> /// <param name="uri">Enqueue endpoint URI</param> /// <param name="authenticationHeader">Authentication header</param> /// <param name="bodyStream">Body stream</param> /// <param name="message">ActivityMessage context</param> /// <returns></returns> public async Task<HttpResponseMessage> SendPostRequestAsync(Uri uri, Stream bodyStream, string externalCorrelationHeaderValue = null) { using (HttpClientHandler handler = new HttpClientHandler() { UseCookies = false }) { using (HttpClient httpClient = new HttpClient(handler)) { httpClient.DefaultRequestHeaders.Authorization = AuthenticationHelper.GetValidAuthenticationHeader(); // Add external correlation id header id specified and valid if (!string.IsNullOrEmpty(externalCorrelationHeaderValue)) { httpClient.DefaultRequestHeaders.Add(Program.ExternalCorrelationHeader, externalCorrelationHeaderValue); } if (bodyStream != null) { using (StreamContent content = new StreamContent(bodyStream)) { return await httpClient.PostAsync(uri, content); } } } } return new HttpResponseMessage() { Content = new StringContent("Request failed at client.", Encoding.ASCII), StatusCode = System.Net.HttpStatusCode.PreconditionFailed }; }
/// <summary> /// Uploads a file to the specified endpoint /// </summary> /// <param name="token">The authentication token</param> /// <param name="path">The endpoint to invoke</param> /// <param name="filename">The local file system path to the file</param> /// <param name="contentType">The mime-type</param> /// <returns>The result of the operation</returns> internal async Task<string> UploadFile(AuthToken token, string path, string filename, string contentType) { using (HttpClient client = new HttpClient()) { HttpRequestMessage message = new HttpRequestMessage(); message.Method = HttpMethod.Post; message.RequestUri = new Uri($"{_baseAddress}/{path}"); message.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token.Token); var content = new MultipartFormDataContent("Upload----" + DateTime.Now.ToString(CultureInfo.InvariantCulture)); var streamContent = new StreamContent(File.OpenRead(filename)); streamContent.Headers.ContentType = new MediaTypeHeaderValue(contentType); content.Add(streamContent, Path.GetFileName(filename), Path.GetFileName(filename)); message.Content = content; var response = await client.SendAsync(message); if (response.IsSuccessStatusCode) { return await response.Content.ReadAsStringAsync(); } else { throw new ApplicationException($"{response.StatusCode} {response.ReasonPhrase}"); } } }
virtual protected async Task <Response> CreateRequest <Response>( string url, net.HttpMethod method, object input, string token) { return(await CreateRequestMessage(url, method, token, async (msg) => { if (input is Stream stream) { using (var content = new net.StreamContent(stream)) { content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); msg.Content = content; return await GetResult <Response>(msg); } } else { using (var content = new net.StringContent(JObject.FromObject(input).ToString())) { content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); msg.Content = content; return await GetResult <Response>(msg); } } })); }
public static void AddContent(this MultipartContent multipart, string name, Stream content) { var streamContent = new StreamContent(content); streamContent.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("file"); streamContent.Headers.ContentDisposition.Name = String.Format("\"{0}\"", name); multipart.Add(streamContent); }
public async Task ThumbnailContentRequest_PutAsync() { using (var requestStream = new MemoryStream()) using (var httpResponseMessage = new HttpResponseMessage()) using (var responseStream = new MemoryStream()) using (var streamContent = new StreamContent(responseStream)) { httpResponseMessage.Content = streamContent; var requestUrl = "https://api.onedrive.com/v1.0/drive/items/id/thumbnails/0/id/content"; this.httpProvider.Setup( provider => provider.SendAsync( It.Is<HttpRequestMessage>( request => request.RequestUri.ToString().StartsWith(requestUrl)), HttpCompletionOption.ResponseContentRead, CancellationToken.None)) .Returns(Task.FromResult(httpResponseMessage)); var expectedThumbnail = new Thumbnail { Url = "https://localhost" }; this.serializer.Setup( serializer => serializer.DeserializeObject<Thumbnail>(It.IsAny<string>())) .Returns(expectedThumbnail); var responseThumbnail = await this.oneDriveClient.Drive.Items["id"].Thumbnails["0"]["id"].Content.Request().PutAsync<Thumbnail>(requestStream); Assert.IsNotNull(responseThumbnail, "Thumbnail not returned."); Assert.AreEqual(expectedThumbnail, responseThumbnail, "Unexpected thumbnail returned."); } }
public async Task ItemCreateLinkRequest_PostAsync() { using (var httpResponseMessage = new HttpResponseMessage()) using (var responseStream = new MemoryStream()) using (var streamContent = new StreamContent(responseStream)) { httpResponseMessage.Content = streamContent; var requestUrl = Constants.Authentication.OneDriveConsumerBaseUrl + "/drive/items/id/action.createLink"; this.httpProvider.Setup( provider => provider.SendAsync( It.Is<HttpRequestMessage>( request => request.RequestUri.ToString().StartsWith(requestUrl)))) .Returns(Task.FromResult(httpResponseMessage)); var expectedPermission = new Permission { Id = "id", Link = new SharingLink { Type = "edit" } }; this.serializer.Setup( serializer => serializer.SerializeObject(It.IsAny<ItemCreateLinkRequestBody>())) .Returns("request body value"); this.serializer.Setup( serializer => serializer.DeserializeObject<Permission>(It.IsAny<string>())) .Returns(expectedPermission); var permission = await this.oneDriveClient.Drive.Items["id"].CreateLink("edit").Request().PostAsync(); Assert.IsNotNull(permission, "Permission not returned."); Assert.AreEqual(expectedPermission, permission, "Unexpected permission returned."); } }
public void PutObject(string bucketName, string key, Stream stream, Dictionary<string, string> metadata, int timeoutInSeconds) { var url = GetUrl(bucketName) + "/" + key; var now = SystemTime.UtcNow; var payloadHash = RavenAwsHelper.CalculatePayloadHash(stream); var content = new StreamContent(stream) { Headers = { { "x-amz-date", RavenAwsHelper.ConvertToString(now) }, { "x-amz-content-sha256", payloadHash } } }; foreach (var metadataKey in metadata.Keys) content.Headers.Add("x-amz-meta-" + metadataKey.ToLower(), metadata[metadataKey]); var headers = ConvertToHeaders(bucketName, content.Headers); var client = GetClient(TimeSpan.FromSeconds(timeoutInSeconds)); var authorizationHeaderValue = CalculateAuthorizationHeaderValue("PUT", url, now, headers); client.DefaultRequestHeaders.Authorization = authorizationHeaderValue; var response = AsyncHelpers.RunSync(() => client.PutAsync(url, content)); if (response.IsSuccessStatusCode) return; throw ErrorResponseException.FromResponseMessage(response); }
public void ReadFromStreamAsyncShouldReturnUploadImageDataTest() { ImageMultipartMediaFormatter target = new ImageMultipartMediaFormatter(); Type type = typeof(UploadImageData); Stream readStream = null; MultipartContent content = new MultipartContent("form-data"); byte[] content_bytes=new byte[] { 10, 11, 12 }; StreamContent content_part = new StreamContent(new MemoryStream(content_bytes)); content_part.Headers.Add("Content-Disposition", @"form-data; name=fieldName; filename=image.jpg"); content_part.Headers.Add("Content-Type", "image/jpeg"); content.Add(content_part); IFormatterLogger formatterLogger = null; var actual = target.ReadFromStreamAsync(type, readStream, content, formatterLogger); var actualResult = actual.Result; Assert.IsInstanceOfType(actualResult,typeof(UploadImageData)); Assert.AreEqual(3, (actualResult as UploadImageData).ImageBuffer.Length); for (int ind = 0; ind < 3; ind++) { Assert.AreEqual(content_bytes[ind], (actualResult as UploadImageData).ImageBuffer[ind]); } Assert.AreEqual("image.jpg", (actualResult as UploadImageData).FileName); Assert.AreEqual("image/jpeg", (actualResult as UploadImageData).ImageType); }
public async System.Threading.Tasks.Task AddEvent(string collection, JObject anEvent) { var content = anEvent.ToString(); using (var client = new HttpClient()) using (var contentStream = new StreamContent(new MemoryStream(Encoding.UTF8.GetBytes(content)))) { contentStream.Headers.Add("content-type", "application/json"); client.DefaultRequestHeaders.Add("Authorization", _prjSettings.WriteKey); var httpResponse = await client.PostAsync(_serverUrl + collection, contentStream) .ConfigureAwait(continueOnCapturedContext: false); var responseString = await httpResponse.Content.ReadAsStringAsync() .ConfigureAwait(continueOnCapturedContext: false); JObject jsonResponse = null; try { // Normally the response content should be parsable JSON, // but if the server returned a 404 error page or something // like that, this will throw. jsonResponse = JObject.Parse(responseString); } catch (Exception) { } // error checking, throw an exception with information from the // json response if available, then check the HTTP response. KeenUtil.CheckApiErrorCode(jsonResponse); if (!httpResponse.IsSuccessStatusCode) throw new KeenException("AddEvent failed with status: " + httpResponse); } }
/// <inheritdoc/> public async Task<Uri> UploadMessageAsync(Stream content, DateTime expirationUtc, string contentType = null, string contentEncoding = null, IProgress<int> bytesCopiedProgress = null, CancellationToken cancellationToken = default(CancellationToken)) { Requires.NotNull(content, nameof(content)); Verify.Operation(this.HttpClient != null, $"{nameof(this.HttpClient)} must be set first."); var httpContent = new StreamContent(content.ReadStreamWithProgress(bytesCopiedProgress)); if (content.CanSeek) { httpContent.Headers.ContentLength = content.Length; } if (contentType != null) { httpContent.Headers.ContentType = new MediaTypeHeaderValue(contentType); } if (contentEncoding != null) { httpContent.Headers.ContentEncoding.Add(contentEncoding); } int lifetime = expirationUtc == DateTime.MaxValue ? int.MaxValue : (int)(expirationUtc - DateTime.UtcNow).TotalMinutes; var response = await this.HttpClient.PostAsync(this.BlobPostUrl.AbsoluteUri + "?lifetimeInMinutes=" + lifetime, httpContent).ConfigureAwait(false); response.EnsureSuccessStatusCode(); var serializer = new DataContractJsonSerializer(typeof(string)); var location = (string)serializer.ReadObject(await response.Content.ReadAsStreamAsync().ConfigureAwait(false)); return new Uri(location, UriKind.Absolute); }
private void AttachFiles(IMail message, MultipartFormDataContent content) { var files = FetchFileBodies(message); foreach (var file in files) { var ifile = file.Value; var fileContent = new StreamContent(ifile.OpenAsync(FileAccess.Read).Result); fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") { Name = "files[" + ifile.Name + "]", FileName = ifile.Name }; fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/octet-stream"); content.Add(fileContent); } var streamingFiles = FetchStreamingFileBodies(message); foreach (KeyValuePair<string, MemoryStream> file in streamingFiles) { var name = file.Key; var stream = file.Value; var fileContent = new StreamContent(stream); fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") { Name = "files[" + name + "]", FileName = name }; fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/octet-stream"); content.Add(fileContent); } }
public void ReadFromStreamAsync_Deserializes_Actions_Correctly() { // Arrange Car car = new Car(); string inputString = "{\"class\":[],\"properties\":{\"numberOfWheels\":0},\"entities\":[],\"actions\":[{\"name\":\"Start\",\"class\":[\"StartAction\"],\"method\":\"POST\",\"href\":\"https://api.test.com/car/start\",\"title\":\"Start the car\",\"type\":\"application/json\",\"fields\":[]}]}"; // Act using (MemoryStream stream = new MemoryStream(System.Text.Encoding.Default.GetBytes(inputString))) { var content = new StreamContent(stream); var task = formatter.ReadFromStreamAsync(typeof(Car), stream, content, null); car = task.Result as Car; } WebApiContrib.MediaType.Hypermedia.Action startTheCarAction = car.Actions[0]; // Assert Assert.Equal("Start", startTheCarAction.Name); Assert.Equal("StartAction", startTheCarAction.Class[0]); Assert.Equal(HTTP_Method.POST, startTheCarAction.Method); Assert.Equal("https://api.test.com/car/start", startTheCarAction.Href.ToString()); Assert.Equal("Start the car", startTheCarAction.Title); Assert.Equal("application/json", startTheCarAction.Type); }
public Guid UpdloadFileForSharing(string filename,string apiKey, string projectName /*,string ownerEmail*/) { if (string.IsNullOrWhiteSpace(filename)) { throw new ArgumentNullException("filename"); } if (string.IsNullOrWhiteSpace(apiKey)) { throw new ArgumentNullException("apiKey"); } if (string.IsNullOrWhiteSpace(projectName)) { throw new ArgumentNullException("projectName"); } // if (string.IsNullOrWhiteSpace(ownerEmail)) { throw new ArgumentNullException("ownerEmail"); } if (!File.Exists(filename)) { throw new FileNotFoundException(filename); } string baseUrl = Settings.Default.LocanServiceBaseUrl; string urlForSharing = string.Format( "{0}/{1}", baseUrl, Consts.UrlAddPhrasesForTranslation); Guid userId = this.GetUserIdForApiKey(apiKey); LocanWebFile webFile = this.GetTranslationFile(apiKey, filename, userId, projectName); JavaScriptSerializer jsonSerializer = new JavaScriptSerializer(); byte[]bytes = Encoding.UTF8.GetBytes(jsonSerializer.Serialize(webFile)); using (HttpClient client = new HttpClient()) using(MemoryStream stream = new MemoryStream(bytes)){ StreamContent streamContent = new StreamContent(stream); HttpResponseMessage response = client.Post(urlForSharing, streamContent); response.EnsureSuccessStatusCode(); string guidString = response.Content.ReadAsString(); // Result looks like: <?xml version="1.0" encoding="utf-8"?><guid>2158e8e5-ae6c-4b9a-a7ab-3169fff9750d</guid> XDocument doc = XDocument.Parse(guidString); return new Guid(doc.Root.Value); } }
private async Task<HttpResponseMessage> EditUserCommit(int id, dynamic targetObject) { try { var person = (ProjectMemberContrainModel)targetObject; using (var ms = new MemoryStream()) { var djs = new DataContractJsonSerializer(typeof(ProjectMemberContrainModel)); djs.WriteObject(ms, person); ms.Position = 0; var sc = new StreamContent(ms); sc.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json"); var resp = id == -1 ? await HttpClient.PostAsync(new Uri(ApiRoot), sc) : await HttpClient.PutAsync(new Uri(ApiRoot + @"/" + id), sc); resp.EnsureSuccessStatusCode(); return resp; } } catch (Exception ex) { LogManager.Instance.LogException(ex.ToString()); return new HttpResponseMessage(HttpStatusCode.NotModified); } }
public async Task<HttpResponseMessage> Post() { var content = new StreamContent(Request.Body); content.Headers.ContentType = MediaTypeHeaderValue.Parse(Request.Headers["Content-Type"]); var response = await _httpClient.PostAsync(_apiUrl, content); return response; }
public string UploadArchive(string glacierVaultName, Stream stream, string archiveDescription, int timeoutInSeconds) { var url = string.Format("{0}/-/vaults/{1}/archives", GetUrl(null), glacierVaultName); var now = SystemTime.UtcNow; var payloadHash = RavenAwsHelper.CalculatePayloadHash(stream); var payloadTreeHash = RavenAwsHelper.CalculatePayloadTreeHash(stream); var content = new StreamContent(stream) { Headers = { { "x-amz-glacier-version", "2012-06-01"}, { "x-amz-date", RavenAwsHelper.ConvertToString(now) }, { "x-amz-content-sha256", payloadHash }, { "x-amz-sha256-tree-hash", payloadTreeHash }, { "x-amz-archive-description", archiveDescription } } }; var headers = ConvertToHeaders(glacierVaultName, content.Headers); var client = GetClient(TimeSpan.FromSeconds(timeoutInSeconds)); var authorizationHeaderValue = CalculateAuthorizationHeaderValue("POST", url, now, headers); client.DefaultRequestHeaders.Authorization = authorizationHeaderValue; var response = client.PostAsync(url, content).ResultUnwrap(); if (response.IsSuccessStatusCode) return ReadArchiveId(response); throw ErrorResponseException.FromResponseMessage(response); }
private async Task<StreamContent> ConvertToStreamContentAsync(HttpContent originalContent) { if (originalContent == null) { return null; } StreamContent streamContent = originalContent as StreamContent; if (streamContent != null) { return streamContent; } MemoryStream ms = new MemoryStream(); await originalContent.CopyToAsync(ms); // Reset the stream position back to 0 as in the previous CopyToAsync() call, // a formatter for example, could have made the position to be at the end ms.Position = 0; streamContent = new StreamContent(ms); // copy headers from the original content foreach (KeyValuePair<string, IEnumerable<string>> header in originalContent.Headers) { streamContent.Headers.TryAddWithoutValidation(header.Key, header.Value); } return streamContent; }
public async Task<HttpResponseMessage> Get(string key) { var cachedItem = MemoryCache.Default.Get(key) as byte[]; if(cachedItem == null) { return new HttpResponseMessage(HttpStatusCode.NoContent); } Stream stream = null; if (cachedItem != null) { stream = new MemoryStream(); await stream.WriteAsync(cachedItem, 0, cachedItem.Length); stream.Position = 0; } //var content = new PushStreamContent(async (stream, httpContent, transportContext) => //{ // await stream.WriteAsync(cachedItem, 0, cachedItem.Length); // stream.Close(); //}); var content = new StreamContent(stream); return new HttpResponseMessage() { Content = content }; }
public static byte[] PostMultipartFormDataBodyReturnBytes(string url, IDictionary <string, object> values, IList <string> fileNames, Encoding encoding = null, IDictionary <string, string> headers = null, string referrer = null, string accept = null) { var content = new System.Net.Http.MultipartFormDataContent(); if (encoding == null) { encoding = Encoding.UTF8; } int i = 0; foreach (var item in values) { if (item.Value == null) { content.Add(new System.Net.Http.StringContent(""), item.Key); } else if (item.Value.GetType() == typeof(byte[])) { var cc = new System.Net.Http.StreamContent(new MemoryStream((byte[])item.Value)); cc.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("image/jpeg"); content.Add(cc, item.Key, fileNames[i]); i++; } else if (item.Value.GetType() == typeof(DateTime)) { content.Add(new System.Net.Http.StringContent(((DateTime)item.Value).ToString("yyyy-MM-dd HH:mm:ss")), item.Key); } else if (item.Value is Enum) { content.Add(new System.Net.Http.StringContent(((int)item.Value).ToString()), item.Key); } else if (item.Value is double) { content.Add(new System.Net.Http.StringContent(((double)item.Value).ToString("F2")), item.Key); } else if (item.Value is float) { content.Add(new System.Net.Http.StringContent(((float)item.Value).ToString("F2")), item.Key); } else { content.Add(new System.Net.Http.StringContent(item.Value.ToString()), item.Key); } } var client = SetupClient(headers, referrer, accept); var ret = client.PostAsync(url, content).Result; if (ret.IsSuccessStatusCode == false) { throw new Exception("HTTP请求错误:" + ret.StatusCode); } var data = ret.Content.ReadAsByteArrayAsync().Result; return(data); }
/// <summary> /// 添付ファイルを追加 /// </summary> /// <param name="path"></param> /// <returns></returns> public async Task <bool> UploadFile(int id, string path) { var filename = System.IO.Path.GetFileName(path); var url = $"{_baseurl}uploads.json?filename={filename}"; var contnet = new System.Net.Http.StreamContent(System.IO.File.OpenRead(path)); contnet.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream"); var res = await _cl.PostAsync(url, contnet); var json = await res.Content.ReadAsStringAsync(); JObject o = JsonConvert.DeserializeObject(json) as JObject; // トークンを取得 string token = o.Value <JObject>("upload").Value <string>("token"); string contentType = "text/plain"; switch (System.IO.Path.GetExtension(path).ToLower()) { case ".txt": contentType = "text/plain"; break; case ".bmp": contentType = "image/bmp"; break; case ".jpg": contentType = "image/jpeg"; break; case ".png": contentType = "image/png"; break; case ".pdf": contentType = "application/pdf"; break; case ".doc": contentType = "application/word"; break; case ".docx": contentType = "application/word"; break; case ".xls": contentType = "application/excel"; break; case ".xlsx": contentType = "application/excel"; break; case ".zip": contentType = "application/zip"; break; default: contentType = "text/plain"; break; } url = $"{_baseurl}{_tablename}/{id}.json"; json = new IssueUpload(token, filename, contentType).ToJson(); var contnet2 = new StringContent(json, Encoding.UTF8, "application/json"); res = await _cl.PutAsync(url, contnet2); System.Diagnostics.Debug.WriteLine(json); return(true); }
static void Main(string[] args) { Task.Run(async() => { string base64img = "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"; string urlpost = "https://dev.oscato.com/vicaj3j"; var bytes = Convert.FromBase64String(base64img); var contents = new System.Net.Http.StreamContent(new MemoryStream(bytes)); var client = new HttpClient(); var response = await client.PostAsync(urlpost, contents); Console.WriteLine(response); }).GetAwaiter().GetResult(); }
public static byte[] PostMultipartFormDataBodyReturnBytes(string url, IDictionary <string, object> values, Encoding encoding = null, IDictionary <string, string> headers = null, string referrer = null, string accept = null) { var content = new System.Net.Http.MultipartFormDataContent(); encoding = encoding ?? Encoding.UTF8; foreach (var item in values) { if (item.Value == null) { throw new Exception("参数的值为NULL"); } else if (item.Value is byte) { var cc = new System.Net.Http.StreamContent(new MemoryStream((byte[])item.Value)); cc.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("image/jpeg"); content.Add(cc, item.Key, item.Key); } else if (item.Value is string) { content.Add(new System.Net.Http.StringContent(item.Value as string, encoding ?? Encoding.UTF8, "application/x-www-form-urlencoded"), item.Key); } else { throw new Exception("不支持的类型:" + item.Value.GetType().FullName); } } var client = SetupClient(headers, referrer, accept); HttpResponseMessage ret = null; try { ret = client.PostAsync(url, content).Result; } catch (Exception ex) { throw GetOrignalException(ex); } if (ret.IsSuccessStatusCode == false) { throw new Exception("HTTP请求错误:" + ret.StatusCode); } var data = ret.Content.ReadAsByteArrayAsync().Result; return(data); }
/// <summary> /// Upload from stream /// </summary> /// <returns>StatusResult: statusCode= Http response statuscode, status=Http response reasonphrase</returns> /// <param name="url">formatted URL (contains query parameters)</param> /// <param name="stream">Stream to upload from</param> public async Task <StatusResult> SaveBinaryAsync(string url, Stream stream) { StatusResult result = new StatusResult(); try { HttpContent content = new System.Net.Http.StreamContent(stream); //StringContent (postData, System.Text.Encoding.UTF8, "application/json"); //content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/image"); HttpResponseMessage response = await client.PostAsync(new Uri(url), content); if (!response.IsSuccessStatusCode) { result.statusCode = ((int)response.StatusCode); result.status = response.ReasonPhrase; } } catch (Exception ex) { result.statusCode = 1; result.status = ex.Message; } return(result); }
/* Responsible for creating a request of the specified type. Used * only during POST and PUT since it requires a payload to be provided. */ async Task <Response <TOut> > CreateContentRequest <TOut>( string url, net.HttpMethod method, object input, Dictionary <string, string> headers) { using (var msg = CreateRequestMessage(method, url, headers)) { if (input is Stream stream) { using (var content = new net.StreamContent(stream)) { AddContentHeaders(content, headers); msg.Content = content; return(await GetResult <TOut>(msg)); } } else if (input is byte[] bytes) { using (var content = new net.ByteArrayContent(bytes)) { AddContentHeaders(content, headers); msg.Content = content; return(await GetResult <TOut>(msg)); } } var stringContent = input is string strInput ? strInput : JObject.FromObject(input).ToString(); using (var content = new net.StringContent(stringContent)) { AddContentHeaders(content, headers); msg.Content = content; return(await GetResult <TOut>(msg)); } } }
private HttpContent UnpackContent(object outContent) { if (outContent == null) { return(null); } var httpCont = outContent as HttpContent; if (httpCont != null) { return(httpCont); } var text = outContent as string; if (text != null) { var cont = new System.Net.Http.StreamContent(new System.IO.MemoryStream(Encoding.UTF8.GetBytes(text))); cont.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("text/html"); return(cont); } Util.Throw("Invalid OutgoingResponseContent value type: {0}. Must be string or HttpContent.", outContent.GetType()); return(null); }
private System.Net.Http.StreamContent GetRequestContent <T>(T request, SignedRequestWriter writer) where T : class { System.IO.Stream?stream = null; try { stream = MemoryStreamFactory.CreateStream(); writer.WriteRequest(request, stream); stream.Seek(0, System.IO.SeekOrigin.Begin); var retVal = new System.Net.Http.StreamContent(stream); retVal.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json") { CharSet = System.Text.UTF8Encoding.UTF8.HeaderName }; return(retVal); } catch { stream?.Dispose(); throw; } }
public static HttpResponseMessage CreateResponseMessage( WinHttpRequestState state, bool doManualDecompressionCheck) { HttpRequestMessage request = state.RequestMessage; SafeWinHttpHandle requestHandle = state.RequestHandle; CookieUsePolicy cookieUsePolicy = state.Handler.CookieUsePolicy; CookieContainer cookieContainer = state.Handler.CookieContainer; var response = new HttpResponseMessage(); bool stripEncodingHeaders = false; // Get HTTP version, status code, reason phrase from the response headers. string version = GetResponseHeaderStringInfo(requestHandle, Interop.WinHttp.WINHTTP_QUERY_VERSION); if (string.Compare("HTTP/1.1", version, StringComparison.OrdinalIgnoreCase) == 0) { response.Version = HttpVersion.Version11; } else if (string.Compare("HTTP/1.0", version, StringComparison.OrdinalIgnoreCase) == 0) { response.Version = HttpVersion.Version10; } else { response.Version = HttpVersion.Unknown; } response.StatusCode = (HttpStatusCode)GetResponseHeaderNumberInfo( requestHandle, Interop.WinHttp.WINHTTP_QUERY_STATUS_CODE); response.ReasonPhrase = GetResponseHeaderStringInfo( requestHandle, Interop.WinHttp.WINHTTP_QUERY_STATUS_TEXT); // Create response stream and wrap it in a StreamContent object. var responseStream = new WinHttpResponseStream(state); Stream decompressedStream = responseStream; if (doManualDecompressionCheck) { string contentEncoding = GetResponseHeaderStringInfo( requestHandle, Interop.WinHttp.WINHTTP_QUERY_CONTENT_ENCODING); if (!string.IsNullOrEmpty(contentEncoding)) { if (contentEncoding.IndexOf(EncodingNameDeflate, StringComparison.OrdinalIgnoreCase) > -1) { decompressedStream = new DeflateStream(responseStream, CompressionMode.Decompress); stripEncodingHeaders = true; } else if (contentEncoding.IndexOf(EncodingNameGzip, StringComparison.OrdinalIgnoreCase) > -1) { decompressedStream = new GZipStream(responseStream, CompressionMode.Decompress); stripEncodingHeaders = true; } } } var content = new StreamContent(decompressedStream); response.Content = content; response.RequestMessage = request; // Parse raw response headers and place them into response message. ParseResponseHeaders(requestHandle, response, stripEncodingHeaders); // Store response header cookies into custom CookieContainer. if (cookieUsePolicy == CookieUsePolicy.UseSpecifiedCookieContainer) { Debug.Assert(cookieContainer != null); if (response.Headers.Contains(HeaderNameSetCookie)) { IEnumerable <string> cookieHeaders = response.Headers.GetValues(HeaderNameSetCookie); foreach (var cookieHeader in cookieHeaders) { try { cookieContainer.SetCookies(request.RequestUri, cookieHeader); } catch (CookieException) { // We ignore malformed cookies in the response. } } } } return(response); }
/// <summary> /// <see cref="HttpContent"/> implementation which provides a byte range view over a stream used to generate HTTP /// 206 (Partial Content) byte range responses. If none of the requested ranges overlap with the current extend /// of the selected resource represented by the <paramref name="content"/> parameter then an /// <see cref="InvalidByteRangeException"/> is thrown indicating the valid Content-Range of the content. /// </summary> /// <param name="content">The stream over which to generate a byte range view.</param> /// <param name="range">The range or ranges, typically obtained from the Range HTTP request header field.</param> /// <param name="mediaType">The media type of the content stream.</param> /// <param name="bufferSize">The buffer size used when copying the content stream.</param> public ByteRangeStreamContent( Stream content, RangeHeaderValue range, MediaTypeHeaderValue mediaType, int bufferSize ) { if (content == null) { throw Error.ArgumentNull("content"); } if (!content.CanSeek) { throw Error.Argument( "content", Properties.Resources.ByteRangeStreamNotSeekable, typeof(ByteRangeStreamContent).Name ); } if (range == null) { throw Error.ArgumentNull("range"); } if (mediaType == null) { throw Error.ArgumentNull("mediaType"); } if (bufferSize < MinBufferSize) { throw Error.ArgumentMustBeGreaterThanOrEqualTo( "bufferSize", bufferSize, MinBufferSize ); } if (!range.Unit.Equals(SupportedRangeUnit, StringComparison.OrdinalIgnoreCase)) { throw Error.Argument( "range", Properties.Resources.ByteRangeStreamContentNotBytesRange, range.Unit, SupportedRangeUnit ); } try { // If we have more than one range then we use a multipart/byteranges content type as wrapper. // Otherwise we use a non-multipart response. if (range.Ranges.Count > 1) { // Create Multipart content and copy headers to this content MultipartContent rangeContent = new MultipartContent(ByteRangesContentSubtype); _byteRangeContent = rangeContent; foreach (RangeItemHeaderValue rangeValue in range.Ranges) { try { ByteRangeStream rangeStream = new ByteRangeStream(content, rangeValue); HttpContent rangeBodyPart = new StreamContent(rangeStream, bufferSize); rangeBodyPart.Headers.ContentType = mediaType; rangeBodyPart.Headers.ContentRange = rangeStream.ContentRange; rangeContent.Add(rangeBodyPart); } catch (ArgumentOutOfRangeException) { // We ignore range errors until we check that we have at least one valid range } } // If no overlapping ranges were found then stop if (!rangeContent.Any()) { ContentRangeHeaderValue actualContentRange = new ContentRangeHeaderValue( content.Length ); string msg = Error.Format( Properties.Resources.ByteRangeStreamNoneOverlap, range.ToString() ); throw new InvalidByteRangeException(actualContentRange, msg); } } else if (range.Ranges.Count == 1) { try { ByteRangeStream rangeStream = new ByteRangeStream( content, range.Ranges.First() ); _byteRangeContent = new StreamContent(rangeStream, bufferSize); _byteRangeContent.Headers.ContentType = mediaType; _byteRangeContent.Headers.ContentRange = rangeStream.ContentRange; } catch (ArgumentOutOfRangeException) { ContentRangeHeaderValue actualContentRange = new ContentRangeHeaderValue( content.Length ); string msg = Error.Format( Properties.Resources.ByteRangeStreamNoOverlap, range.ToString() ); throw new InvalidByteRangeException(actualContentRange, msg); } } else { throw Error.Argument( "range", Properties.Resources.ByteRangeStreamContentNoRanges ); } // Copy headers from byte range content so that we get the right content type etc. _byteRangeContent.Headers.CopyTo(Headers); _content = content; _start = content.Position; } catch { if (_byteRangeContent != null) { _byteRangeContent.Dispose(); } throw; } }
public static HttpResponseMessage CreateResponseMessage( WinHttpRequestState state, bool doManualDecompressionCheck) { HttpRequestMessage request = state.RequestMessage; SafeWinHttpHandle requestHandle = state.RequestHandle; CookieUsePolicy cookieUsePolicy = state.Handler.CookieUsePolicy; CookieContainer cookieContainer = state.Handler.CookieContainer; var response = new HttpResponseMessage(); bool stripEncodingHeaders = false; // Create a single buffer to use for all subsequent WinHttpQueryHeaders string interop calls. // This buffer is the length needed for WINHTTP_QUERY_RAW_HEADERS_CRLF, which includes the status line // and all headers separated by CRLF, so it should be large enough for any individual status line or header queries. int bufferLength = GetResponseHeaderCharBufferLength(requestHandle, Interop.WinHttp.WINHTTP_QUERY_RAW_HEADERS_CRLF); char[] buffer = new char[bufferLength]; // Get HTTP version, status code, reason phrase from the response headers. if (IsResponseHttp2(requestHandle)) { response.Version = WinHttpHandler.HttpVersion20; } else { int versionLength = GetResponseHeader(requestHandle, Interop.WinHttp.WINHTTP_QUERY_VERSION, buffer); response.Version = CharArrayHelpers.EqualsOrdinalAsciiIgnoreCase("HTTP/1.1", buffer, 0, versionLength) ? HttpVersion.Version11 : CharArrayHelpers.EqualsOrdinalAsciiIgnoreCase("HTTP/1.0", buffer, 0, versionLength) ? HttpVersion.Version10 : WinHttpHandler.HttpVersionUnknown; } response.StatusCode = (HttpStatusCode)GetResponseHeaderNumberInfo( requestHandle, Interop.WinHttp.WINHTTP_QUERY_STATUS_CODE); int reasonPhraseLength = GetResponseHeader(requestHandle, Interop.WinHttp.WINHTTP_QUERY_STATUS_TEXT, buffer); response.ReasonPhrase = reasonPhraseLength > 0 ? GetReasonPhrase(response.StatusCode, buffer, reasonPhraseLength) : string.Empty; // Create response stream and wrap it in a StreamContent object. var responseStream = new WinHttpResponseStream(requestHandle, state); state.RequestHandle = null; // ownership successfully transfered to WinHttpResponseStram. Stream decompressedStream = responseStream; if (doManualDecompressionCheck) { int contentEncodingStartIndex = 0; int contentEncodingLength = GetResponseHeader( requestHandle, Interop.WinHttp.WINHTTP_QUERY_CONTENT_ENCODING, buffer); CharArrayHelpers.Trim(buffer, ref contentEncodingStartIndex, ref contentEncodingLength); if (contentEncodingLength > 0) { if (CharArrayHelpers.EqualsOrdinalAsciiIgnoreCase( EncodingNameGzip, buffer, contentEncodingStartIndex, contentEncodingLength)) { decompressedStream = new GZipStream(responseStream, CompressionMode.Decompress); stripEncodingHeaders = true; } else if (CharArrayHelpers.EqualsOrdinalAsciiIgnoreCase( EncodingNameDeflate, buffer, contentEncodingStartIndex, contentEncodingLength)) { decompressedStream = new DeflateStream(responseStream, CompressionMode.Decompress); stripEncodingHeaders = true; } } } #if HTTP_DLL var content = new StreamContent(decompressedStream, state.CancellationToken); #else // TODO: Issue https://github.com/dotnet/corefx/issues/9071 // We'd like to be able to pass state.CancellationToken into the StreamContent so that its // SerializeToStreamAsync method can use it, but that ctor isn't public, nor is there a // SerializeToStreamAsync override that takes a CancellationToken. var content = new StreamContent(decompressedStream); #endif response.Content = content; response.RequestMessage = request; // Parse raw response headers and place them into response message. ParseResponseHeaders(requestHandle, response, buffer, stripEncodingHeaders); if (response.RequestMessage.Method != HttpMethod.Head) { state.ExpectedBytesToRead = response.Content.Headers.ContentLength; } return(response); }
public StreamContent(Http.StreamContent content) : base(content) { }
internal CurlResponseMessage(HttpRequestMessage request) { RequestMessage = request; Content = new StreamContent(_responseStream); }
public static HttpResponseMessage CreateResponseMessage( WinHttpRequestState state, bool doManualDecompressionCheck) { HttpRequestMessage request = state.RequestMessage; SafeWinHttpHandle requestHandle = state.RequestHandle; CookieUsePolicy cookieUsePolicy = state.Handler.CookieUsePolicy; CookieContainer cookieContainer = state.Handler.CookieContainer; var response = new HttpResponseMessage(); bool stripEncodingHeaders = false; // Create a single buffer to use for all subsequent WinHttpQueryHeaders string interop calls. // This buffer is the length needed for WINHTTP_QUERY_RAW_HEADERS_CRLF, which includes the status line // and all headers separated by CRLF, so it should be large enough for any individual status line or header queries. int bufferLength = GetResponseHeaderCharBufferLength(requestHandle, Interop.WinHttp.WINHTTP_QUERY_RAW_HEADERS_CRLF); char[] buffer = new char[bufferLength]; // Get HTTP version, status code, reason phrase from the response headers. int versionLength = GetResponseHeader(requestHandle, Interop.WinHttp.WINHTTP_QUERY_VERSION, buffer); response.Version = CharArrayHelpers.EqualsOrdinalAsciiIgnoreCase("HTTP/1.1", buffer, 0, versionLength) ? HttpVersion.Version11 : CharArrayHelpers.EqualsOrdinalAsciiIgnoreCase("HTTP/1.0", buffer, 0, versionLength) ? HttpVersion.Version10 : HttpVersion.Unknown; response.StatusCode = (HttpStatusCode)GetResponseHeaderNumberInfo( requestHandle, Interop.WinHttp.WINHTTP_QUERY_STATUS_CODE); int reasonPhraseLength = GetResponseHeader(requestHandle, Interop.WinHttp.WINHTTP_QUERY_STATUS_TEXT, buffer); response.ReasonPhrase = reasonPhraseLength > 0 ? GetReasonPhrase(response.StatusCode, buffer, reasonPhraseLength) : string.Empty; // Create response stream and wrap it in a StreamContent object. var responseStream = new WinHttpResponseStream(requestHandle, state); Stream decompressedStream = responseStream; if (doManualDecompressionCheck) { int contentEncodingStartIndex = 0; int contentEncodingLength = GetResponseHeader( requestHandle, Interop.WinHttp.WINHTTP_QUERY_CONTENT_ENCODING, buffer); CharArrayHelpers.Trim(buffer, ref contentEncodingStartIndex, ref contentEncodingLength); if (contentEncodingLength > 0) { if (CharArrayHelpers.EqualsOrdinalAsciiIgnoreCase( EncodingNameGzip, buffer, contentEncodingStartIndex, contentEncodingLength)) { decompressedStream = new GZipStream(responseStream, CompressionMode.Decompress); stripEncodingHeaders = true; } else if (CharArrayHelpers.EqualsOrdinalAsciiIgnoreCase( EncodingNameDeflate, buffer, contentEncodingStartIndex, contentEncodingLength)) { decompressedStream = new DeflateStream(responseStream, CompressionMode.Decompress); stripEncodingHeaders = true; } } } var content = new StreamContent(decompressedStream); response.Content = content; response.RequestMessage = request; // Parse raw response headers and place them into response message. ParseResponseHeaders(requestHandle, response, buffer, stripEncodingHeaders); if (response.RequestMessage.Method != HttpMethod.Head) { state.ExpectedBytesToRead = response.Content.Headers.ContentLength; } return(response); }
/// <summary>Upload a new Job</summary> /// <param name="file">Input File</param> /// <param name="fScriptParams">Parameters for the script</param> /// <param name="scriptFilename">Script to use</param> /// <param name="outputFileFormat">format of the file output</param> /// <returns>Success</returns> /// <exception cref="SwaggerException">A server side error occurred.</exception> /// <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param> public async System.Threading.Tasks.Task <JobResult> UploadJobAsync(FileParameter file, string fScriptParams, string scriptFilename, string outputFileFormat, System.Threading.CancellationToken cancellationToken) { var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/UploadJob"); var client_ = _httpClient; try { using (var request_ = new System.Net.Http.HttpRequestMessage()) { var boundary_ = System.Guid.NewGuid().ToString(); var content_ = new System.Net.Http.MultipartFormDataContent(boundary_); content_.Headers.Remove("Content-Type"); content_.Headers.TryAddWithoutValidation("Content-Type", "multipart/form-data; boundary=" + boundary_); if (file != null) { var content_file_ = new System.Net.Http.StreamContent(file.Data); if (!string.IsNullOrEmpty(file.ContentType)) { content_file_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse(file.ContentType); } content_.Add(content_file_, "file", file.FileName ?? "file"); } if (fScriptParams != null) { content_.Add(new System.Net.Http.StringContent(ConvertToString(fScriptParams, System.Globalization.CultureInfo.InvariantCulture)), "fScriptParams"); } if (scriptFilename != null) { content_.Add(new System.Net.Http.StringContent(ConvertToString(scriptFilename, System.Globalization.CultureInfo.InvariantCulture)), "scriptFilename"); } if (outputFileFormat != null) { content_.Add(new System.Net.Http.StringContent(ConvertToString(outputFileFormat, System.Globalization.CultureInfo.InvariantCulture)), "outputFileFormat"); } request_.Content = content_; request_.Method = new System.Net.Http.HttpMethod("POST"); request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); PrepareRequest(client_, request_, urlBuilder_); var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); PrepareRequest(client_, request_, url_); var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); try { var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); if (response_.Content != null && response_.Content.Headers != null) { foreach (var item_ in response_.Content.Headers) { headers_[item_.Key] = item_.Value; } } ProcessResponse(client_, response_); var status_ = ((int)response_.StatusCode).ToString(); if (status_ == "200") { var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); var result_ = default(JobResult); try { result_ = Newtonsoft.Json.JsonConvert.DeserializeObject <JobResult>(responseData_, _settings.Value); return(result_); } catch (System.Exception exception_) { throw new SwaggerException("Could not deserialize the response body.", (int)response_.StatusCode, responseData_, headers_, exception_); } } else if (status_ != "200" && status_ != "204") { var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); throw new SwaggerException("The HTTP status code of the response was not expected (" + (int)response_.StatusCode + ").", (int)response_.StatusCode, responseData_, headers_, null); } return(default(JobResult)); } finally { if (response_ != null) { response_.Dispose(); } } } } finally { } }
// Process request and craft response. public override CefReturnValue ProcessRequestAsync(IRequest request, ICallback callback) { if (request.Method == "OPTIONS") { // This is the CORS request, and that's good base.StatusCode = 200; // base.Headers.Add("Access-Control-Allow-Origin", "*"); base.Headers.Add("Access-Control-Allow-Methods", "GET,POST,PUT,OPTIONS"); base.Headers.Add("Access-Control-Allow-Headers", "Content-Type, Accept, authorization"); callback.Continue(); return(CefReturnValue.Continue); } var uri = new Uri(request.Url); Console.WriteLine($"-----------------\r\n{request.Url}"); try { // This is a regular request Hl7.Fhir.Rest.FhirClient server = new Hl7.Fhir.Rest.FhirClient(_externalFhirServerBaseUrl); server.OnAfterResponse += (sender, args) => { base.Charset = args.RawResponse.CharacterSet; foreach (string header in args.RawResponse.Headers.AllKeys) { if (!header.StartsWith("Access-Control")) { base.Headers.Add(header, args.RawResponse.Headers[header]); } } }; server.PreferredFormat = Hl7.Fhir.Rest.ResourceFormat.Json; string redirectedUrl = server.Endpoint.OriginalString.TrimEnd('/') + uri.PathAndQuery; System.Diagnostics.Trace.WriteLine($"{redirectedUrl}"); if (request.Method == "GET") { System.Threading.Tasks.Task <Hl7.Fhir.Model.Resource> t = server.GetAsync(redirectedUrl).ContinueWith <Hl7.Fhir.Model.Resource>(r => { if (r.Exception != null) { System.Diagnostics.Trace.WriteLine($"Error: {r.Exception.Message}"); if (r.Exception.InnerException is Hl7.Fhir.Rest.FhirOperationException fe) { base.StatusCode = (int)fe.Status; if (fe.Outcome != null) { base.Stream = new MemoryStream(new Hl7.Fhir.Serialization.FhirJsonSerializer(new Hl7.Fhir.Serialization.SerializerSettings() { Pretty = true }).SerializeToBytes(fe.Outcome)); base.MimeType = "application/fhir+json"; } callback.Continue(); System.Diagnostics.Trace.WriteLine($"Error (inner): {fe.Message}"); return(null); } } base.StatusCode = 200; if (r.Result is Hl7.Fhir.Model.CapabilityStatement cs) { // As per the documentation http://hl7.org/fhir/smart-app-launch/conformance/index.html // Update the security node with our internal security node if (cs.Rest[0].Security == null) { cs.Rest[0].Security = new Hl7.Fhir.Model.CapabilityStatement.SecurityComponent(); } Hl7.Fhir.Model.CapabilityStatement.SecurityComponent security = cs.Rest[0].Security; if (!security.Service.Any(cc => cc.Coding.Any(c => c.System == "http://hl7.org/fhir/restful-security-service" && c.Code == "SMART-on-FHIR"))) { security.Service.Add(new Hl7.Fhir.Model.CodeableConcept("http://hl7.org/fhir/restful-security-service", "SMART-on-FHIR")); } var extension = security.GetExtension("http://fhir-registry.smarthealthit.org/StructureDefinition/oauth-uris"); if (extension == null) { extension = new Extension() { Url = "http://fhir-registry.smarthealthit.org/StructureDefinition/oauth-uris" }; security.Extension.Add(extension); } // remove the existing authentications, and put in our own extension.Extension.Clear(); extension.AddExtension("token", new FhirUri($"https://{AuthProtocolSchemeHandlerFactory.AuthAddress(_launchContext)}/token")); extension.AddExtension("authorize", new FhirUri($"https://{AuthProtocolSchemeHandlerFactory.AuthAddress(_launchContext)}/authorize")); } base.Stream = new MemoryStream(new Hl7.Fhir.Serialization.FhirJsonSerializer(new Hl7.Fhir.Serialization.SerializerSettings() { Pretty = true }).SerializeToBytes(r.Result)); Console.WriteLine($"Success: {base.Stream.Length}"); base.MimeType = "application/fhir+json"; callback.Continue(); return(r.Result); }); } if (request.Method == "POST") { System.Net.Http.HttpClient client = new System.Net.Http.HttpClient(); client.DefaultRequestHeaders.Add("Accept", request.GetHeaderByName("Accept")); // client.DefaultRequestHeaders.Add("Content-Type", request.GetHeaderByName("Content-Type")); HttpContent content = null; if (request.PostData != null) { var data = request.PostData.Elements.FirstOrDefault(); var body = data.GetBody(); content = new System.Net.Http.StringContent(body, System.Text.Encoding.UTF8, request.GetHeaderByName("Content-Type")); } else { content = new System.Net.Http.StreamContent(null); } client.PostAsync(redirectedUrl, content).ContinueWith((System.Threading.Tasks.Task <HttpResponseMessage> r) => { if (r.Exception != null) { Console.WriteLine($"Error: {r.Exception.Message}"); //if (r.Exception.InnerException is Hl7.Fhir.Rest.FhirOperationException fe) //{ // base.StatusCode = (int)fe.Status; // if (fe.Outcome != null) // base.Stream = new MemoryStream(r.Result.Content.ReadAsStringAsync().GetAwaiter().GetResult()); // callback.Continue(); // System.Diagnostics.Trace.WriteLine($"Error (inner): {fe.Message}"); // return; //} } base.StatusCode = (int)r.Result.StatusCode; base.Stream = r.Result.Content.ReadAsStreamAsync().GetAwaiter().GetResult(); Console.WriteLine($"Success: {base.Stream.Length}"); base.MimeType = r.Result.Content.Headers.ContentType.MediaType; callback.Continue(); return; }); } if (request.Method == "PUT") { System.Net.Http.HttpClient client = new System.Net.Http.HttpClient(); client.DefaultRequestHeaders.Add("Accept", request.GetHeaderByName("Accept")); // client.DefaultRequestHeaders.Add("Content-Type", request.GetHeaderByName("Content-Type")); HttpContent content = null; if (request.PostData != null) { var data = request.PostData.Elements.FirstOrDefault(); var body = data.GetBody(); content = new System.Net.Http.StringContent(body, System.Text.Encoding.UTF8, request.GetHeaderByName("Content-Type")); } else { content = new System.Net.Http.StreamContent(null); } client.PutAsync(redirectedUrl, content).ContinueWith((System.Threading.Tasks.Task <HttpResponseMessage> r) => { if (r.Exception != null) { Console.WriteLine($"Error: {r.Exception.Message}"); //if (r.Exception.InnerException is Hl7.Fhir.Rest.FhirOperationException fe) //{ // base.StatusCode = (int)fe.Status; // if (fe.Outcome != null) // base.Stream = new MemoryStream(r.Result.Content.ReadAsStringAsync().GetAwaiter().GetResult()); // callback.Continue(); // System.Diagnostics.Trace.WriteLine($"Error (inner): {fe.Message}"); // return; //} } base.StatusCode = (int)r.Result.StatusCode; base.Stream = r.Result.Content.ReadAsStreamAsync().GetAwaiter().GetResult(); Console.WriteLine($"Success: {base.Stream.Length}"); base.MimeType = r.Result.Content.Headers.ContentType.MediaType; callback.Continue(); return; }); } return(CefReturnValue.ContinueAsync); } catch (Exception ex) { Console.WriteLine($"{ex.Message}"); callback.Dispose(); return(CefReturnValue.Cancel); } }
/// <summary> /// Upload file /// </summary> /// <param name='fileContent'> /// File to upload. /// </param> /// <param name='fileName'> /// File name to upload. Name has to be spelled exactly as written here. /// </param> /// <param name='customHeaders'> /// Headers that will be added to request. /// </param> /// <param name='cancellationToken'> /// The cancellation token. /// </param> /// <exception cref="ErrorException"> /// Thrown when the operation returned an invalid status code /// </exception> /// <exception cref="SerializationException"> /// Thrown when unable to deserialize the response /// </exception> /// <exception cref="ValidationException"> /// Thrown when a required parameter is null /// </exception> /// <return> /// A response object containing the response body and response headers. /// </return> public async Task <HttpOperationResponse <Stream> > UploadFileWithHttpMessagesAsync(Stream fileContent, string fileName, Dictionary <string, List <string> > customHeaders = null, CancellationToken cancellationToken = default(CancellationToken)) { if (fileContent == null) { throw new ValidationException(ValidationRules.CannotBeNull, "fileContent"); } if (fileName == null) { throw new ValidationException(ValidationRules.CannotBeNull, "fileName"); } // Tracing bool _shouldTrace = ServiceClientTracing.IsEnabled; string _invocationId = null; if (_shouldTrace) { _invocationId = ServiceClientTracing.NextInvocationId.ToString(); Dictionary <string, object> tracingParameters = new Dictionary <string, object>(); tracingParameters.Add("fileContent", fileContent); tracingParameters.Add("fileName", fileName); tracingParameters.Add("cancellationToken", cancellationToken); ServiceClientTracing.Enter(_invocationId, this, "UploadFile", tracingParameters); } // Construct URL var _baseUrl = Client.BaseUri.AbsoluteUri; var _url = new System.Uri(new System.Uri(_baseUrl + (_baseUrl.EndsWith("/") ? "" : "/")), "formdata/stream/uploadfile").ToString(); // Create HTTP transport objects var _httpRequest = new System.Net.Http.HttpRequestMessage(); System.Net.Http.HttpResponseMessage _httpResponse = null; _httpRequest.Method = new System.Net.Http.HttpMethod("POST"); _httpRequest.RequestUri = new System.Uri(_url); // Set Headers if (customHeaders != null) { foreach (var _header in customHeaders) { if (_httpRequest.Headers.Contains(_header.Key)) { _httpRequest.Headers.Remove(_header.Key); } _httpRequest.Headers.TryAddWithoutValidation(_header.Key, _header.Value); } } // Serialize Request string _requestContent = null; System.Net.Http.MultipartFormDataContent _multiPartContent = new System.Net.Http.MultipartFormDataContent(); if (fileContent != null) { System.Net.Http.StreamContent _fileContent = new System.Net.Http.StreamContent(fileContent); _fileContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream"); FileStream _fileContentAsFileStream = fileContent as FileStream; if (_fileContentAsFileStream != null) { System.Net.Http.Headers.ContentDispositionHeaderValue _contentDispositionHeaderValue = new System.Net.Http.Headers.ContentDispositionHeaderValue("form-data"); _contentDispositionHeaderValue.Name = "fileContent"; _contentDispositionHeaderValue.FileName = _fileContentAsFileStream.Name; _fileContent.Headers.ContentDisposition = _contentDispositionHeaderValue; } _multiPartContent.Add(_fileContent, "fileContent"); } if (fileName != null) { System.Net.Http.StringContent _fileName = new System.Net.Http.StringContent(fileName, System.Text.Encoding.UTF8); _multiPartContent.Add(_fileName, "fileName"); } _httpRequest.Content = _multiPartContent; // Send Request if (_shouldTrace) { ServiceClientTracing.SendRequest(_invocationId, _httpRequest); } cancellationToken.ThrowIfCancellationRequested(); _httpResponse = await Client.HttpClient.SendAsync(_httpRequest, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); if (_shouldTrace) { ServiceClientTracing.ReceiveResponse(_invocationId, _httpResponse); } HttpStatusCode _statusCode = _httpResponse.StatusCode; cancellationToken.ThrowIfCancellationRequested(); string _responseContent = null; if ((int)_statusCode != 200) { var ex = new ErrorException(string.Format("Operation returned an invalid status code '{0}'", _statusCode)); try { _responseContent = await _httpResponse.Content.ReadAsStringAsync().ConfigureAwait(false); Error _errorBody = Microsoft.Rest.Serialization.SafeJsonConvert.DeserializeObject <Error>(_responseContent, Client.DeserializationSettings); if (_errorBody != null) { ex.Body = _errorBody; } } catch (Newtonsoft.Json.JsonException) { // Ignore the exception } ex.Request = new HttpRequestMessageWrapper(_httpRequest, _requestContent); ex.Response = new HttpResponseMessageWrapper(_httpResponse, _responseContent); if (_shouldTrace) { ServiceClientTracing.Error(_invocationId, ex); } _httpRequest.Dispose(); if (_httpResponse != null) { _httpResponse.Dispose(); } throw ex; } // Create Result var _result = new HttpOperationResponse <Stream>(); _result.Request = _httpRequest; _result.Response = _httpResponse; // Deserialize Response if ((int)_statusCode == 200) { _result.Body = await _httpResponse.Content.ReadAsStreamAsync().ConfigureAwait(false); } if (_shouldTrace) { ServiceClientTracing.Exit(_invocationId, _result); } return(_result); }
// Process request and craft response. public override CefReturnValue ProcessRequestAsync(IRequest request, ICallback callback) { if (request.Method == "OPTIONS") { // This is the CORS request, and that's good base.StatusCode = 200; // base.Headers.Add("Access-Control-Allow-Origin", "*"); base.Headers.Add("Access-Control-Allow-Methods", "GET,POST,PUT,OPTIONS"); base.Headers.Add("Access-Control-Allow-Headers", "Content-Type, Accept, authorization"); callback.Continue(); return(CefReturnValue.Continue); } var uri = new Uri(request.Url); Console.WriteLine($"-----------------\r\n{request.Url}"); // Check the bearer header if (!string.IsNullOrEmpty(_launchContext.Bearer)) { string bearer = request.GetHeaderByName("authorization"); if (bearer != "Bearer " + _launchContext.Bearer) { base.StatusCode = (int)HttpStatusCode.Unauthorized; callback.Continue(); return(CefReturnValue.Continue); } } try { // This is a regular request Hl7.Fhir.Rest.FhirClient server = new Hl7.Fhir.Rest.FhirClient("http://localhost:4178"); server.OnAfterResponse += (sender, args) => { base.Charset = args.RawResponse.CharacterSet; foreach (string header in args.RawResponse.Headers.AllKeys) { base.Headers.Add(header, args.RawResponse.Headers[header]); } }; server.PreferredFormat = Hl7.Fhir.Rest.ResourceFormat.Json; string redirectedUrl = server.Endpoint.OriginalString.TrimEnd('/') + uri.PathAndQuery; System.Diagnostics.Trace.WriteLine($"{redirectedUrl}"); var headers = new List <KeyValuePair <string, IEnumerable <string> > >(); ModelBaseInputs <IServiceProvider> requestDetails = new ModelBaseInputs <IServiceProvider>(null, null, request.Method, uri, new Uri($"https://{AuthProtocolSchemeHandlerFactory.FhirFacadeAddress(_launchContext)}"), null, headers, null); if (request.Method == "GET") { if (uri.LocalPath == "/metadata") { _facade.GetConformance(requestDetails, Rest.SummaryType.False).ContinueWith <CapabilityStatement>(r => { if (r.Exception != null) { System.Diagnostics.Trace.WriteLine($"Error: {r.Exception.Message}"); if (r.Exception.InnerException is Hl7.Fhir.Rest.FhirOperationException fe) { base.StatusCode = (int)fe.Status; if (fe.Outcome != null) { base.Stream = new MemoryStream(new Hl7.Fhir.Serialization.FhirJsonSerializer(new Hl7.Fhir.Serialization.SerializerSettings() { Pretty = true }).SerializeToBytes(fe.Outcome)); base.MimeType = "application/fhir+json"; } callback.Continue(); System.Diagnostics.Trace.WriteLine($"Error (inner): {fe.Message}"); return(null); } } base.StatusCode = 200; // As per the documentation http://hl7.org/fhir/smart-app-launch/conformance/index.html CapabilityStatement cs = r.Result; // Update the security node with our internal security node if (cs.Rest[0].Security == null) { cs.Rest[0].Security = new Hl7.Fhir.Model.CapabilityStatement.SecurityComponent(); } Hl7.Fhir.Model.CapabilityStatement.SecurityComponent security = cs.Rest[0].Security; if (!security.Service.Any(cc => cc.Coding.Any(c => c.System == "http://hl7.org/fhir/restful-security-service" && c.Code == "SMART-on-FHIR"))) { security.Service.Add(new Hl7.Fhir.Model.CodeableConcept("http://hl7.org/fhir/restful-security-service", "SMART-on-FHIR")); } var extension = security.GetExtension("http://fhir-registry.smarthealthit.org/StructureDefinition/oauth-uris"); if (extension == null) { extension = new Extension() { Url = "http://fhir-registry.smarthealthit.org/StructureDefinition/oauth-uris" }; security.Extension.Add(extension); } // remove the existing authentications, and put in our own extension.Extension.Clear(); extension.AddExtension("token", new FhirUri($"https://{AuthProtocolSchemeHandlerFactory.AuthAddress(_launchContext)}/token")); extension.AddExtension("authorize", new FhirUri($"https://{AuthProtocolSchemeHandlerFactory.AuthAddress(_launchContext)}/authorize")); base.Stream = new MemoryStream(new Hl7.Fhir.Serialization.FhirJsonSerializer(new Hl7.Fhir.Serialization.SerializerSettings() { Pretty = true }).SerializeToBytes(r.Result)); Console.WriteLine($"Success: {base.Stream.Length}"); base.MimeType = "application/fhir+json"; callback.Continue(); return(r.Result); }); return(CefReturnValue.ContinueAsync); } if (!uri.LocalPath.StartsWith("/$") && !uri.LocalPath.StartsWith("/_") && uri.LocalPath.Length > 2) { // This is not an operation or history, so it must be a resource type string resourceType = uri.LocalPath.Substring(1); if (resourceType.Contains("/")) { resourceType = resourceType.Substring(0, resourceType.IndexOf("/")); } var rs = _facade.GetResourceService(requestDetails, resourceType); if (rs == null) { System.Diagnostics.Trace.WriteLine($"Error: resource type not handled {resourceType}"); base.StatusCode = (int)HttpStatusCode.BadRequest; // base.Stream = new MemoryStream(new Hl7.Fhir.Serialization.FhirJsonSerializer(new Hl7.Fhir.Serialization.SerializerSettings() { Pretty = true }).SerializeToBytes(fe.Outcome)); // base.MimeType = "application/fhir+json"; callback.Continue(); return(CefReturnValue.Continue); } // GET for a specific resource ResourceIdentity ri = new ResourceIdentity(uri); if (ri.IsRestResourceIdentity()) { rs.Get(ri.Id, ri.VersionId, SummaryType.False).ContinueWith(r => { if (r.Exception != null) { System.Diagnostics.Trace.WriteLine($"Error: {r.Exception.Message}"); if (r.Exception.InnerException is Hl7.Fhir.Rest.FhirOperationException fe) { base.StatusCode = (int)fe.Status; if (fe.Outcome != null) { base.Stream = new MemoryStream(new Hl7.Fhir.Serialization.FhirJsonSerializer(new Hl7.Fhir.Serialization.SerializerSettings() { Pretty = true }).SerializeToBytes(fe.Outcome)); base.MimeType = "application/fhir+json"; } callback.Continue(); System.Diagnostics.Trace.WriteLine($"Error (inner): {fe.Message}"); return(null); } } if (r.Result.HasAnnotation <HttpStatusCode>()) { base.StatusCode = (int)r.Result.Annotation <HttpStatusCode>(); } else { base.StatusCode = 200; } base.Stream = new MemoryStream(new Hl7.Fhir.Serialization.FhirJsonSerializer(new Hl7.Fhir.Serialization.SerializerSettings() { Pretty = true }).SerializeToBytes(r.Result)); Console.WriteLine($"Success: {base.Stream.Length}"); base.MimeType = "application/fhir+json"; callback.Continue(); return(r.Result); }); return(CefReturnValue.ContinueAsync); } // Search for the resource type var parameters = TupledParameters(uri, SearchQueryParameterNames); int?pagesize = GetIntParameter(uri, FhirParameter.COUNT); var summary = GetSummaryParameter(uri); rs.Search(parameters, pagesize, summary).ContinueWith(r => { if (r.Exception != null) { System.Diagnostics.Trace.WriteLine($"Error: {r.Exception.Message}"); if (r.Exception.InnerException is Hl7.Fhir.Rest.FhirOperationException fe) { base.StatusCode = (int)fe.Status; if (fe.Outcome != null) { base.Stream = new MemoryStream(new Hl7.Fhir.Serialization.FhirJsonSerializer(new Hl7.Fhir.Serialization.SerializerSettings() { Pretty = true }).SerializeToBytes(fe.Outcome)); base.MimeType = "application/fhir+json"; } callback.Continue(); System.Diagnostics.Trace.WriteLine($"Error (inner): {fe.Message}"); return(null); } } if (r.Result.HasAnnotation <HttpStatusCode>()) { base.StatusCode = (int)r.Result.Annotation <HttpStatusCode>(); } else { base.StatusCode = 200; } base.Stream = new MemoryStream(new Hl7.Fhir.Serialization.FhirJsonSerializer(new Hl7.Fhir.Serialization.SerializerSettings() { Pretty = true }).SerializeToBytes(r.Result)); Console.WriteLine($"Success: {base.Stream.Length}"); base.MimeType = "application/fhir+json"; callback.Continue(); return(r.Result); }); return(CefReturnValue.ContinueAsync); } System.Threading.Tasks.Task <Hl7.Fhir.Model.Resource> t = server.GetAsync(redirectedUrl).ContinueWith <Hl7.Fhir.Model.Resource>(r => { if (r.Exception != null) { System.Diagnostics.Trace.WriteLine($"Error: {r.Exception.Message}"); if (r.Exception.InnerException is Hl7.Fhir.Rest.FhirOperationException fe) { base.StatusCode = (int)fe.Status; if (fe.Outcome != null) { base.Stream = new MemoryStream(new Hl7.Fhir.Serialization.FhirJsonSerializer(new Hl7.Fhir.Serialization.SerializerSettings() { Pretty = true }).SerializeToBytes(fe.Outcome)); base.MimeType = "application/fhir+json"; } callback.Continue(); System.Diagnostics.Trace.WriteLine($"Error (inner): {fe.Message}"); return(null); } } base.StatusCode = 200; if (r.Result is Hl7.Fhir.Model.CapabilityStatement cs) { // As per the documentation http://hl7.org/fhir/smart-app-launch/conformance/index.html // Update the security node with our internal security node if (cs.Rest[0].Security == null) { cs.Rest[0].Security = new Hl7.Fhir.Model.CapabilityStatement.SecurityComponent(); } Hl7.Fhir.Model.CapabilityStatement.SecurityComponent security = cs.Rest[0].Security; if (!security.Service.Any(cc => cc.Coding.Any(c => c.System == "http://hl7.org/fhir/restful-security-service" && c.Code == "SMART-on-FHIR"))) { security.Service.Add(new Hl7.Fhir.Model.CodeableConcept("http://hl7.org/fhir/restful-security-service", "SMART-on-FHIR")); } var extension = security.GetExtension("http://fhir-registry.smarthealthit.org/StructureDefinition/oauth-uris"); if (extension == null) { extension = new Extension() { Url = "http://fhir-registry.smarthealthit.org/StructureDefinition/oauth-uris" }; security.Extension.Add(extension); } // remove the existing authentications, and put in our own extension.Extension.Clear(); extension.AddExtension("token", new FhirUri($"https://{AuthProtocolSchemeHandlerFactory.AuthAddress(_launchContext)}/token")); extension.AddExtension("authorize", new FhirUri($"https://{AuthProtocolSchemeHandlerFactory.AuthAddress(_launchContext)}/authorize")); } base.Stream = new MemoryStream(new Hl7.Fhir.Serialization.FhirJsonSerializer(new Hl7.Fhir.Serialization.SerializerSettings() { Pretty = true }).SerializeToBytes(r.Result)); Console.WriteLine($"Success: {base.Stream.Length}"); base.MimeType = "application/fhir+json"; callback.Continue(); return(r.Result); }); } if (request.Method == "POST") { if (uri.LocalPath == "/") { Bundle b = null; if (request.PostData != null) { var data = request.PostData.Elements.FirstOrDefault(); var body = data.GetBody(); if (request.GetHeaderByName("Content-Type").Contains("xml")) { b = new Hl7.Fhir.Serialization.FhirXmlParser().Parse <Bundle>(body); } else { b = new Hl7.Fhir.Serialization.FhirJsonParser().Parse <Bundle>(body); } } _facade.ProcessBatch(requestDetails, b).ContinueWith(r => { if (r.Exception != null) { System.Diagnostics.Trace.WriteLine($"Error: {r.Exception.Message}"); if (r.Exception.InnerException is Hl7.Fhir.Rest.FhirOperationException fe) { base.StatusCode = (int)fe.Status; if (fe.Outcome != null) { base.Stream = new MemoryStream(new Hl7.Fhir.Serialization.FhirJsonSerializer(new Hl7.Fhir.Serialization.SerializerSettings() { Pretty = true }).SerializeToBytes(fe.Outcome)); base.MimeType = "application/fhir+json"; } callback.Continue(); System.Diagnostics.Trace.WriteLine($"Error (inner): {fe.Message}"); return(null); } } if (r.Result.HasAnnotation <HttpStatusCode>()) { base.StatusCode = (int)r.Result.Annotation <HttpStatusCode>(); } else { base.StatusCode = 200; } base.Stream = new MemoryStream(new Hl7.Fhir.Serialization.FhirJsonSerializer(new Hl7.Fhir.Serialization.SerializerSettings() { Pretty = true }).SerializeToBytes(r.Result)); Console.WriteLine($"Success: {base.Stream.Length}"); base.MimeType = "application/fhir+json"; callback.Continue(); return(r.Result); }); return(CefReturnValue.ContinueAsync); } System.Net.Http.HttpClient client = new System.Net.Http.HttpClient(); client.DefaultRequestHeaders.Add("Accept", request.GetHeaderByName("Accept")); // client.DefaultRequestHeaders.Add("Content-Type", request.GetHeaderByName("Content-Type")); HttpContent content = null; if (request.PostData != null) { var data = request.PostData.Elements.FirstOrDefault(); var body = data.GetBody(); content = new System.Net.Http.StringContent(body, System.Text.Encoding.UTF8, request.GetHeaderByName("Content-Type")); } else { content = new System.Net.Http.StreamContent(null); } client.PostAsync(redirectedUrl, content).ContinueWith((System.Threading.Tasks.Task <HttpResponseMessage> r) => { if (r.Exception != null) { Console.WriteLine($"Error: {r.Exception.Message}"); //if (r.Exception.InnerException is Hl7.Fhir.Rest.FhirOperationException fe) //{ // base.StatusCode = (int)fe.Status; // if (fe.Outcome != null) // base.Stream = new MemoryStream(r.Result.Content.ReadAsStringAsync().GetAwaiter().GetResult()); // callback.Continue(); // System.Diagnostics.Trace.WriteLine($"Error (inner): {fe.Message}"); // return; //} } base.StatusCode = (int)r.Result.StatusCode; base.Stream = r.Result.Content.ReadAsStreamAsync().GetAwaiter().GetResult(); Console.WriteLine($"Success: {base.Stream.Length}"); base.MimeType = r.Result.Content.Headers.ContentType.MediaType; callback.Continue(); return; }); } if (request.Method == "PUT") { System.Net.Http.HttpClient client = new System.Net.Http.HttpClient(); client.DefaultRequestHeaders.Add("Accept", request.GetHeaderByName("Accept")); // client.DefaultRequestHeaders.Add("Content-Type", request.GetHeaderByName("Content-Type")); HttpContent content = null; if (request.PostData != null) { var data = request.PostData.Elements.FirstOrDefault(); var body = data.GetBody(); content = new System.Net.Http.StringContent(body, System.Text.Encoding.UTF8, request.GetHeaderByName("Content-Type")); } else { content = new System.Net.Http.StreamContent(null); } client.PutAsync(redirectedUrl, content).ContinueWith((System.Threading.Tasks.Task <HttpResponseMessage> r) => { if (r.Exception != null) { Console.WriteLine($"Error: {r.Exception.Message}"); //if (r.Exception.InnerException is Hl7.Fhir.Rest.FhirOperationException fe) //{ // base.StatusCode = (int)fe.Status; // if (fe.Outcome != null) // base.Stream = new MemoryStream(r.Result.Content.ReadAsStringAsync().GetAwaiter().GetResult()); // callback.Continue(); // System.Diagnostics.Trace.WriteLine($"Error (inner): {fe.Message}"); // return; //} } base.StatusCode = (int)r.Result.StatusCode; base.Stream = r.Result.Content.ReadAsStreamAsync().GetAwaiter().GetResult(); Console.WriteLine($"Success: {base.Stream.Length}"); base.MimeType = r.Result.Content.Headers.ContentType.MediaType; callback.Continue(); return; }); } return(CefReturnValue.ContinueAsync); } catch (Exception ex) { Console.WriteLine($"{ex.Message}"); callback.Dispose(); return(CefReturnValue.Cancel); } }
public void sendPost() { // Définition des variables qui seront envoyés HttpContent stringContent1 = new StringContent(param1String); // Le contenu du paramètre P1 HttpContent stringContent2 = new StringContent(param2String); // Le contenu du paramètre P2 HttpContent fileStreamContent = new StreamContent(paramFileStream); //HttpContent bytesContent = new ByteArrayContent(paramFileBytes); using (var client = new HttpClient()) using (var formData = new MultipartFormDataContent()) { formData.Add(stringContent1, "P1"); // Le paramètre P1 aura la valeur contenue dans param1String formData.Add(stringContent2, "P2"); // Le parmaètre P2 aura la valeur contenue dans param2String formData.Add(fileStreamContent, "FICHIER", "RETURN.xml"); // formData.Add(bytesContent, "file2", "file2"); try { var response = client.PostAsync(actionUrl, formData).Result; MessageBox.Show(response.ToString()); if (!response.IsSuccessStatusCode) { MessageBox.Show("Erreur de réponse"); } } catch (Exception Error) { MessageBox.Show(Error.Message); } finally { client.CancelPendingRequests(); } } }