From b5907660dfcff778732f426892088c1394d44274 Mon Sep 17 00:00:00 2001 From: Mikael Hagerbro Date: Mon, 20 Sep 2010 14:10:34 +0200 Subject: [PATCH 1/7] Implemented the possibility to add actions to modify the properties of the HttpWebRequest created in ConsumerRequest. --- src/DevDefined.OAuth/Consumer/ConsumerRequest.cs | 13 +++++++++++++ src/DevDefined.OAuth/Consumer/IConsumerRequest.cs | 1 + 2 files changed, 14 insertions(+) diff --git a/src/DevDefined.OAuth/Consumer/ConsumerRequest.cs b/src/DevDefined.OAuth/Consumer/ConsumerRequest.cs index 1253905..24c19d8 100644 --- a/src/DevDefined.OAuth/Consumer/ConsumerRequest.cs +++ b/src/DevDefined.OAuth/Consumer/ConsumerRequest.cs @@ -25,9 +25,11 @@ #endregion using System; +using System.Collections.Generic; using System.Collections.Specialized; using System.Globalization; using System.IO; +using System.Linq; using System.Net; using System.Web; using System.Xml.Linq; @@ -41,6 +43,7 @@ public class ConsumerRequest : IConsumerRequest readonly IOAuthConsumerContext _consumerContext; readonly IOAuthContext _context; readonly IToken _token; + readonly List> httpWebRequestPropertyActions = new List>(); public ConsumerRequest(IOAuthContext context, IOAuthConsumerContext consumerContext, IToken token) { @@ -79,6 +82,8 @@ public virtual HttpWebRequest ToWebRequest() request.Method = description.Method; request.UserAgent = _consumerContext.UserAgent; + httpWebRequestPropertyActions.ForEach(action => action(request)); + if (!string.IsNullOrEmpty(AcceptsType)) { request.Accept = AcceptsType; @@ -234,6 +239,14 @@ public IConsumerRequest SignWithToken(IToken token) ConsumerContext.SignContextWithToken(_context, token); return this; } + + public IConsumerRequest WithWebRequestPropertyAction(Action action) + { + if (action == null) return this; + + httpWebRequestPropertyActions.Add(action); + return this; + } public Uri ProxyServerUri { get; set; } diff --git a/src/DevDefined.OAuth/Consumer/IConsumerRequest.cs b/src/DevDefined.OAuth/Consumer/IConsumerRequest.cs index 294953e..6651a57 100644 --- a/src/DevDefined.OAuth/Consumer/IConsumerRequest.cs +++ b/src/DevDefined.OAuth/Consumer/IConsumerRequest.cs @@ -18,6 +18,7 @@ public interface IConsumerRequest IConsumerRequest SignWithoutToken(); IConsumerRequest SignWithToken(); IConsumerRequest SignWithToken(IToken token); + IConsumerRequest WithWebRequestPropertyAction(Action action); Uri ProxyServerUri { get; set; } Action ResponseBodyAction { get; set; } From 82a0dbe0121c2d5ca02d0e860d666453d95405b6 Mon Sep 17 00:00:00 2001 From: Mikael Hagerbro Date: Mon, 20 Sep 2010 14:10:55 +0200 Subject: [PATCH 2/7] Fixed EscapeUriDataStringRfc3986 in UriUtility so it can handle long strings --- src/DevDefined.OAuth/Framework/UriUtility.cs | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/DevDefined.OAuth/Framework/UriUtility.cs b/src/DevDefined.OAuth/Framework/UriUtility.cs index 50d122d..94bce0b 100644 --- a/src/DevDefined.OAuth/Framework/UriUtility.cs +++ b/src/DevDefined.OAuth/Framework/UriUtility.cs @@ -50,7 +50,20 @@ static UriUtility() // see http://stackoverflow.com/questions/846487/how-to-get-uri-escapedatastring-to-comply-with-rfc-3986 for details static string EscapeUriDataStringRfc3986(string value) { - var escaped = new StringBuilder(Uri.EscapeDataString(value)); + const int maxLengthOfEscapeDataString = 32766; + + var escaped = new StringBuilder(); + + for(int i = 0; i < value.Length; i += maxLengthOfEscapeDataString) + { + int subStringLength = maxLengthOfEscapeDataString; + if (i + subStringLength > value.Length) + { + subStringLength = value.Length - i; + } + + escaped.Append(Uri.EscapeDataString(value.Substring(i, subStringLength))); + } for (int i = 0; i < UriRfc3986CharsToEscape.Length; i++) { From a9795d23df64c34499132c7c43164ac8ce72e995 Mon Sep 17 00:00:00 2001 From: Mikael Hagerbro Date: Mon, 20 Sep 2010 14:11:14 +0200 Subject: [PATCH 3/7] Added *.svn to the .gitignore so the lib can co-exists in our subversion repository --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 6d5d6f5..ed9647a 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,5 @@ release/ *.user *.cache -/src/GlobalAssemblyInfo.cs \ No newline at end of file +/src/GlobalAssemblyInfo.cs +*.svn \ No newline at end of file From f2917393989ba4d4841ab20d71183f76e3643049 Mon Sep 17 00:00:00 2001 From: Mikael Hagerbro Date: Mon, 20 Sep 2010 14:11:28 +0200 Subject: [PATCH 4/7] Changed project ToolsVersion to 3.5 in DevDefined.OAuth.csproj for compatibility with vs 2008 --- src/DevDefined.OAuth/DevDefined.OAuth.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/DevDefined.OAuth/DevDefined.OAuth.csproj b/src/DevDefined.OAuth/DevDefined.OAuth.csproj index f90ba54..2ddd149 100644 --- a/src/DevDefined.OAuth/DevDefined.OAuth.csproj +++ b/src/DevDefined.OAuth/DevDefined.OAuth.csproj @@ -1,5 +1,5 @@  - + Debug AnyCPU From c62aacbe1f0342c68d1e626ef85cd393d8a549a2 Mon Sep 17 00:00:00 2001 From: Mikael Hagerbro Date: Fri, 1 Oct 2010 10:54:51 +0200 Subject: [PATCH 5/7] Refactoring http properties actions post and put json support --- .../Consumer/ConsumerRequest.cs | 29 ++++++++++--------- .../Consumer/ConsumerRequestExtensions.cs | 17 +++++++++++ .../Consumer/IConsumerRequest.cs | 4 ++- .../Consumer/IOAuthConsumerContext.cs | 1 + .../Consumer/OAuthConsumerContext.cs | 3 +- src/DevDefined.OAuth/DevDefined.OAuth.csproj | 17 +++++++++++ .../Framework/BoundParameter.cs | 2 +- .../Framework/IOAuthContext.cs | 1 + .../Framework/OAuthContext.cs | 1 + 9 files changed, 59 insertions(+), 16 deletions(-) diff --git a/src/DevDefined.OAuth/Consumer/ConsumerRequest.cs b/src/DevDefined.OAuth/Consumer/ConsumerRequest.cs index 24c19d8..09f3239 100644 --- a/src/DevDefined.OAuth/Consumer/ConsumerRequest.cs +++ b/src/DevDefined.OAuth/Consumer/ConsumerRequest.cs @@ -43,7 +43,6 @@ public class ConsumerRequest : IConsumerRequest readonly IOAuthConsumerContext _consumerContext; readonly IOAuthContext _context; readonly IToken _token; - readonly List> httpWebRequestPropertyActions = new List>(); public ConsumerRequest(IOAuthContext context, IOAuthConsumerContext consumerContext, IToken token) { @@ -82,8 +81,6 @@ public virtual HttpWebRequest ToWebRequest() request.Method = description.Method; request.UserAgent = _consumerContext.UserAgent; - httpWebRequestPropertyActions.ForEach(action => action(request)); - if (!string.IsNullOrEmpty(AcceptsType)) { request.Accept = AcceptsType; @@ -102,6 +99,11 @@ public virtual HttpWebRequest ToWebRequest() throw new ApplicationException("If-Modified-Since header could not be parsed as a datetime", ex); } + if (HttpWebRequestPropertyActions != null) + { + HttpWebRequestPropertyActions.ForEach(action => action(request)); + } + if (ProxyServerUri != null) { request.Proxy = new WebProxy(ProxyServerUri, false); @@ -150,7 +152,7 @@ public RequestDescription GetRequestDescription() } Uri uri = _context.GenerateUri(); - + var description = new RequestDescription { Url = uri, @@ -164,7 +166,14 @@ public RequestDescription GetRequestDescription() } else if (!string.IsNullOrEmpty(RequestBody)) { - description.Body = UriUtility.UrlEncode(RequestBody); + if(_consumerContext.EncodeRequestBody) + { + description.Body = UriUtility.UrlEncode(RequestBody); + } + else + { + description.Body = RequestBody; + } } if (_consumerContext.UseHeaderForOAuthParameters) @@ -240,14 +249,6 @@ public IConsumerRequest SignWithToken(IToken token) return this; } - public IConsumerRequest WithWebRequestPropertyAction(Action action) - { - if (action == null) return this; - - httpWebRequestPropertyActions.Add(action); - return this; - } - public Uri ProxyServerUri { get; set; } public Action ResponseBodyAction { get; set; } @@ -256,6 +257,8 @@ public IConsumerRequest WithWebRequestPropertyAction(Action acti public string RequestBody { get; set; } + public List> HttpWebRequestPropertyActions { get; set; } + private string ResponseBody { get; set; } public override string ToString() diff --git a/src/DevDefined.OAuth/Consumer/ConsumerRequestExtensions.cs b/src/DevDefined.OAuth/Consumer/ConsumerRequestExtensions.cs index 525cd96..880ec94 100644 --- a/src/DevDefined.OAuth/Consumer/ConsumerRequestExtensions.cs +++ b/src/DevDefined.OAuth/Consumer/ConsumerRequestExtensions.cs @@ -1,5 +1,6 @@ using System; using System.Collections; +using System.Collections.Generic; using System.Collections.Specialized; using System.Net; using DevDefined.OAuth.Framework; @@ -43,7 +44,12 @@ static void ApplyParameters(NameValueCollection destination, IDictionary additio destination[parameter] = Convert.ToString(additions[parameter]); } } + public static IConsumerRequest WithOAuthInQueryString(this IConsumerRequest request) + { + request.Context.UseQueryParametersForOAuth = true; + return request; + } public static IConsumerRequest ForMethod(this IConsumerRequest request, string method) { request.Context.RequestMethod = method; @@ -122,6 +128,17 @@ public static IConsumerRequest WithHeaders(this IConsumerRequest request, object return request; } + public static IConsumerRequest WithWebRequestPropertyAction(this IConsumerRequest request, Action action) + { + if (request.HttpWebRequestPropertyActions == null) + { + request.HttpWebRequestPropertyActions = new List>(); + } + request.HttpWebRequestPropertyActions.Add(action); + + return request; + } + public static IConsumerRequest AlterContext(this IConsumerRequest request, Action alteration) { alteration(request.Context); diff --git a/src/DevDefined.OAuth/Consumer/IConsumerRequest.cs b/src/DevDefined.OAuth/Consumer/IConsumerRequest.cs index 6651a57..177f40c 100644 --- a/src/DevDefined.OAuth/Consumer/IConsumerRequest.cs +++ b/src/DevDefined.OAuth/Consumer/IConsumerRequest.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Collections.Specialized; using System.Net; using System.Xml.Linq; @@ -18,11 +19,12 @@ public interface IConsumerRequest IConsumerRequest SignWithoutToken(); IConsumerRequest SignWithToken(); IConsumerRequest SignWithToken(IToken token); - IConsumerRequest WithWebRequestPropertyAction(Action action); Uri ProxyServerUri { get; set; } Action ResponseBodyAction { get; set; } string AcceptsType { get; set; } string RequestBody { get; set; } + List> HttpWebRequestPropertyActions { get; set; } + } } \ No newline at end of file diff --git a/src/DevDefined.OAuth/Consumer/IOAuthConsumerContext.cs b/src/DevDefined.OAuth/Consumer/IOAuthConsumerContext.cs index dd029a5..739cb3b 100644 --- a/src/DevDefined.OAuth/Consumer/IOAuthConsumerContext.cs +++ b/src/DevDefined.OAuth/Consumer/IOAuthConsumerContext.cs @@ -42,6 +42,7 @@ public interface IOAuthConsumerContext string UserAgent { get; set; } AsymmetricAlgorithm Key { get; set; } bool UseHeaderForOAuthParameters { get; set; } + bool EncodeRequestBody { get; set; } void SignContext(IOAuthContext context); void SignContextWithToken(IOAuthContext context, IToken token); } diff --git a/src/DevDefined.OAuth/Consumer/OAuthConsumerContext.cs b/src/DevDefined.OAuth/Consumer/OAuthConsumerContext.cs index 2a28847..fde5eee 100644 --- a/src/DevDefined.OAuth/Consumer/OAuthConsumerContext.cs +++ b/src/DevDefined.OAuth/Consumer/OAuthConsumerContext.cs @@ -61,7 +61,8 @@ public INonceGenerator NonceGenerator public AsymmetricAlgorithm Key { get; set; } public bool UseHeaderForOAuthParameters { get; set; } public string UserAgent { get; set; } - + public bool EncodeRequestBody { get; set; } + public void SignContext(IOAuthContext context) { EnsureStateIsValid(); diff --git a/src/DevDefined.OAuth/DevDefined.OAuth.csproj b/src/DevDefined.OAuth/DevDefined.OAuth.csproj index 2ddd149..bba4681 100644 --- a/src/DevDefined.OAuth/DevDefined.OAuth.csproj +++ b/src/DevDefined.OAuth/DevDefined.OAuth.csproj @@ -54,6 +54,23 @@ 4 AllRules.ruleset + + true + bin\x86\Debug\ + DEBUG;TRACE + true + full + x86 + prompt + + + bin\x86\Release\ + TRACE + true + pdbonly + x86 + prompt + diff --git a/src/DevDefined.OAuth/Framework/BoundParameter.cs b/src/DevDefined.OAuth/Framework/BoundParameter.cs index 424ed44..0a5781b 100644 --- a/src/DevDefined.OAuth/Framework/BoundParameter.cs +++ b/src/DevDefined.OAuth/Framework/BoundParameter.cs @@ -61,7 +61,7 @@ NameValueCollection Collection if (_context.UseAuthorizationHeader) return _context.AuthorizationHeaderParameters; - if (_context.RequestMethod == "GET") + if (_context.RequestMethod == "GET" || _context.UseQueryParametersForOAuth) return _context.QueryParameters; return _context.FormEncodedParameters; diff --git a/src/DevDefined.OAuth/Framework/IOAuthContext.cs b/src/DevDefined.OAuth/Framework/IOAuthContext.cs index db8c23b..bff2124 100644 --- a/src/DevDefined.OAuth/Framework/IOAuthContext.cs +++ b/src/DevDefined.OAuth/Framework/IOAuthContext.cs @@ -24,6 +24,7 @@ public interface IOAuthContext : IToken string Verifier { get; set; } bool UseAuthorizationHeader { get; set; } + bool UseQueryParametersForOAuth { get; set; } Uri GenerateUri(); string GenerateUrl(); diff --git a/src/DevDefined.OAuth/Framework/OAuthContext.cs b/src/DevDefined.OAuth/Framework/OAuthContext.cs index aca788d..3005cae 100644 --- a/src/DevDefined.OAuth/Framework/OAuthContext.cs +++ b/src/DevDefined.OAuth/Framework/OAuthContext.cs @@ -202,6 +202,7 @@ public string Version } public bool UseAuthorizationHeader { get; set; } + public bool UseQueryParametersForOAuth { get; set; } public string Realm { From 80ce3253334643a2415c7eb85ca0fefcf8f3ec1b Mon Sep 17 00:00:00 2001 From: Mikael Hagerbro Date: Mon, 4 Oct 2010 13:15:04 +0200 Subject: [PATCH 6/7] some name refactoring to match the original design better --- src/DevDefined.OAuth/Consumer/ConsumerRequest.cs | 6 +++--- .../Consumer/ConsumerRequestExtensions.cs | 14 +++++--------- src/DevDefined.OAuth/Consumer/IConsumerRequest.cs | 2 +- 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/src/DevDefined.OAuth/Consumer/ConsumerRequest.cs b/src/DevDefined.OAuth/Consumer/ConsumerRequest.cs index 09f3239..ae6516c 100644 --- a/src/DevDefined.OAuth/Consumer/ConsumerRequest.cs +++ b/src/DevDefined.OAuth/Consumer/ConsumerRequest.cs @@ -99,9 +99,9 @@ public virtual HttpWebRequest ToWebRequest() throw new ApplicationException("If-Modified-Since header could not be parsed as a datetime", ex); } - if (HttpWebRequestPropertyActions != null) + if (HttpWebRequestAlterations != null) { - HttpWebRequestPropertyActions.ForEach(action => action(request)); + HttpWebRequestAlterations.ForEach(action => action(request)); } if (ProxyServerUri != null) @@ -257,7 +257,7 @@ public IConsumerRequest SignWithToken(IToken token) public string RequestBody { get; set; } - public List> HttpWebRequestPropertyActions { get; set; } + public List> HttpWebRequestAlterations { get; set; } private string ResponseBody { get; set; } diff --git a/src/DevDefined.OAuth/Consumer/ConsumerRequestExtensions.cs b/src/DevDefined.OAuth/Consumer/ConsumerRequestExtensions.cs index 880ec94..0781db5 100644 --- a/src/DevDefined.OAuth/Consumer/ConsumerRequestExtensions.cs +++ b/src/DevDefined.OAuth/Consumer/ConsumerRequestExtensions.cs @@ -44,12 +44,7 @@ static void ApplyParameters(NameValueCollection destination, IDictionary additio destination[parameter] = Convert.ToString(additions[parameter]); } } - public static IConsumerRequest WithOAuthInQueryString(this IConsumerRequest request) - { - request.Context.UseQueryParametersForOAuth = true; - return request; - } public static IConsumerRequest ForMethod(this IConsumerRequest request, string method) { request.Context.RequestMethod = method; @@ -128,13 +123,14 @@ public static IConsumerRequest WithHeaders(this IConsumerRequest request, object return request; } - public static IConsumerRequest WithWebRequestPropertyAction(this IConsumerRequest request, Action action) + public static IConsumerRequest AlterHttpWebRequest(this IConsumerRequest request, Action alteration) { - if (request.HttpWebRequestPropertyActions == null) + if (request.HttpWebRequestAlterations == null) { - request.HttpWebRequestPropertyActions = new List>(); + request.HttpWebRequestAlterations = new List>(); } - request.HttpWebRequestPropertyActions.Add(action); + + request.HttpWebRequestAlterations.Add(alteration); return request; } diff --git a/src/DevDefined.OAuth/Consumer/IConsumerRequest.cs b/src/DevDefined.OAuth/Consumer/IConsumerRequest.cs index 177f40c..0c1dfbf 100644 --- a/src/DevDefined.OAuth/Consumer/IConsumerRequest.cs +++ b/src/DevDefined.OAuth/Consumer/IConsumerRequest.cs @@ -24,7 +24,7 @@ public interface IConsumerRequest Action ResponseBodyAction { get; set; } string AcceptsType { get; set; } string RequestBody { get; set; } - List> HttpWebRequestPropertyActions { get; set; } + List> HttpWebRequestAlterations { get; set; } } } \ No newline at end of file From ed24c013524784d3351a00f74c66a88f37d00bf2 Mon Sep 17 00:00:00 2001 From: Mikael Hagerbro Date: Mon, 11 Oct 2010 13:07:38 +0200 Subject: [PATCH 7/7] http web request alteration refactoring --- .../Consumer/ConsumerRequest.cs | 35 +++++++++---------- src/DevDefined.OAuth/DevDefined.OAuth.csproj | 3 ++ 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/src/DevDefined.OAuth/Consumer/ConsumerRequest.cs b/src/DevDefined.OAuth/Consumer/ConsumerRequest.cs index ae6516c..c9889b5 100644 --- a/src/DevDefined.OAuth/Consumer/ConsumerRequest.cs +++ b/src/DevDefined.OAuth/Consumer/ConsumerRequest.cs @@ -99,41 +99,40 @@ public virtual HttpWebRequest ToWebRequest() throw new ApplicationException("If-Modified-Since header could not be parsed as a datetime", ex); } - if (HttpWebRequestAlterations != null) + if (ProxyServerUri != null) { - HttpWebRequestAlterations.ForEach(action => action(request)); + request.Proxy = new WebProxy(ProxyServerUri, false); } - if (ProxyServerUri != null) + if (description.Headers.Count > 0) { - request.Proxy = new WebProxy(ProxyServerUri, false); + foreach (string key in description.Headers.AllKeys) + { + request.Headers[key] = description.Headers[key]; + } } if (description.ContentType == Parameters.HttpFormEncoded) { - request.ContentType = description.ContentType; - - using (var writer = new StreamWriter(request.GetRequestStream())) - { - writer.Write(description.Body); - } + request.ContentType = description.ContentType; } - else if (!string.IsNullOrEmpty(description.Body)) + + // We want to do the alterations last of all but before GetRequestStream() when + // it will be to late for the modifications + if (HttpWebRequestAlterations != null) { - using (var writer = new StreamWriter(request.GetRequestStream())) - { - writer.Write(description.Body); - } + HttpWebRequestAlterations.ForEach(action => action(request)); } - if (description.Headers.Count > 0) + if (description.ContentType == Parameters.HttpFormEncoded || !string.IsNullOrEmpty(description.Body)) { - foreach (string key in description.Headers.AllKeys) + using (var writer = new StreamWriter(request.GetRequestStream())) { - request.Headers[key] = description.Headers[key]; + writer.Write(description.Body); } } + return request; } diff --git a/src/DevDefined.OAuth/DevDefined.OAuth.csproj b/src/DevDefined.OAuth/DevDefined.OAuth.csproj index bba4681..5424637 100644 --- a/src/DevDefined.OAuth/DevDefined.OAuth.csproj +++ b/src/DevDefined.OAuth/DevDefined.OAuth.csproj @@ -200,4 +200,7 @@ --> + + copy "$(TargetPath)" "$(SolutionDir)\clients\DotNet\ThirdParty\DevDefined\" + \ No newline at end of file