Exemple #1
0
/* 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;
}
Exemple #2
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));
}