From patchwork Wed Mar 7 10:59:25 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefano Babic X-Patchwork-Id: 882523 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=googlegroups.com (client-ip=2a00:1450:400c:c0c::23a; helo=mail-wr0-x23a.google.com; envelope-from=swupdate+bncbcxploxj6ikrbfem77kakgqetxaxzry@googlegroups.com; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=denx.de Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=googlegroups.com header.i=@googlegroups.com header.b="ka94AzgE"; dkim-atps=neutral Received: from mail-wr0-x23a.google.com (mail-wr0-x23a.google.com [IPv6:2a00:1450:400c:c0c::23a]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zx9dM6dS8z9sf8 for ; Wed, 7 Mar 2018 21:59:35 +1100 (AEDT) Received: by mail-wr0-x23a.google.com with SMTP id u65sf1034758wrc.8 for ; Wed, 07 Mar 2018 02:59:35 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1520420372; cv=pass; d=google.com; s=arc-20160816; b=Y8fNeBeNDG+/cBPWn3ttaw7HpMRT9IsaUqinLSvQhg9fF9e0unyeqv1+x6+GdbE/wJ oY84f25mnnHQzyQGOloMe4mTkGes2od00Vr6ozynPGm7O/a9dYbaGiT5AjAa27QgjrZl +B+OMpJfHj6AOqmezEJeQJvjoSB3WwpqC+HzHgu7vx0HDVNjV4FVDh+NC3weAar8c3td XW8eoQIX0ixcrZFqtY4OZdketW5aGoEKNlVWcWvqkn2kQTxTRKm6jriJZJS0PfIiu2MD G917tGQPd3mKEe+v88PQUFWW/IxnwcWZa3aU96/Oupf21iGZLhuUt6dKDzuo3+Wm3RWs tgwA== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-unsubscribe:list-subscribe:list-archive:list-help:list-post :list-id:mailing-list:precedence:message-id:date:subject:cc:to:from :arc-authentication-results:arc-message-signature:mime-version :sender:dkim-signature:arc-authentication-results; bh=o++d83sc5SP9ockaOW+5WuB8MTdHMAMwY+4T8xZCcnk=; b=M8o4yaig4aT4lGd4VUQlBMQgbnZyPPZ3Z3+gItRVVWewNX0ScNnIrrWRdhnv5huhOk X9PB473u38xJMOpBC9hPlXwXWDwMu3K6cJRWs4BMYOqa7gmH0kVEae0fV3tQ7PtAkQJX ovxXkHnND/Z7rrd2C34+I13q34JnigDAZuViN64jRVLI8sKosN9lrpPhXBD1xgG3Mxsf sn17ImCWKcQEJtjPYn0LFIKm2O/YwRhp0H+0DDbE3yCOkQTyycfEiFXZX1DqQ2CP/x+r Lhb7mjb8bDrHgZlBNTjnm/ubnkCSJnR5IUHv3daHj8SjVA80QusFdth3i4jcmoR9ulUx 7aAA== ARC-Authentication-Results: i=2; gmr-mx.google.com; spf=neutral (google.com: 212.18.0.9 is neither permitted nor denied by best guess record for domain of sbabic@denx.de) smtp.mailfrom=sbabic@denx.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlegroups.com; s=20161025; h=sender:mime-version:from:to:cc:subject:date:message-id :x-original-sender:x-original-authentication-results:precedence :mailing-list:list-id:list-post:list-help:list-archive :list-subscribe:list-unsubscribe; bh=o++d83sc5SP9ockaOW+5WuB8MTdHMAMwY+4T8xZCcnk=; b=ka94AzgEQU5RqDIibfXHLpRVbixtc2DSwb57aS2hUBqQuUTx+hRx2OsaMJ1psVtGkF 0Q/OVm17k50bOEQLoOipM2oHYrQbvTh2mYZHBZrgN460FFvCd/oAroeZ9paVUTnj84Lx i62E6kHQbSaGIOKFE+fjqHJVeUBVFXtf9XAV+PzOCzSq6ZT72WshP6AOfGX0j75c9fNd BEn8rc0mCEtG+c3/P4vpR5okaIvF7rLg/+NdLNLTcvaVLzCe3nR+oP0DHKflHos3RPcD W09vl7S6WvDLd5Ojx7VMPbUw3+Ooduh7ljhGfoUDUxcEF8nQydXf65/sBbgKkMVdQoFA fKAg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=sender:x-gm-message-state:mime-version:from:to:cc:subject:date :message-id:x-original-sender:x-original-authentication-results :precedence:mailing-list:list-id:x-spam-checked-in-group:list-post :list-help:list-archive:list-subscribe:list-unsubscribe; bh=o++d83sc5SP9ockaOW+5WuB8MTdHMAMwY+4T8xZCcnk=; b=agLyzC7yAlIlw2qVxopBAuzBVLxhPIsKI86iltiqEGpG0lpwJQU6RiJPw81rOpU41o i6meEGFaHbzDlXryyv0yzK9SRav+5qOMApr+snma9yQ9fTcztKoZZq7ixmA181VfWAWe OO9pkj9zMzfMdXF/4igH5SoU9trd6i4uYHHYAQhHiJO/7qMV5okiWyEwqRcV/RFwFdSg 5Iay7BZQmya0wbKc5TD8AiGt4HXmqZDdrqTGy4Vv8s1IlAoZypRbNbby2pxQVNLBLGu8 SjLfJqckshm17vFVQMaq6tdAIUXmgyChIAXnkVTgHl2LqTSv5gm0CcG2nkjQVdTX4Afv XUmQ== Sender: swupdate@googlegroups.com X-Gm-Message-State: AElRT7H34GuRHbPUsrF7zfl1JsunKfam357Cv905ggMH8Ui9p3ZnrXpK OwZZROnq7jaiW3e40vIra+4= X-Google-Smtp-Source: AG47ELtcTniiR23QqkxcZW868u2Fwtp5F5yR7ogqchDcdIqFI336Rlu6lNCRABmN5RSJ4yoAQ9FPww== X-Received: by 10.28.63.139 with SMTP id m133mr236214wma.3.1520420372785; Wed, 07 Mar 2018 02:59:32 -0800 (PST) MIME-Version: 1.0 X-BeenThere: swupdate@googlegroups.com Received: by 10.80.241.1 with SMTP id w1ls495440edl.2.gmail; Wed, 07 Mar 2018 02:59:32 -0800 (PST) X-Received: by 10.80.189.195 with SMTP id z3mr6415267edh.8.1520420372254; Wed, 07 Mar 2018 02:59:32 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1520420372; cv=none; d=google.com; s=arc-20160816; b=R3V2VokVKerzqjqpmi1HvoIcdd5RK5AS4qTovOoPEf3X7Pa5e4XiaQhBSFPhkMx2E0 A6A/bgGuEMamBCEuqOuxWfoHNvdjxr5FWkEZ37Nn+2qQ4n5vKu8lYheK3dFF8ZBy05Qd ygUbPyQdPBMOmfiCGThMe7eNNsZZBaT8NSzKqELDZc/H4le1LhWE4yQTK4jp5Hg+xPJZ g/y+/yjDHykx4aZRRYvjYQbmQEvAHIBavqkXKrwFOcQEhwAs8Rd/FRLaD9wPXAO70Jx4 PJ4ElZzA/KRixOfa6gYzK6CJdroX4+Q40dd87DpMiHXBbi7rOim5eW4ISNYD7l36ihUI IgzA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=message-id:date:subject:cc:to:from:arc-authentication-results; bh=zBlpyobUxXEmv7i1fTiaMKKYuv/0JADpVdjcYGfAUQ0=; b=CCGPdR9ow1B6JZ1kaK/D6cGBcLLR0IYBwk4WjQ2XE7ESgjXFLNLfbgH78XmzBQ7QUF W2Dw+an6B3MufgtoOS9P10WMNRfpn0ftOY+wP46XaKEDLzknJDVphEEPJviZ8XHjvqIF XF+z0V5fDrxCdeZCkO1PTMn7eq19PGC3dHCdosHh1fynGQEqvtq36nDBNww1CRSYkR4d PFGMNPY3hQ3NrJ/eH8KCWBWDDqniywJR1GAV9EuJzdbLMdKRGd2qdF1DN1sykzPgUQQx 05FRCv+FwyfwdKoFkH6HapV54rdK+aPPDMbp2wZEjbbQWR8t43ShlKnNOl7EYlx4w1bC Sfmw== ARC-Authentication-Results: i=1; gmr-mx.google.com; spf=neutral (google.com: 212.18.0.9 is neither permitted nor denied by best guess record for domain of sbabic@denx.de) smtp.mailfrom=sbabic@denx.de Received: from mail-out.m-online.net (mail-out.m-online.net. [212.18.0.9]) by gmr-mx.google.com with ESMTPS id h9si597432edi.4.2018.03.07.02.59.32 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 07 Mar 2018 02:59:32 -0800 (PST) Received-SPF: neutral (google.com: 212.18.0.9 is neither permitted nor denied by best guess record for domain of sbabic@denx.de) client-ip=212.18.0.9; Received: from frontend01.mail.m-online.net (unknown [192.168.8.182]) by mail-out.m-online.net (Postfix) with ESMTP id 3zx9dH6k6Kz1qvTT; Wed, 7 Mar 2018 11:59:31 +0100 (CET) Received: from localhost (dynscan1.mnet-online.de [192.168.6.70]) by mail.m-online.net (Postfix) with ESMTP id 3zx9dH6QyFz1qwkg; Wed, 7 Mar 2018 11:59:31 +0100 (CET) X-Virus-Scanned: amavisd-new at mnet-online.de Received: from mail.mnet-online.de ([192.168.8.182]) by localhost (dynscan1.mail.m-online.net [192.168.6.70]) (amavisd-new, port 10024) with ESMTP id v2Y3VWLe0lLy; Wed, 7 Mar 2018 11:59:31 +0100 (CET) Received: from babic.homelinux.org (host-88-217-136-221.customer.m-online.net [88.217.136.221]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.mnet-online.de (Postfix) with ESMTPS; Wed, 7 Mar 2018 11:59:31 +0100 (CET) Received: from localhost (mail.babic.homelinux.org [127.0.0.1]) by babic.homelinux.org (Postfix) with ESMTP id 9754B4540571; Wed, 7 Mar 2018 11:59:30 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at babic.homelinux.org Received: from babic.homelinux.org ([127.0.0.1]) by localhost (mail.babic.homelinux.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id xR6x4wJNgpw4; Wed, 7 Mar 2018 11:59:28 +0100 (CET) Received: from papero.fritz.box (papero.fritz.box [192.168.178.132]) by babic.homelinux.org (Postfix) with ESMTP id 2F6584540471; Wed, 7 Mar 2018 11:59:28 +0100 (CET) From: Stefano Babic To: swupdate@googlegroups.com Cc: Stefano Babic , Sami Hartikainen Subject: [swupdate] [PATCH V3 1/2] mongoose: split upload_handler Date: Wed, 7 Mar 2018 11:59:25 +0100 Message-Id: <1520420366-6564-1-git-send-email-sbabic@denx.de> X-Mailer: git-send-email 2.7.4 X-Original-Sender: sbabic@denx.de X-Original-Authentication-Results: gmr-mx.google.com; spf=neutral (google.com: 212.18.0.9 is neither permitted nor denied by best guess record for domain of sbabic@denx.de) smtp.mailfrom=sbabic@denx.de Precedence: list Mailing-list: list swupdate@googlegroups.com; contact swupdate+owners@googlegroups.com List-ID: X-Spam-Checked-In-Group: swupdate@googlegroups.com X-Google-Group-Id: 605343134186 List-Post: , List-Help: , List-Archive: , List-Unsubscribe: , To make code more readable, split upload_handler into two function for v1 and v2 API. Signed-off-by: Stefano Babic CC: Sami Hartikainen --- Changes since V1: - no changes mongoose/mongoose_interface.c | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/mongoose/mongoose_interface.c b/mongoose/mongoose_interface.c index 60914d3..0e22671 100644 --- a/mongoose/mongoose_interface.c +++ b/mongoose/mongoose_interface.c @@ -48,6 +48,7 @@ struct file_upload_state { }; static struct mg_serve_http_opts s_http_server_opts; +static void upload_handler(struct mg_connection *nc, int ev, void *p); #if defined(CONFIG_MONGOOSE_WEB_API_V2) #define enum_string(x) [x] = #x @@ -112,20 +113,16 @@ static size_t snescape(char *dst, size_t n, const char *src) } #endif -static void upload_handler(struct mg_connection *nc, int ev, void *p) -{ - struct mg_http_multipart_part *mp; - struct file_upload_state *fus; #if defined(CONFIG_MONGOOSE_WEB_API_V1) +static void upload_handler_v1(struct mg_connection *nc, int ev, void *p) +{ struct mg_str *filename, *data; struct http_message *hm; size_t length; char buf[16]; int fd; -#endif switch (ev) { -#if defined(CONFIG_MONGOOSE_WEB_API_V1) case MG_EV_HTTP_REQUEST: hm = (struct http_message *) p; @@ -159,9 +156,20 @@ static void upload_handler(struct mg_connection *nc, int ev, void *p) mg_send(nc, "\r\n", 2); mg_printf(nc, "Ok, %.*s - %d bytes.\r\n", (int) filename->len, filename->p, (int) length); nc->flags |= MG_F_SEND_AND_CLOSE; - break; + default: + upload_handler(nc, ev, p); + break; + } +} #endif + +static void upload_handler(struct mg_connection *nc, int ev, void *p) +{ + struct mg_http_multipart_part *mp; + struct file_upload_state *fus; + + switch (ev) { case MG_EV_HTTP_PART_BEGIN: mp = (struct mg_http_multipart_part *) p; @@ -610,18 +618,16 @@ int start_mongoose(const char *cfgfname, int argc, char *argv[]) exit(EXIT_FAILURE); } + mg_set_protocol_http_websocket(nc); + mg_register_http_endpoint(nc, "/upload", MG_CB(upload_handler, NULL)); #if defined(CONFIG_MONGOOSE_WEB_API_V1) - mg_register_http_endpoint(nc, "/handle_post_request", MG_CB(upload_handler, NULL)); + mg_register_http_endpoint(nc, "/handle_post_request", MG_CB(upload_handler_v1, NULL)); mg_register_http_endpoint(nc, "/getstatus.json", MG_CB(recovery_status, NULL)); mg_register_http_endpoint(nc, "/rebootTarget", MG_CB(reboot_target, NULL)); mg_register_http_endpoint(nc, "/postUpdateCommand", MG_CB(post_update_cmd, NULL)); -#elif defined(CONFIG_MONGOOSE_WEB_API_V2) - mg_register_http_endpoint(nc, "/restart", restart_handler); #endif - mg_register_http_endpoint(nc, "/upload", MG_CB(upload_handler, NULL)); - mg_set_protocol_http_websocket(nc); - #if defined(CONFIG_MONGOOSE_WEB_API_V2) + mg_register_http_endpoint(nc, "/restart", restart_handler); mg_start_thread(broadcast_message_thread, &mgr); mg_start_thread(broadcast_progress_thread, &mgr); #endif From patchwork Wed Mar 7 10:59:26 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefano Babic X-Patchwork-Id: 882524 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=googlegroups.com (client-ip=2a00:1450:400c:c0c::239; helo=mail-wr0-x239.google.com; envelope-from=swupdate+bncbcxploxj6ikrbfum77kakgqelk2vrli@googlegroups.com; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=denx.de Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=googlegroups.com header.i=@googlegroups.com header.b="lWvVbeYZ"; dkim-atps=neutral Received: from mail-wr0-x239.google.com (mail-wr0-x239.google.com [IPv6:2a00:1450:400c:c0c::239]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zx9dP367Nz9sfN for ; Wed, 7 Mar 2018 21:59:37 +1100 (AEDT) Received: by mail-wr0-x239.google.com with SMTP id d12sf1073187wri.4 for ; Wed, 07 Mar 2018 02:59:37 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1520420374; cv=pass; d=google.com; s=arc-20160816; b=PZZyeKhOytEspppXSCf/eh58iTz5Ywr9gB/KKFtslzIK6HJuYaNtzKhvHQKBEZTmlz NaRslWyXf7+PjkZe75H6xJavlF0lhdg3gyKYs7JnjO2BTxpqZNxRxyNzVqOF+IfU31Yp zOARHclKs9v4wjFbzsw4tCmrIQyh5els2Az6UucJzFgOerZGMa1Sdl5LIJSU/HMqwL+T 6aJlvQPz10XrbbTla1uLGl6NGrKU03qyuE0lpP29idGZsvNFOyt5Eb6wbFZaXtGXXoRM +VhjwvpKW3n84pDv+sHH40kEWRs02sNP4i6MCAlObYSYubumcyYJLiSdPH5an2m0D2tW QApg== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-unsubscribe:list-subscribe:list-archive:list-help:list-post :list-id:mailing-list:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:arc-authentication-results :arc-message-signature:mime-version:sender:dkim-signature :arc-authentication-results; bh=qka5IX9uTGAStvaP8JqtZZutzKL+ncLvNQ2r9VR+Bs8=; b=QzptE+p7PXC1zU/637jRERSXpUVi+aiw49z6ZESCzAs4Ni/8o9tUfEKZIn/FotTrBz +I844/5UTXNOski278kPsiaQVUEJzgJYHoZH/BasAZmMytF9qaJU6KNWDu0m5B6M0ynm aLQ3zGJPGTSZD/2/G+oK0DYpJZOpVClD6P264dlmhJ7KC1hJnL5CxRyP+PFVlX+4tTqt 6dNh2PWpYNCWOL/dEdPImsgBf8R2cl/+UVx28Lw8239zkJ1MiHufsTT4CVDImlbjT6wq 5tiIaOGIbJ87GJFAU/x/vup+fGg4FWUsUVUNPuoeiK8h0OSWr9bAnn6MdMRssFxnBwrH hxGw== ARC-Authentication-Results: i=2; gmr-mx.google.com; spf=neutral (google.com: 212.18.0.9 is neither permitted nor denied by best guess record for domain of sbabic@denx.de) smtp.mailfrom=sbabic@denx.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlegroups.com; s=20161025; h=sender:mime-version:from:to:cc:subject:date:message-id:in-reply-to :references:x-original-sender:x-original-authentication-results :precedence:mailing-list:list-id:list-post:list-help:list-archive :list-subscribe:list-unsubscribe; bh=qka5IX9uTGAStvaP8JqtZZutzKL+ncLvNQ2r9VR+Bs8=; b=lWvVbeYZDsUTtYY4NiM0XvFDJE6V60Ndu8rJsOnVAaMNwwpUnam5/p1zYKYP98oxKy qNX5waZrEHISmQZ3g67SaDyaki+T6eLf7J42FqTkY2Hxr9YTQEzu5CAmYHfc3nvyHXI/ 38HXLgKwKuNj+8TAhq8oBnAWzts/atRUXnZYP91VXlVx5ygsJIpGOMfMrjlk2OFWBu/r H3bqYtnMFNZAbgko7/xg67oTyjx5vZp1SzByAyaHjGUpCT7cmYfpg+goXcMyWeVv2NCq 3Y7OuRICpzvh5kCiK0289uISXv3f8xH5UMVTPwpBAKZn+4FeDsKRMGbJbgdgMWRr48z0 hdRQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=sender:x-gm-message-state:mime-version:from:to:cc:subject:date :message-id:in-reply-to:references:x-original-sender :x-original-authentication-results:precedence:mailing-list:list-id :x-spam-checked-in-group:list-post:list-help:list-archive :list-subscribe:list-unsubscribe; bh=qka5IX9uTGAStvaP8JqtZZutzKL+ncLvNQ2r9VR+Bs8=; b=tOUJNfQ82rnr8/S31GOe2RQZkYSfHZlNIAlttnCNOpE9EsnzAvLKp0/9IvtlnJc2Is Jho8csLPRwftk3pCPBfRsYhP87OiT2JHe3gc0LA1gZrpSULNL4Xx740OoojU+dfI1MjB 92Ne+ZNyiRMLqr+B2xrH4BajfSumfBb1DmLDbk0gTCRW2TuDsdS++nUbU7cdmE37rFi/ aGQbNA9oJ2H4zNyljy8dPN5/p+/v1ks6u6X4n+i6DQHLcrXesLG8E2YU8pJVe6dKlhuM ngbFcw1tBxg3MB+av7/K1FnIfSxqe0l6IpGgvlUJ+RL77A9+TK4aDMrc0a7ZNqHqOCTT 7vFA== Sender: swupdate@googlegroups.com X-Gm-Message-State: AElRT7HQme5hf59mm3CAMFmEb62ZSYilN8y5SFreiGCDdAIzkRzkn0mw CNS5wf4QaRdFl6ttQlVsiVk= X-Google-Smtp-Source: AG47ELuNeXvYlI7WOFxjz+lLTTT1Vq/1nt1fX+kGlQlo7n5Kvotlrw3oXe7QHX5yMUUORUa1wgB7Nw== X-Received: by 10.28.74.10 with SMTP id x10mr237104wma.0.1520420374808; Wed, 07 Mar 2018 02:59:34 -0800 (PST) MIME-Version: 1.0 X-BeenThere: swupdate@googlegroups.com Received: by 10.223.181.149 with SMTP id c21ls411652wre.1.gmail; Wed, 07 Mar 2018 02:59:34 -0800 (PST) X-Received: by 10.223.164.28 with SMTP id d28mr1994433wra.6.1520420374266; Wed, 07 Mar 2018 02:59:34 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1520420374; cv=none; d=google.com; s=arc-20160816; b=X7cXDXTv0FxY740EGeDrpNCfj/quQdcxXU1S5YRHPFUGIQ8whffCNumC9/0H1CH1fP QdmFxxDsVTHZ1JY1Jsvoyy7BIx10sOsehR9Hviy1IlmdV1bBHeUTeJla/QJiabq4FfNa Br1CSmOEeUqnBfwMtCrCzWZg8YdSXxTX6ca/J0jD2yVtetB4HqlAj5fAclFp6j6Pq1DD cbl3KlWSbTf57C6pHxLFtWpzp/ujQ0ijDKWDedcQQWmYRgWbt7nANt9aECgQGeIFZzSO SxHsjoSCs2/HjXeLKt1OM/WQoKHZHFPEMnbriYogsFwoZgjr+cxYIwE9lLkRpF6KoMh6 qk5Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from :arc-authentication-results; bh=QxudLmxI3pdi/stOFj/c1QONcuwtfCqF1zuLi53I/Lg=; b=YcggPelsE4OF64zg7HGcqrLZObmEoOfoU814/mRdmQml8tfMikZc/qybMu4MIzyFQP YENoUZTvscap4DS3xl27Afa6QHXZzWSfiP5OGBn3NieaRj2EW7o15+IQfthlme6xk/JX VhsSNfA4avC8xXnY4VmDCVTGmGd3lo9c8ZSZhvqeH2a8ettWmlDKcOaYH5kzciuYqP5P vMYdFiY3x60ecuD1dhqw1ZixuDv/YatwFKPmpgxWn51Gi1S+RorTEPanF+o455S1Uowh EpvOikr/KEXsZjyZcS9ve09wJuWfHFKtlbU/WLciIpRlhubP+m2b4Zu+w2jmrpAqxdGj wsfA== ARC-Authentication-Results: i=1; gmr-mx.google.com; spf=neutral (google.com: 212.18.0.9 is neither permitted nor denied by best guess record for domain of sbabic@denx.de) smtp.mailfrom=sbabic@denx.de Received: from mail-out.m-online.net (mail-out.m-online.net. [212.18.0.9]) by gmr-mx.google.com with ESMTPS id j199si355611wmj.1.2018.03.07.02.59.34 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 07 Mar 2018 02:59:34 -0800 (PST) Received-SPF: neutral (google.com: 212.18.0.9 is neither permitted nor denied by best guess record for domain of sbabic@denx.de) client-ip=212.18.0.9; Received: from frontend01.mail.m-online.net (unknown [192.168.8.182]) by mail-out.m-online.net (Postfix) with ESMTP id 3zx9dL0PHyz1qvTT; Wed, 7 Mar 2018 11:59:34 +0100 (CET) Received: from localhost (dynscan1.mnet-online.de [192.168.6.70]) by mail.m-online.net (Postfix) with ESMTP id 3zx9dL07cNz1qwkj; Wed, 7 Mar 2018 11:59:34 +0100 (CET) X-Virus-Scanned: amavisd-new at mnet-online.de Received: from mail.mnet-online.de ([192.168.8.182]) by localhost (dynscan1.mail.m-online.net [192.168.6.70]) (amavisd-new, port 10024) with ESMTP id Rb-bzw5W0S16; Wed, 7 Mar 2018 11:59:32 +0100 (CET) Received: from babic.homelinux.org (host-88-217-136-221.customer.m-online.net [88.217.136.221]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.mnet-online.de (Postfix) with ESMTPS; Wed, 7 Mar 2018 11:59:32 +0100 (CET) Received: from localhost (mail.babic.homelinux.org [127.0.0.1]) by babic.homelinux.org (Postfix) with ESMTP id C56FA4540471; Wed, 7 Mar 2018 11:59:31 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at babic.homelinux.org Received: from babic.homelinux.org ([127.0.0.1]) by localhost (mail.babic.homelinux.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id geE2VtXMpxbE; Wed, 7 Mar 2018 11:59:28 +0100 (CET) Received: from papero.fritz.box (papero.fritz.box [192.168.178.132]) by babic.homelinux.org (Postfix) with ESMTP id 63C6645404D5; Wed, 7 Mar 2018 11:59:28 +0100 (CET) From: Stefano Babic To: swupdate@googlegroups.com Cc: Stefano Babic , Sami Hartikainen Subject: [swupdate] [PATCH V3 2/2] mongoose: set V1 or V2 at runtime Date: Wed, 7 Mar 2018 11:59:26 +0100 Message-Id: <1520420366-6564-2-git-send-email-sbabic@denx.de> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1520420366-6564-1-git-send-email-sbabic@denx.de> References: <1520420366-6564-1-git-send-email-sbabic@denx.de> X-Original-Sender: sbabic@denx.de X-Original-Authentication-Results: gmr-mx.google.com; spf=neutral (google.com: 212.18.0.9 is neither permitted nor denied by best guess record for domain of sbabic@denx.de) smtp.mailfrom=sbabic@denx.de Precedence: list Mailing-list: list swupdate@googlegroups.com; contact swupdate+owners@googlegroups.com List-ID: X-Spam-Checked-In-Group: swupdate@googlegroups.com X-Google-Group-Id: 605343134186 List-Post: , List-Help: , List-Archive: , List-Unsubscribe: , V1 version of REST-API is still more suitable for M2M updates together with the SWU forwarder handler. However, it is not currently possible to switch between them and the API must be selected at compile time, and this requires different binaries. Let the user decides which version of API should run with a command line parameter. Signed-off-by: Stefano Babic CC: Sami Hartikainen --- Changes since V2: - use enum for API - drop V1 website support and let just the two URLs: handle_post_request getstatus.json this to guarantee the compatibility with SWU forwarder and proprietary applications using (or abusing of..) the REST-API For the Webserver itself, just V2 should be used. Changes since V1: - Drop MONGOOSE_WEB_API_V1 and MONGOOSE_WEB_API_V2 - Add help for "api" - Add "api" parameter to configuration file - "/upload" URL just in case of v2 - print API version when Webserver is started mongoose/Config.in | 18 -- mongoose/Makefile | 2 - mongoose/mongoose_interface.c | 414 ++++++++++++++++++++---------------------- 3 files changed, 193 insertions(+), 241 deletions(-) diff --git a/mongoose/Config.in b/mongoose/Config.in index a001247..29cac90 100644 --- a/mongoose/Config.in +++ b/mongoose/Config.in @@ -18,24 +18,6 @@ config MONGOOSE endchoice -choice - prompt "Web Application Interface" - default MONGOOSE_WEB_API_V1 - help - Choose the bootloader - -config MONGOOSE_WEB_API_V1 - bool "Version 1 (deprecated)" - help - Support for version 1 - -config MONGOOSE_WEB_API_V2 - bool "Version 2" - help - Support for version 2 - -endchoice - config MONGOOSEIPV6 bool "IPv6 support" default y diff --git a/mongoose/Makefile b/mongoose/Makefile index 77a616c..dc2d3d3 100644 --- a/mongoose/Makefile +++ b/mongoose/Makefile @@ -1,9 +1,7 @@ ifneq ($(CONFIG_WEBSERVER),) ifneq ($(CONFIG_MONGOOSE),) KBUILD_CFLAGS += -DMG_ENABLE_HTTP_STREAMING_MULTIPART=1 -ifneq ($(CONFIG_MONGOOSE_WEB_API_V2),) KBUILD_CFLAGS += -DMG_ENABLE_HTTP_WEBSOCKET=1 -DMG_ENABLE_THREADS=1 -endif ifneq ($(CONFIG_MONGOOSEIPV6),) KBUILD_CFLAGS += -DMG_ENABLE_IPV6=1 endif diff --git a/mongoose/mongoose_interface.c b/mongoose/mongoose_interface.c index 0e22671..9ef9070 100644 --- a/mongoose/mongoose_interface.c +++ b/mongoose/mongoose_interface.c @@ -32,6 +32,11 @@ #define MG_PORT "8080" #define MG_ROOT "." +enum MONGOOSE_API_VERSION { + MONGOOSE_API_V1, + MONGOOSE_API_V2 +}; + struct mongoose_options { char *root; char *listing; @@ -40,6 +45,7 @@ struct mongoose_options { char *ssl_cert; char *ssl_key; #endif + enum MONGOOSE_API_VERSION api_version; }; struct file_upload_state { @@ -50,7 +56,9 @@ struct file_upload_state { static struct mg_serve_http_opts s_http_server_opts; static void upload_handler(struct mg_connection *nc, int ev, void *p); -#if defined(CONFIG_MONGOOSE_WEB_API_V2) +/* + * These functions are for V2 of the protocol + */ #define enum_string(x) [x] = #x static const char *get_status_string(unsigned int status) { @@ -111,210 +119,7 @@ static size_t snescape(char *dst, size_t n, const char *src) return len; } -#endif - -#if defined(CONFIG_MONGOOSE_WEB_API_V1) -static void upload_handler_v1(struct mg_connection *nc, int ev, void *p) -{ - struct mg_str *filename, *data; - struct http_message *hm; - size_t length; - char buf[16]; - int fd; - - switch (ev) { - case MG_EV_HTTP_REQUEST: - hm = (struct http_message *) p; - - filename = mg_get_http_header(hm, "X_FILENAME"); - if (filename == NULL) { - mg_http_send_error(nc, 403, NULL); - return; - } - - data = mg_get_http_header(hm, "Content-length"); - if (data == NULL || data->len >= ARRAY_SIZE(buf)) { - mg_http_send_error(nc, 403, NULL); - return; - } - - memcpy(buf, data->p, data->len); - buf[data->len] = '\0'; - length = strtoul(data->p, NULL, 10); - if (length == 0) { - mg_http_send_error(nc, 403, NULL); - return; - } - - fd = ipc_inst_start_ext(SOURCE_WEBSERVER, filename->len, filename->p); - ipc_send_data(fd, (char *) hm->body.p, hm->body.len); - ipc_end(fd); - - mg_send_response_line(nc, 200, - "Content-Type: text/plain\r\n" - "Connection: close"); - mg_send(nc, "\r\n", 2); - mg_printf(nc, "Ok, %.*s - %d bytes.\r\n", (int) filename->len, filename->p, (int) length); - nc->flags |= MG_F_SEND_AND_CLOSE; - break; - default: - upload_handler(nc, ev, p); - break; - } -} -#endif - -static void upload_handler(struct mg_connection *nc, int ev, void *p) -{ - struct mg_http_multipart_part *mp; - struct file_upload_state *fus; - - switch (ev) { - case MG_EV_HTTP_PART_BEGIN: - mp = (struct mg_http_multipart_part *) p; - - fus = (struct file_upload_state *) calloc(1, sizeof(*fus)); - if (fus == NULL) { - mg_http_send_error(nc, 500, "Out of memory"); - break; - } - - fus->fd = ipc_inst_start_ext(SOURCE_WEBSERVER, strlen(mp->file_name), mp->file_name); - if (fus->fd < 0) { - mg_http_send_error(nc, 500, "Failed to queue command"); - free(fus); - break; - } - - mp->user_data = fus; - - break; - - case MG_EV_HTTP_PART_DATA: - mp = (struct mg_http_multipart_part *) p; - fus = (struct file_upload_state *) mp->user_data; - - if (!fus) - break; - - ipc_send_data(fus->fd, (char *) mp->data.p, mp->data.len); - fus->len += mp->data.len; - - break; - - case MG_EV_HTTP_PART_END: - mp = (struct mg_http_multipart_part *) p; - fus = (struct file_upload_state *) mp->user_data; - - if (!fus) - break; - - ipc_end(fus->fd); - - mg_send_response_line(nc, 200, - "Content-Type: text/plain\r\n" - "Connection: close"); - mg_send(nc, "\r\n", 2); - mg_printf(nc, "Ok, %s - %d bytes.\r\n", mp->file_name, (int) fus->len); - nc->flags |= MG_F_SEND_AND_CLOSE; - - mp->user_data = NULL; - free(fus); - break; - } -} -#if defined(CONFIG_MONGOOSE_WEB_API_V1) -static void recovery_status(struct mg_connection *nc, int ev, void *ev_data) -{ - ipc_message ipc; - int ret; - char buf[4096]; - - (void)ev; - (void)ev_data; - - ret = ipc_get_status(&ipc); - - if (ret) { - mg_http_send_error(nc, 500, NULL); - return; - } - - snprintf(buf, sizeof(buf), - "{\r\n" - "\t\"Status\" : \"%d\",\r\n" - "\t\"Msg\" : \"%s\",\r\n" - "\t\"Error\" : \"%d\",\r\n" - "\t\"LastResult\" : \"%d\"\r\n" - "}\r\n", - ipc.data.status.current, - strlen(ipc.data.status.desc) ? ipc.data.status.desc : "", - ipc.data.status.error, - ipc.data.status.last_result); - - mg_send_head(nc, 200, strlen(buf), - "Cache: no-cache\r\n" - "Content-Type: text/plain"); - - mg_send(nc, buf, strlen(buf)); - - nc->flags |= MG_F_SEND_AND_CLOSE; -} - -static void reboot_target(struct mg_connection *nc, int ev, void *ev_data) -{ - struct http_message *hm = (struct http_message *) ev_data; - int ret; - - (void)ev; - - if(mg_vcasecmp(&hm->method, "POST") == 0) { - ret = system("reboot"); - if (ret) { - mg_http_send_error(nc, 500, - "Device cannot be reboot, internal fault."); - return; - } - - mg_http_send_error(nc, 200, "Device will reboot now."); - } - else { - mg_send_response_line(nc, 200, - "Content-Type: text/html\r\n" - "Connection: close"); - mg_send(nc, "\r\n", 2); - mg_printf(nc, - "
" - "" - "
"); - nc->flags |= MG_F_SEND_AND_CLOSE; - } -} - -static void post_update_cmd(struct mg_connection *nc, int ev, void *ev_data) -{ - ipc_message msg = {}; - - (void)ev; - (void)ev_data; - - int ret = ipc_postupdate(&msg); - mg_send_response_line(nc, 200, "Content-Type: application/json"); - mg_send(nc, "\r\n", 2); - mg_printf(nc, - "{\r\n" - "\t\"code\": %d,\r\n" - "\t\"error\": \"%s\",\r\n" - "\t\"detail\": \"%s\"\r\n" - "}", - (ret == 0) ? 200 : 501, - (ret == 0) ? "" : "Internal server error", - (ret == 0) ? "" : "Failed to queue command"); - - nc->flags |= MG_F_SEND_AND_CLOSE; -} -#elif defined(CONFIG_MONGOOSE_WEB_API_V2) static void restart_handler(struct mg_connection *nc, int ev, void *ev_data) { struct http_message *hm = (struct http_message *) ev_data; @@ -470,7 +275,158 @@ static void *broadcast_progress_thread(void *data) return NULL; } -#endif + +/* + * These functions are for V1 of the protocol + */ +static void upload_handler_v1(struct mg_connection *nc, int ev, void *p) +{ + struct mg_str *filename, *data; + struct http_message *hm; + size_t length; + char buf[16]; + int fd; + + switch (ev) { + case MG_EV_HTTP_REQUEST: + hm = (struct http_message *) p; + + filename = mg_get_http_header(hm, "X_FILENAME"); + if (filename == NULL) { + mg_http_send_error(nc, 403, NULL); + return; + } + + data = mg_get_http_header(hm, "Content-length"); + if (data == NULL || data->len >= ARRAY_SIZE(buf)) { + mg_http_send_error(nc, 403, NULL); + return; + } + + memcpy(buf, data->p, data->len); + buf[data->len] = '\0'; + length = strtoul(data->p, NULL, 10); + if (length == 0) { + mg_http_send_error(nc, 403, NULL); + return; + } + + fd = ipc_inst_start_ext(SOURCE_WEBSERVER, filename->len, filename->p); + ipc_send_data(fd, (char *) hm->body.p, hm->body.len); + ipc_end(fd); + + mg_send_response_line(nc, 200, + "Content-Type: text/plain\r\n" + "Connection: close"); + mg_send(nc, "\r\n", 2); + mg_printf(nc, "Ok, %.*s - %d bytes.\r\n", (int) filename->len, filename->p, (int) length); + nc->flags |= MG_F_SEND_AND_CLOSE; + break; + default: + upload_handler(nc, ev, p); + break; + } +} + +static void recovery_status(struct mg_connection *nc, int ev, void *ev_data) +{ + ipc_message ipc; + int ret; + char buf[4096]; + + (void)ev; + (void)ev_data; + + ret = ipc_get_status(&ipc); + + if (ret) { + mg_http_send_error(nc, 500, NULL); + return; + } + + snprintf(buf, sizeof(buf), + "{\r\n" + "\t\"Status\" : \"%d\",\r\n" + "\t\"Msg\" : \"%s\",\r\n" + "\t\"Error\" : \"%d\",\r\n" + "\t\"LastResult\" : \"%d\"\r\n" + "}\r\n", + ipc.data.status.current, + strlen(ipc.data.status.desc) ? ipc.data.status.desc : "", + ipc.data.status.error, + ipc.data.status.last_result); + + mg_send_head(nc, 200, strlen(buf), + "Cache: no-cache\r\n" + "Content-Type: text/plain"); + + mg_send(nc, buf, strlen(buf)); + + nc->flags |= MG_F_SEND_AND_CLOSE; +} + +/* + * Code common to V1 and V2 + */ +static void upload_handler(struct mg_connection *nc, int ev, void *p) +{ + struct mg_http_multipart_part *mp; + struct file_upload_state *fus; + + switch (ev) { + case MG_EV_HTTP_PART_BEGIN: + mp = (struct mg_http_multipart_part *) p; + + fus = (struct file_upload_state *) calloc(1, sizeof(*fus)); + if (fus == NULL) { + mg_http_send_error(nc, 500, "Out of memory"); + break; + } + + fus->fd = ipc_inst_start_ext(SOURCE_WEBSERVER, strlen(mp->file_name), mp->file_name); + if (fus->fd < 0) { + mg_http_send_error(nc, 500, "Failed to queue command"); + free(fus); + break; + } + + mp->user_data = fus; + + break; + + case MG_EV_HTTP_PART_DATA: + mp = (struct mg_http_multipart_part *) p; + fus = (struct file_upload_state *) mp->user_data; + + if (!fus) + break; + + ipc_send_data(fus->fd, (char *) mp->data.p, mp->data.len); + fus->len += mp->data.len; + + break; + + case MG_EV_HTTP_PART_END: + mp = (struct mg_http_multipart_part *) p; + fus = (struct file_upload_state *) mp->user_data; + + if (!fus) + break; + + ipc_end(fus->fd); + + mg_send_response_line(nc, 200, + "Content-Type: text/plain\r\n" + "Connection: close"); + mg_send(nc, "\r\n", 2); + mg_printf(nc, "Ok, %s - %d bytes.\r\n", mp->file_name, (int) fus->len); + nc->flags |= MG_F_SEND_AND_CLOSE; + + mp->user_data = NULL; + free(fus); + break; + } +} static void ev_handler(struct mg_connection *nc, int ev, void *ev_data) { @@ -510,6 +466,12 @@ static int mongoose_settings(void *elem, void __attribute__ ((__unused__)) *dat opts->ssl_key = strdup(tmp); } #endif + GET_FIELD_STRING_RESET(LIBCFG_PARSER, elem, "api", tmp); + if (strlen(tmp)) { + opts->api_version = (!strcmp(tmp, "1")) ? + MONGOOSE_API_V1 : + MONGOOSE_API_V2; + } return 0; } @@ -523,6 +485,7 @@ static struct option long_options[] = { {"ssl-key", required_argument, NULL, 'K'}, #endif {"document-root", required_argument, NULL, 'r'}, + {"api-version", required_argument, NULL, 'a'}, {NULL, 0, NULL, 0} }; @@ -538,7 +501,8 @@ void mongoose_print_help(void) "\t -C, --ssl-cert : ssl certificate to present to clients\n" "\t -K, --ssl-key : key corresponding to the ssl certificate\n" #endif - "\t -r, --document-root : path to document root directory (default: %s)\n", + "\t -r, --document-root : path to document root directory (default: %s)\n" + "\t -a, --api-version [1|2] : set Web protocol API to v1 (legacy) or v2 (default v2)\n", MG_LISTING, MG_PORT, MG_ROOT); } @@ -556,12 +520,14 @@ int start_mongoose(const char *cfgfname, int argc, char *argv[]) int choice = 0; memset(&opts, 0, sizeof(opts)); + /* Set default API version */ + opts.api_version = MONGOOSE_API_V2; if (cfgfname) { read_module_settings(cfgfname, "webserver", mongoose_settings, &opts); } optind = 1; - while ((choice = getopt_long(argc, argv, "lp:sC:K:r:", + while ((choice = getopt_long(argc, argv, "lp:sC:K:r:a:", long_options, NULL)) != -1) { switch (choice) { case 'l': @@ -589,6 +555,11 @@ int start_mongoose(const char *cfgfname, int argc, char *argv[]) free(opts.root); opts.root = strdup(optarg); break; + case 'a': + opts.api_version = (!strcmp(optarg, "1")) ? + MONGOOSE_API_V1 : + MONGOOSE_API_V2; + break; case '?': default: return -EINVAL; @@ -619,22 +590,23 @@ int start_mongoose(const char *cfgfname, int argc, char *argv[]) } mg_set_protocol_http_websocket(nc); - mg_register_http_endpoint(nc, "/upload", MG_CB(upload_handler, NULL)); -#if defined(CONFIG_MONGOOSE_WEB_API_V1) - mg_register_http_endpoint(nc, "/handle_post_request", MG_CB(upload_handler_v1, NULL)); - mg_register_http_endpoint(nc, "/getstatus.json", MG_CB(recovery_status, NULL)); - mg_register_http_endpoint(nc, "/rebootTarget", MG_CB(reboot_target, NULL)); - mg_register_http_endpoint(nc, "/postUpdateCommand", MG_CB(post_update_cmd, NULL)); -#endif -#if defined(CONFIG_MONGOOSE_WEB_API_V2) - mg_register_http_endpoint(nc, "/restart", restart_handler); - mg_start_thread(broadcast_message_thread, &mgr); - mg_start_thread(broadcast_progress_thread, &mgr); -#endif + switch (opts.api_version) { + case MONGOOSE_API_V1: + mg_register_http_endpoint(nc, "/handle_post_request", MG_CB(upload_handler_v1, NULL)); + mg_register_http_endpoint(nc, "/getstatus.json", MG_CB(recovery_status, NULL)); + break; + case MONGOOSE_API_V2: + mg_register_http_endpoint(nc, "/restart", restart_handler); + mg_register_http_endpoint(nc, "/upload", MG_CB(upload_handler, NULL)); + mg_start_thread(broadcast_message_thread, &mgr); + mg_start_thread(broadcast_progress_thread, &mgr); + break; + } - printf("Mongoose web server version %s with pid %d started on port(s) %s with web root [%s]\n", + printf("Mongoose web server version %s with pid %d started on port(s) %s with web root [%s] and API %s\n", MG_VERSION, getpid(), s_http_port, - s_http_server_opts.document_root); + s_http_server_opts.document_root, + (opts.api_version == MONGOOSE_API_V1) ? "v1" : "v2"); for (;;) { mg_mgr_poll(&mgr, 100);