summaryrefslogtreecommitdiffhomepage
path: root/Storage
diff options
context:
space:
mode:
authorJoey Hess <joeyh@joeyh.name>2016-08-22 13:47:23 -0400
committerJoey Hess <joeyh@joeyh.name>2016-08-22 13:47:23 -0400
commit013529513af62e14c2bfc0eb4f699281cdd94f84 (patch)
tree5e54d01a148587ed5d3fb9eb83eb222613a4c0e3 /Storage
parentf20df55a550cdd5ce88ef59e7bd92d3ca464ab55 (diff)
downloadkeysafe-013529513af62e14c2bfc0eb4f699281cdd94f84.tar.gz
wire up client to Storage.Network
Diffstat (limited to 'Storage')
-rw-r--r--Storage/Network.hs43
1 files changed, 38 insertions, 5 deletions
diff --git a/Storage/Network.hs b/Storage/Network.hs
index 0b6ff49..ec00cf8 100644
--- a/Storage/Network.hs
+++ b/Storage/Network.hs
@@ -9,9 +9,20 @@ module Storage.Network (Server(..), networkServers, networkStorage) where
import Types
import Types.Storage
+import HTTP
import HTTP.Client
+import Servant.Client
+import Network.Wai.Handler.Warp (Port)
+import Network.HTTP.Client (Manager, newManager, defaultManagerSettings)
+import Control.Monad.Trans.Except (ExceptT, runExceptT)
-newtype Server = Server { serverName :: String }
+data Server = Server
+ { serverName :: String
+ , serverPort :: Port
+ }
+
+serverUrl :: Server -> BaseUrl
+serverUrl srv = BaseUrl Http (serverName srv) (serverPort srv) ""
networkServers :: IO [Server]
networkServers = return [] -- none yet
@@ -26,10 +37,14 @@ networkStorage server = Storage
}
store :: Server -> StorableObjectIdent -> Share -> IO StoreResult
-store _server _i _s = return $ StoreFailure "network storage not implemented yet"
+store srv i (Share _n o) =
+ serverRequest srv StoreFailure id $ \pow ->
+ putObject i pow o
retrieve :: Server -> ShareNum -> StorableObjectIdent -> IO RetrieveResult
-retrieve _server _n _i = return $ RetrieveFailure "network storage not implemented yet"
+retrieve srv n i =
+ serverRequest srv RetrieveFailure (RetrieveSuccess . Share n) $
+ getObject i
-- | Servers should automatically obscure, so do nothing.
-- (Could upload chaff.)
@@ -37,8 +52,26 @@ obscure :: Server -> IO ObscureResult
obscure _ = return ObscureSuccess
count :: Server -> IO CountResult
-count _server = return $ CountFailure "network storage not implemented yet"
+count srv = serverRequest srv CountFailure id countObjects
-- | Not needed for servers.
move :: Server -> Storage -> IO ()
-move _ _ = return ()
+move _ _ = error "move is not implemented for servers"
+
+serverRequest
+ :: Server
+ -> (String -> a)
+ -> (r -> a)
+ -> (Maybe ProofOfWork -> Manager -> BaseUrl -> ExceptT ServantError IO (ProofOfWorkRequirement r))
+ -> IO a
+serverRequest srv onerr onsuccess a =
+ go Nothing =<< newManager defaultManagerSettings
+ where
+ url = serverUrl srv
+ go pow manager = do
+ res <- runExceptT $ a pow manager url
+ case res of
+ Left err -> return $ onerr $
+ "server failure: " ++ show err
+ Right (Result r) -> return $ onsuccess r
+ Right needpow -> error "NEEDPOW" -- loop with pow