From de67e405c56579379ee62639b96dd768d418a39b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roberto=20Abdelkader=20Mart=C3=ADnez=20P=C3=A9rez?= Date: Mon, 29 Apr 2019 13:01:37 +0200 Subject: [PATCH] Reimplementing response tool in python to allow streaming put from stdin. --- poc/bin/response | 38 +++++++++++++++++++++++++++++--------- poc/kapow | 6 +++++- 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/poc/bin/response b/poc/bin/response index 225aa83..c0961e4 100755 --- a/poc/bin/response +++ b/poc/bin/response @@ -1,4 +1,4 @@ -#!/bin/sh +#!/usr/bin/env python # # Copyright 2019 Banco Bilbao Vizcaya Argentaria, S.A. @@ -16,11 +16,31 @@ # limitations under the License. # -if [ $# -lt 1 ]; then - echo "Response object is mandatory" >&2 - exit 1 -elif [ $# -eq 1 ]; then - curl -N -sf -X PUT --data-binary @- ${KAPOW_URL}/connections/${KAPOW_CONNECTION}/response$1 -else - curl -sf -X PUT --data-binary "$2" ${KAPOW_URL}/connections/${KAPOW_CONNECTION}/response$1 -fi +import sys + +import click +import requests + + +@click.command() +@click.option("--url", envvar='KAPOW_URL') +@click.option("--connection", envvar='KAPOW_CONNECTION') +@click.argument("path", nargs=1) +@click.argument("value", required=False) +def response(url, connection, path, value): + if value is None: + data = sys.stdin.buffer + else: + data = value.encode('utf-8') + + try: + response = requests.put(f"{url}/connections/{connection}/response{path}", + data=data) + except requests.exceptions.ConnectionError: + return False + else: + response.raise_for_status() + + +if __name__ == '__main__': + response() diff --git a/poc/kapow b/poc/kapow index 5442904..41d8808 100755 --- a/poc/kapow +++ b/poc/kapow @@ -159,7 +159,11 @@ async def get_resource(request): async def set_resource(request): id = request.match_info["id"] resource = request.match_info["resource"] - await CONNECTIONS[id].set(resource, request.content) + try: + await CONNECTIONS[id].set(resource, request.content) + except ConnectionResetError: + # Raised when trying to write to an already-closed stream. + request.transport.close() return web.Response(body=b'')