CによるURLパーサー
CでURL文字列の解析処理が必要になったので作りました。
https://github.com/kztomita/c-url-parser
URL文字列を解析してscheme, host, path等の構成要素に分割して返します。PHPのparse_url()と同じような動作をします。
同様のURL解析処理はcurlの curl_url_get() でもできますが、 /foo?bar=1 のようにschemeがないようなURLとして不完全な形式はエラーになります。今回、このような形式も扱いたかったため新たに作りました。
.aファイルのようなものをは生成しないので、使うにはparse_url.c, parse_url.hをコピーして、parse_url.hをincludeしてください。
リンク先にも書いておきましたが、URLを構成要素に分割するだけでURLの厳密なバリデーションは行いません。URLとして不完全だったり誤ったものでも受け付けます(/foo?bar=1のようなものも通しますし)。ただし、以下のようなケースではerrnoにEINVAL設定してエラー(NULL)を返します。
- 制御コード(0x00-0x1f, 0x7f)が含まれる
- ホスト部分にspace(0x20)が含まれる
- ポート番号に数字以外が含まれる
- ポート番号が16bitの範囲外
- IPv6アドレスを埋め込むための角括弧([])の位置がおかしい
この辺のチェック内容は今後調整するかもしれません。
使用例 - example.c
#include <stdio.h>
#include "url_parser.h"
int main()
{
const char *url = "https://example.com:8080/foo/?bar=baz";
URL_COMPONENTS *c;
c = parse_url(url);
if (!c) {
return -1;
}
printf("Scheme: %s\n", c->scheme ? c->scheme : "");
printf("Host: %s\n", c->host ? c->host : "");
if (c->port != -1) {
printf("Port: %d\n", c->port);
}
printf("Path: %s\n", c->path ? c->path : "");
printf("Query: %s\n", c->query ? c->query : "");
free_url_components(c);
return 0;
}
ビルド / 実行結果
# gcc example.c url_parser.c # ./a.out Scheme: https Host: example.com Port: 8080 Path: /foo/ Query: bar=baz
投稿日:2022/01/11 12:22