コード例 #1
0
        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);
        }