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); }
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(); } } }
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); }