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 (15) 作業実績 (12) プログラミング (11) ネットワーク (7) C++ (7) C (6) Webアプリ (5) PHP (5) Linux (4) laravel (4) Nginx (3) JavaScript (3) 書籍 (3) AWS (2) Rust (2) Golang (2) Vue.js (2) EC-CUBE (2) Apache (1) デモ (1) CreateJS (1) OSS (1)

技術的な情報は以下にもあります。