private RenderingResult RenderUrlImpl(HttpCookie[] cookies, string url, string outputImageFilePath, string mode) { Verify.ArgumentNotNull(cookies, nameof(cookies)); string cookieDomain = new Uri(url).Host; var request = new RenderPreviewRequest { requestId = "1", mode = mode, url = url, outputFilePath = outputImageFilePath, cookies = cookies.Select(cookie => new CookieInformation { name = cookie.Name, value = cookie.Value, domain = cookieDomain }).ToArray() }; var ms = new MemoryStream(); var ser = new DataContractJsonSerializer(typeof(RenderPreviewRequest)); ser.WriteObject(ms, request); var json = Encoding.UTF8.GetString(ms.ToArray()); var output = new List<string>(); Task readerTask = Task.Run(() => { _stdin.WriteLine(json); string line; do { line = _stdout.ReadLine(); lock (output) { output.Add(line); } } while (!IsEndOfReply(line)); }); var secondsSinceStartup = (DateTime.Now - _process.StartTime).TotalSeconds; double timeout = secondsSinceStartup < 120 || mode == "test" ? 65 : 30; readerTask.Wait(TimeSpan.FromSeconds(timeout)); // TODO: check for theother task statuses switch (readerTask.Status) { case TaskStatus.RanToCompletion: if (output.Count == 0) { return new RenderingResult { Status = RenderingResultStatus.PhantomServerNoOutput, Output = new [] { "(null)" } }; } break; default: string[] outputCopy; lock (output) { outputCopy = output.ToArray(); } string logMessage = "Request failed to complete within expected time: " + #if DEBUG json #else url + " " + mode #endif ; return new RenderingResult { Status = RenderingResultStatus.PhantomServerTimeout, Output = new [] { logMessage}.Concat(outputCopy).ToArray(), FilePath = outputImageFilePath }; } if (C1File.Exists(outputImageFilePath)) { return new RenderingResult { Status = RenderingResultStatus.Success, Output = output, FilePath = outputImageFilePath }; } var lastMessage = output.Last(); if (!lastMessage.StartsWith(EndOfReplyMarker)) { Log.LogError(LogTitle, $"Missing {EndOfReplyMarker} in the response"); } string redirectUrl = null; RenderingResultStatus? status = null; foreach (var line in output) { const string redirectResponsePrefix = "REDIRECT: "; if (line == "SUCCESS") { status = RenderingResultStatus.Success; } else if (line.StartsWith(redirectResponsePrefix)) { status = RenderingResultStatus.Redirect; redirectUrl = line.Substring(redirectResponsePrefix.Length); } else if (line.StartsWith("TIMEOUT: ")) { status = RenderingResultStatus.Timeout; } else if (line.StartsWith("ERROR: ")) { status = RenderingResultStatus.Error; } } status = status ?? RenderingResultStatus.PhantomServerIncorrectResponse; return new RenderingResult { Status = status.Value, Output = output, RedirectUrl = redirectUrl }; }
private RenderingResult RenderUrlImpl(HttpCookie[] cookies, string url, string outputImageFilePath, string mode) { Verify.ArgumentNotNull(cookies, nameof(cookies)); string cookieDomain = new Uri(url).Host; var request = new RenderPreviewRequest { requestId = "1", mode = mode, url = url, outputFilePath = outputImageFilePath, cookies = cookies.Select(cookie => new CookieInformation { name = cookie.Name, value = cookie.Value, domain = cookieDomain }).ToArray() }; var ms = new MemoryStream(); var ser = new DataContractJsonSerializer(typeof(RenderPreviewRequest)); ser.WriteObject(ms, request); var json = Encoding.UTF8.GetString(ms.ToArray()); var output = new List <string>(); Task readerTask = Task.Run(() => { _stdin.WriteLine(json); string line; do { line = _stdout.ReadLine(); lock (output) { output.Add(line); } } while (!IsEndOfReply(line)); }); var secondsSinceStartup = (DateTime.Now - _process.StartTime).TotalSeconds; double timeout = secondsSinceStartup < 120 || mode == "test" ? 65 : 30; readerTask.Wait(TimeSpan.FromSeconds(timeout)); // TODO: check for theother task statuses switch (readerTask.Status) { case TaskStatus.RanToCompletion: if (output.Count == 0) { return(new RenderingResult { Status = RenderingResultStatus.PhantomServerNoOutput, Output = new [] { "(null)" } }); } break; default: string[] outputCopy; lock (output) { outputCopy = output.ToArray(); } string logMessage = "Request failed to complete within expected time: " + #if DEBUG json #else url + " " + mode #endif ; return(new RenderingResult { Status = RenderingResultStatus.PhantomServerTimeout, Output = new [] { logMessage }.Concat(outputCopy).ToArray(), FilePath = outputImageFilePath }); } if (C1File.Exists(outputImageFilePath)) { return(new RenderingResult { Status = RenderingResultStatus.Success, Output = output, FilePath = outputImageFilePath }); } var lastMessage = output.Last(); if (!lastMessage.StartsWith(EndOfReplyMarker)) { Log.LogError(LogTitle, $"Missing {EndOfReplyMarker} in the response"); } string redirectUrl = null; RenderingResultStatus?status = null; foreach (var line in output) { const string redirectResponsePrefix = "REDIRECT: "; if (line == "SUCCESS") { status = RenderingResultStatus.Success; } else if (line.StartsWith(redirectResponsePrefix)) { status = RenderingResultStatus.Redirect; redirectUrl = line.Substring(redirectResponsePrefix.Length); } else if (line.StartsWith("TIMEOUT: ")) { status = RenderingResultStatus.Timeout; } else if (line.StartsWith("ERROR: ")) { status = RenderingResultStatus.Error; } } status = status ?? RenderingResultStatus.PhantomServerIncorrectResponse; return(new RenderingResult { Status = status.Value, Output = output, RedirectUrl = redirectUrl }); }