144 lines
3.7 KiB
C
144 lines
3.7 KiB
C
#ifndef HTTPCOMMON_H_
|
|
#define HTTPCOMMON_H_
|
|
|
|
/*includes*/
|
|
#include "contiki.h"
|
|
#include "contiki-net.h"
|
|
|
|
/*current state of the request, waiting: handling request, output: sending response*/
|
|
#define STATE_WAITING 0
|
|
#define STATE_OUTPUT 1
|
|
|
|
/*definitions of the line ending characters*/
|
|
#define LINE_FEED_CHAR '\n'
|
|
#define CARRIAGE_RETURN_CHAR '\r'
|
|
|
|
/*needed for web services giving all path (http://172.16.79.0/services/light1)
|
|
* instead relative (/services/light1) in HTTP request. Ex: Restlet lib. does it*/
|
|
extern const char* http_string;
|
|
|
|
/*HTTP method strings*/
|
|
extern const char* http_get_string;
|
|
extern const char* http_head_string;
|
|
extern const char* http_post_string;
|
|
extern const char* http_put_string;
|
|
extern const char* http_delete_string;
|
|
|
|
extern const char* httpv1_1;
|
|
extern const char* line_end;
|
|
extern const char* contiki;
|
|
extern const char* close;
|
|
|
|
/*header names*/
|
|
extern const char* HTTP_HEADER_NAME_CONTENT_TYPE;
|
|
extern const char* HTTP_HEADER_NAME_CONTENT_LENGTH;
|
|
extern const char* HTTP_HEADER_NAME_LOCATION;
|
|
extern const char* HTTP_HEADER_NAME_CONNECTION;
|
|
extern const char* HTTP_HEADER_NAME_SERVER;
|
|
extern const char* HTTP_HEADER_NAME_HOST;
|
|
extern const char* HTTP_HEADER_NAME_IF_NONE_MATCH;
|
|
extern const char* HTTP_HEADER_NAME_ETAG;
|
|
|
|
extern const char* header_delimiter;
|
|
|
|
|
|
/*Configuration parameters*/
|
|
#define HTTP_PORT 8080
|
|
#define HTTP_DATA_BUFF_SIZE 600
|
|
#define INCOMING_DATA_BUFF_SIZE 102 /*100+2, 100 = max url len, 2 = space char+'\0'*/
|
|
|
|
/*HTTP method types*/
|
|
typedef enum {
|
|
HTTP_METHOD_GET = (1 << 0),
|
|
HTTP_METHOD_HEAD = (1 << 1),
|
|
HTTP_METHOD_POST = (1 << 2),
|
|
HTTP_METHOD_PUT = (1 << 3),
|
|
HTTP_METHOD_DELETE = (1 << 4)
|
|
} http_method_t;
|
|
|
|
//DY : FIXME right now same enum names with COAP with different values. Will this work fine?
|
|
typedef enum {
|
|
OK_200 = 200,
|
|
CREATED_201 = 201,
|
|
NOT_MODIFIED_304 = 304,
|
|
BAD_REQUEST_400 = 400,
|
|
NOT_FOUND_404 = 404,
|
|
METHOD_NOT_ALLOWED_405 = 405,
|
|
REQUEST_URI_TOO_LONG_414 = 414,
|
|
UNSUPPORTED_MADIA_TYPE_415 = 415,
|
|
INTERNAL_SERVER_ERROR_500 = 500,
|
|
BAD_GATEWAY_502 = 502,
|
|
SERVICE_UNAVAILABLE_503 = 503,
|
|
GATEWAY_TIMEOUT_504 = 504
|
|
} status_code_t;
|
|
|
|
typedef enum {
|
|
TEXT_PLAIN,
|
|
TEXT_XML,
|
|
TEXT_CSV,
|
|
TEXT_HTML,
|
|
APPLICATION_XML,
|
|
APPLICATION_EXI,
|
|
APPLICATION_JSON,
|
|
APPLICATION_LINK_FORMAT,
|
|
APPLICATION_WWW_FORM,
|
|
UNKNOWN_CONTENT_TYPE
|
|
} content_type_t;
|
|
|
|
/*Header type*/
|
|
struct http_header_t {
|
|
struct http_header_t* next;
|
|
char* name;
|
|
char* value;
|
|
};
|
|
typedef struct http_header_t http_header_t;
|
|
|
|
/*This structure contains information about the HTTP request.*/
|
|
struct http_request_t {
|
|
char* url;
|
|
uint16_t url_len;
|
|
http_method_t request_type; /* GET, POST, etc */
|
|
char* query;
|
|
uint16_t query_len;
|
|
http_header_t* headers;
|
|
uint16_t payload_len;
|
|
uint8_t* payload;
|
|
};
|
|
typedef struct http_request_t http_request_t;
|
|
|
|
/*This structure contains information about the HTTP response.*/
|
|
struct http_response_t {
|
|
status_code_t status_code;
|
|
char* status_string;
|
|
http_header_t* headers;
|
|
uint16_t payload_len;
|
|
uint8_t* payload;
|
|
};
|
|
typedef struct http_response_t http_response_t;
|
|
|
|
/*This structure contains information about the TCP Connection.*/
|
|
typedef struct {
|
|
struct psock sin, sout; /*Protosockets for incoming and outgoing communication*/
|
|
struct pt outputpt;
|
|
char inputbuf[INCOMING_DATA_BUFF_SIZE]; /*to put incoming data in*/
|
|
uint8_t state;
|
|
http_request_t request;
|
|
http_response_t response;
|
|
} connection_state_t;
|
|
|
|
/*error definitions*/
|
|
typedef enum {
|
|
HTTP_NO_ERROR,
|
|
|
|
/*Memory errors*/
|
|
HTTP_MEMORY_ALLOC_ERR,
|
|
HTTP_MEMORY_BOUNDARY_EXCEEDED,
|
|
|
|
/*specific errors*/
|
|
HTTP_XML_NOT_VALID,
|
|
HTTP_SOAP_MESSAGE_NOT_VALID,
|
|
HTTP_URL_TOO_LONG,
|
|
HTTP_URL_INVALID
|
|
} http_error_t;
|
|
|
|
#endif /*HTTPCOMMON_H_*/
|