void led_handler(REQUEST* request, RESPONSE* response) { char color[10]; char mode[10]; uint8_t led = 0; int success = 1; int ret; ret = rest_get_query_variable(request, "color", color, 10); if (ret) { PRINTF("color %s\n", color); if (!strcmp(color,"red")) { led = LEDS_RED; } else if(!strcmp(color,"green")) { led = LEDS_GREEN; } else { success = 0; } } else { success = 0; } ret = rest_get_query_variable(request, "mode", mode, 10); if (success && ret) { PRINTF("mode %s\n", mode); if (!strcmp(mode, "on")) { leds_on(led); } else if (!strcmp(mode, "off")) { leds_off(led); } else { success = 0; } } else { success = 0; } if (!success) { rest_set_response_status(response, BAD_REQUEST_400); } }
int rest_invoke_restful_service(REQUEST* request, RESPONSE* response) { int found = 0; const char* url = request->url; uint16_t url_len = request->url_len; PRINTF("rest_invoke_restful_service url %s url_len %d -->\n", url, url_len); resource_t* resource = NULL; for (resource = (resource_t*)list_head(restful_services); resource; resource = resource->next) { /*if the web service handles that kind of requests and urls matches*/ if (url && strlen(resource->url) == url_len && strncmp(resource->url, url, url_len) == 0){ found = 1; method_t method = rest_get_method_type(request); PRINTF("method %u, resource->methods_to_handle %u\n", (uint16_t)method, resource->methods_to_handle); if (resource->methods_to_handle & method) { /*FIXME Need to move somewhere else*/ #ifdef WITH_COAP uint32_t lifetime = 0; if (coap_get_header_subscription_lifetime(request, &lifetime)) { PRINTF("Lifetime %lu\n", lifetime); periodic_resource_t* periodic_resource = NULL; for (periodic_resource = (periodic_resource_t*)list_head(restful_periodic_services); periodic_resource; periodic_resource = periodic_resource->next) { if (periodic_resource->resource == resource) { PRINTF("Periodic Resource Found\n"); PRINT6ADDR(&request->addr); periodic_resource->lifetime = lifetime; stimer_set(periodic_resource->lifetime_timer, lifetime); uip_ipaddr_copy(&periodic_resource->addr, &request->addr); } } } #endif /*WITH_COAP*/ /*call pre handler if it exists*/ if (!resource->pre_handler || resource->pre_handler(request, response)) { /* call handler function*/ resource->handler(request, response); /*call post handler if it exists*/ if (resource->post_handler) { resource->post_handler(request, response); } } } else { rest_set_response_status(response, METHOD_NOT_ALLOWED_405); } break; } } if (!found) { rest_set_response_status(response, NOT_FOUND_404); } return found; }
void mem_handler(REQUEST* request, RESPONSE* response) { char arg[16]; uint32_t addr, val; int success = 1; int ret; ret = rest_get_query_variable(request, "addr", arg, 16); if (ret) { addr = readhex(arg); ret = rest_get_query_variable(request, "sz", arg, 16); if (ret) { if (arg[0] == '1') { ret = rest_get_query_variable(request, "val", arg, 16); if (ret) { val = readhex(arg); *(uint8_t*)addr = (uint8_t)val; sprintf(temp, "OK\n"); } else { sprintf(temp, "0x%02x\n", *(uint8_t*)addr); } } else if (arg[0] == '2') { ret = rest_get_query_variable(request, "val", arg, 16); if (ret) { val = readhex(arg); *(uint16_t*)addr = (uint16_t)val; sprintf(temp, "OK\n"); } else { sprintf(temp, "0x%0hx\n", *(uint16_t*)addr); } } else { ret = rest_get_query_variable(request, "val", arg, 16); if (ret) { val = readhex(arg); *(uint32_t*)addr = (uint32_t)val; sprintf(temp, "OK\n"); } else { sprintf(temp, "0x%0x\n", *(uint32_t*)addr); } } } else { ret = rest_get_query_variable(request, "val", arg, 16); if (ret) { val = readhex(arg); *(uint32_t*)addr = (uint32_t)val; sprintf(temp, "OK\n"); } else { sprintf(temp, "0x%0x\n", *(uint32_t*)addr); } } } else { success = 0; } if (success) { rest_set_header_content_type(response, TEXT_PLAIN); rest_set_response_payload(response, (uint8_t*)temp, strlen(temp)); } else { rest_set_response_status(response, BAD_REQUEST_400); } }