Ignore:
Timestamp:
Jan 14, 2016, 1:17:21 PM (8 years ago)
Author:
coas-nagasima
Message:

・デジタルPinとアナログPinのWAMPトピックを追加し、PubSubできるように機能追加。

デジタルPINのトピックは、

「com.sonycsl.kadecot.arduino.topic.pinXX」(XXは0から13)

アナログPINのトピックは、

「com.sonycsl.kadecot.arduino.topic.pinXX.thrYYY」(XXは14から19、YYYは閾値十進)

・デバッグ用の使用していない文字列が、ROM領域に残ってしまうのを修正
・WebSocket接続時のHTTPヘッダーを1行ずつNAK応答を待って送信しているのを、一括で送るよう変更

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uKadecot/trunk/uip/apps/webserver/httpd.c

    r108 r152  
    8989#endif
    9090
     91#define MAX(a, b) ((a > b) ? a : b)
     92
     93union temp_type_t {
     94        char binary[sizeof(http_content_type_binary)];
     95        char html[sizeof(http_content_type_html)];
     96        char css[sizeof(http_content_type_css)];
     97        char js[sizeof(http_content_type_js)];
     98        char json[sizeof(http_content_type_json)];
     99        char png[sizeof(http_content_type_png)];
     100        char gif[sizeof(http_content_type_gif)];
     101        char jpg[sizeof(http_content_type_jpg)];
     102        char svg[sizeof(http_content_type_svg)];
     103        char plain[sizeof(http_content_type_plain)];
     104};
     105
     106struct temp_buf_t{
     107        char headers[MAX(sizeof(http_header_404), sizeof(http_header_200))
     108                + sizeof(http_content_encoding_gzip)
     109                + sizeof(union temp_type_t)
     110        ];
     111        char ws_headers[sizeof(http_header_101)
     112                + sizeof(http_upgrade) + sizeof(((struct httpd_state *)0)->message.upgrade) + sizeof(http_crnl)
     113                + sizeof(http_connection) + sizeof(((struct httpd_state *)0)->message.connection) + sizeof(http_crnl)
     114                + sizeof(http_sec_websocket_accept) + sizeof(((struct httpd_state *)0)->message.response_key) + sizeof(http_crnl)
     115                + sizeof(http_sec_websocket_protocol) + sizeof(((struct httpd_state *)0)->message.sec_websocket_protocol) + sizeof(http_crnl)
     116                + sizeof(http_crnl)
     117        ];
     118};
     119static char temp_buf[sizeof(struct temp_buf_t)];
     120
    91121int httpd_strnicmp(const char *s1, const char *s2, size_t n)
    92122{
     
    159189PT_THREAD(send_headers(struct httpd_state *s, const char *statushdr))
    160190{
     191  char *pos = temp_buf;
     192  int len;
    161193  char *ptr;
    162194
    163195  PSOCK_BEGIN(&s->sout);
    164196
    165   PSOCK_SEND_STR(&s->sout, statushdr);
    166 
    167   PSOCK_SEND_STR(&s->sout, http_content_encoding_gzip);
     197  len = strlen(statushdr);
     198  memcpy(pos, statushdr, len); pos += len;
     199
     200  len = strlen(http_content_encoding_gzip);
     201  memcpy(pos, http_content_encoding_gzip, len); pos += len;
    168202
    169203  ptr = strrchr(s->message.request_url, ISO_period);
    170204  if (ptr == NULL) {
    171     PSOCK_SEND_STR(&s->sout, http_content_type_binary);
     205    len = strlen(http_content_type_binary);
     206    memcpy(pos, http_content_type_binary, len); pos += len;
    172207  } else if (strncmp(http_html, ptr, 5) == 0 ||
    173208    strncmp(http_shtml, ptr, 6) == 0) {
    174     PSOCK_SEND_STR(&s->sout, http_content_type_html);
     209    len = strlen(http_content_type_html);
     210    memcpy(pos, http_content_type_html, len); pos += len;
    175211  } else if (strncmp(http_css, ptr, 4) == 0) {
    176     PSOCK_SEND_STR(&s->sout, http_content_type_css);
     212    len = strlen(http_content_type_css);
     213    memcpy(pos, http_content_type_css, len); pos += len;
    177214  } else if (strncmp(http_js, ptr, 3) == 0) {
    178     PSOCK_SEND_STR(&s->sout, http_content_type_js);
     215    len = strlen(http_content_type_js);
     216    memcpy(pos, http_content_type_js, len); pos += len;
    179217  } else if (strncmp(http_json, ptr, 5) == 0) {
    180     PSOCK_SEND_STR(&s->sout, http_content_type_json);
     218    len = strlen(http_content_type_json);
     219    memcpy(pos, http_content_type_json, len); pos += len;
    181220  } else if (strncmp(http_png, ptr, 4) == 0) {
    182     PSOCK_SEND_STR(&s->sout, http_content_type_png);
     221    len = strlen(http_content_type_png);
     222    memcpy(pos, http_content_type_png, len); pos += len;
    183223  } else if (strncmp(http_gif, ptr, 4) == 0) {
    184     PSOCK_SEND_STR(&s->sout, http_content_type_gif);
     224    len = strlen(http_content_type_gif);
     225    memcpy(pos, http_content_type_gif, len); pos += len;
    185226  } else if (strncmp(http_jpg, ptr, 4) == 0) {
    186     PSOCK_SEND_STR(&s->sout, http_content_type_jpg);
     227    len = strlen(http_content_type_jpg);
     228    memcpy(pos, http_content_type_jpg, len); pos += len;
    187229  } else if (strncmp(http_svg, ptr, 4) == 0) {
    188     PSOCK_SEND_STR(&s->sout, http_content_type_svg);
     230    len = strlen(http_content_type_svg);
     231    memcpy(pos, http_content_type_svg, len); pos += len;
    189232  } else {
    190     PSOCK_SEND_STR(&s->sout, http_content_type_plain);
    191   }
     233    len = strlen(http_content_type_plain);
     234    memcpy(pos, http_content_type_plain, len); pos += len;
     235  }
     236  *pos = '\0';
     237
     238  PSOCK_SEND(&s->sout, temp_buf, pos - temp_buf);
     239
    192240  PSOCK_END(&s->sout);
    193241}
     
    222270PT_THREAD(send_ws_headers(struct httpd_state *s, const char *statushdr))
    223271{
     272  char *pos = temp_buf;
     273  int len;
     274
    224275  PSOCK_BEGIN(&s->sout);
    225276
    226   PSOCK_SEND_STR(&s->sout, statushdr);
    227 
    228   PSOCK_SEND_STR(&s->sout, http_upgrade);
    229   PSOCK_SEND_STR(&s->sout, s->message.upgrade);
    230   PSOCK_SEND_STR(&s->sout, http_crnl);
    231 
    232   PSOCK_SEND_STR(&s->sout, http_connection);
    233   PSOCK_SEND_STR(&s->sout, s->message.connection);
    234   PSOCK_SEND_STR(&s->sout, http_crnl);
    235 
    236   PSOCK_SEND_STR(&s->sout, http_sec_websocket_accept);
    237   PSOCK_SEND_STR(&s->sout, s->message.response_key);
    238   PSOCK_SEND_STR(&s->sout, http_crnl);
    239 
    240   PSOCK_SEND_STR(&s->sout, http_sec_websocket_protocol);
    241   PSOCK_SEND_STR(&s->sout, s->message.sec_websocket_protocol);
    242   PSOCK_SEND_STR(&s->sout, http_crnl);
    243 
    244   PSOCK_SEND_STR(&s->sout, http_crnl);
     277  len = strlen(statushdr);
     278  memcpy(pos, statushdr, len); pos += len;
     279
     280  len = strlen(http_upgrade);
     281  memcpy(pos, http_upgrade, len); pos += len;
     282  len = strlen(s->message.upgrade);
     283  memcpy(pos, s->message.upgrade, len); pos += len;
     284  len = strlen(http_crnl);
     285  memcpy(pos, http_crnl, len); pos += len;
     286
     287  len = strlen(http_connection);
     288  memcpy(pos, http_connection, len); pos += len;
     289  len = strlen(s->message.connection);
     290  memcpy(pos, s->message.connection, len); pos += len;
     291  len = strlen(http_crnl);
     292  memcpy(pos, http_crnl, len); pos += len;
     293
     294  len = strlen(http_sec_websocket_accept);
     295  memcpy(pos, http_sec_websocket_accept, len); pos += len;
     296  len = strlen(s->message.response_key);
     297  memcpy(pos, s->message.response_key, len); pos += len;
     298  len = strlen(http_crnl);
     299  memcpy(pos, http_crnl, len); pos += len;
     300
     301  len = strlen(http_sec_websocket_protocol);
     302  memcpy(pos, http_sec_websocket_protocol, len); pos += len;
     303  len = strlen(s->message.sec_websocket_protocol);
     304  memcpy(pos, s->message.sec_websocket_protocol, len); pos += len;
     305  len = strlen(http_crnl);
     306  memcpy(pos, http_crnl, len); pos += len;
     307
     308  len = strlen(http_crnl);
     309  memcpy(pos, http_crnl, len); pos += len;
     310  *pos = '\0';
     311
     312  PSOCK_SEND(&s->sout, temp_buf, pos - temp_buf);
    245313
    246314  PSOCK_END(&s->sout);
Note: See TracChangeset for help on using the changeset viewer.