⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 httpp.c,v

📁 版本控制CVS资源库转换成SVN库的转换程序
💻 C,V
📖 第 1 页 / 共 3 页
字号:
    if (name == NULL || value == NULL)        return;    var = (http_var_t *)malloc(sizeof(http_var_t));    if (var == NULL) return;    var->name = strdup(name);    var->value = strdup(value);    if (httpp_getvar(parser, name) == NULL) {        avl_insert(parser->vars, (void *)var);    } else {        avl_delete(parser->vars, (void *)var, _free_vars);        avl_insert(parser->vars, (void *)var);    }}char *httpp_getvar(http_parser_t *parser, char *name){    http_var_t var;    http_var_t *found;    void *fp;    fp = &found;    var.name = name;    var.value = NULL;    if (avl_get_by_key(parser->vars, &var, fp) == 0)        return found->value;    else        return NULL;}void httpp_set_query_param(http_parser_t *parser, char *name, char *value){    http_var_t *var;    if (name == NULL || value == NULL)        return;    var = (http_var_t *)malloc(sizeof(http_var_t));    if (var == NULL) return;    var->name = strdup(name);    var->value = url_escape(value);    if (httpp_get_query_param(parser, name) == NULL) {        avl_insert(parser->queryvars, (void *)var);    } else {        avl_delete(parser->queryvars, (void *)var, _free_vars);        avl_insert(parser->queryvars, (void *)var);    }}char *httpp_get_query_param(http_parser_t *parser, char *name){    http_var_t var;    http_var_t *found;    void *fp;    fp = &found;    var.name = name;    var.value = NULL;    if (avl_get_by_key(parser->queryvars, (void *)&var, fp) == 0)        return found->value;    else        return NULL;}void httpp_clear(http_parser_t *parser){    parser->req_type = httpp_req_none;    if (parser->uri)        free(parser->uri);    parser->uri = NULL;    avl_tree_free(parser->vars, _free_vars);    avl_tree_free(parser->queryvars, _free_vars);    parser->vars = NULL;}void httpp_destroy(http_parser_t *parser){    httpp_clear(parser);    free(parser);}static char *_lowercase(char *str){    char *p = str;    for (; *p != '\0'; p++)        *p = tolower(*p);    return str;}static int _compare_vars(void *compare_arg, void *a, void *b){    http_var_t *vara, *varb;    vara = (http_var_t *)a;    varb = (http_var_t *)b;    return strcmp(vara->name, varb->name);}static int _free_vars(void *key){    http_var_t *var;    var = (http_var_t *)key;    if (var->name)        free(var->name);    if (var->value)        free(var->value);    free(var);    return 1;}@1.22log@ermmm, let's use the right operator.@text@d34 2a35 2int _compare_vars(void *compare_arg, void *a, void *b);int _free_vars(void *key);d556 1a556 1int _compare_vars(void *compare_arg, void *a, void *b)d566 1a566 1int _free_vars(void *key)@1.21log@minor cleanup, removes compiler warning, makes it static, and doesn'tre-evaluate string length each time.@text@d550 1a550 1    for (; *p |= '\0'; p++)@1.20log@gcc 3.3 warns: dereferencing type-punned pointer will break strict-aliasing rules@text@d31 1a31 1char *_lowercase(char *str);d547 1a547 1char *_lowercase(char *str)d549 3a551 3    long i;    for (i = 0; i < strlen(str); i++)        str[i] = tolower(str[i]);@1.19log@Karl's patch for freebsd, minus the sys/select.h test which breaks on OS X.Also enables IPV6 in libshout!@text@d481 1d483 1d487 1a487 1    if (avl_get_by_key(parser->vars, (void *)&var, (void **)&found) == 0)d518 1d520 1d524 1a524 1    if (avl_get_by_key(parser->queryvars, (void *)&var, (void **)&found) == 0)@1.18log@Brendan was getting pissed off about inconsistent indentation styles.Convert all tabs to 4 spaces. All code must now use 4 space indents.@text@d15 3@1.17log@reduce include file namespace clutter for libshout and the associatedsmaller libs.@text@d36 1a36 1	return (http_parser_t *)malloc(sizeof(http_parser_t));d41 1a41 1	http_varlist_t *list;d43 11a53 11	parser->req_type = httpp_req_none;	parser->uri = NULL;	parser->vars = avl_tree_new(_compare_vars, NULL);	parser->queryvars = avl_tree_new(_compare_vars, NULL);	/* now insert the default variables */	list = defaults;	while (list != NULL) {		httpp_setvar(parser, list->var.name, list->var.value);		list = list->next;	}d58 4a61 4	/* first we count how many lines there are 	** and set up the line[] array	 	*/	int lines = 0;d63 11a73 11	line[lines] = data;	for (i = 0; i < len && lines < MAX_HEADERS; i++) {		if (data[i] == '\r')			data[i] = '\0';		if (data[i] == '\n') {			lines++;			data[i] = '\0';			if (i + 1 < len) {				if (data[i + 1] == '\n' || data[i + 1] == '\r')					break;				line[lines] = &data[i + 1];d75 2a76 2		}	}d78 2a79 2	i++;	while (data[i] == '\n') i++;d87 35a121 35	int whitespace, where, slen;	char *name = NULL;	char *value = NULL;	/* parse the name: value lines. */	for (l = 1; l < lines; l++) {		where = 0;		whitespace = 0;		name = line[l];		value = NULL;		slen = strlen(line[l]);		for (i = 0; i < slen; i++) {			if (line[l][i] == ':') {				whitespace = 1;				line[l][i] = '\0';			} else {				if (whitespace) {					whitespace = 0;					while (i < slen && line[l][i] == ' ')						i++;					if (i < slen)						value = &line[l][i];										break;				}			}		}				if (name != NULL && value != NULL) {			httpp_setvar(parser, _lowercase(name), value);			name = NULL; 			value = NULL;		}	}d126 4a129 4	char *data;	char *line[MAX_HEADERS];	int lines, slen,i, whitespace=0, where=0,code;	char *version=NULL, *resp_code=NULL, *message=NULL;d131 2a132 2	if(http_data == NULL)		return 0;d134 5a138 39	/* make a local copy of the data, including 0 terminator */	data = (char *)malloc(len+1);	if (data == NULL) return 0;	memcpy(data, http_data, len);	data[len] = 0;	lines = split_headers(data, len, line);	/* In this case, the first line contains:	 * VERSION RESPONSE_CODE MESSAGE, such as HTTP/1.0 200 OK	 */	slen = strlen(line[0]);	version = line[0];	for(i=0; i < slen; i++) {		if(line[0][i] == ' ') {			line[0][i] = 0;			whitespace = 1;		} else if(whitespace) {			whitespace = 0;			where++;			if(where == 1)				resp_code = &line[0][i];			else {				message = &line[0][i];				break;			}		}	}	if(version == NULL || resp_code == NULL || message == NULL) {		free(data);		return 0;	}	httpp_setvar(parser, HTTPP_VAR_ERROR_CODE, resp_code);	code = atoi(resp_code);	if(code < 200 || code >= 300) {		httpp_setvar(parser, HTTPP_VAR_ERROR_MESSAGE, message);	}d140 1a140 2	httpp_setvar(parser, HTTPP_VAR_URI, uri);	httpp_setvar(parser, HTTPP_VAR_REQ_TYPE, "NONE");d142 20a161 1	parse_headers(parser, line, lines);d163 4a166 1	free(data);d168 14a181 1	return 1;d186 8a193 8	if(c >= '0' && c <= '9')		return c - '0';	else if(c >= 'A' && c <= 'F')		return c - 'A' + 10;	else if(c >= 'a' && c <= 'f')		return c - 'a' + 10;	else		return -1;d198 39a236 39	int len = strlen(src);	unsigned char *decoded;	int i;	char *dst;	int done = 0;	decoded = calloc(1, len + 1);	dst = decoded;	for(i=0; i < len; i++) {		switch(src[i]) {		case '%':			if(i+2 >= len) {				free(decoded);				return NULL;			}			if(hex(src[i+1]) == -1 || hex(src[i+2]) == -1 ) {				free(decoded);				return NULL;			}			*dst++ = hex(src[i+1]) * 16  + hex(src[i+2]);			i+= 2;			break;		case '#':			done = 1;			break;		case 0:			free(decoded);			return NULL;			break;		default:			*dst++ = src[i];			break;		}		if(done)			break;	}d238 1a238 1	*dst = 0; /* null terminator */d240 1a240 1	return decoded;d246 29a274 29	int len;	int i=0;	char *key = query;	char *val=NULL;	if(!query || !*query)		return;	len = strlen(query);	while(i<len) {		switch(query[i]) {		case '&':			query[i] = 0;			if(val && key)				httpp_set_query_param(parser, key, val);			key = query+i+1;			break;		case '=':			query[i] = 0;			val = query+i+1;			break;		}		i++;	}	if(val && key) {		httpp_set_query_param(parser, key, val);	}d291 1a291 1	lines = split_headers(data, len, line);d316 80a395 74	char *data, *tmp;	char *line[MAX_HEADERS]; /* limited to 32 lines, should be more than enough */	int i;	int lines;	char *req_type = NULL;	char *uri = NULL;	char *version = NULL;	int whitespace, where, slen;	if (http_data == NULL)		return 0;	/* make a local copy of the data, including 0 terminator */	data = (char *)malloc(len+1);	if (data == NULL) return 0;	memcpy(data, http_data, len);	data[len] = 0;	lines = split_headers(data, len, line);	/* parse the first line special	** the format is:	** REQ_TYPE URI VERSION	** eg:	** GET /index.html HTTP/1.0	*/	where = 0;	whitespace = 0;	slen = strlen(line[0]);	req_type = line[0];	for (i = 0; i < slen; i++) {		if (line[0][i] == ' ') {			whitespace = 1;			line[0][i] = '\0';		} else {			/* we're just past the whitespace boundry */			if (whitespace) {				whitespace = 0;				where++;				switch (where) {				case 1:					uri = &line[0][i];					break;				case 2:					version = &line[0][i];					break;				}			}		}	}	if (strcasecmp("GET", req_type) == 0) {		parser->req_type = httpp_req_get;	} else if (strcasecmp("POST", req_type) == 0) {		parser->req_type = httpp_req_post;	} else if (strcasecmp("HEAD", req_type) == 0) {		parser->req_type = httpp_req_head;	} else if (strcasecmp("SOURCE", req_type) == 0) {		parser->req_type = httpp_req_source;	} else if (strcasecmp("PLAY", req_type) == 0) {		parser->req_type = httpp_req_play;	} else if (strcasecmp("STATS", req_type) == 0) {		parser->req_type = httpp_req_stats;	} else {		parser->req_type = httpp_req_unknown;	}	if (uri != NULL && strlen(uri) > 0) {		char *query;		if((query = strchr(uri, '?')) != NULL) {			*query = 0;			query++;			parse_query(parser, query);		}d397 10a406 2		parser->uri = strdup(uri);	} else {d411 27a437 48	if ((version != NULL) && ((tmp = strchr(version, '/')) != NULL)) {		tmp[0] = '\0';		if ((strlen(version) > 0) && (strlen(&tmp[1]) > 0)) {			httpp_setvar(parser, HTTPP_VAR_PROTOCOL, version);			httpp_setvar(parser, HTTPP_VAR_VERSION, &tmp[1]);		} else {			free(data);			return 0;		}	} else {		free(data);		return 0;	}	if (parser->req_type != httpp_req_none && parser->req_type != httpp_req_unknown) {		switch (parser->req_type) {		case httpp_req_get:			httpp_setvar(parser, HTTPP_VAR_REQ_TYPE, "GET");			break;		case httpp_req_post:			httpp_setvar(parser, HTTPP_VAR_REQ_TYPE, "POST");			break;		case httpp_req_head:			httpp_setvar(parser, HTTPP_VAR_REQ_TYPE, "HEAD");			break;		case httpp_req_source:			httpp_setvar(parser, HTTPP_VAR_REQ_TYPE, "SOURCE");			break;		case httpp_req_play:			httpp_setvar(parser, HTTPP_VAR_REQ_TYPE, "PLAY");			break;		case httpp_req_stats:			httpp_setvar(parser, HTTPP_VAR_REQ_TYPE, "STATS");			break;		default:			break;		}	} else {		free(data);		return 0;	}	if (parser->uri != NULL) {		httpp_setvar(parser, HTTPP_VAR_URI, parser->uri);	} else {		free(data);		return 0;	}d439 6a444 1	parse_headers(parser, line, lines);d446 3a448 1	free(data);d450 1a450 1	return 1;d455 1a455 1	http_var_t *var;d457 2a458 2	if (name == NULL || value == NULL)		return;d460 2a461 2	var = (http_var_t *)malloc(sizeof(http_var_t));	if (var == NULL) return;d463 9a471 9	var->name = strdup(name);	var->value = strdup(value);	if (httpp_getvar(parser, name) == NULL) {		avl_insert(parser->vars, (void *)var);	} else {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -