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 diff --git a/src/DevDefined.OAuth/Consumer/ConsumerRequest.cs b/src/DevDefined.OAuth/Consumer/ConsumerRequest.cs index 1253905..c9889b5 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; @@ -102,31 +104,35 @@ public virtual HttpWebRequest ToWebRequest() request.Proxy = new WebProxy(ProxyServerUri, false); } - if (description.ContentType == Parameters.HttpFormEncoded) + if (description.Headers.Count > 0) { - request.ContentType = description.ContentType; + foreach (string key in description.Headers.AllKeys) + { + request.Headers[key] = description.Headers[key]; + } + } - using (var writer = new StreamWriter(request.GetRequestStream())) - { - writer.Write(description.Body); - } + if (description.ContentType == Parameters.HttpFormEncoded) + { + 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; } @@ -145,7 +151,7 @@ public RequestDescription GetRequestDescription() } Uri uri = _context.GenerateUri(); - + var description = new RequestDescription { Url = uri, @@ -159,7 +165,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) @@ -234,7 +247,7 @@ public IConsumerRequest SignWithToken(IToken token) ConsumerContext.SignContextWithToken(_context, token); return this; } - + public Uri ProxyServerUri { get; set; } public Action ResponseBodyAction { get; set; } @@ -243,6 +256,8 @@ public IConsumerRequest SignWithToken(IToken token) public string RequestBody { get; set; } + public List> HttpWebRequestAlterations { 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..0781db5 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; @@ -122,6 +123,18 @@ public static IConsumerRequest WithHeaders(this IConsumerRequest request, object return request; } + public static IConsumerRequest AlterHttpWebRequest(this IConsumerRequest request, Action alteration) + { + if (request.HttpWebRequestAlterations == null) + { + request.HttpWebRequestAlterations = new List>(); + } + + request.HttpWebRequestAlterations.Add(alteration); + + 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 294953e..0c1dfbf 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; @@ -23,5 +24,7 @@ public interface IConsumerRequest Action ResponseBodyAction { get; set; } string AcceptsType { get; set; } string RequestBody { get; set; } + List> HttpWebRequestAlterations { 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 f90ba54..5424637 100644 --- a/src/DevDefined.OAuth/DevDefined.OAuth.csproj +++ b/src/DevDefined.OAuth/DevDefined.OAuth.csproj @@ -1,5 +1,5 @@  - + Debug AnyCPU @@ -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 + @@ -183,4 +200,7 @@ --> + + copy "$(TargetPath)" "$(SolutionDir)\clients\DotNet\ThirdParty\DevDefined\" + \ No newline at end of file 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 { 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++) {