uriparser 解析处理URI
uriparser是一个用于解析与处理RFC3986标准URI的C语言库,这里简单记录其基本使用方式。
编译&安装
RPM包安装
centos7下可以通过yum安装。
1 | yum install uriparser |
1 | yum install uriparser-devel |
源码编译
如果需要静态链接,可以考虑源码编译。
uriparser代码托管于github,可以直接下载release代码。
1 | tar -xzvf uriparser-0.9.3.tar.gz && \ |
PS:编译需要cmake至少3.3版本,可以下载二进制安装包解压后将bin目录加入PATH环境变量直接使用,https://cmake.org/download/
例子
例子中可以看到,使用方式很简单,解析URI使用函数uriParseSingleUriA
,如果解析成功,最后要调用uriFreeUriMembersA
用以释放内存。
其他就是按照结构体构成读取解析后的各个URI结构。
1 |
|
1 | gcc -g main.c -l uriparser |
1 | [huyu@localhost test_uriparser]$ ./a.out "tcp://user:pass@host:443/a/b/cd?k=v&k2=v2#frag" |
结构体
uriparser的头文件中使用宏定义包装了结构体和函数的命名,宏如下。功能为字符串拼接,比如URI_TYPE(Uri)
在展开后为UriUriA
1 |
了解过宏定义就可以看主要结构体了
1 | /** |
UriUriA
中大量出现的成员类型URI_TYPE(TextRange)
定义如下,读取方式参考例子代码。
1 | /** |
UriUriA
中hostData
成员在域名是合法的IPV4地址时,uriparser会帮助解析为网络序的IPV4地址值,参考例子代码对hostData的处理。
URI_TYPE(PathSegment)
代表了路径的每一段,链表结构。1
2
3
4
5
6
7
8
9
10
11
12
13
14/**
* Represents a path segment within a %URI path.
* More precisely it is a node in a linked
* list of path segments.
*
* @see UriUriA
* @since 0.3.0
*/
typedef struct URI_TYPE(PathSegmentStruct) {
URI_TYPE(TextRange) text; /**< Path segment name */
struct URI_TYPE(PathSegmentStruct) * next; /**< Pointer to the next path segment in the list, can be NULL if last already */
void * reserved; /**< Reserved to the parser */
} URI_TYPE(PathSegment); /**< @copydoc UriPathSegmentStructA */