get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/811757/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 811757,
    "url": "http://patchwork.ozlabs.org/api/patches/811757/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20170908173801.15205-3-brandon.carpenter@cypherpath.com/",
    "project": {
        "id": 14,
        "url": "http://patchwork.ozlabs.org/api/projects/14/?format=api",
        "name": "QEMU Development",
        "link_name": "qemu-devel",
        "list_id": "qemu-devel.nongnu.org",
        "list_email": "qemu-devel@nongnu.org",
        "web_url": "",
        "scm_url": "",
        "webscm_url": "",
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<20170908173801.15205-3-brandon.carpenter@cypherpath.com>",
    "list_archive_url": null,
    "date": "2017-09-08T17:37:57",
    "name": "[v2,2/6] io: Small updates in preparation for websocket changes",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "91d9149651f2706f2600151abe9e692dc54c208f",
    "submitter": {
        "id": 72031,
        "url": "http://patchwork.ozlabs.org/api/people/72031/?format=api",
        "name": "Brandon Carpenter",
        "email": "brandon.carpenter@cypherpath.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20170908173801.15205-3-brandon.carpenter@cypherpath.com/mbox/",
    "series": [
        {
            "id": 2262,
            "url": "http://patchwork.ozlabs.org/api/series/2262/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=2262",
            "date": "2017-09-08T17:37:56",
            "name": "Update websocket code to more fully support the RFC",
            "version": 2,
            "mbox": "http://patchwork.ozlabs.org/series/2262/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/811757/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/811757/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>",
        "X-Original-To": "incoming@patchwork.ozlabs.org",
        "Delivered-To": "patchwork-incoming@bilbo.ozlabs.org",
        "Authentication-Results": [
            "ozlabs.org;\n\tspf=pass (mailfrom) smtp.mailfrom=nongnu.org\n\t(client-ip=2001:4830:134:3::11; helo=lists.gnu.org;\n\tenvelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n\treceiver=<UNKNOWN>)",
            "ozlabs.org;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=cypherpath.com header.i=@cypherpath.com\n\theader.b=\"gE8+R2VT\"; dkim-atps=neutral"
        ],
        "Received": [
            "from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11])\n\t(using TLSv1 with cipher AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3xplHq282Yz9s8J\n\tfor <incoming@patchwork.ozlabs.org>;\n\tSat,  9 Sep 2017 03:51:35 +1000 (AEST)",
            "from localhost ([::1]:46739 helo=lists.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.71) (envelope-from\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>)\n\tid 1dqNRF-00030c-Cb\n\tfor incoming@patchwork.ozlabs.org; Fri, 08 Sep 2017 13:51:33 -0400",
            "from eggs.gnu.org ([2001:4830:134:3::10]:40089)\n\tby lists.gnu.org with esmtp (Exim 4.71)\n\t(envelope-from <brandon.carpenter@cypherpath.com>)\n\tid 1dqNFQ-0000KB-4I\n\tfor qemu-devel@nongnu.org; Fri, 08 Sep 2017 13:39:21 -0400",
            "from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)\n\t(envelope-from <brandon.carpenter@cypherpath.com>)\n\tid 1dqNFN-0008Ik-2B\n\tfor qemu-devel@nongnu.org; Fri, 08 Sep 2017 13:39:20 -0400",
            "from mail-pf0-x231.google.com ([2607:f8b0:400e:c00::231]:34225)\n\tby eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16)\n\t(Exim 4.71) (envelope-from <brandon.carpenter@cypherpath.com>)\n\tid 1dqNFM-0008Hw-QE\n\tfor qemu-devel@nongnu.org; Fri, 08 Sep 2017 13:39:16 -0400",
            "by mail-pf0-x231.google.com with SMTP id e1so5553582pfk.1\n\tfor <qemu-devel@nongnu.org>; Fri, 08 Sep 2017 10:39:16 -0700 (PDT)",
            "from servo.cypherpath.com (68-113-0-218.static.knwc.wa.charter.com.\n\t[68.113.0.218]) by smtp.gmail.com with ESMTPSA id\n\tc30sm4556833pgn.33.2017.09.08.10.39.14\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\n\tFri, 08 Sep 2017 10:39:15 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=cypherpath.com; s=google;\n\th=mime-version:from:to:cc:subject:date:message-id:in-reply-to\n\t:references:in-reply-to:references;\n\tbh=JZZmlLubV6Q+PMzYYoDbfyYNWN1sqMop387Le6nPk50=;\n\tb=gE8+R2VTAIpw/jy7jaFSqBdUillq5RTvXt2tty+mkK3gcJcvkAYoTfRq/rsqkE/ZJY\n\tp3egMvBRgn4l6lgDNUB9TmnX/jxYwtiJsIeSSeEJUsKIs4Nb3vpc9Osj6pH+tWavQj4C\n\tSJ4yvnIu5L7qLV/5NFKbfp5hhxxTOA/sl49OI=",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:mime-version:from:to:cc:subject:date:message-id\n\t:in-reply-to:references:in-reply-to:references;\n\tbh=JZZmlLubV6Q+PMzYYoDbfyYNWN1sqMop387Le6nPk50=;\n\tb=qXj4whfcA3gd9VYlwUHxmvoBJOcKBj3EsrKyL2irpFhMDilowCmN2M+jvoA63AseIg\n\trBbe9XDGstIllMvXUrWeiTSLoL5JJAucgiwLICQaMtiHKYC0I22/+e6frpkgvhKMaeCw\n\tsJ3s8aVuIUb6KUlFgHT4CRMdrYtWOgfQoLvP0K+QGCAkJ6i6j/C+vRXoyksswC6Ni7bz\n\tdfEZLpHuhvqSluRvTOt5GtKPEPMbB9ciNFggSIe0NawJkNvm2kWUeTQOYXg5JHAIiX80\n\tg0f+6ZvWJoHa20SOm8kTdtXzrK8bND8Edox3ReOLkdV5jl6VSSZCvNQl7qkZ/XOM79u8\n\t2zzg==",
        "X-Gm-Message-State": "AHPjjUjO1KRYsg1MGkL3Uu9r8Q2tz9eUJYP7Isvpljwsh6RKHKhNjC6d\n\t4KefwF7N3QhOf5Z9JAid5ZgCXUPyvsxcBfcdkS24jz/6Wi6a1hGWeZjPyyg49hsAoqzlQnvqRuH\n\t486Li",
        "MIME-Version": "1.0",
        "X-Google-Smtp-Source": "ADKCNb4/c9QJB7U46u3oL27i2VnbXhzWBQVk5q1iP+bEFiC1HCfASc15zR/q+IGx8J6rCK/LYZfRwQ==",
        "X-Received": "by 10.98.212.94 with SMTP id u30mr3954339pfl.297.1504892355637; \n\tFri, 08 Sep 2017 10:39:15 -0700 (PDT)",
        "From": "Brandon Carpenter <brandon.carpenter@cypherpath.com>",
        "To": "qemu-devel@nongnu.org",
        "Date": "Fri,  8 Sep 2017 10:37:57 -0700",
        "Message-Id": "<20170908173801.15205-3-brandon.carpenter@cypherpath.com>",
        "X-Mailer": "git-send-email 2.14.1",
        "In-Reply-To": [
            "<20170908173801.15205-1-brandon.carpenter@cypherpath.com>",
            "<20170724184217.21381-1-brandon.carpenter@cypherpath.com>"
        ],
        "References": [
            "<20170908173801.15205-1-brandon.carpenter@cypherpath.com>",
            "<20170724184217.21381-1-brandon.carpenter@cypherpath.com>"
        ],
        "Content-Type": "text/plain; charset=\"US-ASCII\"",
        "X-detected-operating-system": "by eggs.gnu.org: Genre and OS details not\n\trecognized.",
        "X-Received-From": "2607:f8b0:400e:c00::231",
        "Subject": "[Qemu-devel] [PATCH v2 2/6] io: Small updates in preparation for\n\twebsocket changes",
        "X-BeenThere": "qemu-devel@nongnu.org",
        "X-Mailman-Version": "2.1.21",
        "Precedence": "list",
        "List-Id": "<qemu-devel.nongnu.org>",
        "List-Unsubscribe": "<https://lists.nongnu.org/mailman/options/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>",
        "List-Archive": "<http://lists.nongnu.org/archive/html/qemu-devel/>",
        "List-Post": "<mailto:qemu-devel@nongnu.org>",
        "List-Help": "<mailto:qemu-devel-request@nongnu.org?subject=help>",
        "List-Subscribe": "<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=subscribe>",
        "Cc": "brandon.carpenter@cypherpath.com",
        "Errors-To": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org",
        "Sender": "\"Qemu-devel\"\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>"
    },
    "content": "Gets rid of unnecessary bit shifting and performs proper EOF checking to\navoid a large number of repeated calls to recvmsg() when a client\nabruptly terminates a connection (bug fix).\n\nSigned-off-by: Brandon Carpenter <brandon.carpenter@cypherpath.com>\n---\n io/channel-websock.c | 62 +++++++++++++++-------------------------------------\n 1 file changed, 18 insertions(+), 44 deletions(-)",
    "diff": "diff --git a/io/channel-websock.c b/io/channel-websock.c\nindex 5a3badbec2..185bd31be5 100644\n--- a/io/channel-websock.c\n+++ b/io/channel-websock.c\n@@ -86,8 +86,6 @@\n #define QIO_CHANNEL_WEBSOCK_HEADER_FIELD_OPCODE 0x0f\n #define QIO_CHANNEL_WEBSOCK_HEADER_FIELD_HAS_MASK 0x80\n #define QIO_CHANNEL_WEBSOCK_HEADER_FIELD_PAYLOAD_LEN 0x7f\n-#define QIO_CHANNEL_WEBSOCK_HEADER_SHIFT_FIN 7\n-#define QIO_CHANNEL_WEBSOCK_HEADER_SHIFT_HAS_MASK 7\n \n typedef struct QIOChannelWebsockHeader QIOChannelWebsockHeader;\n \n@@ -492,7 +490,7 @@ static void qio_channel_websock_encode(QIOChannelWebsock *ioc)\n         return;\n     }\n \n-    header.ws.b0 = (1 << QIO_CHANNEL_WEBSOCK_HEADER_SHIFT_FIN) |\n+    header.ws.b0 = QIO_CHANNEL_WEBSOCK_HEADER_FIELD_FIN |\n         (QIO_CHANNEL_WEBSOCK_OPCODE_BINARY_FRAME &\n          QIO_CHANNEL_WEBSOCK_HEADER_FIELD_OPCODE);\n     if (ioc->rawoutput.offset <\n@@ -519,8 +517,8 @@ static void qio_channel_websock_encode(QIOChannelWebsock *ioc)\n }\n \n \n-static ssize_t qio_channel_websock_decode_header(QIOChannelWebsock *ioc,\n-                                                 Error **errp)\n+static int qio_channel_websock_decode_header(QIOChannelWebsock *ioc,\n+                                             Error **errp)\n {\n     unsigned char opcode, fin, has_mask;\n     size_t header_size;\n@@ -539,11 +537,9 @@ static ssize_t qio_channel_websock_decode_header(QIOChannelWebsock *ioc,\n         return QIO_CHANNEL_ERR_BLOCK;\n     }\n \n-    fin = (header->b0 & QIO_CHANNEL_WEBSOCK_HEADER_FIELD_FIN) >>\n-        QIO_CHANNEL_WEBSOCK_HEADER_SHIFT_FIN;\n+    fin = header->b0 & QIO_CHANNEL_WEBSOCK_HEADER_FIELD_FIN;\n     opcode = header->b0 & QIO_CHANNEL_WEBSOCK_HEADER_FIELD_OPCODE;\n-    has_mask = (header->b1 & QIO_CHANNEL_WEBSOCK_HEADER_FIELD_HAS_MASK) >>\n-        QIO_CHANNEL_WEBSOCK_HEADER_SHIFT_HAS_MASK;\n+    has_mask = header->b1 & QIO_CHANNEL_WEBSOCK_HEADER_FIELD_HAS_MASK;\n     payload_len = header->b1 & QIO_CHANNEL_WEBSOCK_HEADER_FIELD_PAYLOAD_LEN;\n \n     if (opcode == QIO_CHANNEL_WEBSOCK_OPCODE_CLOSE) {\n@@ -561,7 +557,7 @@ static ssize_t qio_channel_websock_decode_header(QIOChannelWebsock *ioc,\n         return -1;\n     }\n     if (!has_mask) {\n-        error_setg(errp, \"websocket frames must be masked\");\n+        error_setg(errp, \"client websocket frames must be masked\");\n         return -1;\n     }\n     if (opcode != QIO_CHANNEL_WEBSOCK_OPCODE_BINARY_FRAME) {\n@@ -593,8 +589,8 @@ static ssize_t qio_channel_websock_decode_header(QIOChannelWebsock *ioc,\n }\n \n \n-static ssize_t qio_channel_websock_decode_payload(QIOChannelWebsock *ioc,\n-                                                  Error **errp)\n+static int qio_channel_websock_decode_payload(QIOChannelWebsock *ioc,\n+                                              Error **errp)\n {\n     size_t i;\n     size_t payload_len;\n@@ -635,7 +631,7 @@ static ssize_t qio_channel_websock_decode_payload(QIOChannelWebsock *ioc,\n     buffer_reserve(&ioc->rawinput, payload_len);\n     buffer_append(&ioc->rawinput, ioc->encinput.buffer, payload_len);\n     buffer_advance(&ioc->encinput, payload_len);\n-    return payload_len;\n+    return 0;\n }\n \n \n@@ -715,8 +711,8 @@ static ssize_t qio_channel_websock_read_wire(QIOChannelWebsock *ioc,\n         if (ret < 0) {\n             return ret;\n         }\n-        if (ret == 0 &&\n-            ioc->encinput.offset == 0) {\n+        if (ret == 0 && ioc->encinput.offset == 0) {\n+            ioc->io_eof = TRUE;\n             return 0;\n         }\n         ioc->encinput.offset += ret;\n@@ -728,10 +724,6 @@ static ssize_t qio_channel_websock_read_wire(QIOChannelWebsock *ioc,\n             if (ret < 0) {\n                 return ret;\n             }\n-            if (ret == 0) {\n-                ioc->io_eof = TRUE;\n-                break;\n-            }\n         }\n \n         ret = qio_channel_websock_decode_payload(ioc, errp);\n@@ -996,14 +988,12 @@ struct QIOChannelWebsockSource {\n };\n \n static gboolean\n-qio_channel_websock_source_prepare(GSource *source,\n-                                   gint *timeout)\n+qio_channel_websock_source_check(GSource *source)\n {\n     QIOChannelWebsockSource *wsource = (QIOChannelWebsockSource *)source;\n     GIOCondition cond = 0;\n-    *timeout = -1;\n \n-    if (wsource->wioc->rawinput.offset) {\n+    if (wsource->wioc->rawinput.offset || wsource->wioc->io_eof) {\n         cond |= G_IO_IN;\n     }\n     if (wsource->wioc->rawoutput.offset < QIO_CHANNEL_WEBSOCK_MAX_BUFFER) {\n@@ -1014,19 +1004,11 @@ qio_channel_websock_source_prepare(GSource *source,\n }\n \n static gboolean\n-qio_channel_websock_source_check(GSource *source)\n+qio_channel_websock_source_prepare(GSource *source,\n+                                   gint *timeout)\n {\n-    QIOChannelWebsockSource *wsource = (QIOChannelWebsockSource *)source;\n-    GIOCondition cond = 0;\n-\n-    if (wsource->wioc->rawinput.offset) {\n-        cond |= G_IO_IN;\n-    }\n-    if (wsource->wioc->rawoutput.offset < QIO_CHANNEL_WEBSOCK_MAX_BUFFER) {\n-        cond |= G_IO_OUT;\n-    }\n-\n-    return cond & wsource->condition;\n+    *timeout = -1;\n+    return qio_channel_websock_source_check(source);\n }\n \n static gboolean\n@@ -1036,17 +1018,9 @@ qio_channel_websock_source_dispatch(GSource *source,\n {\n     QIOChannelFunc func = (QIOChannelFunc)callback;\n     QIOChannelWebsockSource *wsource = (QIOChannelWebsockSource *)source;\n-    GIOCondition cond = 0;\n-\n-    if (wsource->wioc->rawinput.offset) {\n-        cond |= G_IO_IN;\n-    }\n-    if (wsource->wioc->rawoutput.offset < QIO_CHANNEL_WEBSOCK_MAX_BUFFER) {\n-        cond |= G_IO_OUT;\n-    }\n \n     return (*func)(QIO_CHANNEL(wsource->wioc),\n-                   (cond & wsource->condition),\n+                   qio_channel_websock_source_check(source),\n                    user_data);\n }\n \n",
    "prefixes": [
        "v2",
        "2/6"
    ]
}