Skip to content

Instantly share code, notes, and snippets.

@shawnoster
Created February 15, 2012 02:13
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save shawnoster/1832559 to your computer and use it in GitHub Desktop.
Save shawnoster/1832559 to your computer and use it in GitHub Desktop.
An AgFx LoadRequest that uses RestSharp to make the actual request, supports passing in OAuth tokens
using System;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Text;
using AgFx;
using RestSharp;
using RestSharp.Authenticators;
namespace Librarian.AgFx
{
public class RestSharpLoadRequest : LoadRequest
{
private RestRequest _request;
private string _consumerKey;
private string _consumerSecret;
private string _accessToken;
private string _accessTokenSecret;
/// <summary>
/// The Uri to request
/// </summary>
public string Resource { get; private set; }
/// <summary>
/// Does the request require authentication. Returns true if all four
/// authentication properties are set to non-null, non-empty.
/// Otherwise false.
/// </summary>
public bool IsProtectedResource { get; private set; }
/// <summary>
/// The method to use.
/// </summary>
public Method Method
{
get
{
return _request.Method;
}
set
{
_request.Method = value;
}
}
/// <summary>
/// Create a RestSharpLoadRequest
/// </summary>
/// <param name="loadContext"></param>
/// <param name="resource"></param>
public RestSharpLoadRequest(LoadContext loadContext, string resource)
: base(loadContext)
{
Resource = resource;
CreateRestRequest();
}
/// <summary>
/// Create a RestSharpLoadRequest
/// </summary>
/// <param name="loadContext"></param>
/// <param name="resource">The URI to request</param>
/// <param name="consumerKey">The consumer key used to make the protected resource request</param>
/// <param name="consumerSecret">The consumer secret key used to make the protected resource request</param>
/// <param name="accessToken">The access token used to make the protected resource request</param>
/// <param name="accessTokenSecret">The access token secret to make the protected resource request</param>
public RestSharpLoadRequest(LoadContext loadContext, string resource, string consumerKey, string consumerSecret, string accessToken, string accessTokenSecret)
: this(loadContext, resource)
{
IsProtectedResource = true;
_consumerKey = consumerKey;
_consumerSecret = consumerSecret;
_accessToken = accessToken;
_accessTokenSecret = accessTokenSecret;
}
/// <summary>
/// Adds a parameter to the current request.
/// </summary>
/// <param name="name"></param>
/// <param name="value"></param>
public void AddParameter(string name, object value)
{
_request.AddParameter(name, value);
}
/// <summary>
/// override this to do things like setting headers and whatnot.
/// </summary>
/// <returns></returns>
protected virtual RestRequest CreateRestRequest()
{
Debug.Assert(Resource != null, "Null resource");
if (_request == null)
{
_request = new RestRequest(Resource);
}
return _request;
}
/// <summary>
/// Override this to take a closer look at the response, for example to look at the status code.
///
/// Default implementation looks for HttpResponse.StatusCode == 200.
/// </summary>
/// <param name="response"></param>
/// <returns></returns>
protected virtual bool IsGoodResponse(RestResponse response)
{
return response.StatusCode == HttpStatusCode.OK;
}
/// <summary>
/// Performs the actual HTTP get for this request.
/// </summary>
/// <param name="result"></param>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope")]
public override void Execute(Action<LoadRequestResult> result)
{
if (result == null)
{
throw new ArgumentNullException();
}
PriorityQueue.AddNetworkWorkItem(
() =>
{
var client = new RestClient
{
UserAgent = "AgFx"
};
if (IsProtectedResource)
{
client.Authenticator = OAuth1Authenticator.ForProtectedResource(_consumerKey, _consumerSecret, _accessToken, _accessTokenSecret);
}
client.ExecuteAsync(_request,
resp =>
{
if (IsGoodResponse(resp))
{
byte[] byteArray = Encoding.UTF8.GetBytes(resp.Content);
result(new LoadRequestResult(new MemoryStream(byteArray)));
}
else
{
result(new LoadRequestResult(new WebException("Bad web response, StatusCode=" + resp.StatusCode)));
}
return;
});
});
}
}
}
@shawnoster
Copy link
Author

I updated the gist to support an AddParameter() method as well some basic code cleanup.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment