Contiki-NG
websocket-http-client.h
1 /*
2  * Copyright (c) 2014, Thingsquare, http://www.thingsquare.com/.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  * notice, this list of conditions and the following disclaimer in the
12  * documentation and/or other materials provided with the distribution.
13  * 3. Neither the name of the copyright holder nor the names of its
14  * contributors may be used to endorse or promote products derived
15  * from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
20  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
21  * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
22  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
26  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
28  * OF THE POSSIBILITY OF SUCH DAMAGE.
29  *
30  */
31 #ifndef WEBSOCKET_HTTP_CLIENT_H_
32 #define WEBSOCKET_HTTP_CLIENT_H_
33 
34 #include "contiki.h"
35 #include "tcp-socket.h"
36 
37 #ifdef WEBSOCKET_HTTP_CLIENT_CONF_INPUTBUFSIZE
38 #define WEBSOCKET_HTTP_CLIENT_INPUTBUFSIZE WEBSOCKET_HTTP_CLIENT_CONF_INPUTBUFSIZE
39 #else /* WEBSOCKET_HTTP_CLIENT_CONF_INPUTBUFSIZE */
40 #define WEBSOCKET_HTTP_CLIENT_INPUTBUFSIZE 100
41 #endif /* WEBSOCKET_HTTP_CLIENT_CONF_INPUTBUFSIZE */
42 
43 #ifdef WEBSOCKET_HTTP_CLIENT_CONF_OUTPUTBUFSIZE
44 #define WEBSOCKET_HTTP_CLIENT_OUTPUTBUFSIZE WEBSOCKET_HTTP_CLIENT_CONF_OUTPUTBUFSIZE
45 #else /* WEBSOCKET_HTTP_CLIENT_CONF_OUTPUTBUFSIZE */
46 #define WEBSOCKET_HTTP_CLIENT_OUTPUTBUFSIZE 300
47 #endif /* WEBSOCKET_HTTP_CLIENT_CONF_OUTPUTBUFSIZE */
48 
49 #ifdef WEBSOCKET_HTTP_CLIENT_CONF_MAX_HOSTLEN
50 #define WEBSOCKET_HTTP_CLIENT_MAX_HOSTLEN WEBSOCKET_HTTP_CLIENT_CONF_MAX_HOSTLEN
51 #else /* WEBSOCKET_HTTP_CLIENT_CONF_MAX_HOSTLEN */
52 #define WEBSOCKET_HTTP_CLIENT_MAX_HOSTLEN 32
53 #endif /* WEBSOCKET_HTTP_CLIENT_CONF_MAX_HOSTLEN */
54 
55 #ifdef WEBSOCKET_HTTP_CLIENT_CONF_MAX_FILELEN
56 #define WEBSOCKET_HTTP_CLIENT_MAX_FILELEN WEBSOCKET_HTTP_CLIENT_CONF_MAX_FILELEN
57 #else /* WEBSOCKET_HTTP_CLIENT_CONF_MAX_FILELEN */
58 #define WEBSOCKET_HTTP_CLIENT_MAX_FILELEN 32
59 #endif /* WEBSOCKET_HTTP_CLIENT_CONF_MAX_FILELEN */
60 
61 #ifdef WEBSOCKET_HTTP_CLIENT_CONF_MAX_SUBPROTOCOLLEN
62 #define WEBSOCKET_HTTP_CLIENT_MAX_SUBPROTOCOLLEN WEBSOCKET_HTTP_CLIENT_CONF_MAX_SUBPROTOCOLLEN
63 #else /* WEBSOCKET_HTTP_CLIENT_CONF_MAX_SUBPROTOCOLLEN */
64 #define WEBSOCKET_HTTP_CLIENT_MAX_SUBPROTOCOLLEN 24
65 #endif /* WEBSOCKET_HTTP_CLIENT_CONF_MAX_SUBPROTOCOLLEN */
66 
67 #ifdef WEBSOCKET_HTTP_CLIENT_CONF_MAX_HEADERLEN
68 #define WEBSOCKET_HTTP_CLIENT_MAX_HEADERLEN WEBSOCKET_HTTP_CLIENT_CONF_MAX_HEADERLEN
69 #else /* WEBSOCKET_HTTP_CLIENT_CONF_MAX_HEADERLEN */
70 #define WEBSOCKET_HTTP_CLIENT_MAX_HEADERLEN 128
71 #endif /* WEBSOCKET_HTTP_CLIENT_CONF_MAX_HEADERLEN */
72 
73 struct websocket_http_client_state {
74  struct tcp_socket s;
75  uint8_t inputbuf[WEBSOCKET_HTTP_CLIENT_INPUTBUFSIZE];
76  uint8_t outputbuf[WEBSOCKET_HTTP_CLIENT_OUTPUTBUFSIZE];
77  char host[WEBSOCKET_HTTP_CLIENT_MAX_HOSTLEN];
78  char file[WEBSOCKET_HTTP_CLIENT_MAX_FILELEN];
79  char subprotocol[WEBSOCKET_HTTP_CLIENT_MAX_SUBPROTOCOLLEN];
80  char header[WEBSOCKET_HTTP_CLIENT_MAX_HEADERLEN];
81  uint16_t port;
82 
83  int state;
84  struct pt parse_header_pt;
85  int http_status;
86  int i;
87 
88  uip_ipaddr_t proxy_addr;
89  uint16_t proxy_port;
90 };
91 
92 void websocket_http_client_init(struct websocket_http_client_state *s);
93 void websocket_http_client_set_proxy(struct websocket_http_client_state *s,
94  const uip_ipaddr_t *addr, uint16_t port);
95 
96 int websocket_http_client_register(struct websocket_http_client_state *s,
97  const char *host,
98  uint16_t port,
99  const char *file,
100  const char *subprotocol,
101  const char *hdr);
102 int websocket_http_client_get(struct websocket_http_client_state *s);
103 int websocket_http_client_send(struct websocket_http_client_state *s,
104  const uint8_t *data,
105  uint16_t datalen);
106 int websocket_http_client_sendbuflen(struct websocket_http_client_state *s);
107 
108 void websocket_http_client_close(struct websocket_http_client_state *s);
109 
110 const char *websocket_http_client_hostname(struct websocket_http_client_state *s);
111 
112 int websocket_http_client_queuelen(struct websocket_http_client_state *s);
113 
114 /* Callback functions that have to be implemented by the application
115  program. */
116 void websocket_http_client_datahandler(struct websocket_http_client_state *s,
117  const uint8_t *data, uint16_t len);
118 void websocket_http_client_connected(struct websocket_http_client_state *s);
119 void websocket_http_client_timedout(struct websocket_http_client_state *s);
120 void websocket_http_client_aborted(struct websocket_http_client_state *s);
121 void websocket_http_client_closed(struct websocket_http_client_state *s);
122 
123 #endif /* WEBSOCKET_HTTP_CLIENT_H_ */
static uip_ds6_addr_t * addr
Pointer to a nbr cache entry.
Definition: uip-nd6.c:107