comparison weatherlog/http_writer.py @ 18:9daa281d996b

Add a HTTP timeout, and verify the server response.
author Paul Fisher <paul@pfish.zone>
date Thu, 16 Jan 2020 23:52:30 -0500
parents c01f9929ae38
children
comparison
equal deleted inserted replaced
17:39c0686e6765 18:9daa281d996b
3 import typing as t 3 import typing as t
4 4
5 import requests 5 import requests
6 6
7 from . import logger 7 from . import logger
8
9 TIMEOUT_SECS = 60
8 10
9 11
10 class HTTPWriter(logger.RemoteWriter): 12 class HTTPWriter(logger.RemoteWriter):
11 13
12 def __init__(self, url: str, preamble: t.Dict[str, object]): 14 def __init__(self, url: str, preamble: t.Dict[str, object]):
16 self._preamble = logger.bson_encode(preamble) 18 self._preamble = logger.bson_encode(preamble)
17 19
18 def write(self, readings: t.Iterable[t.Dict[str, object]]) -> None: 20 def write(self, readings: t.Iterable[t.Dict[str, object]]) -> None:
19 try: 21 try:
20 data = b''.join(map(logger.bson_encode, readings)) 22 data = b''.join(map(logger.bson_encode, readings))
21 response = self._session.post(self._url, data=self._preamble + data) 23 response = self._session.post(
24 self._url, data=self._preamble + data, timeout=TIMEOUT_SECS)
22 response.raise_for_status() 25 response.raise_for_status()
26 contents = response.json()
27 if contents.get('status') != 'OK':
28 raise logger.RemoteWriteError(
29 f'Invalid server response: {contents!r}')
23 except requests.exceptions.RequestException as rex: 30 except requests.exceptions.RequestException as rex:
24 raise logger.RemoteWriteError("Coulndn't write values") from rex 31 raise logger.RemoteWriteError("Coulndn't write values") from rex
32 except ValueError as ve:
33 raise logger.RemoteWriteError('Invalid JSON response') from ve