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;
                }
            });
        }
Example #2
0
        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))
 {
 }