分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
用C语言编写http应用,解析URL是一个繁琐的事儿。前几天使用http_parser实现httpclient,发现里面提供了一个解析URL的方法http_parser_parse_url,用起来相当方便。
http_parser_parse_url通过分析URL字符串,把port、host、path、schema之类的信息保存在一个结构体http_parser_url中。通过看头文件和源码,发现这个结构体仅仅是记录了URL中各部分信息的起始位置、长度,没有做任何内存拷贝,效率上看还是不错的。目前支持SCHEMA、PORT、HOST、PATH、QUERY、USERINFO、FRAGMENT七种信息的提取。
http_parser_url定义如下:
struct http_parser_url { uint16_t field_set; /* Bitmask of (1 << UF_*) values */ uint16_t port; /* Converted UF_PORT string */ struct { uint16_t off; /* Offset into buffer in which field starts */ uint16_t len; /* Length of run in buffer */ } field_data[UF_MAX];};
其中,field_set成员用于检测解析到了哪种信息(使用位与操作),field_data存放相应的URL信息在原始URL中的起始位置和长度。
http_parser_parse_url()方法的原型:
int http_parser_parse_url(const char *buf, size_t buflen, int is_connect, struct http_parser_url *u);
需要说明的是is_connect参数,当传1时,http_parser_parse_url方法将进行严格检验,如果URL中没有port、schema将导致http_parser_parse_url方法失败,返回非0值。一般给is_connect方法传0即可。
下面是我使用的一段代码:
static int parse_url(struct http_client * httpc, const char *url){ struct http_parser_url u; if(0 == http_parser_parse_url(url, strlen(url), 0, &u)) { if(u.field_set & (1 << UF_PORT)) { httpc->port = u.port; } else { httpc->port = 80; } if(httpc->host) free(httpc->host); if(u.field_set & (1 << UF_HOST) ) { httpc->host = (char*)malloc(u.field_data[UF_HOST].len+1); strncpy(httpc->host, url+u.field_data[UF_HOST].off, u.field_data[UF_HOST].len); httpc->host[u.field_data[UF_HOST].len] = 0; } if(httpc->path) free(httpc->path); if(u.field_set & (1 << UF_PATH)) { httpc->path = (char*)malloc(u.field_data[UF_PATH].len+1); strncpy(httpc->path, url+u.field_data[UF_PATH].off, u.field_data[UF_PATH].len); httpc->path[u.field_data[UF_PATH].len] = 0; } return 0; } return -1;}
上面的代码是我实现的http_client中的一部分,仅供参考。