Rewrite WebBrowser errors logic, again

Maybe THIS TIME after 7 years it'll finally do what I need from it.

TL;DR, if anybody is insane enough to return client/server errors, and expects HtmlDocument or other Object to actually be null, it must be explicitly specified now with allow, to work like 200-OK, where we return only stuff that actually parses
This commit is contained in:
JustArchi
2022-08-25 20:23:37 +02:00
parent f5d165493d
commit 019893ee43
2 changed files with 58 additions and 112 deletions

View File

@@ -173,7 +173,7 @@ public sealed class ArchiWebHandler : IDisposable {
await Task.Delay(rateLimitingDelay).ConfigureAwait(false);
}
response = await UrlGetToJsonObjectWithSession<InventoryResponse>(request, requestOptions: WebBrowser.ERequestOptions.ReturnServerErrors, rateLimitingDelay: rateLimitingDelay).ConfigureAwait(false);
response = await UrlGetToJsonObjectWithSession<InventoryResponse>(request, requestOptions: WebBrowser.ERequestOptions.ReturnServerErrors | WebBrowser.ERequestOptions.AllowInvalidBodyOnErrors, rateLimitingDelay: rateLimitingDelay).ConfigureAwait(false);
if (response == null) {
throw new HttpRequestException(string.Format(CultureInfo.CurrentCulture, Strings.ErrorObjectIsNull, nameof(response)));
@@ -427,7 +427,7 @@ public sealed class ArchiWebHandler : IDisposable {
ObjectResponse<TradeOfferSendResponse>? response = null;
for (byte i = 0; (i < WebBrowser.MaxTries) && (response == null); i++) {
response = await UrlPostToJsonObjectWithSession<TradeOfferSendResponse>(request, data: data, referer: referer, requestOptions: WebBrowser.ERequestOptions.ReturnServerErrors).ConfigureAwait(false);
response = await UrlPostToJsonObjectWithSession<TradeOfferSendResponse>(request, data: data, referer: referer, requestOptions: WebBrowser.ERequestOptions.ReturnServerErrors | WebBrowser.ERequestOptions.AllowInvalidBodyOnErrors).ConfigureAwait(false);
if (response == null) {
return (false, mobileTradeOfferIDs);
@@ -1292,7 +1292,7 @@ public sealed class ArchiWebHandler : IDisposable {
ObjectResponse<TradeOfferAcceptResponse>? response = null;
for (byte i = 0; (i < WebBrowser.MaxTries) && (response == null); i++) {
response = await UrlPostToJsonObjectWithSession<TradeOfferAcceptResponse>(request, data: data, referer: referer, requestOptions: WebBrowser.ERequestOptions.ReturnServerErrors).ConfigureAwait(false);
response = await UrlPostToJsonObjectWithSession<TradeOfferAcceptResponse>(request, data: data, referer: referer, requestOptions: WebBrowser.ERequestOptions.ReturnServerErrors | WebBrowser.ERequestOptions.AllowInvalidBodyOnErrors).ConfigureAwait(false);
if (response == null) {
return (false, false);
@@ -1329,7 +1329,7 @@ public sealed class ArchiWebHandler : IDisposable {
{ "ajax", "true" }
};
ObjectResponse<JToken>? response = await UrlPostToJsonObjectWithSession<JToken>(request, data: data, requestOptions: WebBrowser.ERequestOptions.ReturnClientErrors | WebBrowser.ERequestOptions.ReturnServerErrors).ConfigureAwait(false);
ObjectResponse<JToken>? response = await UrlPostToJsonObjectWithSession<JToken>(request, data: data, requestOptions: WebBrowser.ERequestOptions.ReturnClientErrors | WebBrowser.ERequestOptions.ReturnServerErrors | WebBrowser.ERequestOptions.AllowInvalidBodyOnErrors).ConfigureAwait(false);
if (response == null) {
return (EResult.Fail, EPurchaseResultDetail.Timeout);

View File

@@ -140,27 +140,21 @@ public sealed class WebBrowser : IDisposable {
await using (response.ConfigureAwait(false)) {
if (response.StatusCode.IsRedirectionCode()) {
if (requestOptions.HasFlag(ERequestOptions.ReturnRedirections)) {
return new BinaryResponse(response);
if (!requestOptions.HasFlag(ERequestOptions.ReturnRedirections)) {
break;
}
break;
}
if (response.StatusCode.IsClientErrorCode()) {
if (requestOptions.HasFlag(ERequestOptions.ReturnClientErrors)) {
return new BinaryResponse(response);
if (!requestOptions.HasFlag(ERequestOptions.ReturnClientErrors)) {
break;
}
break;
}
if (response.StatusCode.IsServerErrorCode()) {
if (requestOptions.HasFlag(ERequestOptions.ReturnServerErrors)) {
return new BinaryResponse(response);
if (!requestOptions.HasFlag(ERequestOptions.ReturnServerErrors)) {
continue;
}
continue;
}
if (response.Content == null) {
@@ -256,27 +250,21 @@ public sealed class WebBrowser : IDisposable {
await using (response.ConfigureAwait(false)) {
if (response.StatusCode.IsRedirectionCode()) {
if (requestOptions.HasFlag(ERequestOptions.ReturnRedirections)) {
return new HtmlDocumentResponse(response);
if (!requestOptions.HasFlag(ERequestOptions.ReturnRedirections)) {
break;
}
break;
}
if (response.StatusCode.IsClientErrorCode()) {
if (requestOptions.HasFlag(ERequestOptions.ReturnClientErrors)) {
return new HtmlDocumentResponse(response);
if (!requestOptions.HasFlag(ERequestOptions.ReturnClientErrors)) {
break;
}
break;
}
if (response.StatusCode.IsServerErrorCode()) {
if (requestOptions.HasFlag(ERequestOptions.ReturnServerErrors)) {
return new HtmlDocumentResponse(response);
if (!requestOptions.HasFlag(ERequestOptions.ReturnServerErrors)) {
continue;
}
continue;
}
if (response.Content == null) {
@@ -328,27 +316,21 @@ public sealed class WebBrowser : IDisposable {
await using (response.ConfigureAwait(false)) {
if (response.StatusCode.IsRedirectionCode()) {
if (requestOptions.HasFlag(ERequestOptions.ReturnRedirections)) {
return new ObjectResponse<T>(response);
if (!requestOptions.HasFlag(ERequestOptions.ReturnRedirections)) {
break;
}
break;
}
if (response.StatusCode.IsClientErrorCode()) {
if (requestOptions.HasFlag(ERequestOptions.ReturnClientErrors)) {
return new ObjectResponse<T>(response);
if (!requestOptions.HasFlag(ERequestOptions.ReturnClientErrors)) {
break;
}
break;
}
if (response.StatusCode.IsServerErrorCode()) {
if (requestOptions.HasFlag(ERequestOptions.ReturnServerErrors)) {
return new ObjectResponse<T>(response);
if (!requestOptions.HasFlag(ERequestOptions.ReturnServerErrors)) {
continue;
}
continue;
}
if (response.Content == null) {
@@ -420,27 +402,21 @@ public sealed class WebBrowser : IDisposable {
}
if (response.StatusCode.IsRedirectionCode()) {
if (requestOptions.HasFlag(ERequestOptions.ReturnRedirections)) {
return new StreamResponse(response);
if (!requestOptions.HasFlag(ERequestOptions.ReturnRedirections)) {
break;
}
break;
}
if (response.StatusCode.IsClientErrorCode()) {
if (requestOptions.HasFlag(ERequestOptions.ReturnClientErrors)) {
return new StreamResponse(response);
if (!requestOptions.HasFlag(ERequestOptions.ReturnClientErrors)) {
break;
}
break;
}
if (response.StatusCode.IsServerErrorCode()) {
if (requestOptions.HasFlag(ERequestOptions.ReturnServerErrors)) {
return new StreamResponse(response);
if (!requestOptions.HasFlag(ERequestOptions.ReturnServerErrors)) {
continue;
}
continue;
}
return new StreamResponse(response, await response.Content.ReadAsStreamAsync().ConfigureAwait(false));
@@ -476,27 +452,21 @@ public sealed class WebBrowser : IDisposable {
}
if (response.StatusCode.IsRedirectionCode()) {
if (requestOptions.HasFlag(ERequestOptions.ReturnRedirections)) {
return new BasicResponse(response);
if (!requestOptions.HasFlag(ERequestOptions.ReturnRedirections)) {
break;
}
break;
}
if (response.StatusCode.IsClientErrorCode()) {
if (requestOptions.HasFlag(ERequestOptions.ReturnClientErrors)) {
return new BasicResponse(response);
if (!requestOptions.HasFlag(ERequestOptions.ReturnClientErrors)) {
break;
}
break;
}
if (response.StatusCode.IsServerErrorCode()) {
if (requestOptions.HasFlag(ERequestOptions.ReturnServerErrors)) {
return new BasicResponse(response);
if (!requestOptions.HasFlag(ERequestOptions.ReturnServerErrors)) {
continue;
}
continue;
}
return new BasicResponse(response);
@@ -532,27 +502,21 @@ public sealed class WebBrowser : IDisposable {
}
if (response.StatusCode.IsRedirectionCode()) {
if (requestOptions.HasFlag(ERequestOptions.ReturnRedirections)) {
return new BasicResponse(response);
if (!requestOptions.HasFlag(ERequestOptions.ReturnRedirections)) {
break;
}
break;
}
if (response.StatusCode.IsClientErrorCode()) {
if (requestOptions.HasFlag(ERequestOptions.ReturnClientErrors)) {
return new BasicResponse(response);
if (!requestOptions.HasFlag(ERequestOptions.ReturnClientErrors)) {
break;
}
break;
}
if (response.StatusCode.IsServerErrorCode()) {
if (requestOptions.HasFlag(ERequestOptions.ReturnServerErrors)) {
return new BasicResponse(response);
if (!requestOptions.HasFlag(ERequestOptions.ReturnServerErrors)) {
continue;
}
continue;
}
return new BasicResponse(response);
@@ -590,27 +554,21 @@ public sealed class WebBrowser : IDisposable {
await using (response.ConfigureAwait(false)) {
if (response.StatusCode.IsRedirectionCode()) {
if (requestOptions.HasFlag(ERequestOptions.ReturnRedirections)) {
return new HtmlDocumentResponse(response);
if (!requestOptions.HasFlag(ERequestOptions.ReturnRedirections)) {
break;
}
break;
}
if (response.StatusCode.IsClientErrorCode()) {
if (requestOptions.HasFlag(ERequestOptions.ReturnClientErrors)) {
return new HtmlDocumentResponse(response);
if (!requestOptions.HasFlag(ERequestOptions.ReturnClientErrors)) {
break;
}
break;
}
if (response.StatusCode.IsServerErrorCode()) {
if (requestOptions.HasFlag(ERequestOptions.ReturnServerErrors)) {
return new HtmlDocumentResponse(response);
if (!requestOptions.HasFlag(ERequestOptions.ReturnServerErrors)) {
continue;
}
continue;
}
if (response.Content == null) {
@@ -662,27 +620,21 @@ public sealed class WebBrowser : IDisposable {
await using (response.ConfigureAwait(false)) {
if (response.StatusCode.IsRedirectionCode()) {
if (requestOptions.HasFlag(ERequestOptions.ReturnRedirections)) {
return new ObjectResponse<TResult>(response);
if (!requestOptions.HasFlag(ERequestOptions.ReturnRedirections)) {
break;
}
break;
}
if (response.StatusCode.IsClientErrorCode()) {
if (requestOptions.HasFlag(ERequestOptions.ReturnClientErrors)) {
return new ObjectResponse<TResult>(response);
if (!requestOptions.HasFlag(ERequestOptions.ReturnClientErrors)) {
break;
}
break;
}
if (response.StatusCode.IsServerErrorCode()) {
if (requestOptions.HasFlag(ERequestOptions.ReturnServerErrors)) {
return new ObjectResponse<TResult>(response);
if (!requestOptions.HasFlag(ERequestOptions.ReturnServerErrors)) {
continue;
}
continue;
}
if (response.Content == null) {
@@ -754,27 +706,21 @@ public sealed class WebBrowser : IDisposable {
}
if (response.StatusCode.IsRedirectionCode()) {
if (requestOptions.HasFlag(ERequestOptions.ReturnRedirections)) {
return new StreamResponse(response);
if (!requestOptions.HasFlag(ERequestOptions.ReturnRedirections)) {
break;
}
break;
}
if (response.StatusCode.IsClientErrorCode()) {
if (requestOptions.HasFlag(ERequestOptions.ReturnClientErrors)) {
return new StreamResponse(response);
if (!requestOptions.HasFlag(ERequestOptions.ReturnClientErrors)) {
break;
}
break;
}
if (response.StatusCode.IsServerErrorCode()) {
if (requestOptions.HasFlag(ERequestOptions.ReturnServerErrors)) {
return new StreamResponse(response);
if (!requestOptions.HasFlag(ERequestOptions.ReturnServerErrors)) {
continue;
}
continue;
}
return new StreamResponse(response, await response.Content.ReadAsStreamAsync().ConfigureAwait(false));