public async Task <IApiResponse> PostAsync(ArraySegment <byte> traces)
        {
            using (var bidirectionalStream = _streamFactory.GetBidirectionalStream())
            {
                var content = new BufferContent(traces);
                var request = new HttpRequest("POST", _uri.Host, _uri.PathAndQuery, _headers, content);

                // send request, get response
                var response = await _client.SendAsync(request, bidirectionalStream, bidirectionalStream).ConfigureAwait(false);

                // Content-Length is required as we don't support chunked transfer
                var contentLength = response.Content.Length;
                if (!contentLength.HasValue)
                {
                    throw new Exception("Content-Length is required but was not provided");
                }

                // buffer the entire contents for now
                var buffer = new byte[contentLength.Value];
                var responseContentStream = new MemoryStream(buffer);
                await response.Content.CopyToAsync(buffer).ConfigureAwait(false);

                responseContentStream.Position = 0;

                return(new HttpStreamResponse(response.StatusCode, responseContentStream.Length, response.GetContentEncoding(), responseContentStream, response.Headers));
            }
        }
Exemplo n.º 2
0
        public async Task <IApiResponse> PostAsync(Span[][] traces, FormatterResolverWrapper formatterResolver)
        {
            using (var bidirectionalStream = _streamFactory.GetBidirectionalStream())
            {
                // buffer the entire contents for now so we can determine its size in bytes and avoid chunking.
                // TODO: support chunked transfer encoding to avoid buffering the entire contents
                var requestContentStream = new MemoryStream();
                await CachedSerializer.Instance.SerializeAsync(requestContentStream, traces, formatterResolver).ConfigureAwait(false);

                requestContentStream.Position = 0;

                var content = new StreamContent(requestContentStream, requestContentStream.Length);
                var request = new HttpRequest("POST", _uri.Host, _uri.PathAndQuery, _headers, content);

                // send request, get response
                var response = await _client.SendAsync(request, bidirectionalStream, bidirectionalStream).ConfigureAwait(false);

                // buffer the entire contents for now
                var responseContentStream = new MemoryStream();
                await response.Content.CopyToAsync(responseContentStream, DatadogHttpValues.MaximumResponseBufferSize).ConfigureAwait(false);

                responseContentStream.Position = 0;

                var contentLength = response.ContentLength;
                if (contentLength != null && contentLength != responseContentStream.Length)
                {
                    throw new Exception("Content length from http headers does not match content's actual length.");
                }

                return(new HttpStreamResponse(response.StatusCode, responseContentStream.Length, response.GetContentEncoding(), responseContentStream));
            }
        }
Exemplo n.º 3
0
        public async Task DatadogHttpClient_WhenOnlyPartOfResponseIsAvailable_ParsesCorrectly(int bytesToRead)
        {
            var client         = new DatadogHttpClient();
            var requestContent = new BufferContent(new ArraySegment <byte>(new byte[0]));
            var htmlResponse   = string.Join("\r\n", HtmlResponseLines());

            using var requestStream = new MemoryStream();
            var responseBytes = Encoding.UTF8.GetBytes(htmlResponse);

            using var responseStream = new RegulatedStream(responseBytes, bytesToRead);

            var request  = new HttpRequest("POST", "localhost", string.Empty, new HttpHeaders(), requestContent);
            var response = await client.SendAsync(request, requestStream, responseStream);

            Assert.Equal(200, response.StatusCode);
            Assert.Equal("OK", response.ResponseMessage);
            Assert.Equal("Test Server", response.Headers.GetValue(("Server")));
            Assert.Equal(2, response.ContentLength);
            Assert.Equal("application/json", response.ContentType);

            var buffer = new byte[2];
            await response.Content.CopyToAsync(buffer);

            var content = Encoding.UTF8.GetString(buffer);

            Assert.Equal("{}", content);
        }