public FastCloudQueue(Uri queueUri, string sas, HttpMessageHandlerExpiringCache handlerCache) { this.handlerCache = handlerCache; messageUri = queueUri + "/messages"; this.sas = GetSAS(sas); messageUriWithSas = queueUri + "/messages?" + this.sas; }
static HttpMessageHandler GetHandler(HttpMessageHandlerExpiringCache cache, out HttpMessageHandler innerHandler) { var handler = cache.GetHandler(); var fieldInfo = handler.GetType().GetField("innerHandler", BindingFlags.NonPublic | BindingFlags.Instance); innerHandler = (HttpMessageHandler)fieldInfo.GetValue(handler); return(handler); }
public static FastCloudQueue CreateFast(CloudQueue queue, HttpMessageHandlerExpiringCache cache) { return(new FastCloudQueue(queue.Uri, queue.GetSharedAccessSignature(new SharedAccessQueuePolicy { Permissions = SharedAccessQueuePermissions.Add | SharedAccessQueuePermissions.ProcessMessages | SharedAccessQueuePermissions.Read | SharedAccessQueuePermissions.Update, SharedAccessExpiryTime = DateTimeOffset.Now.AddYears(1) }), cache)); }
public void Disposing_twice_should_throw() { var timeout = TimeSpan.FromDays(1); using (var cache = new HttpMessageHandlerExpiringCache(timeout)) { var handler = GetHandler(cache, out _); handler.Dispose(); Assert.Throws <ObjectDisposedException>(() => handler.Dispose()); } }
public void Within_expiring_window_should_reuse_handler() { var timeout = TimeSpan.FromDays(1); using (var cache = new HttpMessageHandlerExpiringCache(timeout)) { var handler1 = GetHandler(cache, out var inner1); handler1.Dispose(); var handler2 = GetHandler(cache, out var inner2); handler2.Dispose(); Assert.AreEqual(inner1, inner2); } }
public async Task After_expiring_window_should_renew_handler() { var timeout = TimeSpan.FromMilliseconds(500); using (var cache = new HttpMessageHandlerExpiringCache(timeout)) { var handler1 = GetHandler(cache, out var inner1); handler1.Dispose(); await Task.Delay(timeout + timeout); var handler2 = GetHandler(cache, out var inner2); handler2.Dispose(); Assert.AreNotEqual(inner1, inner2); } }
public async Task Handler_held_after_renew_should_still_work() { var timeout = TimeSpan.FromMilliseconds(500); using (var cache = new HttpMessageHandlerExpiringCache(timeout)) { var handler1 = GetHandler(cache, out var inner); var handler2 = GetHandler(cache, out _); await Task.Delay(timeout + timeout); handler1.Dispose(); // inner should be still valid and this one request await DoSomeGet(inner, false); // handler 2 should free the inner handler handler2.Dispose(); Assert.ThrowsAsync <ObjectDisposedException>(async() => await DoSomeGet(inner, false)); } }