From da87c24db9182e5d2b57fb61b02b3fb96be29db6 Mon Sep 17 00:00:00 2001 From: Andrey Date: Fri, 19 Feb 2021 09:50:31 +0300 Subject: [PATCH] add proxy support --- .experiment.py | 52 ++++++--------------- custom_components/mega/config_flow.py | 4 +- custom_components/mega/const.py | 1 + custom_components/mega/http.py | 13 ++++-- custom_components/mega/hub.py | 2 + custom_components/mega/manifest.json | 2 +- custom_components/mega/strings.json | 1 + custom_components/mega/translations/en.json | 2 + custom_components/mega/translations/ru.json | 2 + custom_components/mega/translations/uk.json | 2 + 10 files changed, 35 insertions(+), 46 deletions(-) diff --git a/.experiment.py b/.experiment.py index 3f7dbaf..0ae89f6 100644 --- a/.experiment.py +++ b/.experiment.py @@ -1,56 +1,30 @@ import asyncio -from urllib.parse import urlparse, parse_qsl from asyncio import Event, FIRST_COMPLETED import signal -import typing -from logging import getLogger, DEBUG stop = Event() loop = asyncio.get_event_loop() -lg = getLogger(__name__) -lg.setLevel(DEBUG) -def make_handler(get_ans: typing.Callable[[dict], str]): - - async def handler( - reader: asyncio.StreamReader, - writer: asyncio.StreamWriter, - ): - data = await reader.read(200) - print(data) - message = data.decode() - addr = writer.get_extra_info('peername') - lg.debug('process msg "%s" from %s', message, addr) - try: - (_, p, *_) = message.split(' ') - p = dict(parse_qsl(urlparse(p).query)) - lg.debug('query %s', p) - ans = get_ans(p) - ans = f'''HTTP/1.1 200 OK\nContent-Length: {len(ans)}\n\n{ans}'''.encode() # \nContent-Length: 6 - ans = b'HTTP/1.1 200 OK\r\n\r\n7:2' - print(ans) - except Exception as exc: - print(exc) - lg.exception('process msg "%s" from %s', message, addr) - ans = '''HTTP/1.1 500\n\n'''.encode() - writer.write(ans) - await writer.drain() - # writer.transport.close() - writer.close() - await writer.wait_closed() - return handler +async def handler( + reader: asyncio.StreamReader, + writer: asyncio.StreamWriter, +): + await reader.read(100) + ans = b'HTTP/1.1 200 OK\r\nContent-Length:1\r\n\r\nd' + writer.write(ans) + await writer.drain() + writer.close() + await writer.wait_closed() async def serve(): server = await asyncio.start_server( - make_handler(lambda x: '7:2'), + handler, host='0.0.0.0', - port=1111, + port=8888, ) - addr = server.sockets[0].getsockname() - print(f'Serving on {addr}') async with server: await asyncio.wait((server.serve_forever(), stop.wait()), return_when=FIRST_COMPLETED) @@ -58,4 +32,4 @@ if __name__ == '__main__': loop.add_signal_handler( signal.SIGINT, stop.set ) - loop.run_until_complete(serve()) \ No newline at end of file + loop.run_until_complete(serve()) diff --git a/custom_components/mega/config_flow.py b/custom_components/mega/config_flow.py index 77e0e91..a96c179 100644 --- a/custom_components/mega/config_flow.py +++ b/custom_components/mega/config_flow.py @@ -10,7 +10,7 @@ from homeassistant.config_entries import ConfigEntry from homeassistant.const import CONF_HOST, CONF_ID, CONF_PASSWORD, CONF_SCAN_INTERVAL from homeassistant.core import callback, HomeAssistant from .const import DOMAIN, CONF_PORT_TO_SCAN, CONF_RELOAD, PLATFORMS, CONF_MQTT_INPUTS, \ - CONF_NPORTS, CONF_UPDATE_ALL, CONF_POLL_OUTS # pylint:disable=unused-import + CONF_NPORTS, CONF_UPDATE_ALL, CONF_POLL_OUTS, CONF_FAKE_RESPONSE # pylint:disable=unused-import from .hub import MegaD from . import exceptions @@ -27,6 +27,7 @@ STEP_USER_DATA_SCHEMA = vol.Schema( vol.Optional(CONF_MQTT_INPUTS, default=True): bool, vol.Optional(CONF_NPORTS, default=37): int, vol.Optional(CONF_UPDATE_ALL, default=True): bool, + vol.Optional(CONF_FAKE_RESPONSE, default=True): bool, }, ) @@ -138,6 +139,7 @@ class OptionsFlowHandler(config_entries.OptionsFlow): vol.Optional(CONF_NPORTS, default=e.get(CONF_NPORTS, 37)): int, vol.Optional(CONF_RELOAD, default=False): bool, vol.Optional(CONF_UPDATE_ALL, default=e.get(CONF_UPDATE_ALL, True)): bool, + vol.Optional(CONF_FAKE_RESPONSE, default=e.get(CONF_FAKE_RESPONSE, True)): bool, # vol.Optional(CONF_INVERT, default=''): str, }), ) diff --git a/custom_components/mega/const.py b/custom_components/mega/const.py index e3a53d6..0c6b165 100644 --- a/custom_components/mega/const.py +++ b/custom_components/mega/const.py @@ -23,6 +23,7 @@ CONF_NPORTS = 'nports' CONF_RESPONSE_TEMPLATE = 'response_template' CONF_ACTION = 'action' CONF_UPDATE_ALL = 'update_all' +CONF_FAKE_RESPONSE = 'fake_response' CONF_GET_VALUE = 'get_value' CONF_ALLOW_HOSTS = 'allow_hosts' CONF_CONV_TEMPLATE = 'conv_template' diff --git a/custom_components/mega/http.py b/custom_components/mega/http.py index 230e387..e7f678d 100644 --- a/custom_components/mega/http.py +++ b/custom_components/mega/http.py @@ -15,6 +15,7 @@ from .tools import make_ints from . import hub as h _LOGGER = logging.getLogger(__name__).getChild('http') +we class MegaView(HomeAssistantView): @@ -78,11 +79,13 @@ class MegaView(HomeAssistantView): template.hass = hass ret = template.async_render(data) _LOGGER.debug('response %s', ret) - Response(body='', content_type='text/plain', headers={'Server': 's', 'Date': 'n'}) - if 'd' in ret: - await hub.request(pt=port, cmd=ret) - else: - await hub.request(cmd=ret) + Response(body='' if hub.fake_response else ret, content_type='text/plain') + + if hub.fake_response: + if 'd' in ret: + await hub.request(pt=port, cmd=ret) + else: + await hub.request(cmd=ret) return ret async def later_update(self, hub): diff --git a/custom_components/mega/hub.py b/custom_components/mega/hub.py index f4b7566..4ec075c 100644 --- a/custom_components/mega/hub.py +++ b/custom_components/mega/hub.py @@ -75,6 +75,7 @@ class MegaD: inverted: typing.List[int] = None, update_all=True, poll_outs=False, + fake_response=True, **kwargs, ): """Initialize.""" @@ -87,6 +88,7 @@ class MegaD: self.poll_outs = poll_outs self.update_all = update_all if update_all is not None else True self.nports = nports + self.fake_response = fake_response self.mqtt_inputs = mqtt_inputs self.loop: asyncio.AbstractEventLoop = None self.hass = hass diff --git a/custom_components/mega/manifest.json b/custom_components/mega/manifest.json index e6c4be6..af5e967 100644 --- a/custom_components/mega/manifest.json +++ b/custom_components/mega/manifest.json @@ -15,5 +15,5 @@ "@andvikt" ], "issue_tracker": "https://github.com/andvikt/mega_hacs/issues", - "version": "v0.4.1" + "version": "v0.4.2b1" } \ No newline at end of file diff --git a/custom_components/mega/strings.json b/custom_components/mega/strings.json index 84217c2..979a1dd 100644 --- a/custom_components/mega/strings.json +++ b/custom_components/mega/strings.json @@ -15,6 +15,7 @@ "mqtt_inputs": "[%key:common::config_flow::data::mqtt_inputs%]", "nports": "[%key:common::config_flow::data::nports%]", "update_all": "[%key:common::config_flow::data::update_all%]", + "fake_response": "[%key:common::config_flow::data::fake_response%]", "poll_outs": "[%key:common::config_flow::data::poll_outs%]" } } diff --git a/custom_components/mega/translations/en.json b/custom_components/mega/translations/en.json index 960cc56..d692296 100644 --- a/custom_components/mega/translations/en.json +++ b/custom_components/mega/translations/en.json @@ -23,6 +23,7 @@ "nports": "Number of ports", "update_all": "Update all outs when input", "mqtt_inputs": "Use MQTT", + "fake_response": "Fake response", "poll_outs": "Poll outs" } } @@ -37,6 +38,7 @@ "reload": "Reload objects", "mqtt_inputs": "Use MQTT", "update_all": "Update all outs when input", + "fake_response": "Fake response", "poll_outs": "Poll outs" } } diff --git a/custom_components/mega/translations/ru.json b/custom_components/mega/translations/ru.json index 4e1fc81..45048fc 100644 --- a/custom_components/mega/translations/ru.json +++ b/custom_components/mega/translations/ru.json @@ -22,6 +22,7 @@ "mqtt_inputs": "Использовать MQTT", "nports": "Кол-во портов", "update_all": "Обновить все выходы когда срабатывает вход", + "fake_response": "Имитация http-ответа", "poll_outs": "Обновлять выходы (регулярно)" } } @@ -36,6 +37,7 @@ "reload": "Обновить объекты", "invert": "Список портов (через ,) с инвертированной логикой", "mqtt_inputs": "Использовать MQTT", + "fake_response": "Имитация http-ответа", "nports": "Кол-во портов", "update_all": "Обновить все выходы когда срабатывает вход", "poll_outs": "Обновлять выходы (регулярно)" diff --git a/custom_components/mega/translations/uk.json b/custom_components/mega/translations/uk.json index e101b88..d71481e 100644 --- a/custom_components/mega/translations/uk.json +++ b/custom_components/mega/translations/uk.json @@ -22,6 +22,7 @@ "mqtt_inputs": "Використовувати MQTT", "nports": "Кількість портів", "update_all": "Оновити всі виходи коли спрацьовує вхід", + "fake_response": "Имитация http-ответа", "poll_outs": "Оновити виходи" } } @@ -37,6 +38,7 @@ "invert": "Список портів з інвертованою логікою (через ,)", "mqtt_inputs": "Використовувати MQTT", "nports": "Кількість портів", + "fake_response": "Имитация http-ответа", "update_all": "Оновити всі виходи коли спрацьовує вхід", "poll_outs": "Оновити виходи" }