-
-
Save migueldeicaza/04e3f5619af8c7b4b9a6 to your computer and use it in GitHub Desktop.
FtpWebRequest patch to address mimepart issues when uploading files (fix for #26312)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
commit 0e17656e47bd0d92e4fe6da0e63a8d4f1669e31d | |
Author: Miguel de Icaza <miguel@gnome.org> | |
Date: Fri Jan 23 00:28:55 2015 -0500 | |
[WebClient/FtpWebRequest] Do not use MIME boundaries on FTP uploads (Fixes #26312) | |
The existing code only prevented HTTP PUTs from not having MIME-type | |
boundaries. Apply this also to FTP methods. | |
Bring a referencesource helper method that determines the default | |
method based on a Uri. | |
The existing test case only tested for the attempt to upload a file | |
not for the contents. Extended the code to check for a bit more | |
(just that the uplaod is actually 10 bytes long). | |
Fixes #26312 | |
diff --git a/mcs/class/System/System.Net/WebClient.cs b/mcs/class/System/System.Net/WebClient.cs | |
index 2bd9dee..2747fec 100644 | |
--- a/mcs/class/System/System.Net/WebClient.cs | |
+++ b/mcs/class/System/System.Net/WebClient.cs | |
@@ -12,6 +12,7 @@ | |
// Copyright 2003 Ximian, Inc. (http://www.ximian.com) | |
// Copyright 2006, 2010 Novell, Inc. (http://www.novell.com) | |
// Copyright 2012 Xamarin Inc. (http://www.xamarin.com) | |
+// Copyright 2014 Microsoft Inc | |
// | |
// | |
// Permission is hereby granted, free of charge, to any person obtaining | |
@@ -553,6 +554,21 @@ namespace System.Net | |
} | |
} | |
+ // From the Microsoft reference source | |
+ string MapToDefaultMethod(Uri address) { | |
+ Uri uri; | |
+ if (!address.IsAbsoluteUri && baseAddress != null) { | |
+ uri = new Uri(baseAddress, address); | |
+ } else { | |
+ uri = address; | |
+ } | |
+ if (uri.Scheme.ToLower(System.Globalization.CultureInfo.InvariantCulture) == "ftp") { | |
+ return WebRequestMethods.Ftp.UploadFile; | |
+ } else { | |
+ return "POST"; | |
+ } | |
+ } | |
+ | |
byte [] UploadFileCore (Uri address, string method, string fileName, object userToken) | |
{ | |
string fileCType = Headers ["Content-Type"]; | |
@@ -565,7 +581,10 @@ namespace System.Net | |
fileCType = "application/octet-stream"; | |
} | |
- bool needs_boundary = (method != "PUT"); // only verified case so far | |
+ if (method == null) | |
+ method = MapToDefaultMethod (address); | |
+ | |
+ bool needs_boundary = (method != "PUT" && method != WebRequestMethods.Ftp.UploadFile); // only verified case so far | |
string boundary = null; | |
if (needs_boundary) { | |
boundary = "------------" + DateTime.Now.Ticks.ToString ("x"); | |
diff --git a/mcs/class/System/Test/System.Net/FtpWebRequestTest.cs b/mcs/class/System/Test/System.Net/FtpWebRequestTest.cs | |
index 2fc0509..429a8d5 100644 | |
--- a/mcs/class/System/Test/System.Net/FtpWebRequestTest.cs | |
+++ b/mcs/class/System/Test/System.Net/FtpWebRequestTest.cs | |
@@ -10,6 +10,7 @@ | |
#if NET_2_0 | |
using NUnit.Framework; | |
using System; | |
+using System.Collections.Generic; | |
using System.IO; | |
using System.Net; | |
using System.Net.Sockets; | |
@@ -23,6 +24,31 @@ namespace MonoTests.System.Net | |
{ | |
FtpWebRequest defaultRequest; | |
+ private string _tempDirectory; | |
+ private string _tempFile; | |
+ | |
+ [SetUp] | |
+ public void SetUp () | |
+ { | |
+ _tempDirectory = Path.Combine (Path.GetTempPath (), "MonoTests.System.Net.FileWebRequestTest"); | |
+ _tempFile = Path.Combine (_tempDirectory, "FtpWebRequestTest.tmp"); | |
+ if (!Directory.Exists (_tempDirectory)) { | |
+ Directory.CreateDirectory (_tempDirectory); | |
+ } else { | |
+ // ensure no files are left over from previous runs | |
+ string [] files = Directory.GetFiles (_tempDirectory, "*"); | |
+ foreach (string file in files) | |
+ File.Delete (file); | |
+ } | |
+ } | |
+ | |
+ [TearDown] | |
+ public void TearDown () | |
+ { | |
+ if (Directory.Exists (_tempDirectory)) | |
+ Directory.Delete (_tempDirectory, true); | |
+ } | |
+ | |
[TestFixtureSetUp] | |
public void Init () | |
{ | |
@@ -183,13 +209,15 @@ namespace MonoTests.System.Net | |
ftp.KeepAlive = false; | |
ftp.Timeout = 5000; | |
ftp.Method = WebRequestMethods.Ftp.UploadFile; | |
- ftp.ContentLength = 1; | |
+ ftp.ContentLength = 10; | |
ftp.UseBinary = true; | |
Stream stream = ftp.GetRequestStream (); | |
- stream.WriteByte (0); | |
+ for (int i = 0; i < 10; i++) | |
+ stream.WriteByte ((byte)i); | |
stream.Close (); | |
FtpWebResponse response = (FtpWebResponse) ftp.GetResponse (); | |
Assert.IsTrue ((int) response.StatusCode >= 200 && (int) response.StatusCode < 300, "UP#01"); | |
+ Assert.AreEqual (10, sp.result.Count, "UP#02"); | |
response.Close (); | |
} catch (Exception) { | |
if (!String.IsNullOrEmpty (sp.Where)) | |
@@ -201,6 +229,24 @@ namespace MonoTests.System.Net | |
} | |
[Test] | |
+ public void UploadFile_WebClient () | |
+ { | |
+ ServerPut sp = new ServerPut (); | |
+ File.WriteAllText (_tempFile, "0123456789"); | |
+ sp.Start (); | |
+ | |
+ using (WebClient m_WebClient = new WebClient()) | |
+ { | |
+ string uri = String.Format ("ftp://{0}:{1}/uploads/file.txt", sp.IPAddress, sp.Port); | |
+ | |
+ m_WebClient.UploadFile(uri, _tempFile); | |
+ } | |
+ Assert.AreEqual (10, sp.result.Count, "WebClient/Ftp#01"); | |
+ | |
+ sp.Stop (); | |
+ } | |
+ | |
+ [Test] | |
public void DownloadFile1 () | |
{ | |
DownloadFile (new ServerDownload ()); | |
@@ -464,6 +510,8 @@ namespace MonoTests.System.Net | |
} | |
class ServerPut : FtpServer { | |
+ public List<byte> result = new List<byte> (); | |
+ | |
protected override void Run () | |
{ | |
Socket client = control.Accept (); | |
@@ -511,8 +559,12 @@ namespace MonoTests.System.Net | |
writer.Flush (); | |
Socket data_cnc = data.Accept (); | |
- byte [] dontcare = new byte [1]; | |
- data_cnc.Receive (dontcare, 1, SocketFlags.None); | |
+ var datastr = new NetworkStream (data_cnc, false); | |
+ int ch; | |
+ while ((ch = datastr.ReadByte ()) != -1){ | |
+ result.Add ((byte)ch); | |
+ | |
+ } | |
data_cnc.Close (); | |
writer.WriteLine ("226 File received Ok"); | |
writer.Flush (); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment