Inheritance: HttpContent
コード例 #1
5
ファイル: Uploader.cs プロジェクト: hexafluoride/UguuSharp
        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;
            }
        }
コード例 #2
3
ファイル: Upload.cs プロジェクト: GorillaGeek/gorilla.wistia
        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);
            }
        }
コード例 #3
2
ファイル: Add.cs プロジェクト: richardschneider/net-ipfs-api
        /// <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);
            }
        }
コード例 #4
0
 /// <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;
 }
コード例 #5
0
 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;
 }
コード例 #6
0
        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;
        }
コード例 #7
0
        /// <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);
        }
コード例 #8
0
        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;
        }
コード例 #10
0
ファイル: OwinClientHandler.cs プロジェクト: tkggand/katana
        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;
                        });
                });
        }
コード例 #11
0
 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);
 }
コード例 #12
0
ファイル: RavenAzureClient.cs プロジェクト: j2jensen/ravendb
        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);
        }
コード例 #13
0
        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;
                }
            }
        }
コード例 #14
0
        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);
            }
        }
コード例 #15
0
        /// <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
            };
        }
コード例 #16
0
        /// <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}");
                }
            }

        }
コード例 #17
0
 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);
             }
         }
     }));
 }
コード例 #18
0
 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);
 }
コード例 #19
0
        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.");
            }
        }
コード例 #20
0
        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.");
            }
        }
コード例 #21
0
ファイル: RavenAwsS3Client.cs プロジェクト: j2jensen/ravendb
        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);
        }
コード例 #22
0
        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);
        }
コード例 #23
0
        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);
            }
        }
コード例 #24
0
        /// <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);
        }
コード例 #25
0
        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); 
			}
        }
コード例 #26
0
        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);
        }
コード例 #27
0
        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);
            }
        }
コード例 #28
0
        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);
            }
        }
コード例 #29
0
		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;
		}
コード例 #30
0
		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);
		}
コード例 #31
0
        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;
        }
コード例 #32
0
        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 };
        }
コード例 #33
0
        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);
        }
コード例 #34
0
ファイル: RedmineService.cs プロジェクト: moonmile/RmClient
            /// <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);
            }
コード例 #35
0
    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();
    }
コード例 #36
0
ファイル: MsHttpRestful.cs プロジェクト: RyanFu/shoperp
        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);
        }
コード例 #37
0
        /// <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);
        }
コード例 #38
0
        /* 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));
                }
            }
        }
コード例 #39
0
        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);
        }
コード例 #40
0
        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;
            }
        }
コード例 #41
0
        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);
        }
コード例 #42
0
        /// <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;
            }
        }
コード例 #43
0
        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);
        }
コード例 #44
0
 public StreamContent(Http.StreamContent content)
     : base(content)
 {
 }
コード例 #45
0
 internal CurlResponseMessage(HttpRequestMessage request)
 {
     RequestMessage = request;
     Content        = new StreamContent(_responseStream);
 }
コード例 #46
0
        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);
        }
コード例 #47
0
    /// <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
        {
        }
    }
コード例 #48
0
        // 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);
            }
        }
コード例 #49
0
ファイル: Formdata.cs プロジェクト: vishalishere/autorest
        /// <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);
        }
コード例 #50
0
        // 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);
            }
        }
コード例 #51
-7
        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();
                }
            }
        }