Mercurial > personal > weatherlog
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 |