From 3daebc2732821bc1351ab01cb269e89fcaacf2f9 Mon Sep 17 00:00:00 2001 From: Danny Backx Date: Sat, 19 Aug 2017 16:16:01 +0200 Subject: [PATCH] Changes to esp-link for coping with REST replies longer than 100 bytes --- cmd/cmd.h | 2 ++ rest/rest.c | 43 ++++++++++++++++++++++++++++++++++++------- 2 files changed, 38 insertions(+), 7 deletions(-) diff --git a/cmd/cmd.h b/cmd/cmd.h index 31803b8..827f61d 100644 --- a/cmd/cmd.h +++ b/cmd/cmd.h @@ -68,6 +68,8 @@ typedef enum { CMD_WIFI_GET_SSID, // Query SSID currently connected to CMD_WIFI_START_SCAN, // Trigger a scan (takes a long time) + CMD_RESP_CB_CONTINUE = 70, // RESP_CB for a long packet + } CmdName; typedef void (*cmdfunc_t)(CmdPacket *cmd); diff --git a/rest/rest.c b/rest/rest.c index 2100109..271f921 100644 --- a/rest/rest.c +++ b/rest/rest.c @@ -1,4 +1,5 @@ // Copyright 2015 by Thorsten von Eicken, see LICENSE.txt +// Copyright 2017 by Danny Backx : code to send a long REST reply // // Adapted from: github.com/tuanpmt/esp_bridge, Created on: Mar 4, 2015, Author: Minh @@ -99,15 +100,43 @@ tcpclient_recv(void *arg, char *pdata, unsigned short len) { cmdResponseBody(&code, sizeof(code)); cmdResponseEnd(); } else { - cmdResponseStart(CMD_RESP_CB, client->resp_cb, 2); - cmdResponseBody(&code, sizeof(code)); - cmdResponseBody(pdata+pi, body_len>100?100:body_len); - cmdResponseEnd(); + // Try to forward more than 100 bytes + +#define MAX_RECEIVE_PACKET_LENGTH 100 + + unsigned short position = 0; + do { + unsigned short msgLen = body_len - position; + + if (msgLen > MAX_RECEIVE_PACKET_LENGTH) { + msgLen = MAX_RECEIVE_PACKET_LENGTH; #if 0 - os_printf("REST: body="); - for (int j=pi; jresp_cb, 2); + cmdResponseBody(&body_len, sizeof(body_len)); // Total packet length + cmdResponseBody(pdata+pi+position, msgLen); + cmdResponseEnd(); + } else { +#if 0 + os_printf("REST (pos %d) : sending %d bytes of body .. ", position, msgLen); + for (int i=0; i<10; i++) os_printf("%c", pdata[pi+position+i]); + os_printf("\n"); +#endif + // CMD_RESP_CB : data fits in one packet (<= 100 bytes) + cmdResponseStart(CMD_RESP_CB, client->resp_cb, 2); + cmdResponseBody(&code, sizeof(code)); // REST HTTP status code + cmdResponseBody(pdata+pi+position, msgLen); + cmdResponseEnd(); + } + + position += msgLen; + } while (position < body_len); // End of loop for multi-packet data } //if(client->security)