# HG changeset patch # User Laman # Date 2017-11-02 21:49:54 # Node ID b022997ba96d1c6c165a522a839a648485c67e56 # Parent 362cff56074049d60ae88a4ab36c3e63e0208ceb more on server denying connection diff --git a/src/server.py b/src/server.py --- a/src/server.py +++ b/src/server.py @@ -33,11 +33,17 @@ class Miniserver: self._ss.listen(1) def serve(self): - while True: - with Connection(self._ss,self._ssl) as c: - p=multiprocessing.Process(target=Server.run,args=(c,self._filename,self._treeFile)) + p=None + with self._ss: + while True: + connection=Connection(self._ss,self._ssl) + if p and p.is_alive(): + with connection as c: + c[0].readMsg() + c[1].writeMsg({"command":"deny"}) + continue + p=multiprocessing.Process(target=Server.run,args=(connection,self._filename,self._treeFile)) p.start() - p.join() class Server(NetNode): @@ -51,9 +57,10 @@ class Server(NetNode): self._dataFileHandle=None @staticmethod - def run(*args): - s=Server(*args) - s.serve() + def run(connection,*args): + with connection as c: + s=Server(c,*args) + s.serve() @property def _dataFile(self): @@ -75,6 +82,8 @@ class Server(NetNode): self._outcoming.writeMsg({"command":"deny"}) if jsonData["action"]=="pull" and self.isLocked(): self._outcoming.writeMsg({"command":"deny"}) + if jsonData["action"]=="push" and not self.isLocked(): + self._lock() self._outcoming.writeMsg({"command":"init", "version":conf.version}) diff --git a/src/tests/test_overall.py b/src/tests/test_overall.py --- a/src/tests/test_overall.py +++ b/src/tests/test_overall.py @@ -1,5 +1,4 @@ import os -import sys import shutil import hashlib import multiprocessing @@ -8,7 +7,7 @@ from unittest import TestCase import config from hashtree import HashTree -from client import Client, Connection as ClientConnection +from client import Client, Connection as ClientConnection, DeniedConnection from server import Miniserver from . import RedirectedOutput @@ -56,6 +55,7 @@ class TestMorevna(RedirectedOutput,TestC os.remove(treeFile) def test_push(self): + config.port+=1 ms=Miniserver(filename) p=multiprocessing.Process(target=ms.serve) p.start() @@ -65,6 +65,7 @@ class TestMorevna(RedirectedOutput,TestC c=Client(clientFile) with ClientConnection("127.0.0.1",config.port) as con: c.setConnection(con) + c.init("push") blocksToTransfer=c.negotiate() c.sendData(blocksToTransfer) @@ -74,6 +75,7 @@ class TestMorevna(RedirectedOutput,TestC p.join() def test_pull(self): + config.port+=1 serverFile=os.path.join(dataDir,"test3.img") ms=Miniserver(serverFile) p=multiprocessing.Process(target=ms.serve) @@ -82,6 +84,7 @@ class TestMorevna(RedirectedOutput,TestC c=Client(filename) with ClientConnection("127.0.0.1",config.port) as con: c.setConnection(con) + c.init("pull") blocksToTransfer=c.negotiate() c.pullData(blocksToTransfer) @@ -89,3 +92,24 @@ class TestMorevna(RedirectedOutput,TestC p.terminate() p.join() + + def test_deny(self): + config.port+=1 + ms=Miniserver(filename) + p=multiprocessing.Process(target=ms.serve) + p.start() + + c1=Client(os.path.join(dataDir,"test2.img")) + with ClientConnection("127.0.0.1",config.port) as con1: + c1.setConnection(con1) + c1.init("push") + + c2=Client(os.path.join(dataDir,"test3.img")) + with ClientConnection("127.0.0.1",config.port) as con2: + c2.setConnection(con2) + with self.assertRaises(DeniedConnection): + c2.init("push") + c1.sendData([]) # to unlock the server + + p.terminate() + p.join()