|
1 | 1 | using System; |
2 | 2 | using System.Collections.Concurrent; |
3 | 3 | using System.Diagnostics; |
| 4 | +using System.IO; |
4 | 5 | using System.Net.Http; |
5 | | -using System.Text; |
6 | 6 | using System.Threading; |
7 | 7 | using System.Threading.Tasks; |
8 | 8 | using GraphQL.Client.Abstractions; |
@@ -73,7 +73,7 @@ public async Task<GraphQLResponse<TResponse>> SendQueryAsync<TResponse>(GraphQLR |
73 | 73 | if (Options.UseWebSocketForQueriesAndMutations) |
74 | 74 | return await _graphQlHttpWebSocket.SendRequest<TResponse>(request, cancellationToken); |
75 | 75 |
|
76 | | - return await SendHttpPostRequestAsync<TResponse>(request, cancellationToken); |
| 76 | + return await SendHttpRequestAsync<TResponse>(request, cancellationToken); |
77 | 77 | } |
78 | 78 |
|
79 | 79 | /// <inheritdoc /> |
@@ -124,35 +124,33 @@ public IObservable<GraphQLResponse<TResponse>> CreateSubscriptionStream<TRespons |
124 | 124 |
|
125 | 125 | #region Private Methods |
126 | 126 |
|
127 | | - private async Task<GraphQLHttpResponse<TResponse>> SendHttpPostRequestAsync<TResponse>(GraphQLRequest request, CancellationToken cancellationToken = default) |
| 127 | + private async Task<GraphQLHttpResponse<TResponse>> SendHttpRequestAsync<TResponse>(GraphQLRequest request, CancellationToken cancellationToken = default) |
128 | 128 | { |
129 | 129 | var preprocessedRequest = await Options.PreprocessRequest(request, this); |
130 | | - using var httpRequestMessage = GenerateHttpRequestMessage(preprocessedRequest); |
131 | | - using var httpResponseMessage = await HttpClient.SendAsync(httpRequestMessage, cancellationToken); |
132 | | - |
133 | | - httpResponseMessage.EnsureSuccessStatusCode(); |
134 | 130 |
|
135 | | - var bodyStream = await httpResponseMessage.Content.ReadAsStreamAsync(); |
136 | | - var response = await JsonSerializer.DeserializeFromUtf8StreamAsync<TResponse>(bodyStream, cancellationToken); |
137 | | - return response.ToGraphQLHttpResponse(httpResponseMessage.Headers, httpResponseMessage.StatusCode); |
138 | | - } |
| 131 | + using var httpRequestMessage = preprocessedRequest.ToHttpRequestMessage(Options, JsonSerializer); |
| 132 | + using var httpResponseMessage = await HttpClient.SendAsync(httpRequestMessage, HttpCompletionOption.ResponseHeadersRead, cancellationToken); |
139 | 133 |
|
140 | | - private HttpRequestMessage GenerateHttpRequestMessage(GraphQLRequest request) |
141 | | - { |
142 | | - var message = new HttpRequestMessage(HttpMethod.Post, Options.EndPoint) |
| 134 | + var contentStream = await httpResponseMessage.Content.ReadAsStreamAsync(); |
| 135 | + |
| 136 | + if (httpResponseMessage.IsSuccessStatusCode) |
143 | 137 | { |
144 | | - Content = new StringContent(JsonSerializer.SerializeToString(request), Encoding.UTF8, Options.MediaType) |
145 | | - }; |
| 138 | + var graphQLResponse = await JsonSerializer.DeserializeFromUtf8StreamAsync<TResponse>(contentStream, cancellationToken); |
| 139 | + return graphQLResponse.ToGraphQLHttpResponse(httpResponseMessage.Headers, httpResponseMessage.StatusCode); |
| 140 | + } |
146 | 141 |
|
147 | | - if (request is GraphQLHttpRequest httpRequest) |
148 | | - httpRequest.PreprocessHttpRequestMessage(message); |
| 142 | + // error handling |
| 143 | + string content = null; |
| 144 | + if (contentStream != null) |
| 145 | + using (var sr = new StreamReader(contentStream)) |
| 146 | + content = await sr.ReadToEndAsync(); |
149 | 147 |
|
150 | | - return message; |
| 148 | + throw new GraphQLHttpRequestException(httpResponseMessage.StatusCode, httpResponseMessage.Headers, content); |
151 | 149 | } |
152 | 150 |
|
153 | 151 | private Uri GetWebSocketUri() |
154 | 152 | { |
155 | | - var webSocketSchema = Options.EndPoint.Scheme == "https" ? "wss" : "ws"; |
| 153 | + string webSocketSchema = Options.EndPoint.Scheme == "https" ? "wss" : "ws"; |
156 | 154 | return new Uri($"{webSocketSchema}://{Options.EndPoint.Host}:{Options.EndPoint.Port}{Options.EndPoint.AbsolutePath}"); |
157 | 155 | } |
158 | 156 |
|
|
0 commit comments