Query String processing in /capture and /stream handlers
parent
d021b14e42
commit
3721de4cd0
|
@ -449,12 +449,59 @@ static size_t jpg_encode_stream(void *arg, size_t index, const void *data, size_
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static esp_err_t process_query_string(httpd_req_t *req, sensor_t *s)
|
||||||
|
{
|
||||||
|
esp_err_t ret = ESP_OK;
|
||||||
|
|
||||||
|
// Extract query string from the request
|
||||||
|
size_t qs_len = httpd_req_get_url_query_len(req);
|
||||||
|
if (qs_len == 0)
|
||||||
|
return ESP_OK; // No variables to set
|
||||||
|
char *qs = malloc(qs_len + 1);
|
||||||
|
if (!qs) {
|
||||||
|
ESP_LOGE(TAG, "QS malloc(%d) error", qs_len + 1);
|
||||||
|
httpd_resp_send_500(req);
|
||||||
|
return ESP_FAIL;
|
||||||
|
}
|
||||||
|
ret = httpd_req_get_url_query_str(req, qs, qs_len + 1);
|
||||||
|
if (ret != ESP_OK) {
|
||||||
|
ESP_LOGE(TAG, "QS httpd_req_get_url_query_str() error");
|
||||||
|
free(qs);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parse and set individual variables
|
||||||
|
char *p, *q = NULL;
|
||||||
|
char *p_token = strtok_r(qs, "&", &p);
|
||||||
|
while (p_token != NULL) {
|
||||||
|
char *variable = strtok_r(p_token, "=", &q);
|
||||||
|
char *val_str = strtok_r(NULL, "=", &q);
|
||||||
|
|
||||||
|
if (variable != NULL && val_str != NULL) {
|
||||||
|
int val = atoi(val_str);
|
||||||
|
ret = set_variable(variable, val, s, true);
|
||||||
|
if (ret != ESP_OK)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
p_token = strtok_r(NULL, "&", &p);
|
||||||
|
}
|
||||||
|
free(qs);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static esp_err_t capture_handler(httpd_req_t *req)
|
static esp_err_t capture_handler(httpd_req_t *req)
|
||||||
{
|
{
|
||||||
camera_fb_t *fb = NULL;
|
camera_fb_t *fb = NULL;
|
||||||
esp_err_t res = ESP_OK;
|
esp_err_t res = ESP_OK;
|
||||||
int64_t fr_start = esp_timer_get_time();
|
int64_t fr_start = esp_timer_get_time();
|
||||||
|
|
||||||
|
// Parse variables from URL query string
|
||||||
|
sensor_t *sensor = esp_camera_sensor_get();
|
||||||
|
res = process_query_string(req, sensor);
|
||||||
|
if (res != ESP_OK)
|
||||||
|
return res;
|
||||||
|
|
||||||
#ifdef CONFIG_LED_ILLUMINATOR_ENABLED
|
#ifdef CONFIG_LED_ILLUMINATOR_ENABLED
|
||||||
enable_led(true);
|
enable_led(true);
|
||||||
vTaskDelay(150 / portTICK_PERIOD_MS); // The LED needs to be turned on ~150ms before the call to esp_camera_fb_get()
|
vTaskDelay(150 / portTICK_PERIOD_MS); // The LED needs to be turned on ~150ms before the call to esp_camera_fb_get()
|
||||||
|
@ -601,6 +648,12 @@ static esp_err_t stream_handler(httpd_req_t *req)
|
||||||
httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*");
|
httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*");
|
||||||
httpd_resp_set_hdr(req, "X-Framerate", "60");
|
httpd_resp_set_hdr(req, "X-Framerate", "60");
|
||||||
|
|
||||||
|
// Parse variables from URL query string
|
||||||
|
sensor_t *sensor = esp_camera_sensor_get();
|
||||||
|
res = process_query_string(req, sensor);
|
||||||
|
if (res != ESP_OK)
|
||||||
|
return res;
|
||||||
|
|
||||||
#ifdef CONFIG_LED_ILLUMINATOR_ENABLED
|
#ifdef CONFIG_LED_ILLUMINATOR_ENABLED
|
||||||
enable_led(true);
|
enable_led(true);
|
||||||
isStreaming = true;
|
isStreaming = true;
|
||||||
|
|
Loading…
Reference in New Issue