2018-01-04 02:45:23 +01:00
|
|
|
import logging
|
|
|
|
import json
|
2018-01-04 17:20:35 +01:00
|
|
|
import time
|
2018-01-04 02:45:23 +01:00
|
|
|
|
|
|
|
from multiprocessing import Process
|
|
|
|
from flask import Flask, abort, jsonify, request
|
|
|
|
|
2018-01-04 17:20:35 +01:00
|
|
|
from platypush.config import Config
|
2018-01-04 02:45:23 +01:00
|
|
|
from platypush.message import Message
|
|
|
|
from platypush.message.request import Request
|
|
|
|
|
|
|
|
from .. import Backend
|
|
|
|
|
|
|
|
|
|
|
|
class HttpBackend(Backend):
|
|
|
|
""" Example interaction with the HTTP backend to make requests:
|
2018-01-04 17:20:35 +01:00
|
|
|
$ curl -XPOST -d "token=your_configured_token" \
|
2018-01-04 02:45:23 +01:00
|
|
|
-d 'msg={"type":"request","target":"volta","action":"tts.say","args": {"phrase":"This is a test"}}' \
|
|
|
|
http://localhost:8008 """
|
|
|
|
|
|
|
|
def __init__(self, port=8008, token=None, **kwargs):
|
|
|
|
super().__init__(**kwargs)
|
|
|
|
self.port = port
|
|
|
|
self.token = token
|
2018-01-04 17:20:35 +01:00
|
|
|
self.server_proc = None
|
2018-01-04 02:45:23 +01:00
|
|
|
|
|
|
|
|
|
|
|
def send_message(self, msg):
|
2018-01-04 17:20:35 +01:00
|
|
|
logging.warning('Use cURL or any HTTP client to query the HTTP backend')
|
2018-01-04 02:45:23 +01:00
|
|
|
|
|
|
|
|
2018-01-04 17:20:35 +01:00
|
|
|
def stop(self):
|
|
|
|
logging.info('Received STOP event on HttpBackend')
|
|
|
|
if self.server_proc:
|
|
|
|
self.server_proc.terminate()
|
|
|
|
self.server_proc.join()
|
2018-01-04 02:45:23 +01:00
|
|
|
|
|
|
|
|
2018-01-04 17:20:35 +01:00
|
|
|
def run(self):
|
|
|
|
super().run()
|
2018-01-04 02:45:23 +01:00
|
|
|
|
2018-01-04 17:20:35 +01:00
|
|
|
app = Flask(__name__)
|
2018-01-04 02:45:23 +01:00
|
|
|
|
2018-01-04 17:20:35 +01:00
|
|
|
@app.route('/', methods=['POST'])
|
|
|
|
def index():
|
|
|
|
args = { k:v for (k,v) in request.form.items() }
|
2018-01-04 02:45:23 +01:00
|
|
|
|
2018-01-04 17:20:35 +01:00
|
|
|
if self.token and ('token' not in args or args['token'] != self.token): abort(401)
|
|
|
|
if 'msg' not in args: abort(400)
|
2018-01-04 02:45:23 +01:00
|
|
|
|
2018-01-04 17:20:35 +01:00
|
|
|
msg = Message.build(args['msg'])
|
|
|
|
logging.info('Received message on the HTTP backend: {}'.format(msg))
|
2018-01-04 02:45:23 +01:00
|
|
|
|
2018-01-04 17:20:35 +01:00
|
|
|
if isinstance(msg, Request):
|
|
|
|
response = msg.execute(async=False)
|
|
|
|
logging.info('Processing response on the HTTP backend: {}'.format(msg))
|
|
|
|
return str(response)
|
2018-01-04 02:45:23 +01:00
|
|
|
|
2018-01-04 17:20:35 +01:00
|
|
|
return jsonify({ 'status': 'ok' })
|
|
|
|
|
|
|
|
logging.info('Initialized HTTP backend on port {}'.format(self.port))
|
|
|
|
|
|
|
|
self.server_proc = Process(target=app.run, kwargs={
|
2018-01-04 17:34:25 +01:00
|
|
|
'debug':True, 'host':'0.0.0.0', 'port':self.port, 'use_reloader':False
|
2018-01-04 17:20:35 +01:00
|
|
|
})
|
|
|
|
|
|
|
|
time.sleep(1)
|
2018-01-04 02:45:23 +01:00
|
|
|
|
|
|
|
self.server_proc.start()
|
|
|
|
self.server_proc.join()
|
|
|
|
|
|
|
|
|
|
|
|
# vim:sw=4:ts=4:et:
|
|
|
|
|