Skip to content

Commit

Permalink
[add-revrec-general-ledger-accounts-feature]
Browse files Browse the repository at this point in the history
  • Loading branch information
Smolations committed Jan 23, 2024
1 parent 56511d0 commit 57f945b
Show file tree
Hide file tree
Showing 11 changed files with 477 additions and 70 deletions.
158 changes: 90 additions & 68 deletions Library/Client.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using System;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Runtime.CompilerServices;
Expand Down Expand Up @@ -128,55 +127,27 @@ public HttpStatusCode PerformRequest(HttpRequestMethod method, string urlPath,
}

protected virtual HttpStatusCode PerformRequest(HttpRequestMethod method, string urlPath,
WriteXmlDelegate writeXmlDelegate, ReadXmlDelegate readXmlDelegate, ReadXmlListDelegate readXmlListDelegate, ReadResponseDelegate reseponseDelegate)
WriteXmlDelegate writeXmlDelegate, ReadXmlDelegate readXmlDelegate, ReadXmlListDelegate readXmlListDelegate, ReadResponseDelegate responseDelegate)
{
const int sixtySeconds = 60000;
var url = Settings.GetServerUri(urlPath);
#if (DEBUG)
Console.WriteLine("Requesting " + method + " " + url);
#endif
var request = (HttpWebRequest)WebRequest.Create(url);

if (!request.RequestUri.Host.EndsWith(Settings.ValidDomain))
{
throw new RecurlyException("Domain " + request.RequestUri.Host + " is not a valid Recurly domain");
}

request.Accept = "application/xml"; // Tells the server to return XML instead of HTML
request.ContentType = "application/xml; charset=utf-8"; // The request is an XML document
request.SendChunked = false; // Send it all as one request
request.UserAgent = Settings.UserAgent;
request.Headers.Add(HttpRequestHeader.Authorization, Settings.AuthorizationHeaderValue);
request.Headers.Add("X-Api-Version", Settings.RecurlyApiVersion);
request.Method = method.ToString().ToUpper();
request.Timeout = Settings.RequestTimeoutMilliseconds ?? request.Timeout;
ValidateDomain(request);
AddRequestMetadata(request, method);

Console.WriteLine(String.Format("Recurly: Requesting {0} {1}", request.Method, request.RequestUri));

if ((method == HttpRequestMethod.Post || method == HttpRequestMethod.Put) && (writeXmlDelegate != null))
{
// 60 second timeout -- some payment gateways (e.g. PayPal) can take a while to respond
request.Timeout = Settings.RequestTimeoutMilliseconds.HasValue ? request.Timeout : sixtySeconds;

// Write POST/PUT body
using (var requestStream = request.GetRequestStream())
{
WritePostParameters(requestStream, writeXmlDelegate);
}
}
else
{
request.ContentLength = 0;
}
WriteRequestParameters(request, method, writeXmlDelegate);

try
{
using (var response = (HttpWebResponse)request.GetResponse())
{

ReadWebResponse(response, readXmlDelegate, readXmlListDelegate, reseponseDelegate);
ReadWebResponse(response, readXmlDelegate, readXmlListDelegate, responseDelegate);
return response.StatusCode;

}
}
catch (WebException ex)
Expand All @@ -185,50 +156,22 @@ protected virtual HttpStatusCode PerformRequest(HttpRequestMethod method, string

var response = (HttpWebResponse)ex.Response;
var statusCode = response.StatusCode;
Errors errors;

Console.WriteLine(String.Format("Recurly Library Received: {0} - {1}", (int)statusCode, statusCode));

switch (response.StatusCode)
switch (statusCode)
{
case HttpStatusCode.OK:
case HttpStatusCode.Accepted:
case HttpStatusCode.Created:
case HttpStatusCode.NoContent:
ReadWebResponse(response, readXmlDelegate, readXmlListDelegate, reseponseDelegate);
ReadWebResponse(response, readXmlDelegate, readXmlListDelegate, responseDelegate);

return HttpStatusCode.NoContent;

case HttpStatusCode.NotFound:
errors = Errors.ReadResponseAndParseErrors(response);
if (errors.ValidationErrors.HasAny())
throw new NotFoundException(errors.ValidationErrors[0].Message, errors);
throw new NotFoundException("The requested object was not found.", errors);

case HttpStatusCode.Unauthorized:
case HttpStatusCode.Forbidden:
errors = Errors.ReadResponseAndParseErrors(response);
throw new InvalidCredentialsException(errors);

case HttpStatusCode.BadRequest:
case HttpStatusCode.PreconditionFailed:
errors = Errors.ReadResponseAndParseErrors(response);
throw new ValidationException(errors);

case HttpStatusCode.ServiceUnavailable:
throw new TemporarilyUnavailableException();

case HttpStatusCode.InternalServerError:
errors = Errors.ReadResponseAndParseErrors(response);
throw new ServerException(errors);
}

if ((int)statusCode == ValidationException.HttpStatusCode) // Unprocessable Entity
{
errors = Errors.ReadResponseAndParseErrors(response);
if (errors.ValidationErrors.HasAny()) Console.WriteLine(errors.ValidationErrors[0].ToString());
else Console.WriteLine("Client Error: " + response.ToString());
throw new ValidationException(errors);
default:
ProcessErrorResponse(response);
break;
}

throw;
Expand Down Expand Up @@ -415,7 +358,6 @@ protected virtual void WritePostParameters(Stream outputStream, WriteXmlDelegate
}
Console.WriteLine(Encoding.UTF8.GetString(s.ToArray()));
#endif

}

protected virtual MemoryStream CopyAndClose(Stream inputStream)
Expand All @@ -435,5 +377,85 @@ protected virtual MemoryStream CopyAndClose(Stream inputStream)
return ms;
}

