Home > ブログ > CによるURLパーサー

ブログ

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

タグ: プログラミング C

Top

アーカイブ

タグ

Server (28) 作業実績 (21) PHP (19) ネットワーク (17) プログラミング (15) OpenSSL (10) C (8) C++ (8) PHP関連更新作業 (8) EC-CUBE (7) Webアプリ (7) laravel (6) 書籍 (5) Nginx (5) Linux (5) AWS (4) Vue.js (4) JavaScript (4) 与太話 (4) Rust (3) Symfony (2) お知らせ (2) Golang (2) OSS (1) MySQL (1) デモ (1) CreateJS (1) Apache (1)