57#ifndef ALTCP_PROXYCONNECT_CLIENT_AGENT
58#define ALTCP_PROXYCONNECT_CLIENT_AGENT "lwIP/" LWIP_VERSION_STRING " (http://savannah.nongnu.org/projects/lwip)"
61#define ALTCP_PROXYCONNECT_FLAGS_CONNECT_STARTED 0x01
62#define ALTCP_PROXYCONNECT_FLAGS_HANDSHAKE_DONE 0x02
64typedef struct altcp_proxyconnect_state_s
68 struct altcp_proxyconnect_config *conf;
70} altcp_proxyconnect_state_t;
74extern const struct altcp_functions altcp_proxyconnect_functions;
78static altcp_proxyconnect_state_t *
79altcp_proxyconnect_state_alloc(
void)
81 altcp_proxyconnect_state_t *
ret = (altcp_proxyconnect_state_t *)
mem_calloc(1,
sizeof(altcp_proxyconnect_state_t));
86altcp_proxyconnect_state_free(altcp_proxyconnect_state_t *
state)
94#define PROXY_CONNECT "CONNECT %s:%d HTTP/1.1\r\n" \
95 "User-Agent: %s\r\n" \
96 "Proxy-Connection: keep-alive\r\n" \
97 "Connection: keep-alive\r\n" \
99#define PROXY_CONNECT_FORMAT(host, port) PROXY_CONNECT, host, port, ALTCP_PROXYCONNECT_CLIENT_AGENT
110altcp_proxyconnect_send_request(
struct altcp_pcb *conn)
115 altcp_proxyconnect_state_t *
state = (altcp_proxyconnect_state_t *)conn->state;
121 len = altcp_proxyconnect_format_request(
NULL, 0,
"",
state->outer_port);
132 if ((
len < 0) || (
int)alloc_len !=
len) {
142 len2 = altcp_proxyconnect_format_request(
buffer, alloc_len,
host,
state->outer_port);
143 if ((len2 > 0) && (len2 <=
len) && (len2 <= 0xFFFF)) {
164 if (conn && conn->state) {
165 LWIP_ASSERT(
"pcb mismatch", conn->inner_conn == inner_conn);
169 if (conn->connected) {
170 if (conn->connected(conn->arg, conn,
err) ==
ERR_ABRT) {
177 return altcp_proxyconnect_send_request(conn);
189 altcp_proxyconnect_state_t *
state;
203 state = (altcp_proxyconnect_state_t *)conn->state;
204 LWIP_ASSERT(
"pcb mismatch", conn->inner_conn == inner_conn);
213 if (
state->flags & ALTCP_PROXYCONNECT_FLAGS_HANDSHAKE_DONE) {
216 return conn->recv(conn->arg, conn,
p,
err);
236 state->flags |= ALTCP_PROXYCONNECT_FLAGS_HANDSHAKE_DONE;
237 if (conn->connected) {
238 return conn->connected(conn->arg, conn,
ERR_OK);
256 altcp_proxyconnect_state_t *
state = (altcp_proxyconnect_state_t *)conn->state;
257 LWIP_ASSERT(
"pcb mismatch", conn->inner_conn == inner_conn);
259 if (!
state || !(
state->flags & ALTCP_PROXYCONNECT_FLAGS_HANDSHAKE_DONE)) {
265 return conn->sent(conn->arg, conn,
len);
276altcp_proxyconnect_lower_poll(
void *
arg,
struct altcp_pcb *inner_conn)
280 LWIP_ASSERT(
"pcb mismatch", conn->inner_conn == inner_conn);
283 return conn->poll(conn->arg, conn);
294 conn->inner_conn =
NULL;
296 conn->err(conn->arg,
err);
306altcp_proxyconnect_setup_callbacks(
struct altcp_pcb *conn,
struct altcp_pcb *inner_conn)
309 altcp_recv(inner_conn, altcp_proxyconnect_lower_recv);
310 altcp_sent(inner_conn, altcp_proxyconnect_lower_sent);
311 altcp_err(inner_conn, altcp_proxyconnect_lower_err);
317altcp_proxyconnect_setup(
struct altcp_proxyconnect_config *
config,
struct altcp_pcb *conn,
struct altcp_pcb *inner_conn)
319 altcp_proxyconnect_state_t *
state;
323 LWIP_ASSERT(
"invalid inner_conn", conn != inner_conn);
326 state = altcp_proxyconnect_state_alloc();
332 altcp_proxyconnect_setup_callbacks(conn, inner_conn);
333 conn->inner_conn = inner_conn;
334 conn->fns = &altcp_proxyconnect_functions;
346altcp_proxyconnect_new(
struct altcp_proxyconnect_config *
config,
struct altcp_pcb *inner_pcb)
349 if (inner_pcb ==
NULL) {
370altcp_proxyconnect_new_tcp(
struct altcp_proxyconnect_config *
config,
u8_t ip_type)
376 if (inner_pcb ==
NULL) {
379 ret = altcp_proxyconnect_new(
config, inner_pcb);
397altcp_proxyconnect_alloc(
void *
arg,
u8_t ip_type)
399 return altcp_proxyconnect_new_tcp((
struct altcp_proxyconnect_config *)
arg, ip_type);
416altcp_proxyconnect_tls_alloc(
void *
arg,
u8_t ip_type)
418 struct altcp_proxyconnect_tls_config *cfg = (
struct altcp_proxyconnect_tls_config *)
arg;
422 proxy_pcb = altcp_proxyconnect_new_tcp(&cfg->proxy, ip_type);
423 tls_pcb = altcp_tls_wrap(cfg->tls_config, proxy_pcb);
425 if (tls_pcb ==
NULL) {
444 altcp_proxyconnect_state_t *
state;
448 state = (altcp_proxyconnect_state_t *)conn->state;
452 if (!(
state->flags & ALTCP_PROXYCONNECT_FLAGS_HANDSHAKE_DONE)) {
461 altcp_proxyconnect_state_t *
state;
463 if ((conn ==
NULL) || (ipaddr ==
NULL)) {
466 state = (altcp_proxyconnect_state_t *)conn->state;
470 if (
state->flags & ALTCP_PROXYCONNECT_FLAGS_CONNECT_STARTED) {
473 state->flags |= ALTCP_PROXYCONNECT_FLAGS_CONNECT_STARTED;
480 return altcp_connect(conn->inner_conn, &
state->conf->proxy_addr,
state->conf->proxy_port, altcp_proxyconnect_lower_connected);
494altcp_proxyconnect_abort(
struct altcp_pcb *conn)
497 if (conn->inner_conn !=
NULL) {
505altcp_proxyconnect_close(
struct altcp_pcb *conn)
510 if (conn->inner_conn !=
NULL) {
525 altcp_proxyconnect_state_t *
state;
533 state = (altcp_proxyconnect_state_t *)conn->state;
538 if (!(
state->flags & ALTCP_PROXYCONNECT_FLAGS_HANDSHAKE_DONE)) {
546altcp_proxyconnect_dealloc(
struct altcp_pcb *conn)
550 altcp_proxyconnect_state_t *
state = (altcp_proxyconnect_state_t *)conn->state;
552 altcp_proxyconnect_state_free(
state);
557const struct altcp_functions altcp_proxyconnect_functions = {
558 altcp_proxyconnect_set_poll,
559 altcp_proxyconnect_recved,
561 altcp_proxyconnect_connect,
562 altcp_proxyconnect_listen,
563 altcp_proxyconnect_abort,
564 altcp_proxyconnect_close,
565 altcp_default_shutdown,
566 altcp_proxyconnect_write,
567 altcp_default_output,
569 altcp_default_sndbuf,
570 altcp_default_sndqueuelen,
571 altcp_default_nagle_disable,
572 altcp_default_nagle_enable,
573 altcp_default_nagle_disabled,
574 altcp_default_setprio,
575 altcp_proxyconnect_dealloc,
576 altcp_default_get_tcp_addrinfo,
577 altcp_default_get_ip,
578 altcp_default_get_port
580 , altcp_default_dbg_get_tcp_state
#define altcp_connected_fn
#define altcp_tcp_new_ip_type
#define mem_free(ptr, bsize)
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
void * mem_calloc(mem_size_t count, mem_size_t size)
void * mem_malloc(mem_size_t size_in)
#define LWIP_ASSERT(message, assertion)
GLenum GLuint GLsizei bufsize
#define LWIP_UNUSED_ARG(x)
u16_t pbuf_memfind(const struct pbuf *p, const void *mem, u16_t mem_len, u16_t start_offset)
u8_t pbuf_free(struct pbuf *p)
#define ip_addr_copy(dest, src)
#define ipaddr_ntoa(ipaddr)
int const JOCTET * dataptr