private void ValidateDomain(HttpWebRequest request)
{
if (!request.RequestUri.Host.EndsWith(Settings.ValidDomain))
{
throw new RecurlyException("Domain " + request.RequestUri.Host + " is not a valid Recurly domain");
}
}

private void AddRequestMetadata(HttpWebRequest request, HttpRequestMethod method)
{
request.Accept = "application/xml"; // Tells the server to return XML instead of HTML
request.ContentType = "application/xml; charset=utf-8"; // The request is an XML document
request.SendChunked = false; // Send it all as one request
request.UserAgent = Settings.UserAgent;
request.Headers.Add(HttpRequestHeader.Authorization, Settings.AuthorizationHeaderValue);
request.Headers.Add("X-Api-Version", Settings.RecurlyApiVersion);
request.Method = method.ToString().ToUpper();
request.Timeout = Settings.RequestTimeoutMilliseconds ?? request.Timeout;
}

private void WriteRequestParameters(HttpWebRequest request,
HttpRequestMethod method,
WriteXmlDelegate writeXmlDelegate)
{
if ((method == HttpRequestMethod.Post || method == HttpRequestMethod.Put) && (writeXmlDelegate != null))
{
// 60 second timeout -- some payment gateways (e.g. PayPal) can take a while to respond
request.Timeout = Settings.RequestTimeoutMilliseconds.HasValue ? request.Timeout : 60000;

// Write POST/PUT body
using (var requestStream = request.GetRequestStream())
{
WritePostParameters(requestStream, writeXmlDelegate);
}
}
else
{
request.ContentLength = 0;
}
}

private void ProcessErrorResponse(HttpWebResponse response)
{
var statusCode = response.StatusCode;
Errors errors;

switch (statusCode)
{
case HttpStatusCode.NotFound:
errors = Errors.ReadResponseAndParseErrors(response);
if (errors.ValidationErrors.HasAny())
throw new NotFoundException(errors.ValidationErrors[0].Message, errors);
throw new NotFoundException("The requested object was not found.", errors);

case HttpStatusCode.Unauthorized:
case HttpStatusCode.Forbidden:
errors = Errors.ReadResponseAndParseErrors(response);
throw new InvalidCredentialsException(errors);

case HttpStatusCode.BadRequest:
case HttpStatusCode.PreconditionFailed:
errors = Errors.ReadResponseAndParseErrors(response);
throw new ValidationException(errors);

case HttpStatusCode.ServiceUnavailable:
throw new TemporarilyUnavailableException();

case HttpStatusCode.InternalServerError:
errors = Errors.ReadResponseAndParseErrors(response);
throw new ServerException(errors);
}

if ((int)statusCode == ValidationException.HttpStatusCode) // Unprocessable Entity
{
errors = Errors.ReadResponseAndParseErrors(response);
if (errors.ValidationErrors.HasAny()) Console.WriteLine(errors.ValidationErrors[0].ToString());
else Console.WriteLine("Client Error: " + response.ToString());
throw new ValidationException(errors);
}
}
}
}
3 changes: 1 addition & 2 deletions Library/Errors.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using System;
using System.Collections.Generic;
using System.Collections.Generic;
using System.Net;
using System.Xml;

Expand Down
Loading

0 comments on commit 57f945b

Please sign in to comment.