int ICACHE_FLASH_ATTR http_relay_api_toggle(http_connection *c) { NODE_DBG("http_wifi_api_get_status"); //wait for whole body if(c->state <HTTPD_STATE_BODY_END) return HTTPD_CGI_MORE; int ret = json_count_token(c->body.data,c->body.len); jsonPair fields[1]={ { .key="relay", .value=NULL } }; if(json_parse(&fields[0],1,c->body.data,c->body.len)){ int relayNumber = atoi(fields[0].value); if(relayNumber<0 || relayNumber >=relay_count()){ http_response_BAD_REQUEST(c); NODE_DBG("Wrong relay"); return HTTPD_CGI_DONE; } unsigned status = relay_get_state(relayNumber); status = relay_toggle_state(relayNumber); //write headers http_SET_HEADER(c,HTTP_CONTENT_TYPE,JSON_CONTENT_TYPE); http_response_OK(c); write_json_object_start(c); write_json_pair_int(c,"relay",relayNumber); write_json_list_separator(c); write_json_pair_int(c,"state",status); write_json_object_end(c); return HTTPD_CGI_DONE; } else{ http_response_BAD_REQUEST(c); return HTTPD_CGI_DONE; } http_response_BAD_REQUEST(c); return HTTPD_CGI_DONE; }
int ICACHE_FLASH_ATTR http_relay_api_toggle(http_connection *c) { NODE_DBG("http_wifi_api_get_status"); //wait for whole body if(c->state <HTTPD_STATE_BODY_END) return HTTPD_CGI_MORE; //parse json cJSON * root = cJSON_Parse(c->body.data); if(root==NULL) goto badrequest; cJSON * relay = cJSON_GetObjectItem(root,"relay"); if(relay==NULL) goto badrequest; int relayNumber = relay->valueint; cJSON_Delete(root); if(relayNumber<0 || relayNumber >=relay_count()){ http_response_BAD_REQUEST(c); NODE_DBG("Wrong relay"); return HTTPD_CGI_DONE; } else{ //valid relay unsigned status = relay_get_state(relayNumber); status = relay_toggle_state(relayNumber); //write headers http_SET_HEADER(c,HTTP_CONTENT_TYPE,JSON_CONTENT_TYPE); http_response_OK(c); //create json root = cJSON_CreateObject(); cJSON_AddNumberToObject(root,"relay",relayNumber); cJSON_AddNumberToObject(root,"state",status); http_write_json(c,root); //delete json struct cJSON_Delete(root); return HTTPD_CGI_DONE; } badrequest: http_response_BAD_REQUEST(c); return HTTPD_CGI_DONE; }