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);
+ }
+ }
}
}