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