Added hammock project to debug streaming issues
[pithos-ms-client] / trunk / hammock / src / net35 / Hammock / Extensions / WebExtensions.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Reflection;
4 using System.Text;
5 using Hammock.Attributes;
6 using Hammock.Attributes.Validation;
7 using Hammock.Web;
8
9 namespace Hammock.Extensions
10 {
11     internal static class WebExtensions
12     {
13         public static void ParseNamedAttributes<T>(this IWebQueryInfo info,
14                                                    IEnumerable<PropertyInfo> properties,
15                                                    IDictionary<string, string> transforms,
16                                                    IDictionary<string, string> collection) 
17             where T : Attribute, INamedAttribute
18         {
19             foreach (var property in properties)
20             {
21                 var attributes = property.GetCustomAttributes<T>(true);
22
23                 foreach (var attribute in attributes)
24                 {
25                     var value = transforms.ContainsKey(property.Name)
26                                     ? transforms[property.Name]
27                                     : property.GetValue(info, null);
28
29                     if (value == null)
30                     {
31                         continue;
32                     }
33
34                     var header = value.ToString();
35                     if (!header.IsNullOrBlank())
36                     {
37                         collection.Add(attribute.Name, header);
38                     }
39                 }
40             }
41         }
42
43         public static Uri UriMinusQuery(this Uri uri, out WebParameterCollection parameters)
44         {
45             var sb = new StringBuilder();
46
47             parameters = new WebParameterCollection();
48             var query = uri.Query.ParseQueryString();
49             foreach(var key in query.Keys)
50             {
51                 parameters.Add(key, query[key].UrlDecode());
52             }
53
54             var port = uri.Scheme.Equals("http") && uri.Port != 80 || 
55                        uri.Scheme.Equals("https") && uri.Port != 443 ? 
56                        ":" + uri.Port : "";
57
58             sb.Append(uri.Scheme)
59                 .Append("://")
60                 .Append(uri.Host)
61                 .Append(port)
62                 .Append(uri.AbsolutePath);
63
64             return new Uri(sb.ToString());
65         }
66
67         public static string ToBasicAuthorizationHeader(string username, string password)
68         {
69             var token = "{0}:{1}".FormatWith(username, password).GetBytes().ToBase64String();
70             return "Basic {0}".FormatWith(token);
71         }
72
73         public static void ParseValidationAttributes(this IWebQueryInfo info,
74                                                      IEnumerable<PropertyInfo> properties,
75                                                      IDictionary<string, string> collection) 
76         {
77             foreach (var property in properties)
78             {
79                 var attributes = property.GetCustomAttributes<ValidationAttribute>(true);
80
81                 foreach (var attribute in attributes)
82                 {
83                     // Support multiple transforms
84                     var value = collection.ContainsKey(property.Name)
85                                     ? collection[property.Name]
86                                     : property.GetValue(info, null);
87                     
88                     var transformed = attribute.TransformValue(property, value);
89                     if (transformed.IsNullOrBlank())
90                     {
91                         continue;
92                     }
93
94                     if(collection.ContainsKey(property.Name))
95                     {
96                         collection[property.Name] = transformed;
97                     }
98                     else
99                     {
100                         collection.Add(property.Name, transformed);
101                     }
102                 }
103             }
104         }
105     }
106 }