From a2393848affdbf30a95d8821789be3b98af2f440 Mon Sep 17 00:00:00 2001 From: Philippe PITTOLI Date: Sat, 4 Jan 2020 10:45:39 +0100 Subject: [PATCH] transfers ok --- shard.yml | 2 +- src/client/main.cr | 27 +++++++++++++++++--- src/common/filestorage.cr | 5 ++-- src/server/handlers.cr | 10 +++++--- src/server/main-loop.cr | 53 ++++++--------------------------------- 5 files changed, 41 insertions(+), 56 deletions(-) diff --git a/shard.yml b/shard.yml index f4df7ca..0975af7 100644 --- a/shard.yml +++ b/shard.yml @@ -20,7 +20,7 @@ targets: main: src/tests/common-tests.cr json-tests: main: src/tests/json_tests.cr - server: + filestoraged: main: src/server/main.cr client: main: src/client/main.cr diff --git a/src/client/main.cr b/src/client/main.cr index 3612557..5b51023 100644 --- a/src/client/main.cr +++ b/src/client/main.cr @@ -17,7 +17,7 @@ service_name = "filestorage" files_and_directories_to_transfer = Array(String).new # This is the requests we will send to the server -requests = Array(FM::Request).new +upload_requests = Array(FM::UploadRequest).new OptionParser.parse do |parser| @@ -68,10 +68,10 @@ files_and_directories_to_transfer.each do |f| end files_info.values.each do |file_info| - requests << FM::UploadRequest.new file_info + upload_requests << FM::UploadRequest.new file_info end -pp! requests +# pp! upload_requests # # Connection to the service @@ -84,7 +84,8 @@ client = IPC::Client.new service_name # token = FileStorage::Token.new 1002, "karchnu" -authentication_message = FM::Authentication.new token, requests +authentication_message = FM::Authentication.new token, upload_requests +pp! authentication_message client.send FileStorage::MessageType::Authentication.to_u8, authentication_message.to_json # @@ -99,6 +100,7 @@ response = FM::Response.from_json(String.new m.payload) if response.mid == authentication_message.mid puts "This is a response for the authentication message" + pp! response else raise "Message IDs from authentication message and its response differ" end @@ -122,6 +124,23 @@ def file_transfer(client : IPC::Client, file : File, file_info : FileStorage::Fi counter += 1 buffer = Bytes.new buffer_size + + + # Check for the response + m = client.read + mtype = FileStorage::MessageType.new m.type.to_i32 + if mtype != FileStorage::MessageType::Response + pp! m + raise "Message received was not expected: #{mtype}" + end + + response = FM::Response.from_json(String.new m.payload) + + if response.mid != transfer_message.mid + raise "Message received has a wrong mid: #{response.mid} != #{transfer_message.mid}" + else + pp! response + end end end diff --git a/src/common/filestorage.cr b/src/common/filestorage.cr index 5281f55..8f0bf84 100644 --- a/src/common/filestorage.cr +++ b/src/common/filestorage.cr @@ -127,10 +127,11 @@ module FileStorage # autogenerated mid: String, token: Token, - requests: Array(Request) + uploads: Array(UploadRequest), + downloads: Array(DownloadRequest) }) - def initialize(@token, @requests = Array(Request).new) + def initialize(@token, @uploads = Array(UploadRequest).new, @downloads = Array(DownloadRequest).new) @mid = UUID.random.to_s end end diff --git a/src/server/handlers.cr b/src/server/handlers.cr index ad5b629..41dbe01 100644 --- a/src/server/handlers.cr +++ b/src/server/handlers.cr @@ -14,8 +14,8 @@ def hdl_transfer(message : FileStorage::Message::Transfer, pp! transfer_message - puts "chunk: #{transfer_message.chunk}" - puts "data: #{Base64.decode transfer_message.data}" + # puts "chunk: #{transfer_message.chunk}" + # puts "data: #{Base64.decode transfer_message.data}" FileStorage::Message::Response.new message.mid, "Ok" end @@ -98,7 +98,7 @@ def hdl_authentication(event : IPC::Event::Message) # AuthenticationMessage includes requests. new_user = User.new authentication_message.token, - authentication_message.requests + [ authentication_message.uploads, authentication_message.downloads ].flatten Context.connected_users[event.connection.fd] = userid @@ -121,7 +121,7 @@ def hdl_authentication(event : IPC::Event::Message) # TODO: quotas # Quotas are not defined yet. - responses = hdl_requests authentication_message.requests, + responses = hdl_requests [ authentication_message.uploads, authentication_message.downloads ].flatten, Context.users_status[userid], event @@ -129,4 +129,6 @@ def hdl_authentication(event : IPC::Event::Message) # The response is "Ok" when the message is well received and authorized. response = FileStorage::Message::Responses.new authentication_message.mid, "Ok", responses event.connection.send FileStorage::MessageType::Responses.to_u8, response.to_json + pp! FileStorage::MessageType::Responses.to_u8 + pp! response end diff --git a/src/server/main-loop.cr b/src/server/main-loop.cr index 6fe57c4..4b7aedd 100644 --- a/src/server/main-loop.cr +++ b/src/server/main-loop.cr @@ -37,50 +37,13 @@ Context.service.not_nil!.loop do |event| # First, the user has to be authenticated unless we are receiving its first message userid = Context.connected_users[event.connection.fd]? - if ! userid - case mtype - when .authentication? - else - mid = "message id not found" - m = String.new event.message.payload - - case mtype - when .authentication? - when .upload_request? - puts "Upload request" - request = FileStorage::Message::UploadRequest.from_json(m) - mid = request.mid - when .download_request? - puts "Download request" - request = FileStorage::Message::DownloadRequest.from_json(m) - mid = request.mid - when .response? - puts "Response message" - request = FileStorage::Message::Response.from_json(m) - mid = request.mid - raise "not implemented yet" - when .responses? - puts "Responses message" - request = FileStorage::Message::Responses.from_json(m) - mid = request.mid - raise "not implemented yet" - when .error? - puts "Error message" - request = FileStorage::Message::Error.from_json(m) - mid = request.mid - raise "not implemented yet" - when .transfer? - request = FileStorage::Message::Transfer.from_json(m) - mid = request.mid - else - raise "Event type not supported, message from a non connected user." - end - - response = FileStorage::Message::Response.new mid, "Not OK", "Action on non connected user" - event.connection.send FileStorage::MessageType::Response.to_u8, response.to_json - next - end + # if the user is not yet connected but does not try to perform authentication + if ! userid && mtype != FileStorage::MessageType::Authentication + # TODO: replace this with an Error message? + mid = "no message id" + response = FileStorage::Message::Response.new mid, "Not OK", "Action on non connected user" + event.connection.send FileStorage::MessageType::Response.to_u8, response.to_json end case mtype @@ -133,10 +96,10 @@ Context.service.not_nil!.loop do |event| response = hdl_transfer transfer, Context.users_status[userid], event event.connection.send FileStorage::MessageType::Response.to_u8, response.to_json - - hdl_transfer transfer, user, event end else raise "Event type not supported." end +rescue e + puts "A problem occured : #{e.message}" end