Beispiel #1
0
        private void OnSyncFilesRequest(SyncFilesRequest fileAction, SyncFilesBodyRequest bodyRequest, HttpRequestEventArgs e)
        {
            var login = _connectionStateManager.GetLoginByToken(fileAction.Token);

            if (string.IsNullOrEmpty(login))
            {
                ApiController.SetErrorResponse(e);
                return;
            }

            var folders       = _userTableDataBase.GetAvailableFolders(login);
            var databaseFiles = _syncTableDataBase.GetSyncStates(login);

            var serverFiles = new List <FileInfoModel>();

            foreach (var folder in folders)
            {
                var rootFiles = _fileManager.GetFiles(folder);
                serverFiles.AddRange(rootFiles);
            }

            var deviceFiles = bodyRequest.Files.Select(Convert).ToList();

            var resultServerRemoveFiles = _serverRemoveFiles.Get(databaseFiles, deviceFiles, serverFiles);


            var response = new SyncFilesResponse();

            var resultClientRemoveFiles = _clientRemoveFiles.Get(databaseFiles, deviceFiles, serverFiles);

            AddFilesRemoveResponse(resultClientRemoveFiles, response);

            var resultServerAddFiles = _serverAddFiles.Get(databaseFiles, deviceFiles, serverFiles);

            AddUploadRequest(resultServerAddFiles, response);

            var resultClientAddFiles = _clientAddFiles.Get(databaseFiles, deviceFiles, serverFiles);

            AddFilesAddResponse(resultClientAddFiles, response);

            var resultClientUpdateFiles = _clientUpdateFiles.Get(databaseFiles, deviceFiles, serverFiles);

            AddUpdatedResponse(resultClientUpdateFiles, response);

            var clientServerExistFiles = _clientServerExistFiles.Get(databaseFiles, deviceFiles, serverFiles);

            _syncTableDataBase.AddStates(login, clientServerExistFiles.Select(x => x.Path).ToArray());
            _syncTableDataBase.RemoveSyncStates(login, resultServerRemoveFiles.Select(x => x.Path).ToList());

            foreach (var filePath in resultServerRemoveFiles.ToList())
            {
                _fileManager.RemoveFile(filePath.Path);
                RaiseSendMessage($"Remove {filePath.Path}");
            }

            ApiController.SendResponse(e, response);
        }
Beispiel #2
0
        private void HandleUploadRequest(UploadRequest request, HttpRequestEventArgs e)
        {
            _logger.Debug(() => $"Upload {request.FileName}");

            var login = _connectionStateManager.GetLoginByToken(request.Token);


            bool isValidRequest = _filesService.HandleUploadRequest(
                login,
                request.FileName,
                e.Request.InputStream,
                e.Request.ContentLength64,
                out UploadResponse response,
                out HttpStatusCode errorStatusCode,
                out string errorMessage);

            if (!isValidRequest)
            {
                e.Response.StatusCode = (int)errorStatusCode;
                _logger.Warn(() => errorMessage);
            }

            RaiseSendMessage($"Added from {login}: {request.FileName}");
            e.Response.SendChunked = true;
            using (var streamWriter = new StreamWriter(e.Response.OutputStream, Encoding.UTF8))
            {
                var serializer = JsonSerializer.Create(new JsonSerializerSettings {
                    NullValueHandling = NullValueHandling.Ignore
                });
                var jsonWriter = new JsonTextWriter(streamWriter);

                try
                {
                    serializer.Serialize(jsonWriter, response);
                }
                finally
                {
                    jsonWriter.Close();
                }
            }
        }
Beispiel #3
0
        public bool HandleDownloadRequest(DownloadRequest request, Stream stream, out HttpStatusCode errorStatusCode, out string errorMessage)
        {
            errorStatusCode = HttpStatusCode.Forbidden;

            if (string.IsNullOrEmpty(request.FilePath) || !File.Exists(request.FilePath))
            {
                errorStatusCode = HttpStatusCode.NotFound;
                errorMessage    = $"File {request.FilePath} is not exist!";
                return(false);
            }

            // В реализации `ResponseStream` в качестве буфера используется `MemoryStream`,
            // в который идёт запись до тех пор, пока поток не будет закрыт или не будет явно вызван метод `ResponseStream.Flush()`.
            // Чтобы при чтении больших файлов не уходить в `OutOfMemory`, читаем файл порционно.
            // read stream from file

            using (Stream reader = File.OpenRead(request.FilePath))
            {
                var buffer = new byte[READ_FILE_BUFFER_SIZE];

                int count;
                while ((count = reader.Read(buffer, 0, buffer.Length)) > 0)
                {
                    stream.Write(buffer, 0, count);
                    stream.Flush();
                    _logger.Trace(() => $"Sending {request.FilePath} ${count}/{reader.Length}");
                }
            }

            errorStatusCode = HttpStatusCode.OK;

            var login = _connectionStateManager.GetLoginByToken(request.Token);

            _syncTableDataBase.AddState(login, request.FilePath);

            errorMessage = null;
            return(true);
        }