Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit 1e1e0ad

Browse files
committed
Extract .NET 4.5 HttpUtils + add async overloads
1 parent 4708869 commit 1e1e0ad

File tree

2 files changed

+166
-59
lines changed

2 files changed

+166
-59
lines changed

src/ServiceStack.Text/HttpUtils.cs

+166-4
Original file line numberDiff line numberDiff line change
@@ -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\nContent-Disposition: form-data; name=\"{field}\"; filename=\"{fileName}\"\r\nContent-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\nContent-Disposition: form-data; name=\"{field}\"; filename=\"{fileName}\"\r\nContent-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

src/ServiceStack.Text/PclExport.Net45.cs

-55
Original file line numberDiff line numberDiff line change
@@ -535,61 +535,6 @@ public static StringCollection ToStringCollection(List<string> items)
535535

536536
public static class PclExportExt
537537
{
538-
//HttpUtils
539-
public static WebResponse PostFileToUrl(this string url,
540-
FileInfo uploadFileInfo, string uploadFileMimeType,
541-
string accept = null,
542-
Action<HttpWebRequest> requestFilter = null)
543-
{
544-
var webReq = (HttpWebRequest)WebRequest.Create(url);
545-
using (var fileStream = uploadFileInfo.OpenRead())
546-
{
547-
var fileName = uploadFileInfo.Name;
548-
549-
webReq.UploadFile(fileStream, fileName, uploadFileMimeType, accept: accept, requestFilter: requestFilter, method: "POST");
550-
}
551-
552-
if (HttpUtils.ResultsFilter != null)
553-
return null;
554-
555-
return webReq.GetResponse();
556-
}
557-
558-
public static WebResponse PutFileToUrl(this string url,
559-
FileInfo uploadFileInfo, string uploadFileMimeType,
560-
string accept = null,
561-
Action<HttpWebRequest> requestFilter = null)
562-
{
563-
var webReq = (HttpWebRequest)WebRequest.Create(url);
564-
using (var fileStream = uploadFileInfo.OpenRead())
565-
{
566-
var fileName = uploadFileInfo.Name;
567-
568-
webReq.UploadFile(fileStream, fileName, uploadFileMimeType, accept: accept, requestFilter: requestFilter, method: "PUT");
569-
}
570-
571-
if (HttpUtils.ResultsFilter != null)
572-
return null;
573-
574-
return webReq.GetResponse();
575-
}
576-
577-
public static WebResponse UploadFile(this WebRequest webRequest,
578-
FileInfo uploadFileInfo, string uploadFileMimeType)
579-
{
580-
using (var fileStream = uploadFileInfo.OpenRead())
581-
{
582-
var fileName = uploadFileInfo.Name;
583-
584-
webRequest.UploadFile(fileStream, fileName, uploadFileMimeType);
585-
}
586-
587-
if (HttpUtils.ResultsFilter != null)
588-
return null;
589-
590-
return webRequest.GetResponse();
591-
}
592-
593538
//XmlSerializer
594539
public static void CompressToStream<TXmlDto>(TXmlDto from, Stream stream)
595540
{

0 commit comments

Comments
 (0)