async Task IServer.DownloadFile(SrvDownloadRequest request, ITcpOp tcpOp) { _log.Info(request.TrackingId, request); validate(request); var user = await getUser(request); authenticate(user, request); var srcPath = makeFilePath(user, request.FileName); if (!File.Exists(srcPath)) { throw new ApplicationException($"Can't find '{request.FileName}'"); } var file = File.Open(srcPath, FileMode.Open, FileAccess.Read); var response = makeResponse <SrvDownloadResponse>(request); response.FileSize = file.Length; await tcpOp.Write(response); await tcpOp.WriteBytesFrom(file, file.Length); file.Close(); _log.Info(request.TrackingId, response); }
async Task IServer.UploadFile(SrvUploadRequest request, ITcpOp tcpOp) { _log.Info(request.TrackingId, request); validate(request); var user = await getUser(request); authenticate(user, request); var dstPath = makeFilePath(user, request.FileName); Directory.CreateDirectory(user.Folder); var file = File.Open(dstPath, FileMode.Create); var response = makeResponse <SrvUploadResponse>(request); await tcpOp.Write(response); await tcpOp.ReadBytesTo(file, request.FileSize); file.Flush(); file.Close(); await tcpOp.Write(response); _log.Info(request.TrackingId, response); }
async Task IServer.Ping(SrvPingRequest request, ITcpOp tcpOp) { validate(request); var user = await getUser(request); authenticate(user, request); var response = makeResponse <SrvPongResponse>(request); await tcpOp.Write(response); }
async Task IServer.ListFiles(SrvListRequest request, ITcpOp tcpOp) { _log.Info(request.TrackingId, request); validate(request); var user = await getUser(request); authenticate(user, request); Directory.CreateDirectory(user.Folder); var fileList = Directory .GetFiles(user.Folder) .Select(path => Path.GetFileName(path)) .ToArray(); var response = makeResponse <SrvListResponse>(request); response.FileNames = fileList; await tcpOp.Write(response); _log.Info(request.TrackingId, response); }
async Task IServer.DeleteFile(SrvDeleteRequest request, ITcpOp tcpOp) { _log.Info(request.TrackingId, request); validate(request); var user = await getUser(request); authenticate(user, request); var path = makeFilePath(user, request.FileName); if (!File.Exists(path)) { throw new ApplicationException($"'{request.FileName}' is not found"); } File.Delete(path); var response = makeResponse <SrvDeleteResponse>(request); await tcpOp.Write(response); _log.Info(request.TrackingId, response); }
private async Task <bool> dispathRequest(SrvRequest request, string jRequest, ITcpOp tcpOp) { try { switch (request.Command) { case SrvRequest.PING: var pingRequest = jRequest.Parse <SrvPingRequest>(); await _server.Ping(pingRequest, tcpOp); break; case SrvRequest.LIST: var listRequest = jRequest.Parse <SrvListRequest>(); await _server.ListFiles(listRequest, tcpOp); break; case SrvRequest.UPLOAD: var uploadRequest = jRequest.Parse <SrvUploadRequest>(); await _server.UploadFile(uploadRequest, tcpOp); break; case SrvRequest.DOWNLOAD: var downloadRequest = jRequest.Parse <SrvDownloadRequest>(); await _server.DownloadFile(downloadRequest, tcpOp); break; case SrvRequest.DELETE: var deleteRequest = jRequest.Parse <SrvDeleteRequest>(); await _server.DeleteFile(deleteRequest, tcpOp); break; default: throw new IOException($"Unknown command: {request.Command}"); } return(true); } catch (Exception ex) { _log.Error(request.TrackingId, ex); await tcpOp.Write(new SrvResponse { TrackingId = request.TrackingId, Error = ex.Message }); return(false); } }