diff --git a/taiga/webhooks/migrations/0003_auto_20150122_1021.py b/taiga/webhooks/migrations/0003_auto_20150122_1021.py new file mode 100644 index 00000000..fa565ba3 --- /dev/null +++ b/taiga/webhooks/migrations/0003_auto_20150122_1021.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import datetime +import django_pgjson.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('webhooks', '0002_webhook_name'), + ] + + operations = [ + migrations.AddField( + model_name='webhooklog', + name='created', + field=models.DateTimeField(default=datetime.datetime(2015, 1, 22, 10, 21, 17, 188643), auto_now_add=True), + preserve_default=False, + ), + migrations.AddField( + model_name='webhooklog', + name='duration', + field=models.FloatField(default=0, verbose_name='Duration'), + preserve_default=True, + ), + migrations.AddField( + model_name='webhooklog', + name='request_headers', + field=django_pgjson.fields.JsonField(default={}, verbose_name='Request headers'), + preserve_default=True, + ), + migrations.AddField( + model_name='webhooklog', + name='response_headers', + field=django_pgjson.fields.JsonField(default={}, verbose_name='Response headers'), + preserve_default=True, + ), + ] diff --git a/taiga/webhooks/models.py b/taiga/webhooks/models.py index e4a418c1..0fd212dd 100644 --- a/taiga/webhooks/models.py +++ b/taiga/webhooks/models.py @@ -35,4 +35,8 @@ class WebhookLog(models.Model): url = models.URLField(null=False, blank=False, verbose_name=_("URL")) status = models.IntegerField(null=False, blank=False, verbose_name=_("Status code")) request_data = JsonField(null=False, blank=False, verbose_name=_("Request data")) + request_headers = JsonField(null=False, blank=False, verbose_name=_("Request headers"), default={}) response_data = models.TextField(null=False, blank=False, verbose_name=_("Response data")) + response_headers = JsonField(null=False, blank=False, verbose_name=_("Response headers"), default={}) + duration = models.FloatField(null=False, blank=False, verbose_name=_("Duration"), default=0) + created = models.DateTimeField(auto_now_add=True) diff --git a/taiga/webhooks/tasks.py b/taiga/webhooks/tasks.py index 652b9f56..c65543e6 100644 --- a/taiga/webhooks/tasks.py +++ b/taiga/webhooks/tasks.py @@ -62,17 +62,29 @@ def _send_request(webhook_id, url, key, data): signature = _generate_signature(serialized_data, key) headers = { "X-TAIGA-WEBHOOK-SIGNATURE": signature, + "Content-Type": "application/json" } + request = requests.Request('POST', url, data=serialized_data, headers=headers) + prepared_request = request.prepare() + + session = requests.Session() try: - response = requests.post(url, data=serialized_data, headers=headers) + response = session.send(prepared_request) WebhookLog.objects.create(webhook_id=webhook_id, url=url, status=response.status_code, request_data=data, - response_data=response.content) - except RequestException: + request_headers=dict(prepared_request.headers), + response_data=response.content, + response_headers=dict(response.headers), + duration=response.elapsed.total_seconds()) + except RequestException as e: WebhookLog.objects.create(webhook_id=webhook_id, url=url, status=0, request_data=data, - response_data="error-in-request") + request_headers=dict(prepared_request.headers), + response_data="error-in-request: {}".format(str(e)), + response_headers={}, + duration=0) + session.close() ids = [webhook_log.id for webhook_log in WebhookLog.objects.filter(webhook_id=webhook_id).order_by("-id")[10:]] WebhookLog.objects.filter(id__in=ids).delete()