@@ -1076,6 +1076,15 @@ public static Task<HttpWebResponse> GetResponseAsync(this HttpWebRequest request
1076
1076
return tcs . Task ;
1077
1077
}
1078
1078
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
+
1079
1088
public static void UploadFile ( this WebRequest webRequest , Stream fileStream , string fileName , string mimeType ,
1080
1089
string accept = null , Action < HttpWebRequest > requestFilter = null , string method = "POST" , string field = "file" )
1081
1090
{
@@ -1093,10 +1102,7 @@ public static void UploadFile(this WebRequest webRequest, Stream fileStream, str
1093
1102
1094
1103
var boundaryBytes = ( "\r \n --" + boundary + "--\r \n " ) . ToAsciiBytes ( ) ;
1095
1104
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 ) ;
1100
1106
1101
1107
var contentLength = fileStream . Length + headerBytes . Length + boundaryBytes . Length ;
1102
1108
PclExport . Instance . InitHttpWebRequest ( httpReq ,
@@ -1115,6 +1121,43 @@ public static void UploadFile(this WebRequest webRequest, Stream fileStream, str
1115
1121
PclExport . Instance . CloseStream ( outputStream ) ;
1116
1122
}
1117
1123
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
+
1118
1161
public static void UploadFile ( this WebRequest webRequest , Stream fileStream , string fileName )
1119
1162
{
1120
1163
if ( fileName == null )
@@ -1126,6 +1169,17 @@ public static void UploadFile(this WebRequest webRequest, Stream fileStream, str
1126
1169
UploadFile ( webRequest , fileStream , fileName , mimeType ) ;
1127
1170
}
1128
1171
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
+
1129
1183
public static string PostXmlToUrl ( this string url , object data ,
1130
1184
Action < HttpWebRequest > requestFilter = null , Action < HttpWebResponse > responseFilter = null )
1131
1185
{
@@ -1153,6 +1207,114 @@ public static string PutCsvToUrl(this string url, object data,
1153
1207
return SendStringToUrl ( url , method : "PUT" , requestBody : data . ToCsv ( ) , contentType : MimeTypes . Csv , accept : MimeTypes . Csv ,
1154
1208
requestFilter : requestFilter , responseFilter : responseFilter ) ;
1155
1209
}
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
+ }
1156
1318
}
1157
1319
1158
1320
//Allow Exceptions to Customize HTTP StatusCode and StatusDescription returned
0 commit comments