private void Initialize() { _requestTask = Task.Run(() => { try { var shard = _cloud.Account.RequestRepo.GetShardInfo(ShardType.Upload).Result; var url = new Uri($"{shard.Url}?cloud_domain=2&{_cloud.Account.Credentials.Login}"); _client = HttpClientFabric.Instance[_cloud.Account]; _request = new HttpRequestMessage { RequestUri = url, Method = HttpMethod.Post, }; _request.Headers.Add("Referer", $"{ConstSettings.CloudDomain}/home/{Uri.EscapeDataString(_file.Path)}"); _request.Headers.Add("Origin", ConstSettings.CloudDomain); _request.Headers.Add("Host", url.Host); _request.Headers.Add("Accept", "*/*"); _request.Headers.TryAddWithoutValidation("User-Agent", _cloud.Account.RequestRepo.HttpSettings.UserAgent); var guid = Guid.NewGuid(); var content = new MultipartFormDataContent($"----{guid}"); var boundaryValue = content.Headers.ContentType.Parameters.First(p => p.Name == "boundary"); boundaryValue.Value = boundaryValue.Value.Replace("\"", String.Empty); _pushContent = new PushStreamContent((stream, httpContent, arg3) => { try { _ringBuffer.CopyTo(stream); stream.Close(); } catch (Exception e) { Console.WriteLine(e); throw; } }); _pushContent.Headers.Add("Content-Disposition", $"form-data; name=\"file\"; filename=\"{_file.Name}\""); content.Add(_pushContent); _request.Content = content; _request.Content.Headers.ContentLength = _file.OriginalSize + 192 + Encoding.UTF8.GetBytes(_file.Name).Length; _responseMessage = _client.SendAsync(_request).Result; } catch (Exception e) { Logger.Error("Upload request failed", e); throw; } }); }
private void Initialize() { _requestTask = Task.Run(() => { try { if (_file.OriginalSize <= MailRuSha1Hash.Length) // do not send upload request if file content fits to hash { using (var ms = new MemoryStream()) { _ringBuffer.CopyTo(ms); } return; } var shard = _cloud.Account.RequestRepo.GetShardInfo(ShardType.Upload).Result; var url = new Uri($"{shard.Url}?token={_cloud.Account.RequestRepo.Authent.AccessToken}"); _client = HttpClientFabric.Instance[_cloud.Account]; _request = new HttpRequestMessage { RequestUri = url, Method = HttpMethod.Put }; _request.Headers.Add("Accept", "*/*"); _request.Headers.TryAddWithoutValidation("User-Agent", _cloud.Account.RequestRepo.HttpSettings.UserAgent); _pushContent = new PushStreamContent((stream, httpContent, arg3) => { try { _ringBuffer.CopyTo(stream); stream.Close(); } catch (Exception e) { Console.WriteLine(e); throw; } }); _request.Content = _pushContent; _request.Content.Headers.ContentLength = _file.OriginalSize; _responseMessage = _client.SendAsync(_request).Result; } catch (Exception e) { Logger.Error($"Uploading to {_file.FullPath} failed with {e.Message}"); //TODO remove duplicate exception catch? throw; } }); }
public PushStreamContent(Action <Stream, HttpContent, TransportContext> onStreamAvailable, string mediaType) : this(PushStreamContent.Taskify(onStreamAvailable), new MediaTypeHeaderValue(mediaType)) { }