/*---------------------------------------------------------------------------*/ static int input(struct tcp_socket *tcps, void *ptr, const uint8_t *inputptr, int inputdatalen) { struct http_socket *s = ptr; input_pt(s, inputptr, inputdatalen); start_timeout_timer(s); return 0; /* all data consumed */ }
static void initialize( Driver* dp, char* application_title ) { dp->application_title = application_title; initialize_SPI(); listen_for_application_activation( dp ); search_desktop_for_application( dp ); if ( dp->found_application ) { remove_listener( dp ); closedown( dp ); return; } start_timeout_timer( dp ); SPI_event_main(); remove_listener( dp ); closedown( dp ); if ( ! dp->found_application ) rb_raise( rb_eRuntimeError, "No such application running." ); }
/*---------------------------------------------------------------------------*/ static void event(struct tcp_socket *tcps, void *ptr, tcp_socket_event_t e) { struct http_socket *s = ptr; char host[MAX_HOSTLEN]; char path[MAX_PATHLEN]; uint16_t port; char str[42]; int len; if(e == TCP_SOCKET_CONNECTED) { puts("Connected"); if(parse_url(s->url, host, &port, path)) { tcp_socket_send_str(tcps, s->postdata != NULL ? "POST " : "GET "); tcp_socket_send_str(tcps, path); tcp_socket_send_str(tcps, " HTTP/1.1\r\n\r"); tcp_socket_send_str(tcps, "Connection: close\r\n\r"); tcp_socket_send_str(tcps, "Host: "); tcp_socket_send_str(tcps, host); tcp_socket_send_str(tcps, "\r\n\r"); if(s->postdata != NULL) { if(s->content_type) { tcp_socket_send_str(tcps, "Content-Type: "); tcp_socket_send_str(tcps, s->content_type); tcp_socket_send_str(tcps, "\r\n\r"); } tcp_socket_send_str(tcps, "Content-Length: "); sprintf(str, "%u", s->postdatalen); tcp_socket_send_str(tcps, str); tcp_socket_send_str(tcps, "\r\n\r"); } else if(s->length || s->pos > 0) { tcp_socket_send_str(tcps, "Range: bytes="); if(s->length) { if(s->pos >= 0) { sprintf(str, "%llu-%llu", s->pos, s->pos + s->length - 1); } else { sprintf(str, "-%llu", s->length); } } else { sprintf(str, "%llu-", s->pos); } tcp_socket_send_str(tcps, str); tcp_socket_send_str(tcps, "\r\n\r"); } tcp_socket_send_str(tcps, "\r\n\r"); if(s->postdata != NULL && s->postdatalen) { len = tcp_socket_send(tcps, s->postdata, s->postdatalen); s->postdata += len; s->postdatalen -= len; } } parse_header_init(s); } else if(e == TCP_SOCKET_CLOSED) { call_callback(s, HTTP_SOCKET_CLOSED, NULL, 0); removesocket(s); puts("Closed"); } else if(e == TCP_SOCKET_TIMEDOUT) { call_callback(s, HTTP_SOCKET_TIMEDOUT, NULL, 0); removesocket(s); puts("Timedout"); } else if(e == TCP_SOCKET_ABORTED) { call_callback(s, HTTP_SOCKET_ABORTED, NULL, 0); removesocket(s); puts("Aborted"); } else if(e == TCP_SOCKET_DATA_SENT) { if(s->postdata != NULL && s->postdatalen) { len = tcp_socket_send(tcps, s->postdata, s->postdatalen); s->postdata += len; s->postdatalen -= len; } else { start_timeout_timer(s); } } }
/*---------------------------------------------------------------------------*/ static void event(struct tcp_socket *tcps, void *ptr, tcp_socket_event_t e) { struct http_socket *s = ptr; char host[MAX_HOSTLEN]; char path[MAX_PATHLEN]; uint16_t port; char str[42]; int len; if(e == TCP_SOCKET_CONNECTED) { printf("Connected\n"); if(parse_url(s->url, host, &port, path)) { tcp_socket_send_str(tcps, s->postdata != NULL ? "POST " : "GET "); if(s->proxy_port != 0) { /* If we are configured to route through a proxy, we should provide the full URL as the path. */ tcp_socket_send_str(tcps, s->url); } else { tcp_socket_send_str(tcps, path); } tcp_socket_send_str(tcps, " HTTP/1.1\r\n"); tcp_socket_send_str(tcps, "Connection: close\r\n"); tcp_socket_send_str(tcps, "Host: "); /* If we have IPv6 host, add the '[' and the ']' characters to the host. As in rfc2732. */ if(memchr(host, ':', MAX_HOSTLEN)) { tcp_socket_send_str(tcps, "["); } tcp_socket_send_str(tcps, host); if(memchr(host, ':', MAX_HOSTLEN)) { tcp_socket_send_str(tcps, "]"); } tcp_socket_send_str(tcps, "\r\n"); if(s->postdata != NULL) { if(s->content_type) { tcp_socket_send_str(tcps, "Content-Type: "); tcp_socket_send_str(tcps, s->content_type); tcp_socket_send_str(tcps, "\r\n"); } tcp_socket_send_str(tcps, "Content-Length: "); sprintf(str, "%u", s->postdatalen); tcp_socket_send_str(tcps, str); tcp_socket_send_str(tcps, "\r\n"); } else if(s->length || s->pos > 0) { tcp_socket_send_str(tcps, "Range: bytes="); if(s->length) { if(s->pos >= 0) { sprintf(str, "%llu-%llu", s->pos, s->pos + s->length - 1); } else { sprintf(str, "-%llu", s->length); } } else { sprintf(str, "%llu-", s->pos); } tcp_socket_send_str(tcps, str); tcp_socket_send_str(tcps, "\r\n"); } tcp_socket_send_str(tcps, "\r\n"); if(s->postdata != NULL && s->postdatalen) { len = tcp_socket_send(tcps, s->postdata, s->postdatalen); s->postdata += len; s->postdatalen -= len; } } parse_header_init(s); } else if(e == TCP_SOCKET_CLOSED) { call_callback(s, HTTP_SOCKET_CLOSED, NULL, 0); removesocket(s); printf("Closed\n"); } else if(e == TCP_SOCKET_TIMEDOUT) { call_callback(s, HTTP_SOCKET_TIMEDOUT, NULL, 0); removesocket(s); printf("Timedout\n"); } else if(e == TCP_SOCKET_ABORTED) { call_callback(s, HTTP_SOCKET_ABORTED, NULL, 0); removesocket(s); printf("Aborted\n"); } else if(e == TCP_SOCKET_DATA_SENT) { if(s->postdata != NULL && s->postdatalen) { len = tcp_socket_send(tcps, s->postdata, s->postdatalen); s->postdata += len; s->postdatalen -= len; } else { start_timeout_timer(s); } } }