4 using Hammock.Extensions;
6 #if !SILVERLIGHT && !ClientProfiles && !MonoTouch
10 using System.Collections.Specialized;
14 using Hammock.Silverlight.Compat;
17 #if ClientProfiles || MonoTouch
18 using System.Collections.Specialized;
19 using System.Compat.Web;
23 using System.Windows.Browser;
26 namespace Hammock.Web.Mocks
28 internal class MockWebRequestFactory : IWebRequestCreate
30 public const string MockScheme = "mockScheme";
31 public const string MockStatusCode = "mockStatusCode";
32 public const string MockStatusDescription = "mockStatusDescription";
33 public const string MockContent = "mockContent";
34 public const string MockContentType = "mockContentType";
35 public const string MockHeaderNames = "mockHeaderNames";
36 public const string MockHeaderValues = "mockHeaderValues";
37 public const string MockHttpMethod = "mockHttpMethod";
39 public WebRequest Create(Uri uri)
41 #if !SILVERLIGHT && !MonoTouch && !NETCF
42 var query = HttpUtility.ParseQueryString(uri.Query);
44 var query = uri.Query.ParseQueryString();
46 var scheme = query[MockScheme];
47 var statusCode = query[MockStatusCode];
48 var statusDescription = query[MockStatusDescription];
49 var content = query[MockContent];
50 var contentType = query[MockContentType];
51 var headerNames = query[MockHeaderNames];
52 var headerValues = query[MockHeaderValues];
54 // Remove mocks parameters
55 var queryString = new NameValueCollection();
56 #if !SILVERLIGHT && !MonoTouch && !NETCF
57 foreach(var key in query.AllKeys)
59 foreach (var key in query.Keys)
65 MockStatusDescription,
75 queryString.Add(key, query[key]);
78 // [DC] Silverlight does not have uri.Authority
79 var uriQuery = queryString.ToQueryString();
80 var authority = "{0}{1}".FormatWith(
82 (uri.Scheme.EqualsIgnoreCase("http") && uri.Port != 80 ||
83 uri.Scheme.EqualsIgnoreCase("https") && uri.Port != 443)
87 var built = "{0}://{1}{2}{3}".FormatWithInvariantCulture(
88 scheme, authority, uri.AbsolutePath, uriQuery
92 var request = Uri.TryCreate(
93 built, UriKind.RelativeOrAbsolute, out mockUri
94 ) ? new MockHttpWebRequest(mockUri)
95 : new MockHttpWebRequest(
96 new Uri(uri.ToString().Replace(
102 int.TryParse(statusCode, out statusCodeValue);
106 statusCodeValue = int.Parse(statusCode);
113 if (!statusCode.IsNullOrBlank()) request.ExpectStatusCode = (HttpStatusCode)statusCodeValue;
114 if (!statusDescription.IsNullOrBlank()) request.ExpectStatusDescription = statusDescription;
115 if (!content.IsNullOrBlank()) request.Content = content;
116 if (!contentType.IsNullOrBlank()) request.ContentType = contentType;
118 if(!headerNames.IsNullOrBlank() && !headerValues.IsNullOrBlank())
120 var headers = new NameValueCollection();
121 var names = headerNames.Split(',').Where(n => !n.IsNullOrBlank()).ToArray();
122 var values = headerValues.Split(',').Where(v => !v.IsNullOrBlank()).ToArray();
123 if(names.Count() == values.Count())
125 for(var i = 0; i < names.Count(); i++)
127 headers.Add(names[i], values[i]);
131 foreach(var key in headers.AllKeys)
133 request.ExpectHeaders.Add(key, headers[key]);