Lines Matching refs:session

157 coap_ws_log_header(const coap_session_t *session, const uint8_t *header) {
159 (void)session;
179 coap_log_debug("* %s: WS header:%s\n", coap_session_str(session), buf);
184 coap_ws_log_key(const coap_session_t *session) {
188 for (i = 0; i < sizeof(session->ws->key); i++) {
189 snprintf(&buf[i*3], 4, " %02x", session->ws->key[i]);
195 coap_ws_mask_data(coap_session_t *session, uint8_t *data, size_t data_len) {
196 coap_ws_state_t *ws = session->ws;
205 coap_ws_write(coap_session_t *session, const uint8_t *data, size_t datalen) {
211 if (!session->ws) {
212 session->ws = coap_malloc_type(COAP_STRING, sizeof(coap_ws_state_t));
213 if (!session->ws) {
214 coap_session_disconnected(session, COAP_NACK_WS_LAYER_FAILED);
217 memset(session->ws, 0, sizeof(coap_ws_state_t));
220 if (!session->ws->up) {
224 if (session->ws->sent_close)
247 if (session->ws->state == COAP_SESSION_TYPE_CLIENT) {
252 memcpy(session->ws->mask_key, &ws_header[hdr_len], 4);
255 coap_ws_log_header(session, ws_header);
256 ret = session->sock.lfunc[COAP_LAYER_WS].l_write(session, ws_header, hdr_len);
260 if (session->ws->state == COAP_SESSION_TYPE_CLIENT) {
268 session->ws->data_size = datalen;
270 coap_ws_mask_data(session, wdata, datalen);
271 ret = session->sock.lfunc[COAP_LAYER_WS].l_write(session, wdata, datalen);
274 ret = session->sock.lfunc[COAP_LAYER_WS].l_write(session, data, datalen);
281 coap_session_str(session), ret);
284 coap_session_str(session), ret, datalen);
289 coap_ws_split_rd_header(coap_session_t *session) {
290 char *cp = strchr((char *)session->ws->http_hdr, ' ');
293 cp = strchr((char *)session->ws->http_hdr, '\t');
306 coap_ws_rd_http_header_server(coap_session_t *session) {
307 coap_ws_state_t *ws = session->ws;
320 value = coap_ws_split_rd_header(session);
363 coap_ws_log_key(session);
392 coap_ws_build_key_hash(coap_session_t *session, char *hash, size_t max_hash_len) {
399 if (!coap_base64_encode_buffer(session->ws->key, sizeof(session->ws->key),
420 coap_ws_rd_http_header_client(coap_session_t *session) {
421 coap_ws_state_t *ws = session->ws;
425 value = coap_ws_split_rd_header(session);
436 value = coap_ws_split_rd_header(session);
467 if (!coap_ws_build_key_hash(session, hash, sizeof(hash))) {
495 coap_ws_rd_http_header(coap_session_t *session) {
496 coap_ws_state_t *ws = session->ws;
508 bytes = session->sock.lfunc[COAP_LAYER_WS].l_read(session,
533 if (!coap_ws_rd_http_header_server(session)) {
537 if (!coap_ws_rd_http_header_client(session)) {
580 coap_ws_read(coap_session_t *session, uint8_t *data, size_t datalen) {
586 if (!session->ws) {
587 session->ws = coap_malloc_type(COAP_STRING, sizeof(coap_ws_state_t));
588 if (!session->ws) {
589 coap_session_disconnected(session, COAP_NACK_WS_LAYER_FAILED);
592 memset(session->ws, 0, sizeof(coap_ws_state_t));
595 if (!session->ws->up) {
598 if (!coap_ws_rd_http_header(session)) {
601 if (coap_netif_available(session)) {
602 session->sock.lfunc[COAP_LAYER_WS].l_write(session, (uint8_t *)buf,
605 coap_session_disconnected(session, COAP_NACK_WS_LAYER_FAILED);
609 if (!session->ws->up)
612 if (session->ws->state == COAP_SESSION_TYPE_SERVER) {
615 if (!coap_ws_build_key_hash(session, hash, sizeof(hash))) {
620 session->sock.lfunc[COAP_LAYER_WS].l_write(session, (uint8_t *)buf,
623 coap_handle_event(session->context, COAP_EVENT_WS_CONNECTED, session);
628 coap_handle_event(session->context, COAP_EVENT_WS_CONNECTED, session);
630 session->sock.lfunc[COAP_LAYER_WS].l_establish(session);
631 if (session->ws->hdr_ofs == 0)
636 if (!session->ws->all_hdr_in) {
637 ret = session->sock.lfunc[COAP_LAYER_WS].l_read(session,
638 &session->ws->rd_header[session->ws->hdr_ofs],
639 sizeof(session->ws->rd_header) - session->ws->hdr_ofs);
642 session->ws->hdr_ofs += (int)ret;
644 if (session->ws->hdr_ofs < 2)
647 if (session->ws->state == COAP_SESSION_TYPE_SERVER &&
648 !(session->ws->rd_header[1] & WS_B1_MASK_BIT)) {
650 session->ws->close_reason = 1002;
651 coap_ws_close(session);
655 bytes_size = session->ws->rd_header[1] & WS_B1_LEN_MASK;
661 if (session->ws->rd_header[1] & WS_B1_MASK_BIT) {
662 memcpy(session->ws->mask_key, &session->ws->rd_header[2 + extra_hdr_len], 4);
665 if (session->ws->hdr_ofs < 2 + extra_hdr_len)
669 coap_ws_log_header(session, session->ws->rd_header);
671 op_code = session->ws->rd_header[0] & WS_B0_OP_MASK;
674 session->ws->close_reason = 1003;
675 coap_ws_close(session);
680 session->ws->recv_close = 1;
681 coap_ws_close(session);
685 session->ws->all_hdr_in = 1;
689 bytes_size = ((uint64_t)session->ws->rd_header[2] << 56) +
690 ((uint64_t)session->ws->rd_header[3] << 48) +
691 ((uint64_t)session->ws->rd_header[4] << 40) +
692 ((uint64_t)session->ws->rd_header[5] << 32) +
693 ((uint64_t)session->ws->rd_header[6] << 24) +
694 ((uint64_t)session->ws->rd_header[7] << 16) +
695 ((uint64_t)session->ws->rd_header[8] << 8) +
696 session->ws->rd_header[9];
698 bytes_size = ((uint16_t)session->ws->rd_header[2] << 8) +
699 session->ws->rd_header[3];
701 session->ws->data_size = bytes_size;
705 coap_handle_event(session->context, COAP_EVENT_WS_PACKET_SIZE, session);
706 session->ws->close_reason = 1009;
707 coap_ws_close(session);
710 coap_log_debug("* %s: Packet size %zu\n", coap_session_str(session),
714 ret = session->ws->hdr_ofs - 2 - extra_hdr_len;
716 assert(2 + extra_hdr_len < (ssize_t)sizeof(session->ws->rd_header));
720 memcpy(data, &session->ws->rd_header[2 + extra_hdr_len], ret);
721 session->ws->data_ofs = ret;
723 if (session->ws->state == COAP_SESSION_TYPE_SERVER) {
725 coap_ws_mask_data(session, data, bytes_size);
727 session->ws->all_hdr_in = 0;
728 session->ws->hdr_ofs = 0;
729 op_code = session->ws->rd_header[0] & WS_B0_OP_MASK;
731 session->ws->close_reason = (data[0] << 8) + data[1];
733 coap_session_str(session),
734 session->ws->close_reason);
735 session->ws->recv_close = 1;
736 if (!session->ws->sent_close)
737 coap_ws_close(session);
744 memcpy(data, &session->ws->rd_header[2 + extra_hdr_len], bytes_size);
745 session->ws->data_ofs = bytes_size;
746 if (session->ws->state == COAP_SESSION_TYPE_SERVER) {
748 coap_ws_mask_data(session, data, bytes_size);
751 memmove(session->ws->rd_header,
752 &session->ws->rd_header[2 + extra_hdr_len + bytes_size],
754 session->ws->all_hdr_in = 0;
755 session->ws->hdr_ofs = (int)(ret - bytes_size);
759 session->ws->data_ofs = 0;
764 ret = session->sock.lfunc[COAP_LAYER_WS].l_read(session,
765 &data[session->ws->data_ofs],
766 session->ws->data_size - session->ws->data_ofs);
769 session->ws->data_ofs += ret;
770 if (session->ws->data_ofs == session->ws->data_size) {
771 if (session->ws->state == COAP_SESSION_TYPE_SERVER) {
773 coap_ws_mask_data(session, data, session->ws->data_size);
775 session->ws->all_hdr_in = 0;
776 session->ws->hdr_ofs = 0;
777 session->ws->data_ofs = 0;
779 coap_session_str(session), session->ws->data_size);
780 return session->ws->data_size;
783 coap_log_debug("* %s: Waiting Packet size %zu (got %zu)\n", coap_session_str(session),
784 session->ws->data_size, session->ws->data_ofs);
799 coap_ws_establish(coap_session_t *session) {
800 if (!session->ws) {
801 session->ws = coap_malloc_type(COAP_STRING, sizeof(coap_ws_state_t));
802 if (!session->ws) {
803 coap_session_disconnected(session, COAP_NACK_WS_LAYER_FAILED);
806 memset(session->ws, 0, sizeof(coap_ws_state_t));
808 if (session->type == COAP_SESSION_TYPE_CLIENT) {
814 session->ws->state = COAP_SESSION_TYPE_CLIENT;
815 if (!session->ws_host) {
817 coap_session_disconnected(session, COAP_NACK_WS_LAYER_FAILED);
820 coap_prng(session->ws->key, sizeof(session->ws->key));
821 coap_ws_log_key(session);
822 if (!coap_base64_encode_buffer(session->ws->key, sizeof(session->ws->key),
825 if (session->proto == COAP_PROTO_WS &&
826 coap_address_get_port(&session->addr_info.remote) != 80) {
827 port = coap_address_get_port(&session->addr_info.remote);
828 } else if (session->proto == COAP_PROTO_WSS &&
829 coap_address_get_port(&session->addr_info.remote) != 443) {
830 port = coap_address_get_port(&session->addr_info.remote);
832 if (strchr((const char *)session->ws_host->s, ':')) {
834 snprintf(host, sizeof(host), "[%s]:%d", session->ws_host->s, port);
836 snprintf(host, sizeof(host), "[%s]", session->ws_host->s);
840 snprintf(host, sizeof(host), "%s:%d", session->ws_host->s, port);
842 snprintf(host, sizeof(host), "%s", session->ws_host->s);
847 session->sock.lfunc[COAP_LAYER_WS].l_write(session, (uint8_t *)buf,
850 session->ws->state = COAP_SESSION_TYPE_SERVER;
855 coap_ws_close(coap_session_t *session) {
856 if (!coap_netif_available(session) ||
857 session->state == COAP_SESSION_STATE_NONE) {
858 session->sock.lfunc[COAP_LAYER_WS].l_close(session);
861 if (session->ws && session->ws->up) {
864 if (!session->ws->sent_close) {
871 if (session->ws->state == COAP_SESSION_TYPE_CLIENT) {
875 memcpy(session->ws->mask_key, &ws_header[hdr_len], 4);
878 coap_ws_log_header(session, ws_header);
879 if (session->ws->close_reason == 0)
880 session->ws->close_reason = 1000;
882 ws_header[hdr_len] = session->ws->close_reason >> 8;
883 ws_header[hdr_len+1] = session->ws->close_reason & 0xff;
884 if (session->ws->state == COAP_SESSION_TYPE_CLIENT) {
885 coap_ws_mask_data(session, &ws_header[hdr_len], 2);
887 session->ws->sent_close = 1;
889 coap_session_str(session),
890 session->ws->close_reason);
891 ret = session->sock.lfunc[COAP_LAYER_WS].l_write(session, ws_header, hdr_len+2);
897 while (!session->ws->recv_close && count > 0 && coap_netif_available(session)) {
904 FD_SET(session->sock.fd, &readfds);
907 result = select((int)(session->sock.fd+1), &readfds, NULL, NULL, &tv);
912 coap_ws_read(session, buf, sizeof(buf));
916 coap_handle_event(session->context, COAP_EVENT_WS_CLOSED, session);
918 session->sock.lfunc[COAP_LAYER_WS].l_close(session);
922 coap_ws_set_host_request(coap_session_t *session, coap_str_const_t *ws_host) {
923 if (!session | !ws_host)
926 session->ws_host = coap_new_str_const(ws_host->s, ws_host->length);
927 if (!session->ws_host)
945 coap_ws_set_host_request(coap_session_t *session, coap_str_const_t *ws_host) {
946 (void)session;