diff --git a/GreenshotPlugin/Core/NetworkHelper.cs b/GreenshotPlugin/Core/NetworkHelper.cs index 7840cd06c..fcd258e30 100644 --- a/GreenshotPlugin/Core/NetworkHelper.cs +++ b/GreenshotPlugin/Core/NetworkHelper.cs @@ -86,6 +86,26 @@ namespace GreenshotPlugin.Core { return null; } + /// + /// Download the uri into a memorystream, without catching exceptions + /// + /// Of an image + /// MemoryStream which is already seeked to 0 + public static MemoryStream GetAsMemoryStream(string url) { + HttpWebRequest request = CreateWebRequest(url); + using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) { + MemoryStream memoryStream = new MemoryStream(); + using (Stream responseStream = response.GetResponseStream()) { + if (responseStream != null) { + responseStream.CopyTo(memoryStream); + } + // Make sure it can be used directly + memoryStream.Seek(0, SeekOrigin.Begin); + } + return memoryStream; + } + } + /// /// Download the uri to Bitmap /// @@ -93,15 +113,27 @@ namespace GreenshotPlugin.Core { /// Bitmap public static Image DownloadImage(string url) { try { - HttpWebRequest request = CreateWebRequest(url); - HttpWebResponse response = (HttpWebResponse)request.GetResponse(); - if (request.HaveResponse) { - using (Stream responseStream = response.GetResponseStream()) { - if (responseStream != null) { - using (Image image = Image.FromStream(responseStream)) { - return ImageHelper.Clone(image, PixelFormat.Format32bppArgb); + string content; + using (MemoryStream memoryStream = GetAsMemoryStream(url)) { + try { + using (Image image = Image.FromStream(memoryStream)) { + return ImageHelper.Clone(image, PixelFormat.Format32bppArgb); + } + } catch (Exception) { + // If we arrive here, the image loading didn't work, try to see if the response has a http(s) URL to an image and just take this instead. + using (StreamReader streamReader = new StreamReader(memoryStream, Encoding.UTF8, true)) { + content = streamReader.ReadLine(); + } + Regex imageUrlRegex = new Regex(@"(http|https)://.*(\.png|\.gif|\.jpg|\.tiff|\.jpeg|\.bmp)"); + Match match = imageUrlRegex.Match(content); + if (match.Success) { + using (MemoryStream memoryStream2 = GetAsMemoryStream(match.Value)) { + using (Image image = Image.FromStream(memoryStream2)) { + return ImageHelper.Clone(image, PixelFormat.Format32bppArgb); + } } } + throw; } } } catch (Exception e) { diff --git a/GreenshotPlugin/Core/StringExtensions.cs b/GreenshotPlugin/Core/StringExtensions.cs index bb4f433a2..9cbec97b4 100644 --- a/GreenshotPlugin/Core/StringExtensions.cs +++ b/GreenshotPlugin/Core/StringExtensions.cs @@ -148,5 +148,19 @@ namespace GreenshotPlugin.Core { return returnValue; } + + /// + /// Read "streamextensions" :) + /// + /// Stream + /// Stream + public static void CopyTo(this Stream input, Stream output) { + byte[] buffer = new byte[16 * 1024]; // Fairly arbitrary size + int bytesRead; + + while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0) { + output.Write(buffer, 0, bytesRead); + } + } } }