public static HttpTransfer FromNative(this NSUrlSessionTask task) { var upload = task is NSUrlSessionUploadTask; Exception exception = null; if (task.Error != null && task.State != NSUrlSessionTaskState.Canceling) { exception = new Exception(task.Error.LocalizedDescription); } var taskId = TaskIdentifier.FromString(task.TaskDescription); return(new HttpTransfer( taskId.Value, task.OriginalRequest.Url.ToString(), taskId.File.FullName, upload, task.OriginalRequest.AllowsCellularAccess, exception, upload ? task.BytesExpectedToSend : task.BytesExpectedToReceive, upload ? task.BytesSent : task.BytesReceived, task.GetTransferStatus() )); }
protected override async Task <HttpTransfer> CreateUpload(HttpTransferRequest request) { if (request.HttpMethod != System.Net.Http.HttpMethod.Post && request.HttpMethod != System.Net.Http.HttpMethod.Put) { throw new ArgumentException($"Invalid Upload HTTP Verb {request.HttpMethod} - only PUT or POST are valid"); } var boundary = Guid.NewGuid().ToString("N"); var native = request.ToNative(); native["Content-Type"] = $"multipart/form-data; boundary={boundary}"; var tempPath = platform.GetUploadTempFilePath(request); this.logger.LogInformation("Writing temp form data body to " + tempPath); using (var fs = new FileStream(tempPath, FileMode.Create)) { if (!request.PostData.IsEmpty()) { fs.Write("--" + boundary); fs.Write($"Content-Type: text/plain; charset=utf-8"); fs.Write("Content-Disposition: form-data;"); fs.WriteLine(); fs.Write(request.PostData !); fs.WriteLine(); } } using (var fs = new FileStream(tempPath, FileMode.Append)) { using (var uploadFile = request.LocalFile.OpenRead()) { fs.Write("--" + boundary); fs.Write($"Content-Type: application/octet-stream"); fs.Write($"Content-Disposition: form-data; name=\"blob\"; filename=\"{request.LocalFile.Name}\""); fs.WriteLine(); await uploadFile.CopyToAsync(fs); fs.WriteLine(); fs.Write($"--{boundary}--"); } } this.logger.LogInformation("Form body written"); var tempFileUrl = NSUrl.CreateFileUrl(tempPath, null); var task = this.Session.CreateUploadTask(native, tempFileUrl); var taskId = TaskIdentifier.Create(request.LocalFile); task.TaskDescription = taskId.ToString(); var transfer = task.FromNative(); task.Resume(); return(transfer); }
protected override Task <HttpTransfer> CreateUpload(HttpTransferRequest request) { var task = this.Session.CreateUploadTask(request.ToNative()); var taskId = TaskIdentifier.Create(request.LocalFile); task.TaskDescription = taskId.ToString(); var transfer = task.FromNative(); task.Resume(); return(Task.FromResult(transfer)); }
protected override Task <HttpTransfer> CreateDownload(HttpTransferRequest request) { var task = this.Session.CreateDownloadTask(request.ToNative()); var taskId = TaskIdentifier.Create(request.LocalFile); task.TaskDescription = taskId.ToString(); //task.Response.SuggestedFilename //task.Response.ExpectedContentLength var transfer = task.FromNative(); task.Resume(); return(Task.FromResult(transfer)); }
public static HttpTransfer FromNative(this NSUrlSessionTask task) { var status = HttpTransferState.Unknown; var upload = task is NSUrlSessionUploadTask; Exception?exception = null; switch (task.State) { case NSUrlSessionTaskState.Canceling: status = HttpTransferState.Canceled; break; case NSUrlSessionTaskState.Completed: status = task.Error?.Code == -999 ? HttpTransferState.Canceled : HttpTransferState.Completed; break; case NSUrlSessionTaskState.Suspended: status = HttpTransferState.Paused; break; case NSUrlSessionTaskState.Running: var bytes = task.BytesSent + task.BytesReceived; status = bytes == 0 ? HttpTransferState.Pending : HttpTransferState.InProgress; break; default: status = HttpTransferState.Error; if (task.Error == null) { exception = new Exception("Unknown Error"); } else { status = HttpTransferState.Error; var e = task.Error; var msg = $"{e.LocalizedDescription} - {e.LocalizedFailureReason}"; exception = new Exception(msg); } break; } var taskId = TaskIdentifier.FromString(task.TaskDescription); return(new HttpTransfer( taskId.Value, task.OriginalRequest.Url.ToString(), taskId.File.FullName, upload, task.OriginalRequest.AllowsCellularAccess, exception, upload ? task.BytesExpectedToSend : task.BytesExpectedToReceive, upload ? task.BytesSent : task.BytesReceived, status )); }