/* parse HTTP request and prepare header */ static int http_parse_request(HTTPContext *c) { char *q, msg[1024]; const char *mime_type, *p; HTTPContext *ctx; int ret = 0, is_first = 0; const char *first_tag = "First-Request=0"; RequestData rd = {{0}}; p = c->buffer; while(get_line(msg, sizeof(msg), &p) > 0){ ret = handle_line(c, msg, sizeof(msg), &rd); if(ret < 0)return ret; } is_first = !av_stristr(rd.cookie, first_tag); if(c->post && c->content_length && !av_match_ext(c->url, "m3u8") && !av_match_ext(c->url, "ts") && !av_match_ext(c->url, "flv")){ c->post = 0; c->content_length = read_request_content(c, rd.content, sizeof(rd.content)); } #if defined(PLUGIN_DVB) if(!c->post && !strcmp(c->url, "digitalDvb/allServiceType/getClientInfo")){ uint32_t *ptr = (uint32_t*)rd.content, *ptr_end = (uint32_t*)(rd.content+sizeof(rd.content)-8); for(ctx = first_http_ctx; ctx; ctx = ctx->next) if(!ctx->post && av_match_ext(ctx->url, "flv") ) {/*todo: record hls*/ if(ptr < ptr_end){ int chid = -1; sscanf(ctx->url, "%d", &chid); *ptr++ = inet_addr(inet_ntoa(ctx->from_addr.sin_addr)); *ptr++ = chid; printf("ip %s id %u %s\t", inet_ntoa(ctx->from_addr.sin_addr), chid, ctx->url); } } } #endif //http_log("New conn: %s:%u %d %s cookie:%s\n", inet_ntoa(c->from_addr.sin_addr), ntohs(c->from_addr.sin_port), c->post, c->url, rd.cookie); /*handle m3u8/ts request solely*/ if(av_match_ext(c->url, "m3u8") || av_match_ext(c->url, "ts")){ c->keep_alive = 0; ret = hls_parse_request(c, c->url, is_first); if(ret < 0)goto send_error; else if(ret == 1){ long chid = atoi(c->url); if(!(0 <= chid && chid <= 10000)){ sprintf(msg, "bad request: %s-->%ld", c->url, chid); http_log("%s\n", msg); goto send_error; } #if defined(PLUGIN_DVB) ff_ctl_send_string(1, c->url, rd.content); #endif http_log("wait get %s\n", c->url); } if(c->state == HTTPSTATE_SEND_HEADER) goto send_header; return 0; /*end here*/ } #if defined(PLUGIN_DVB) ret = plugin_dvb(c, &rd); if(ret < 0){ goto send_error; }else if(ret > 0){ return 0; } #endif /*handle feed request*/ if (c->post) { ctx = find_feed(c->url); if(ctx && ctx != c){ sprintf(msg, "file %s has been feeded", c->url); http_log("%s\n", msg); goto send_error; } c->http_error = 0; c->state = HTTPSTATE_RECEIVE_DATA; return 0; /*end here*/ }else{ if(prepare_local_file(c) > 0){ c->http_error = 200; c->state = HTTPSTATE_SEND_HEADER; return 0; /*no need feed, send local files directly.*/ } ctx = find_feed(c->url); if(!ctx){ c->keep_alive = 0; sprintf(msg, "wait to get %s", c->url); http_log("%s\n", msg); #if defined(PLUGIN_DVB) ff_ctl_send(2, c->url, strlen(c->url)+1, rd.content, sizeof(rd.content)); #endif }else{ ctx->sff_ref_cnt++; } c->feed_ctx = ctx; } send_header: /* prepare HTTP header */ c->buffer[0] = 0; av_strlcatf(c->buffer, c->buffer_size, "HTTP/1.1 200 OK\r\n"); mime_type = get_mine_type(c->url); av_strlcatf(c->buffer, c->buffer_size, "Pragma: no-cache\r\n"); av_strlcatf(c->buffer, c->buffer_size, "Content-Type: %s\r\n", mime_type); av_strlcatf(c->buffer, c->buffer_size, "Connection: %s\r\n", (c->keep_alive ? "keep-alive" : "close")); av_strlcatf(c->buffer, c->buffer_size, "Set-Cookie: %s; Path=/; Domain=%s\r\n", first_tag, rd.domain); av_strlcatf(c->buffer, c->buffer_size, "\r\n"); q = c->buffer + strlen(c->buffer); /* prepare output buffer */ c->http_error = 0; c->buffer_ptr = c->buffer; c->buffer_end = q; c->state = HTTPSTATE_SEND_HEADER; #if 0 if(S == c->hls_idx){ HLS *s = &s_hls[c->hls_idx]; char *ext = strrchr(c->url, '.'); if(!(2 == s->flag && s->data && s->csize > 0)){/*not exist yet, fake one*/ c->http_error = 200; c->buffer_end += sprintf(c->buffer_end, "#EXTM3U\n" "#EXT-X-VERSION:3\n" "#EXT-X-TARGETDURATION:2\n" "#EXT-X-MEDIA-SEQUENCE:0\n" "#EXTINF:1.283989,\n" "%.*s0.ts\n", ext - c->url, c->url); } } #endif return 0; send_error: c->keep_alive = 0; c->http_error = 404; q = c->buffer; htmlstrip(msg); snprintf(q, c->buffer_size, "HTTP/1.1 404 Not Found\r\n" "Content-type: text/html\r\n" "\r\n" "<html>\n" "<head><title>404 Not Found</title></head>\n" "<body>%s</body>\n" "</html>\n", msg); q += strlen(q); /* prepare output buffer */ c->buffer_ptr = c->buffer; c->buffer_end = q; c->state = HTTPSTATE_SEND_HEADER; return 0; }
static void iupdate(void) { time_t t; long idletime = secs_getvar_int("idletime"); struct tm *tmptr; char buf[1024]; assert(sizeof(buf) > faimconf.winfo.widthx); nw_erase(&win_info); tmptr = localtime(&now); assert(tmptr != NULL); if (curconn->online > 0) { t = now - curconn->online; secs_setvar("online", dtime(t)); } else secs_setvar("online", "(not connected)"); secs_setvar("SN", curconn->sn); secs_setvar("conn", curconn->winname); if (inconn) { secs_setvar("cur", curconn->curbwin->winname); if ((curconn->curbwin->et == BUDDY) && (curconn->curbwin->e.buddy->tag != NULL)) { snprintf(buf, sizeof(buf), " !%.*s!", (int)(sizeof(buf)-4), curconn->curbwin->e.buddy->tag); htmlstrip(buf); secs_setvar("iftopic", buf); } else if (curconn->curbwin->blurb != NULL) { snprintf(buf, sizeof(buf), " (%.*s)", (int)(sizeof(buf)-4), curconn->curbwin->blurb); htmlstrip(buf); secs_setvar("iftopic", buf); } else if (curconn->curbwin->status != NULL) { snprintf(buf, sizeof(buf), " (%.*s)", (int)(sizeof(buf)-4), curconn->curbwin->status); htmlstrip(buf); secs_setvar("iftopic", buf); } else secs_setvar("iftopic", ""); if ((curconn->curbwin->et != BUDDY) || (curconn->curbwin->e.buddy->typing == 0)) secs_setvar("iftyping", ""); else secs_setvar("iftyping", secs_script_expand(NULL, getvar(curconn, "statusbar_typing"))); switch (curconn->curbwin->et) { case BUDDY: if (curconn->curbwin->e.buddy->docrypt) secs_setvar("ifcrypt", getvar(curconn, "statusbar_crypt")); else secs_setvar("ifcrypt", ""); if (curconn->curbwin->e.buddy->tzname != NULL) { secs_setvar("tzname", curconn->curbwin->e.buddy->tzname); secs_setvar("iftzname", secs_script_expand(NULL, getvar(curconn, "statusbar_tzname"))); } else { secs_setvar("tzname", ""); secs_setvar("iftzname", ""); } secs_setvar("ifoper", ""); secs_setvar("ifquery", secs_script_expand(NULL, getvar(curconn, "statusbar_query"))); secs_setvar("ifchat", ""); break; case CHAT: if (curconn->curbwin->e.chat->isoper) secs_setvar("ifoper", secs_script_expand(NULL, getvar(curconn, "statusbar_oper"))); else secs_setvar("ifoper", ""); secs_setvar("ifquery", ""); secs_setvar("ifchat", secs_script_expand(NULL, getvar(curconn, "statusbar_chat"))); break; case TRANSFER: secs_setvar("ifoper", ""); secs_setvar("ifquery", ""); secs_setvar("ifchat", ""); break; } } else { secs_setvar("cur", ""); secs_setvar("ifoper", ""); secs_setvar("ifquery", ""); secs_setvar("iftyping", ""); secs_setvar("ifchat", ""); } secs_setvar("iftransfer", ""); if (awaytime > 0) secs_setvar("ifaway", secs_script_expand(NULL, getvar(curconn, "statusbar_away"))); else secs_setvar("ifaway", ""); if (idletime > 10) { secs_setvar("idle", dtime(60*idletime)); secs_setvar("ifidle", secs_script_expand(NULL, getvar(curconn, "statusbar_idle"))); } else { secs_setvar("idle", ""); secs_setvar("ifidle", ""); } if (curconn->lag > 0.1) { secs_setvar("lag", dtime(curconn->lag)); secs_setvar("iflag", secs_script_expand(NULL, getvar(curconn, "statusbar_lag"))); } else { secs_setvar("lag", "0"); secs_setvar("iflag", ""); } if (curconn->warnval > 0) { snprintf(buf, sizeof(buf), "%li", curconn->warnval); secs_setvar("warnval", buf); secs_setvar("ifwarn", secs_script_expand(NULL, getvar(curconn, "statusbar_warn"))); } else { secs_setvar("warnval", "0"); secs_setvar("ifwarn", ""); } if (strftime(buf, sizeof(buf), getvar(curconn, "statusbar"), tmptr) > 0) { char *left, *right; assert(*buf != 0); right = secs_script_expand(NULL, buf); assert(right != NULL); left = strdup(right); assert(left != NULL); if ((right = strrchr(left, '+')) != NULL) { char *ell; int leftlen, rightlen; *right = 0; right++; leftlen = strlen(left); rightlen = strlen(right); if (leftlen > (faimconf.winfo.widthx-rightlen)) { ell = "..."; leftlen = faimconf.winfo.widthx-rightlen-3; } else { ell = ""; leftlen = faimconf.winfo.widthx-rightlen; } if (leftlen < 0) leftlen = 0; snprintf(buf, faimconf.winfo.widthx+1, "%-*.*s%s%s", leftlen, leftlen, left, ell, right); } else snprintf(buf, faimconf.winfo.widthx+1, "%s", left); nw_printf(&win_info, CB(STATUSBAR,INPUT), 0, "%-*s", faimconf.winfo.widthx, buf); free(left); left = NULL; } else status_echof(curconn, "Error in strftime(): %s.\n", strerror(errno)); }