private Response GetResponse(Hashtable parameters, TimeSpan cacheTimeout)
{
// Calulate URL
StringBuilder UrlStringBuilder = new StringBuilder(BaseUrl, 2 * 1024);
StringBuilder HashStringBuilder = new StringBuilder(_sharedSecret, 2 * 1024);
UrlStringBuilder.Append("?");
parameters["api_key"] = _apiKey;
if( _apiToken != null && _apiToken.Length > 0 )
{
parameters["auth_token"] = _apiToken;
}
string[] keys = new string[parameters.Keys.Count];
parameters.Keys.CopyTo(keys, 0);
Array.Sort(keys);
foreach(string key in keys)
{
if( UrlStringBuilder.Length > BaseUrl.Length + 1 ) UrlStringBuilder.Append("&");
UrlStringBuilder.Append(key);
UrlStringBuilder.Append("=");
UrlStringBuilder.Append(Utils.UrlEncode((string)parameters[key]));
HashStringBuilder.Append(key);
HashStringBuilder.Append(parameters[key]);
}
if (_sharedSecret != null && _sharedSecret.Length > 0)
{
if (UrlStringBuilder.Length > BaseUrl.Length + 1)
{
UrlStringBuilder.Append("&");
}
UrlStringBuilder.Append("api_sig=");
UrlStringBuilder.Append(Md5Hash(HashStringBuilder.ToString()));
}
string url = UrlStringBuilder.ToString();
_lastRequest = url;
_lastResponse = string.Empty;
if( CacheDisabled )
{
string responseXml = DoGetResponse(url);
_lastResponse = responseXml;
return Deserialize(responseXml);
}
else
{
ResponseCacheItem cached = (ResponseCacheItem) Cache.Responses.Get(url, cacheTimeout, true);
if (cached != null)
{
System.Diagnostics.Debug.WriteLine("Cache hit");
_lastResponse = cached.Response;
return Deserialize(cached.Response);
}
else
{
System.Diagnostics.Debug.WriteLine("Cache miss");
string responseXml = DoGetResponse(url);
_lastResponse = responseXml;
ResponseCacheItem resCache = new ResponseCacheItem();
resCache.Response = responseXml;
resCache.Url = url;
resCache.CreationTime = DateTime.UtcNow;
FlickrNet.Response response = Deserialize(responseXml);
if( response.Status == ResponseStatus.OK )
{
Cache.Responses.Shrink(Math.Max(0, Cache.CacheSizeLimit - responseXml.Length));
Cache.Responses[url] = resCache;
}
return response;
}
}
}