public override async Task Invoke(IOwinContext context) { var contextEnv = context.Environment; Stream responseStream; if (!contextEnv.ContainsKey(CommonOwinKeys.AdditionalInfo)) { PushFunc pushPromise = null; var path = context.Request.Path.Value; var base64Req = path.Remove(0, 1); //remove leading / var isHtmlReq = Regex.Match(base64Req, Base64Regex).Success; var isJpeg = !isHtmlReq && path.EndsWith(TileExtension); var url = String.Empty; if (isHtmlReq) { var bingProcessor = new BingRequestProcessor(base64Req); var images = bingProcessor.GetTilesSoapRequestsUrls(); foreach (var image in images.Where(image => TryGetPushPromise(context, out pushPromise))) { Push(context.Request, pushPromise, image); } url = BingRequestsUrl + base64Req; } else if (isJpeg) { url = BingRequestProcessor.GetSoapUrlFromTileName(path); } else { url = BingServiceUrl + path; } if (isHtmlReq) { var responseString = new WebClient().DownloadString(url); //html on original request //TODO handle errors HtmlProcessor.PreprocessHtml(ref responseString); var response = Encoding.UTF8.GetBytes(responseString); responseStream = context.Response.Body; responseStream.Write(response, 0, response.Length); } else { DownloadVia11(url, context); } } else { var url = context.Get <string>(CommonOwinKeys.AdditionalInfo); DownloadVia11(url, context); } await Next.Invoke(context); }