private IEnumerable<Task> ProcessRequesIterator(HttpContext context, MovieInfoResult miar) { if (context.Request.Path != "/") { ReplyError(HttpStatusCode.NotFound, "Resource does not exist", context.Response); yield return new Task(()=> { miar.IsCompleted = true; ((ManualResetEvent)miar.AsyncWaitHandle).Set(); miar.Callback(miar); }); yield break; } if (context.Request.QueryString["t"] == null) { ReplyError(HttpStatusCode.BadRequest, "Requests must indicate a movie via parameter <b>t=<i>movie</i></b>", context.Response); yield return new Task(() => { miar.IsCompleted = true; ((ManualResetEvent)miar.AsyncWaitHandle).Set(); miar.Callback(miar); }); yield break; } string imdbRequestUri = null; if (context.Request.QueryString["y"] == null) { imdbRequestUri = String.Format("http://imdbapi.com/?t={0}", context.Request.QueryString["t"]); } else { imdbRequestUri = String.Format("http://imdbapi.com/?t={0}&y={1}", context.Request.QueryString["t"], context.Request.QueryString["y"]); } WebRequest imdbRequest = WebRequest.Create(imdbRequestUri); var imdbtask = Task.Factory.FromAsync(imdbRequest.BeginGetResponse , (Func<IAsyncResult, WebResponse>)imdbRequest.EndGetResponse , null); yield return imdbtask; HttpWebResponse imdbResponse = (HttpWebResponse)imdbtask.Result; if (imdbResponse.StatusCode == HttpStatusCode.OK) { JavaScriptSerializer jsonMaster = new JavaScriptSerializer(); IMDbObj imdbObj = jsonMaster.Deserialize<IMDbObj>(new StreamReader(imdbResponse.GetResponseStream()).ReadToEnd()); if (imdbObj != null && imdbObj.Response == "True") { if (imdbObj.Plot != "N/A") { string bingRequestUri = String.Format("http://api.bing.net/json.aspx?AppId={0}&Query={1}&Sources=Translation&Version=2.2&Translation.SourceLanguage={2}&Translation.TargetLanguage={3}", BING_KEY, imdbObj.Plot, "en", "pt"); for (int retries = 0; retries < MAX_RETRIES; ++retries) { WebRequest bingRequest = (HttpWebRequest)WebRequest.Create(bingRequestUri); var bingTask = Task.Factory.FromAsync(bingRequest.BeginGetResponse , (Func<IAsyncResult, WebResponse>) bingRequest.EndGetResponse , null); yield return bingTask; HttpWebResponse bingResponse = (HttpWebResponse) bingTask.Result; if (bingResponse.StatusCode == HttpStatusCode.OK) { BingObj bingObj = jsonMaster.Deserialize<BingObj>(new StreamReader(bingResponse.GetResponseStream()).ReadToEnd()); if (bingObj.SearchResponse.Translation != null) { imdbObj.Plot = bingObj.SearchResponse.Translation.Results[0].TranslatedTerm; break; } } int retrieslocal = retries; yield return new Task(() => { new Timer((_) => { } , null, 000 + 1000*retrieslocal + _rand.Next(2000), 0 ); }); } } context.Response.StatusCode = (int)HttpStatusCode.OK; context.Response.ContentType = "text/plain; charset=utf-8"; // In the final version use "application/json; charset=utf-8" string jsonData = jsonMaster.Serialize(imdbObj); var writer = new StreamWriter(context.Response.OutputStream); writer.Write(jsonData); writer.Flush(); miar.IsCompleted = true; ((ManualResetEvent)miar.AsyncWaitHandle).Set(); miar.Callback(miar); yield break; } } ReplyError(HttpStatusCode.NotFound, "Movie not found", context.Response); }