Fix warnings

This commit is contained in:
nicolas.dorier
2021-12-27 13:46:31 +09:00
parent 259f0b5aad
commit c0e9f91bdc
15 changed files with 115 additions and 130 deletions

View File

@@ -10,104 +10,59 @@ namespace BTCPayServer.Services.Rates
{
internal class HttpClientRequestMaker : IAPIRequestMaker
{
class InternalHttpWebRequest : IHttpWebRequest
#nullable enable
internal class InternalHttpWebRequest : IHttpWebRequest
{
internal readonly HttpWebRequest Request;
internal readonly HttpRequestMessage Request;
internal HttpResponseMessage? Response;
private string? contentType;
public Uri RequestUri => Request.RequestUri;
public string Method
public InternalHttpWebRequest(string method, Uri fullUri)
{
get
{
return Request.Method;
}
set
{
Request.Method = value;
}
}
public int Timeout
{
get
{
return Request.Timeout;
}
set
{
Request.Timeout = value;
}
}
public int ReadWriteTimeout
{
get
{
return Request.ReadWriteTimeout;
}
set
{
Request.ReadWriteTimeout = value;
}
}
public InternalHttpWebRequest(Uri fullUri)
{
Request = ((WebRequest.Create(fullUri) as HttpWebRequest) ?? throw new NullReferenceException("Failed to create HttpWebRequest"));
Request.KeepAlive = false;
Request = new HttpRequestMessage(new HttpMethod(method), fullUri);
}
public void AddHeader(string header, string value)
{
switch (header.ToStringLowerInvariant())
switch (header.ToLowerInvariant())
{
case "content-type":
Request.ContentType = value;
break;
case "content-length":
Request.ContentLength = value.ConvertInvariant<long>(0L);
break;
case "user-agent":
Request.UserAgent = value;
break;
case "accept":
Request.Accept = value;
break;
case "connection":
Request.Connection = value;
contentType = value;
break;
default:
Request.Headers[header] = value;
Request.Headers.TryAddWithoutValidation(header, value);
break;
}
}
public Uri RequestUri
{
get { return Request.RequestUri!; }
}
public string Method
{
get { return Request.Method.Method; }
set { Request.Method = new HttpMethod(value); }
}
public int Timeout { get; set; }
public int ReadWriteTimeout
{
get => Timeout;
set => Timeout = value;
}
public Task WriteAllAsync(byte[] data, int index, int length)
{
throw new NotImplementedException();
}
public HttpRequestMessage ToHttpRequestMessage()
{
var httpRequest = new HttpRequestMessage(HttpMethod.Get, Request.RequestUri);
CopyHeadersFrom(httpRequest, Request);
return httpRequest;
}
internal void CopyHeadersFrom(HttpRequestMessage message, HttpWebRequest request)
{
foreach (string headerName in request.Headers)
{
string[] headerValues = request.Headers.GetValues(headerName);
if (!message.Headers.TryAddWithoutValidation(headerName, headerValues))
{
if (message.Content != null)
message.Content.Headers.TryAddWithoutValidation(headerName, headerValues);
}
}
Request.Content = new ByteArrayContent(data, index, length);
Request.Content.Headers.Add("content-type", contentType);
return Task.CompletedTask;
}
}
#nullable restore
class InternalHttpWebResponse : IHttpWebResponse
{
public InternalHttpWebResponse(HttpResponseMessage httpResponseMessage)
@@ -164,44 +119,61 @@ namespace BTCPayServer.Services.Rates
{
url = "/" + url;
}
string uri2 = (baseUrl ?? api.BaseUrl) + url;
if (method == null)
{
method = api.RequestMethod;
}
Uri uri = api.ProcessRequestUrl(new UriBuilder(uri2), payload, method);
InternalHttpWebRequest request = new InternalHttpWebRequest(uri)
{
Method = method
};
// prepare the request
string fullUrl = (baseUrl ?? api.BaseUrl) + url;
method ??= api.RequestMethod;
Uri uri = api.ProcessRequestUrl(new UriBuilder(fullUrl), payload, method);
InternalHttpWebRequest request = new InternalHttpWebRequest(method, uri);
request.AddHeader("accept-language", "en-US,en;q=0.5");
request.AddHeader("content-type", api.RequestContentType);
request.AddHeader("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36");
int num3 = request.Timeout = (request.ReadWriteTimeout = (int)api.RequestTimeout.TotalMilliseconds);
request.AddHeader("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36");
request.Timeout = (int)api.RequestTimeout.TotalMilliseconds;
await api.ProcessRequestAsync(request, payload);
// send the request
var response = request.Response;
string responseString;
using var cancel = new CancellationTokenSource(request.Timeout);
try
{
RequestStateChanged?.Invoke(this, RequestMakerState.Begin, uri.AbsoluteUri);
using var webHttpRequest = request.ToHttpRequestMessage();
using var webHttpResponse = await _httpClient.SendAsync(webHttpRequest, _cancellationToken);
string text = await webHttpResponse.Content.ReadAsStringAsync();
if (!webHttpResponse.IsSuccessStatusCode)
RequestStateChanged?.Invoke(this, RequestMakerState.Begin, uri.AbsoluteUri);// when start make a request we send the uri, this helps developers to track the http requests.
response = await _httpClient.SendAsync(request.Request, cancel.Token);
if (response == null)
{
if (string.IsNullOrWhiteSpace(text))
{
throw new APIException($"{webHttpResponse.StatusCode.ConvertInvariant<int>(0)} - {webHttpResponse.StatusCode}");
}
throw new APIException(text);
throw new APIException("Unknown response from server");
}
api.ProcessResponse(new InternalHttpWebResponse(webHttpResponse));
responseString = await response.Content.ReadAsStringAsync();
RequestStateChanged?.Invoke(this, RequestMakerState.Finished, text);
return text;
if (response.StatusCode != HttpStatusCode.OK && response.StatusCode != HttpStatusCode.Created)
{
// 404 maybe return empty responseString
if (string.IsNullOrWhiteSpace(responseString))
{
throw new APIException(string.Format("{0} - {1}", response.StatusCode.ConvertInvariant<int>(), response.StatusCode));
}
throw new APIException(responseString);
}
api.ProcessResponse(new InternalHttpWebResponse(response));
RequestStateChanged?.Invoke(this, RequestMakerState.Finished, responseString);
}
catch (Exception arg)
catch (OperationCanceledException ex) when (cancel.IsCancellationRequested)
{
RequestStateChanged?.Invoke(this, RequestMakerState.Error, arg);
RequestStateChanged?.Invoke(this, RequestMakerState.Error, ex);
throw new TimeoutException("APIRequest timeout", ex);
}
catch (Exception ex)
{
RequestStateChanged?.Invoke(this, RequestMakerState.Error, ex);
throw;
}
finally
{
response?.Dispose();
}
return responseString;
}
}
}