Fixed token bug in separate response and extended API (thanks to Klaus Hartke for the bug report).
This commit is contained in:
parent
2ef46ac47a
commit
cd802979da
@ -57,15 +57,12 @@
|
|||||||
int coap_separate_handler(resource_t *resource, void *request, void *response)
|
int coap_separate_handler(resource_t *resource, void *request, void *response)
|
||||||
{
|
{
|
||||||
coap_packet_t *const coap_req = (coap_packet_t *) request;
|
coap_packet_t *const coap_req = (coap_packet_t *) request;
|
||||||
coap_packet_t *const coap_res = (coap_packet_t *) response;
|
|
||||||
|
|
||||||
PRINTF("Separate response for /%s MID %u\n", resource->url, coap_res->mid);
|
PRINTF("Separate response for /%s MID %u\n", resource->url, coap_res->mid);
|
||||||
|
|
||||||
/* Only ack CON requests. */
|
/* Only ack CON requests. */
|
||||||
if (coap_req->type==COAP_TYPE_CON)
|
if (coap_req->type==COAP_TYPE_CON)
|
||||||
{
|
{
|
||||||
coap_transaction_t *const t = coap_get_transaction_by_mid(coap_res->mid);
|
|
||||||
|
|
||||||
/* send separate ACK. */
|
/* send separate ACK. */
|
||||||
coap_packet_t ack[1];
|
coap_packet_t ack[1];
|
||||||
/* ACK with empty code (0) */
|
/* ACK with empty code (0) */
|
||||||
@ -79,7 +76,7 @@ int coap_separate_handler(resource_t *resource, void *request, void *response)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
coap_separate_response(void *request, coap_separate_t *separate_store)
|
coap_separate_yield(void *request, coap_separate_t *separate_store)
|
||||||
{
|
{
|
||||||
coap_packet_t *const coap_req = (coap_packet_t *) request;
|
coap_packet_t *const coap_req = (coap_packet_t *) request;
|
||||||
coap_transaction_t *const t = coap_get_transaction_by_mid(coap_req->mid);
|
coap_transaction_t *const t = coap_get_transaction_by_mid(coap_req->mid);
|
||||||
@ -96,9 +93,7 @@ coap_separate_response(void *request, coap_separate_t *separate_store)
|
|||||||
separate_store->token_len = coap_req->token_len;
|
separate_store->token_len = coap_req->token_len;
|
||||||
|
|
||||||
separate_store->block2_num = coap_req->block2_num;
|
separate_store->block2_num = coap_req->block2_num;
|
||||||
separate_store->block2_more = coap_req->block2_more;
|
|
||||||
separate_store->block2_size = coap_req->block2_size;
|
separate_store->block2_size = coap_req->block2_size;
|
||||||
separate_store->block2_offset = coap_req->block2_offset;
|
|
||||||
|
|
||||||
/* Signal the engine to skip automatic response and clear transaction by engine. */
|
/* Signal the engine to skip automatic response and clear transaction by engine. */
|
||||||
coap_error_code = MANUAL_RESPONSE;
|
coap_error_code = MANUAL_RESPONSE;
|
||||||
@ -110,3 +105,10 @@ coap_separate_response(void *request, coap_separate_t *separate_store)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
coap_separate_resume(void *response, coap_separate_t *separate_store, uint8_t code)
|
||||||
|
{
|
||||||
|
coap_init_message(response, separate_store->type, code, separate_store->mid);
|
||||||
|
coap_set_header_token(response, separate_store->token, separate_store->token_len);
|
||||||
|
}
|
||||||
|
@ -54,13 +54,12 @@ typedef struct coap_separate {
|
|||||||
|
|
||||||
/* separate + blockwise is untested! */
|
/* separate + blockwise is untested! */
|
||||||
uint32_t block2_num;
|
uint32_t block2_num;
|
||||||
uint8_t block2_more;
|
|
||||||
uint16_t block2_size;
|
uint16_t block2_size;
|
||||||
uint32_t block2_offset;
|
|
||||||
|
|
||||||
} coap_separate_t;
|
} coap_separate_t;
|
||||||
|
|
||||||
int coap_separate_handler(resource_t *resource, void *request, void *response);
|
int coap_separate_handler(resource_t *resource, void *request, void *response);
|
||||||
int coap_separate_response(void *response, coap_separate_t *separate_store);
|
int coap_separate_yield(void *request, coap_separate_t *separate_store);
|
||||||
|
void coap_separate_resume(void *response, coap_separate_t *separate_store, uint8_t code);
|
||||||
|
|
||||||
#endif /* COAP_SEPARATE_H_ */
|
#endif /* COAP_SEPARATE_H_ */
|
||||||
|
@ -349,7 +349,7 @@ chunks_handler(void* request, void* response, uint8_t *buffer, uint16_t preferre
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if REST_RES_SEPARATE && WITH_COAP > 3
|
#if defined (PLATFORM_HAS_BUTTON) && REST_RES_SEPARATE && WITH_COAP > 3
|
||||||
/* Required to manually (=not by the engine) handle the response transaction. */
|
/* Required to manually (=not by the engine) handle the response transaction. */
|
||||||
#include "er-coap-07-separate.h"
|
#include "er-coap-07-separate.h"
|
||||||
#include "er-coap-07-transactions.h"
|
#include "er-coap-07-transactions.h"
|
||||||
@ -390,7 +390,8 @@ separate_handler(void* request, void* response, uint8_t *buffer, uint16_t prefer
|
|||||||
separate_active = 1;
|
separate_active = 1;
|
||||||
|
|
||||||
/* Take over and skip response by engine. */
|
/* Take over and skip response by engine. */
|
||||||
coap_separate_response(request, &separate_store->request_metadata);
|
coap_separate_yield(request, &separate_store->request_metadata);
|
||||||
|
/* Be aware to respect the Block2 option, which is also stored in the coap_separate_t. */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* At the moment, only the minimal information is stored in the store (client address, port, token, MID, type, and Block2).
|
* At the moment, only the minimal information is stored in the store (client address, port, token, MID, type, and Block2).
|
||||||
@ -410,10 +411,18 @@ separate_finalize_handler()
|
|||||||
if ( (transaction = coap_new_transaction(separate_store->request_metadata.mid, &separate_store->request_metadata.addr, separate_store->request_metadata.port)) )
|
if ( (transaction = coap_new_transaction(separate_store->request_metadata.mid, &separate_store->request_metadata.addr, separate_store->request_metadata.port)) )
|
||||||
{
|
{
|
||||||
coap_packet_t response[1]; /* This way the packet can be treated as pointer as usual. */
|
coap_packet_t response[1]; /* This way the packet can be treated as pointer as usual. */
|
||||||
coap_init_message(response, separate_store->request_metadata.type, CONTENT_2_05, separate_store->request_metadata.mid);
|
|
||||||
|
/* Restore the request information for the response. */
|
||||||
|
coap_separate_resume(response, &separate_store->request_metadata, CONTENT_2_05);
|
||||||
|
|
||||||
coap_set_payload(response, separate_store->buffer, strlen(separate_store->buffer));
|
coap_set_payload(response, separate_store->buffer, strlen(separate_store->buffer));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Be aware to respect the Block2 option, which is also stored in the coap_separate_t.
|
||||||
|
* As it is a critical option, this example resource pretends to handle it for compliance.
|
||||||
|
*/
|
||||||
|
coap_set_header_block2(response, separate_store->request_metadata.block2_num, 0, separate_store->request_metadata.block2_size);
|
||||||
|
|
||||||
/* Warning: No check for serialization error. */
|
/* Warning: No check for serialization error. */
|
||||||
transaction->packet_len = coap_serialize_message(response, transaction->packet);
|
transaction->packet_len = coap_serialize_message(response, transaction->packet);
|
||||||
coap_send_transaction(transaction);
|
coap_send_transaction(transaction);
|
||||||
@ -692,14 +701,16 @@ PROCESS_THREAD(rest_server_example, ev, data)
|
|||||||
#if REST_RES_PUSHING
|
#if REST_RES_PUSHING
|
||||||
rest_activate_periodic_resource(&periodic_resource_pushing);
|
rest_activate_periodic_resource(&periodic_resource_pushing);
|
||||||
#endif
|
#endif
|
||||||
#if REST_RES_SEPARATE && WITH_COAP > 3
|
#if defined (PLATFORM_HAS_BUTTON) && REST_RES_EVENT
|
||||||
|
rest_activate_event_resource(&resource_event);
|
||||||
|
#endif
|
||||||
|
#if defined (PLATFORM_HAS_BUTTON) && REST_RES_SEPARATE && WITH_COAP > 3
|
||||||
|
/* Use this pre-handler for separate response resources. */
|
||||||
rest_set_pre_handler(&resource_separate, coap_separate_handler);
|
rest_set_pre_handler(&resource_separate, coap_separate_handler);
|
||||||
rest_activate_resource(&resource_separate);
|
rest_activate_resource(&resource_separate);
|
||||||
#endif
|
#endif
|
||||||
|
#if defined (PLATFORM_HAS_BUTTON) && (REST_RES_EVENT || (REST_RES_SEPARATE && WITH_COAP > 3))
|
||||||
#if defined (PLATFORM_HAS_BUTTON) && REST_RES_EVENT
|
|
||||||
SENSORS_ACTIVATE(button_sensor);
|
SENSORS_ACTIVATE(button_sensor);
|
||||||
rest_activate_event_resource(&resource_event);
|
|
||||||
#endif
|
#endif
|
||||||
#if defined (PLATFORM_HAS_LEDS)
|
#if defined (PLATFORM_HAS_LEDS)
|
||||||
#if REST_RES_LEDS
|
#if REST_RES_LEDS
|
||||||
|
Loading…
Reference in New Issue
Block a user