class SocketService(SimpleService):
def __init__(self, configuration=None, name=None):
self._sock = None
- self._keep_alive = True
+ self._keep_alive = False
self.host = "localhost"
self.port = None
self.unix_socket = None
def _connect(self):
"""
- Recreate socket and connect to it since they cannot be reused
+ Recreate socket and connect to it since sockets cannot be reused after closing
Available configurations are IPv6, IPv4 or UNIX socket
:return:
"""
data = ""
while True:
try:
- ready_to_read, _, in_error = select.select([self._sock], [], [], 0.01)
+ ready_to_read, _, in_error = select.select([self._sock], [], [], 60)
except Exception as e:
self.debug("SELECT", str(e))
self._disconnect()
if len(buf) == 0 or buf is None:
break
data += buf.decode()
+ if self._check_raw_data(data):
+ break
else:
- self._disconnect()
+ # self._disconnect()
break
return data
if not self._send():
return None
- finished = False
- data = ""
- prevent_infinite_loop = 1000000
- while not finished:
- data += self._receive()
- finished = self._check_raw_data(data)
- prevent_infinite_loop -= 1
- if prevent_infinite_loop <= 0:
- self.debug("Almost got into infinite loop while grabbing data. Is _check_raw_data() ok?")
- break
+ data = self._receive()
if not self._keep_alive:
self._disconnect()
class Service(SocketService):
def __init__(self, configuration=None, name=None):
SocketService.__init__(self, configuration=configuration, name=name)
- self._keep_alive = False
+ self._keep_alive = True
self.request = ""
self.host = "localhost"
self.port = 3128
"""
data = {}
try:
- raw = self._get_raw_data().split('\r\n')[-1]
+ raw = ""
+ for tmp in self._get_raw_data().split('\r\n'):
+ if tmp.startswith("sample_time"):
+ raw = tmp
+ break
if raw.startswith('<'):
self.error("invalid data received")
return None
self.error("invalid data received")
return None
- self.debug("DATA:", str(len(raw)))
if len(data) == 0:
self.error("no data received")
return None
return data
def _check_raw_data(self, data):
- if "Content-Length" not in data[:1024]: # assuming headers should be in first 1024 bytes (performance)
- return True # "Content-Length" not found, assume everything is ok
-
- # TODO write some parser of "Content-Length"
- return True
- length = len(data)
-
+ if "Connection: keep-alive" in data[:1024]:
+ self._keep_alive = True
+ else:
+ self._keep_alive = False
- supposed = 0
- if length >= supposed:
+ if "client" in data and "server.all" in data:
return True
else:
return False
-
- return False
+ # # TODO write some parser of "Transfer-Encoding: chunked"
+ # if "Transfer-Encoding: chunked" in data[:1024]:
+ # data = data[self.__last:]
+ #
+ #
+ # print(data)
+ # import time
+ # time.sleep(10)
+ # return False
+ # supposed = 0
+ # if length >= supposed:
+ # return True
+ # else:
+ # return False
+ #
+ # return False
def check(self):
"""
req = self.request.decode()
if not req.startswith("GET"):
req = "GET " + req
- if not req.endswith(" HTTP/1.0\r\n\r\n"):
- req += " HTTP/1.0\r\n\r\n"
+ if not req.endswith(" HTTP/1.1\r\n\r\n"):
+ req += " HTTP/1.1\r\n\r\n"
self.request = req.encode()
if self._get_data() is not None:
return True