Tasmota Control basic support and Windows fixes

This commit is contained in:
openshwprojects
2022-11-10 11:22:22 +01:00
parent a3964fd328
commit 2961bc9470
5 changed files with 435 additions and 101 deletions

View File

@ -1603,6 +1603,16 @@ int http_tasmota_json_power(http_request_t* request) {
int numPWMs;
int i;
int lastRelayState;
bool bRelayIndexingStartsWithZero;
int relayIndexingOffset;
bRelayIndexingStartsWithZero = CHANNEL_HasChannelPinWithRoleOrRole(0, IOR_Relay, IOR_Relay_n);
if (bRelayIndexingStartsWithZero) {
relayIndexingOffset = 0;
}
else {
relayIndexingOffset = 1;
}
// try to return status
numPWMs = PIN_CountPinsWithRoleOrRole(IOR_PWM, IOR_PWM_n);
@ -1610,11 +1620,16 @@ int http_tasmota_json_power(http_request_t* request) {
// LED driver (if has PWMs)
if (numPWMs > 0) {
int dimmer = LED_GetDimmer();
hprintf255(request, "\"Dimmer\":%i,", dimmer);
hprintf255(request, "\"Fade\":\"OFF\",");
hprintf255(request, "\"Speed\":1,");
hprintf255(request, "\"LedTable\":\"ON\",");
if (LED_GetEnableAll() == 0) {
poststr(request, "{\"POWER\":\"OFF\"}");
poststr(request, "\"POWER\":\"OFF\"");
}
else {
poststr(request, "{\"POWER\":\"ON\"}");
poststr(request, "\"POWER\":\"ON\"");
}
}
else {
@ -1627,22 +1642,35 @@ int http_tasmota_json_power(http_request_t* request) {
}
if (numRelays == 1) {
if (lastRelayState) {
poststr(request, "{\"POWER\":\"ON\"}");
poststr(request, "\"POWER\":\"ON\"");
}
else {
poststr(request, "{\"POWER\":\"OFF\"}");
poststr(request, "\"POWER\":\"OFF\"");
}
}
else {
int c_posted = 0;
for (i = 0; i < CHANNEL_MAX; i++) {
if (h_isChannelRelay(i) || CHANNEL_GetType(i) == ChType_Toggle) {
lastRelayState = CHANNEL_Get(i);
if (lastRelayState) {
hprintf255(request, "{\"POWER%i\":\"ON\"}", i);
int indexStartingFrom1;
if (bRelayIndexingStartsWithZero) {
indexStartingFrom1 = i + 1;
}
else {
hprintf255(request, "{\"POWER%i\":\"OFF\"}", i);
indexStartingFrom1 = i;
}
lastRelayState = CHANNEL_Get(i);
if (c_posted) {
hprintf255(request, ",");
}
if (lastRelayState) {
hprintf255(request, "\"POWER%i\":\"ON\"", indexStartingFrom1);
}
else {
hprintf255(request, "\"POWER%i\":\"OFF\"", indexStartingFrom1);
}
c_posted++;
}
}
}
@ -1654,33 +1682,38 @@ int http_tasmota_json_power(http_request_t* request) {
{"StatusSNS":{"Time":"2022-07-30T10:11:26","ENERGY":{"TotalStartTime":"2022-05-12T10:56:31","Total":0.003,"Yesterday":0.003,"Today":0.000,"Power": 0,"ApparentPower": 0,"ReactivePower": 0,"Factor":0.00,"Voltage":236,"Current":0.000}}}
*/
int http_tasmota_json_status_SNS(http_request_t* request) {
float power, factor, voltage, current;
float energy, energy_hour;
hprintf255(request, "{\"StatusSNS\":{");
#ifndef OBK_DISABLE_ALL_DRIVERS
factor = 0; // TODO
voltage = DRV_GetReading(OBK_VOLTAGE);
current = DRV_GetReading(OBK_CURRENT);
power = DRV_GetReading(OBK_POWER);
energy = DRV_GetReading(OBK_CONSUMPTION_TOTAL);
energy_hour = DRV_GetReading(OBK_CONSUMPTION_LAST_HOUR);
if (DRV_IsMeasuringPower()) {
#else
factor = 0;
voltage = 0;
current = 0;
power = 0;
energy = 0;
energy_hour = 0;
float power, factor, voltage, current;
float energy, energy_hour;
factor = 0; // TODO
voltage = DRV_GetReading(OBK_VOLTAGE);
current = DRV_GetReading(OBK_CURRENT);
power = DRV_GetReading(OBK_POWER);
energy = DRV_GetReading(OBK_CONSUMPTION_TOTAL);
energy_hour = DRV_GetReading(OBK_CONSUMPTION_LAST_HOUR);
// begin ENERGY block
hprintf255(request, "\"ENERGY\":{");
hprintf255(request, "\"Power\": %f,", power);
hprintf255(request, "\"ApparentPower\": 0,\"ReactivePower\": 0,\"Factor\":%f,", factor);
hprintf255(request, "\"Voltage\":%f,", voltage);
hprintf255(request, "\"Current\":%f,", current);
hprintf255(request, "\"ConsumptionTotal\":%f,", energy);
hprintf255(request, "\"ConsumptionLastHour\":%f", energy_hour);
// close ENERGY block
hprintf255(request, "}");
}
#endif
hprintf255(request, "{\"StatusSNS\":{\"ENERGY\":{");
hprintf255(request, "\"Power\": %f,", power);
hprintf255(request, "\"ApparentPower\": 0,\"ReactivePower\": 0,\"Factor\":%f,", factor);
hprintf255(request, "\"Voltage\":%f,", voltage);
hprintf255(request, "\"Current\":%f,", current);
hprintf255(request, "\"ConsumptionTotal\":%f,", energy);
hprintf255(request, "\"ConsumptionLastHour\":%f}}}", energy_hour);
hprintf255(request, "}");
hprintf255(request, "}");
return 0;
}
@ -1691,19 +1724,284 @@ int http_tasmota_json_status_generic(http_request_t* request) {
const char* deviceName;
const char* friendlyName;
const char* clientId;
int powerCode;
int relayCount, pwmCount, i;
bool bRelayIndexingStartsWithZero;
deviceName = CFG_GetShortDeviceName();
friendlyName = CFG_GetDeviceName();
clientId = CFG_GetMQTTClientId();
hprintf255(request, "{\"Status\":{\"Module\":0,\"DeviceName\":\"%s\"", deviceName);
hprintf255(request, ",\"FriendlyName\":[\"%s\"]", friendlyName);
//deviceName = "Tasmota";
//friendlyName - "Tasmota";
#if 0
const char *dbg = "{\"Status\":{\"Module\":0,\"DeviceName\":\"Tasmota\",\"FriendlyName\":[\"Tasmota\"],\"Topic\":\"tasmota_D79E2C\",\"ButtonTopic\":\"0\",\"Power\":1,\"PowerOnState\":3,\"LedState\":1,\"LedMask\":\"FFFF\",\"SaveData\":1,\"SaveState\":1,\"SwitchTopic\":\"0\",\"SwitchMode\":[0,0,0,0,0,0,0,0],\"ButtonRetain\":0,\"SwitchRetain\":0,\"SensorRetain\":0,\"PowerRetain\":0,\"InfoRetain\":0,\"StateRetain\":0},\"StatusPRM\":{\"Baudrate\":115200,\"SerialConfig\":\"8N1\",\"GroupTopic\":\"tasmotas\",\"OtaUrl\":\"http://ota.tasmota.com/tasmota/release/tasmota.bin.gz\",\"RestartReason\":\"Hardware Watchdog\",\"Uptime\":\"30T03:43:17\",\"StartupUTC\":\"2022-10-10T16:09:41\",\"Sleep\":50,\"CfgHolder\":4617,\"BootCount\":22,\"BCResetTime\":\"2022-01-27T16:10:56\",\"SaveCount\":1235,\"SaveAddress\":\"F9000\"},\"StatusFWR\":{\"Version\":\"10.1.0(tasmota)\",\"BuildDateTime\":\"2021-12-08T14:47:33\",\"Boot\":7,\"Core\":\"2_7_4_9\",\"SDK\":\"2.2.2-dev(38a443e)\",\"CpuFrequency\":80,\"Hardware\":\"ESP8266EX\",\"CR\":\"465/699\"},\"StatusLOG\":{\"SerialLog\":2,\"WebLog\":2,\"MqttLog\":0,\"SysLog\":0,\"LogHost\":\"\",\"LogPort\":514,\"SSId\":[\"DLINK_FastNet\",\"\"],\"TelePeriod\":300,\"Resolution\":\"558180C0\",\"SetOption\":[\"000A8009\",\"2805C80001000600003C5A0A000000000000\",\"00000280\",\"00006008\",\"00004000\"]},\"StatusMEM\":{\"ProgramSize\":616,\"Free\":384,\"Heap\":25,\"ProgramFlashSize\":1024,\"FlashSize\":2048,\"FlashChipId\":\"1540A1\",\"FlashFrequency\":40,\"FlashMode\":3,\"Features\":[\"00000809\",\"8FDAC787\",\"04368001\",\"000000CF\",\"010013C0\",\"C000F981\",\"00004004\",\"00001000\",\"00000020\"],\"Drivers\":\"1,2,3,4,5,6,7,8,9,10,12,16,18,19,20,21,22,24,26,27,29,30,35,37,45\",\"Sensors\":\"1,2,3,4,5,6\"},\"StatusNET\":{\"Hostname\":\"tasmota-D79E2C-7724\",\"IPAddress\":\"192.168.0.104\",\"Gateway\":\"192.168.0.1\",\"Subnetmask\":\"255.255.255.0\",\"DNSServer1\":\"192.168.0.1\",\"DNSServer2\":\"0.0.0.0\",\"Mac\":\"10:52:1C:D7:9E:2C\",\"Webserver\":2,\"HTTP_API\":1,\"WifiConfig\":4,\"WifiPower\":17.0},\"StatusMQT\":{\"MqttHost\":\"192.168.0.113\",\"MqttPort\":1883,\"MqttClientMask\":\"core-mosquitto\",\"MqttClient\":\"core-mosquitto\",\"MqttUser\":\"homeassistant\",\"MqttCount\":23,\"MAX_PACKET_SIZE\":1200,\"KEEPALIVE\":30,\"SOCKET_TIMEOUT\":4},\"StatusTIM\":{\"UTC\":\"2022-11-09T19:52:58\",\"Local\":\"2022-11-09T20:52:58\",\"StartDST\":\"2022-03-27T02:00:00\",\"EndDST\":\"2022-10-30T03:00:00\",\"Timezone\":\"+01:00\",\"Sunrise\":\"07:50\",\"Sunset\":\"17:17\"},\"StatusSNS\":{\"Time\":\"2022-11-09T20:52:58\"},\"StatusSTS\":{\"Time\":\"2022-11-09T20:52:58\",\"Uptime\":\"30T03:43:17\",\"UptimeSec\":2605397,\"Heap\":25,\"SleepMode\":\"Dynamic\",\"Sleep\":10,\"LoadAvg\":99,\"MqttCount\":23,\"POWER\":\"ON\",\"Dimmer\":99,\"Fade\":\"OFF\",\"Speed\":1,\"LedTable\":\"ON\",\"Wifi\":{\"AP\":1,\"SSId\":\"DLINK_FastNet\",\"BSSId\":\"30:B5:C2:5D:70:72\",\"Channel\":11,\"Mode\":\"11n\",\"RSSI\":80,\"Signal\":-60,\"LinkCount\":21,\"Downtime\":\"0T06:13:34\"}}}";
poststr(request,dbg);
return;
#endif
bRelayIndexingStartsWithZero = CHANNEL_HasChannelPinWithRoleOrRole(0, IOR_Relay, IOR_Relay_n);
get_Relay_PWM_Count(&relayCount, &pwmCount);
if (pwmCount > 0) {
powerCode = LED_GetEnableAll();
}
else {
powerCode = 0;
for (i = 0; i < CHANNEL_MAX; i++) {
bool bRelay;
int useIdx;
int iValue;
if (bRelayIndexingStartsWithZero) {
useIdx = i;
}
else {
useIdx = i + 1;
}
bRelay = CHANNEL_HasChannelPinWithRoleOrRole(useIdx, IOR_Relay, IOR_Relay_n);
if (bRelay) {
iValue = CHANNEL_Get(useIdx);
if (iValue)
BIT_SET(powerCode, i);
else
BIT_CLEAR(powerCode, i);
}
}
}
hprintf255(request, "{");
// Status section
hprintf255(request, "\"Status\":{\"Module\":0,\"DeviceName\":\"%s\"", deviceName);
hprintf255(request, ",\"FriendlyName\":[");
if (relayCount == 0) {
hprintf255(request, "\"%s\"", deviceName);
}
else {
int c_printed = 0;
for (i = 0; i < CHANNEL_MAX; i++) {
bool bRelay;
bRelay = CHANNEL_HasChannelPinWithRoleOrRole(i, IOR_Relay, IOR_Relay_n);
if (bRelay) {
int useIdx;
if (bRelayIndexingStartsWithZero) {
useIdx = i + 1;
}
else {
useIdx = i;
}
if (c_printed) {
hprintf255(request, ",");
}
hprintf255(request, "\"%s_%i\"", deviceName, useIdx);
c_printed++;
}
}
}
hprintf255(request, "]");
hprintf255(request, ",\"Topic\":\"%s\",\"ButtonTopic\":\"0\"", clientId);
hprintf255(request, ",\"Power\":1,\"PowerOnState\":3,\"LedState\":1");
hprintf255(request, ",\"Power\":%i,\"PowerOnState\":3,\"LedState\":1", powerCode);
hprintf255(request, ",\"LedMask\":\"FFFF\",\"SaveData\":1,\"SaveState\":1");
hprintf255(request, ",\"SwitchTopic\":\"0\",\"SwitchMode\":[0,0,0,0,0,0,0,0]");
hprintf255(request, ",\"ButtonRetain\":0,\"SwitchRetain\":0,\"SensorRetain\":0");
hprintf255(request, ",\"PowerRetain\":0,\"InfoRetain\":0,\"StateRetain\":0}}");
hprintf255(request, ",\"PowerRetain\":0,\"InfoRetain\":0,\"StateRetain\":0");
hprintf255(request, "}");
hprintf255(request, ",");
hprintf255(request, "\"StatusPRM\":{");
hprintf255(request, "\"Baudrate\":115200,");
hprintf255(request, "\"SerialConfig\":\"8N1\",");
hprintf255(request, "\"GroupTopic\":\"tasmotas\",");
hprintf255(request, "\"OtaUrl\":\"http://ota.tasmota.com/tasmota/release/tasmota.bin.gz\",");
hprintf255(request, "\"RestartReason\":\"HardwareWatchdog\",");
hprintf255(request, "\"Uptime\":\"30T02:59:30\",");
hprintf255(request, "\"StartupUTC\":\"2022-10-10T16:09:41\",");
hprintf255(request, "\"Sleep\":50,");
hprintf255(request, "\"CfgHolder\":4617,");
hprintf255(request, "\"BootCount\":22,");
hprintf255(request, "\"BCResetTime\":\"2022-01-27T16:10:56\",");
hprintf255(request, "\"SaveCount\":1235,");
hprintf255(request, "\"SaveAddress\":\"F9000\"");
hprintf255(request, "}");
hprintf255(request, ",");
hprintf255(request, "\"StatusFWR\":{");
hprintf255(request, "\"Version\":\"%s\",", DEVICENAME_PREFIX_FULL"_"USER_SW_VER);
hprintf255(request, "\"BuildDateTime\":\"%s\",", __DATE__ " " __TIME__);
hprintf255(request, "\"Boot\":7,");
hprintf255(request, "\"Core\":\"%s\",","0.0");
hprintf255(request, "\"SDK\":\"\",","obk");
hprintf255(request, "\"CpuFrequency\":80,");
hprintf255(request, "\"Hardware\":\"%s\",", PLATFORM_MCU_NAME);
hprintf255(request, "\"CR\":\"465/699\"");
hprintf255(request, "}");
hprintf255(request, ",");
hprintf255(request, "\"StatusLOG\":{");
hprintf255(request, "\"SerialLog\":2,");
hprintf255(request, "\"WebLog\":2,");
hprintf255(request, "\"MqttLog\":0,");
hprintf255(request, "\"SysLog\":0,");
hprintf255(request, "\"LogHost\":\"\",");
hprintf255(request, "\"LogPort\":514,");
hprintf255(request, "\"SSId\":[");
hprintf255(request, "\"DLINK_FastNet\",");
hprintf255(request, "\"\"");
hprintf255(request, "],");
hprintf255(request, "\"TelePeriod\":300,");
hprintf255(request, "\"Resolution\":\"558180C0\",");
hprintf255(request, "\"SetOption\":[");
hprintf255(request, "\"000A8009\",");
hprintf255(request, "\"2805C80001000600003C5A0A000000000000\",");
hprintf255(request, "\"00000280\",");
hprintf255(request, "\"00006008\",");
hprintf255(request, "\"00004000\"");
hprintf255(request, "]");
hprintf255(request, "}");
hprintf255(request, ",");
hprintf255(request, "\"StatusMEM\":{");
hprintf255(request, "\"ProgramSize\":616,");
hprintf255(request, "\"Free\":384,");
hprintf255(request, "\"Heap\":25,");
hprintf255(request, "\"ProgramFlashSize\":1024,");
hprintf255(request, "\"FlashSize\":2048,");
hprintf255(request, "\"FlashChipId\":\"1540A1\",");
hprintf255(request, "\"FlashFrequency\":40,");
hprintf255(request, "\"FlashMode\":3,");
hprintf255(request, "\"Features\":[");
hprintf255(request, "\"00000809\",");
hprintf255(request, "\"8FDAC787\",");
hprintf255(request, "\"04368001\",");
hprintf255(request, "\"000000CF\",");
hprintf255(request, "\"010013C0\",");
hprintf255(request, "\"C000F981\",");
hprintf255(request, "\"00004004\",");
hprintf255(request, "\"00001000\",");
hprintf255(request, "\"00000020\"");
hprintf255(request, "],");
hprintf255(request, "\"Drivers\":\"1,2,3,4,5,6,7,8,9,10,12,16,18,19,20,21,22,24,26,27,29,30,35,37,45\",");
hprintf255(request, "\"Sensors\":\"1,2,3,4,5,6\"");
hprintf255(request, "}");
hprintf255(request, ",");
hprintf255(request, "\"StatusNET\":{");
hprintf255(request, "\"Hostname\":\"tasmota-D79E2C-7724\",");
hprintf255(request, "\"IPAddress\":\"192.168.0.104\",");
hprintf255(request, "\"Gateway\":\"192.168.0.1\",");
hprintf255(request, "\"Subnetmask\":\"255.255.255.0\",");
hprintf255(request, "\"DNSServer1\":\"192.168.0.1\",");
hprintf255(request, "\"DNSServer2\":\"0.0.0.0\",");
hprintf255(request, "\"Mac\":\"10:52:1C:D7:9E:2C\",");
hprintf255(request, "\"Webserver\":2,");
hprintf255(request, "\"HTTP_API\":1,");
hprintf255(request, "\"WifiConfig\":4,");
hprintf255(request, "\"WifiPower\":17.0");
hprintf255(request, "}");
hprintf255(request, ",");
hprintf255(request, "\"StatusMQT\":{");
hprintf255(request, "\"MqttHost\":\"192.168.0.113\",");
hprintf255(request, "\"MqttPort\":1883,");
hprintf255(request, "\"MqttClientMask\":\"core-mosquitto\",");
hprintf255(request, "\"MqttClient\":\"core-mosquitto\",");
hprintf255(request, "\"MqttUser\":\"homeassistant\",");
hprintf255(request, "\"MqttCount\":23,");
hprintf255(request, "\"MAX_PACKET_SIZE\":1200,");
hprintf255(request, "\"KEEPALIVE\":30,");
hprintf255(request, "\"SOCKET_TIMEOUT\":4");
hprintf255(request, "}");
hprintf255(request, ",");
hprintf255(request, "\"StatusTIM\":{");
hprintf255(request, "\"UTC\":\"2022-11-09T19:09:11\",");
hprintf255(request, "\"Local\":\"2022-11-09T20:09:11\",");
hprintf255(request, "\"StartDST\":\"2022-03-27T02:00:00\",");
hprintf255(request, "\"EndDST\":\"2022-10-30T03:00:00\",");
hprintf255(request, "\"Timezone\":\"+01:00\",");
hprintf255(request, "\"Sunrise\":\"07:50\",");
hprintf255(request, "\"Sunset\":\"17:17\"");
hprintf255(request, "}");
hprintf255(request, ",");
hprintf255(request, "\"StatusSNS\":{");
hprintf255(request, "\"Time\":\"2022-11-09T19:09:11\"");
hprintf255(request, "}");
hprintf255(request, ",");
hprintf255(request, "\"StatusSTS\":{");
hprintf255(request, "\"Time\":\"2022-11-09T20:09:11\",");
hprintf255(request, "\"Uptime\":\"30T02:59:30\",");
hprintf255(request, "\"UptimeSec\":2602770,");
hprintf255(request, "\"Heap\":25,");
hprintf255(request, "\"SleepMode\":\"Dynamic\",");
hprintf255(request, "\"Sleep\":10,");
hprintf255(request, "\"LoadAvg\":99,");
hprintf255(request, "\"MqttCount\":23,");
http_tasmota_json_power(request);
hprintf255(request, ",");
//if(0)
//{
// hprintf255(request, "\"POWER\":\"ON\",");
// hprintf255(request, "\"Dimmer\":99,");
// hprintf255(request, "\"Fade\":\"OFF\",");
// hprintf255(request, "\"Speed\":1,");
// hprintf255(request, "\"LedTable\":\"ON\",");
//}
//else
//{
// for (i = 0; i < CHANNEL_MAX; i++) {
// bool bRelay;
// int iValue;
// bRelay = CHANNEL_HasChannelPinWithRoleOrRole(i, IOR_Relay, IOR_Relay_n);
// iValue = CHANNEL_Get(i);
// if (bRelay) {
// hprintf255(request, "\"POWER%i\":\"%s\",",i, iValue == 0 ? "OFF" : "ON");
// }
// }
//}
hprintf255(request, "\"Wifi\":{");
hprintf255(request, "\"AP\":1,");
hprintf255(request, "\"SSId\":\"SSIIIIIIIIIIIID\",");
hprintf255(request, "\"BSSId\":\"30:B5:C2:5D:70:72\",");
hprintf255(request, "\"Channel\":11,");
hprintf255(request, "\"Mode\":\"11n\",");
hprintf255(request, "\"RSSI\":78,");
hprintf255(request, "\"Signal\":-61,");
hprintf255(request, "\"LinkCount\":21,");
hprintf255(request, "\"Downtime\":\"0T06:13:34\"");
hprintf255(request, "}");
hprintf255(request, "}");
// end
hprintf255(request, "}");
@ -1718,9 +2016,12 @@ int http_fn_cm(http_request_t* request) {
CMD_ExecuteCommand(tmpA, COMMAND_FLAG_SOURCE_HTTP);
if (!wal_strnicmp(tmpA, "POWER", 5)) {
poststr(request, "{");
http_tasmota_json_power(request);
poststr(request, "}");
}
else if (!wal_strnicmp(tmpA, "STATUS 8", 8)) {
else if (!wal_strnicmp(tmpA, "STATUS 8", 8) || !wal_strnicmp(tmpA, "STATUS 10", 10)) {
http_tasmota_json_status_SNS(request);
}
else {

View File

@ -48,28 +48,6 @@ const char htmlFooterInfo[] =
"<a target=\"_blank\" "
"href=\"https://paypal.me/openshwprojects\">Support project</a><br>";
// make sure that USER_SW_VER is set on all platforms
// Automatic Github builds are setting it externally,
// but it may not be set while doing a test build on developer PC
#ifndef USER_SW_VER
#ifdef WINDOWS
#define USER_SW_VER "Win_Test"
#elif PLATFORM_XR809
#define USER_SW_VER "XR809_Test"
#elif defined(PLATFORM_BK7231N)
#define USER_SW_VER "BK7231N_Test"
#elif defined(PLATFORM_BK7231T)
#define USER_SW_VER "BK7231T_Test"
#elif defined(PLATFORM_BL602)
#define USER_SW_VER "BL602_Test"
#elif defined(PLATFORM_W600)
#define USER_SW_VER "W600_Test"
#elif defined(PLATFORM_W800)
#define USER_SW_VER "W800_Test"
#else
#define USER_SW_VER "unknown"
#endif
#endif
const char* g_build_str = "Build on " __DATE__ " " __TIME__ " version " USER_SW_VER; // Show GIT version at Build line;
const char httpCorsHeaders[] = "Access-Control-Allow-Origin: *\r\nAccess-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept"; // TEXT MIME type
@ -168,6 +146,21 @@ void http_setup(http_request_t* request, const char* type) {
hprintf255(request, httpHeader, request->responseCode, type);
poststr(request, "\r\n"); // next header
poststr(request, httpCorsHeaders);
#if 0
poststr(request, "Server: Tasmota/10.1.0 (ESP8266EX)");
poststr(request, "\r\n");
poststr(request, "Cache-Control: no-cache, no-store, must-revalidate");
poststr(request, "\r\n");
poststr(request, "Pragma: no-cache");
poststr(request, "\r\n");
poststr(request, "Expires: -1");
poststr(request, "\r\n");
poststr(request, "Accept-Ranges: none");
poststr(request, "\r\n");
poststr(request, "Transfer-Encoding: chunked");
poststr(request, "\r\n");
poststr(request, "Connection: close");
#endif
poststr(request, "\r\n"); // end headers with double CRLF
poststr(request, "\r\n");
}
@ -485,13 +478,15 @@ int HTTP_ProcessPacket(http_request_t* request) {
// chop URL at space
p = strchr(urlStr, ' ');
if (*p) {
*p = '\0';
p++; // past space
}
else {
ADDLOGF_ERROR("invalid request\n");
return 0;
if (p != 0) {
if (*p) {
*p = '\0';
p++; // past space
}
else {
ADDLOGF_ERROR("invalid request\n");
return 0;
}
}
request->url = urlStr;
@ -499,51 +494,61 @@ int HTTP_ProcessPacket(http_request_t* request) {
// protocol is next, termed by \r\n
protocol = p;
p = strchr(protocol, '\r');
if (*p) {
*p = '\0';
p++; // past \r
p++; // past \n
}
else {
ADDLOGF_ERROR("invalid request\n");
return 0;
if (p != 0) {
if (*p) {
*p = '\0';
p++; // past \r
p++; // past \n
}
else {
ADDLOGF_ERROR("invalid request\n");
return 0;
}
}
// i.e. not received
request->contentLength = -1;
headers = p;
do {
p = strchr(headers, '\r');
if (p != headers) {
if (p) {
if (request->numheaders < 16) {
request->headers[request->numheaders] = headers;
request->numheaders++;
}
// pick out contentLength
if (!my_strnicmp(headers, "Content-Length:", 15)) {
request->contentLength = atoi(headers + 15);
}
if (headers != 0) {
do {
p = strchr(headers, '\r');
if (p != headers) {
if (p) {
if (request->numheaders < 16) {
request->headers[request->numheaders] = headers;
request->numheaders++;
}
// pick out contentLength
if (!my_strnicmp(headers, "Content-Length:", 15)) {
request->contentLength = atoi(headers + 15);
}
*p = 0;
p++; // past \r
p++; // past \n
headers = p;
*p = 0;
p++; // past \r
p++; // past \n
headers = p;
}
else {
break;
}
}
else {
if (*p == '\r') {
// end of headers
*p = 0;
p++;
p++;
break;
}
}
if (*p == '\r') {
// end of headers
*p = 0;
p++;
p++;
break;
}
} while (1);
} while (1);
}
request->bodystart = p;
request->bodylen = request->receivedLen - (p - request->received);
if (p == 0) {
request->bodystart = 0;
request->bodylen = 0;
}
else {
request->bodystart = p;
request->bodylen = request->receivedLen - (p - request->received);
}
#if 0
postany(request, "test", 4);
return 0;