@@ -1076,6 +1076,15 @@ public static Task<HttpWebResponse> GetResponseAsync(this HttpWebRequest request
10761076 return tcs . Task ;
10771077 }
10781078
1079+ private static byte [ ] GetHeaderBytes ( string fileName , string mimeType , string field , string boundary )
1080+ {
1081+ var header = "\r \n --" + boundary +
1082+ $ "\r \n Content-Disposition: form-data; name=\" { field } \" ; filename=\" { fileName } \" \r \n Content-Type: { mimeType } \r \n \r \n ";
1083+
1084+ var headerBytes = header . ToAsciiBytes ( ) ;
1085+ return headerBytes ;
1086+ }
1087+
10791088 public static void UploadFile ( this WebRequest webRequest , Stream fileStream , string fileName , string mimeType ,
10801089 string accept = null , Action < HttpWebRequest > requestFilter = null , string method = "POST" , string field = "file" )
10811090 {
@@ -1093,10 +1102,7 @@ public static void UploadFile(this WebRequest webRequest, Stream fileStream, str
10931102
10941103 var boundaryBytes = ( "\r \n --" + boundary + "--\r \n " ) . ToAsciiBytes ( ) ;
10951104
1096- var header = "\r \n --" + boundary +
1097- $ "\r \n Content-Disposition: form-data; name=\" { field } \" ; filename=\" { fileName } \" \r \n Content-Type: { mimeType } \r \n \r \n ";
1098-
1099- var headerBytes = header . ToAsciiBytes ( ) ;
1105+ var headerBytes = GetHeaderBytes ( fileName , mimeType , field , boundary ) ;
11001106
11011107 var contentLength = fileStream . Length + headerBytes . Length + boundaryBytes . Length ;
11021108 PclExport . Instance . InitHttpWebRequest ( httpReq ,
@@ -1115,6 +1121,43 @@ public static void UploadFile(this WebRequest webRequest, Stream fileStream, str
11151121 PclExport . Instance . CloseStream ( outputStream ) ;
11161122 }
11171123
1124+ public static async Task UploadFileAsync ( this WebRequest webRequest , Stream fileStream , string fileName , string mimeType ,
1125+ string accept = null , Action < HttpWebRequest > requestFilter = null , string method = "POST" , string field = "file" ,
1126+ CancellationToken token = default )
1127+ {
1128+ var httpReq = ( HttpWebRequest ) webRequest ;
1129+ httpReq . Method = method ;
1130+
1131+ if ( accept != null )
1132+ httpReq . Accept = accept ;
1133+
1134+ requestFilter ? . Invoke ( httpReq ) ;
1135+
1136+ var boundary = Guid . NewGuid ( ) . ToString ( "N" ) ;
1137+
1138+ httpReq . ContentType = "multipart/form-data; boundary=\" " + boundary + "\" " ;
1139+
1140+ var boundaryBytes = ( "\r \n --" + boundary + "--\r \n " ) . ToAsciiBytes ( ) ;
1141+
1142+ var headerBytes = GetHeaderBytes ( fileName , mimeType , field , boundary ) ;
1143+
1144+ var contentLength = fileStream . Length + headerBytes . Length + boundaryBytes . Length ;
1145+ PclExport . Instance . InitHttpWebRequest ( httpReq ,
1146+ contentLength : contentLength , allowAutoRedirect : false , keepAlive : false ) ;
1147+
1148+ if ( ResultsFilter != null )
1149+ {
1150+ ResultsFilter . UploadStream ( httpReq , fileStream , fileName ) ;
1151+ return ;
1152+ }
1153+
1154+ using var outputStream = PclExport . Instance . GetRequestStream ( httpReq ) ;
1155+ await outputStream . WriteAsync ( headerBytes , 0 , headerBytes . Length , token ) . ConfigAwait ( ) ;
1156+ await fileStream . CopyToAsync ( outputStream , 4096 , token ) . ConfigAwait ( ) ;
1157+ await outputStream . WriteAsync ( boundaryBytes , 0 , boundaryBytes . Length , token ) . ConfigAwait ( ) ;
1158+ PclExport . Instance . CloseStream ( outputStream ) ;
1159+ }
1160+
11181161 public static void UploadFile ( this WebRequest webRequest , Stream fileStream , string fileName )
11191162 {
11201163 if ( fileName == null )
@@ -1126,6 +1169,17 @@ public static void UploadFile(this WebRequest webRequest, Stream fileStream, str
11261169 UploadFile ( webRequest , fileStream , fileName , mimeType ) ;
11271170 }
11281171
1172+ public static async Task UploadFileAsync ( this WebRequest webRequest , Stream fileStream , string fileName , CancellationToken token = default )
1173+ {
1174+ if ( fileName == null )
1175+ throw new ArgumentNullException ( nameof ( fileName ) ) ;
1176+ var mimeType = MimeTypes . GetMimeType ( fileName ) ;
1177+ if ( mimeType == null )
1178+ throw new ArgumentException ( "Mime-type not found for file: " + fileName ) ;
1179+
1180+ await UploadFileAsync ( webRequest , fileStream , fileName , mimeType , token : token ) . ConfigAwait ( ) ;
1181+ }
1182+
11291183 public static string PostXmlToUrl ( this string url , object data ,
11301184 Action < HttpWebRequest > requestFilter = null , Action < HttpWebResponse > responseFilter = null )
11311185 {
@@ -1153,6 +1207,114 @@ public static string PutCsvToUrl(this string url, object data,
11531207 return SendStringToUrl ( url , method : "PUT" , requestBody : data . ToCsv ( ) , contentType : MimeTypes . Csv , accept : MimeTypes . Csv ,
11541208 requestFilter : requestFilter , responseFilter : responseFilter ) ;
11551209 }
1210+
1211+ public static WebResponse PostFileToUrl ( this string url ,
1212+ FileInfo uploadFileInfo , string uploadFileMimeType ,
1213+ string accept = null ,
1214+ Action < HttpWebRequest > requestFilter = null )
1215+ {
1216+ var webReq = ( HttpWebRequest ) WebRequest . Create ( url ) ;
1217+ using ( var fileStream = uploadFileInfo . OpenRead ( ) )
1218+ {
1219+ var fileName = uploadFileInfo . Name ;
1220+
1221+ webReq . UploadFile ( fileStream , fileName , uploadFileMimeType , accept : accept , requestFilter : requestFilter , method : "POST" ) ;
1222+ }
1223+
1224+ if ( ResultsFilter != null )
1225+ return null ;
1226+
1227+ return webReq . GetResponse ( ) ;
1228+ }
1229+
1230+ public static async Task < WebResponse > PostFileToUrlAsync ( this string url ,
1231+ FileInfo uploadFileInfo , string uploadFileMimeType ,
1232+ string accept = null ,
1233+ Action < HttpWebRequest > requestFilter = null , CancellationToken token = default )
1234+ {
1235+ var webReq = ( HttpWebRequest ) WebRequest . Create ( url ) ;
1236+ using ( var fileStream = uploadFileInfo . OpenRead ( ) )
1237+ {
1238+ var fileName = uploadFileInfo . Name ;
1239+
1240+ await webReq . UploadFileAsync ( fileStream , fileName , uploadFileMimeType , accept : accept , requestFilter : requestFilter , method : "POST" , token : token ) ;
1241+ }
1242+
1243+ if ( ResultsFilter != null )
1244+ return null ;
1245+
1246+ return await webReq . GetResponseAsync ( ) ;
1247+ }
1248+
1249+ public static WebResponse PutFileToUrl ( this string url ,
1250+ FileInfo uploadFileInfo , string uploadFileMimeType ,
1251+ string accept = null ,
1252+ Action < HttpWebRequest > requestFilter = null )
1253+ {
1254+ var webReq = ( HttpWebRequest ) WebRequest . Create ( url ) ;
1255+ using ( var fileStream = uploadFileInfo . OpenRead ( ) )
1256+ {
1257+ var fileName = uploadFileInfo . Name ;
1258+
1259+ webReq . UploadFile ( fileStream , fileName , uploadFileMimeType , accept : accept , requestFilter : requestFilter , method : "PUT" ) ;
1260+ }
1261+
1262+ if ( ResultsFilter != null )
1263+ return null ;
1264+
1265+ return webReq . GetResponse ( ) ;
1266+ }
1267+
1268+ public static async Task < WebResponse > PutFileToUrlAsync ( this string url ,
1269+ FileInfo uploadFileInfo , string uploadFileMimeType ,
1270+ string accept = null ,
1271+ Action < HttpWebRequest > requestFilter = null , CancellationToken token = default )
1272+ {
1273+ var webReq = ( HttpWebRequest ) WebRequest . Create ( url ) ;
1274+ using ( var fileStream = uploadFileInfo . OpenRead ( ) )
1275+ {
1276+ var fileName = uploadFileInfo . Name ;
1277+
1278+ await webReq . UploadFileAsync ( fileStream , fileName , uploadFileMimeType , accept : accept , requestFilter : requestFilter , method : "PUT" , token : token ) ;
1279+ }
1280+
1281+ if ( ResultsFilter != null )
1282+ return null ;
1283+
1284+ return await webReq . GetResponseAsync ( ) ;
1285+ }
1286+
1287+ public static WebResponse UploadFile ( this WebRequest webRequest ,
1288+ FileInfo uploadFileInfo , string uploadFileMimeType )
1289+ {
1290+ using ( var fileStream = uploadFileInfo . OpenRead ( ) )
1291+ {
1292+ var fileName = uploadFileInfo . Name ;
1293+
1294+ webRequest . UploadFile ( fileStream , fileName , uploadFileMimeType ) ;
1295+ }
1296+
1297+ if ( ResultsFilter != null )
1298+ return null ;
1299+
1300+ return webRequest . GetResponse ( ) ;
1301+ }
1302+
1303+ public static async Task < WebResponse > UploadFileAsync ( this WebRequest webRequest ,
1304+ FileInfo uploadFileInfo , string uploadFileMimeType )
1305+ {
1306+ using ( var fileStream = uploadFileInfo . OpenRead ( ) )
1307+ {
1308+ var fileName = uploadFileInfo . Name ;
1309+
1310+ await webRequest . UploadFileAsync ( fileStream , fileName , uploadFileMimeType ) ;
1311+ }
1312+
1313+ if ( ResultsFilter != null )
1314+ return null ;
1315+
1316+ return await webRequest . GetResponseAsync ( ) ;
1317+ }
11561318 }
11571319
11581320 //Allow Exceptions to Customize HTTP StatusCode and StatusDescription returned
0 commit comments