C++によるURL文字列解析

Javaの場合、java.net.URLを使うと、URL文字列からホスト名やパス名を抽出することが出来る。C++の場合、どうやれば良いんだろうといろいろ探した結果、uriparserを使えばいけることが分かった。
調べた感じではcpp-netlibでも行けそうな感じだったけど、こちらはBoostなどが必要になりそう?

サンプルコード

注意する点は、サンプルでは特にエラーチェックなどは行っていないことと、URL文字列はフルのものを使用しているということ。uriparserの場合、存在しない項目に対してアクセスすると、セグメンテーション違反で落ちます。

#include <cstdio>
#include <uriparser/Uri.h>

int main(int argc, char **argv) {
	UriParserStateA state;
	UriUriA uri;
	state.uri = &uri;

	// None error check
	const char* u = "http://user:pass@example.com:8080/hoge/index.html?hoge=foo#bar";
	uriParseUriA(&state, u);

	printf("host : %s\n", uri.scheme.first);
	printf("host : %s\n", uri.scheme.afterLast);
	printf("\n");
	printf("host : %s\n", uri.userInfo.first);
	printf("host : %s\n", uri.userInfo.afterLast);
	printf("\n");
	printf("host : %s\n", uri.hostText.first);
	printf("host : %s\n", uri.hostText.afterLast);
	printf("\n");
	printf("port : %s\n", uri.portText.first);
	printf("port : %s\n", uri.portText.afterLast);
	printf("\n");
	printf("path : %s\n", uri.pathHead->text.first);
	printf("path : %s\n", uri.pathHead->text.afterLast);
	printf("\n");
	printf("query: %s\n", uri.query.first);
	printf("query: %s\n", uri.query.afterLast);
	printf("\n");
	printf("frag : %s\n", uri.fragment.first);
	printf("frag : %s\n", uri.fragment.afterLast);

	uriFreeUriMembersA(&uri);
	return 0;
}

実行結果

実行してみると、以下のように抽出したい情報そのものはとれずに、どうやら自分で文字列を抜き出さないといけないっぽい。ただ、これだと面倒だし、何かしら方法はありそうな気もするけど(未確認)。

scheme: http://user:pass@example.com:8080/hoge/index.html?hoge=foo#bar
scheme: ://user:pass@example.com:8080/hoge/index.html?hoge=foo#bar

userInfo : user:pass@example.com:8080/hoge/index.html?hoge=foo#bar
userInfo : @example.com:8080/hoge/index.html?hoge=foo#bar

host : example.com:8080/hoge/index.html?hoge=foo#bar
host : :8080/hoge/index.html?hoge=foo#bar

port : 8080/hoge/index.html?hoge=foo#bar
port : /hoge/index.html?hoge=foo#bar

path : hoge/index.html?hoge=foo#bar
path : /index.html?hoge=foo#bar

query: hoge=foo#bar
query: #bar

frag : bar
frag :