/* kuri.c * URI パージングのサンプル * apr_uri_parse の挙動を確認するプログラム */ #define USAGE "Usage: kuri " #include "apr_general.h" #include "apr_errno.h" #include "apr_strings.h" #include "apr_uri.h" #include "mystab.h" int apr_my_main (int ac, char **av, apr_file_t * astdin, apr_file_t * astdout, apr_file_t * astderr, apr_pool_t * pool) { int error_flag = 0; apr_status_t rv = APR_SUCCESS; char *uri_str = NULL; apr_uri_t uri ; if (ac < 2) { apr_file_printf(astderr, "%s\n", USAGE); error_flag = 1; goto _FINALLY_; } uri_str = av[1]; rv = apr_uri_parse(pool, uri_str, &uri); if (rv != APR_SUCCESS) { error_flag = 1; goto _FINALLY_; } if (!uri.port_str) { /* URI にポート番号がない場合には、uri.port_str に値はセットされない。 */ /* ここでは、スキーマ文字列からデフォルトポートを推測している。 */ uri.port = apr_uri_port_of_scheme(uri.scheme); uri.port_str = apr_itoa(pool, uri.port); } #define XPRINTS(XSTR,X) apr_file_printf(astdout, "%s=[%s]\n", XSTR, uri.X) #define XPRINTD(XSTR,X) apr_file_printf(astdout, "%s=[%d]\n", XSTR, uri.X) XPRINTS("scheme", scheme); XPRINTS("hostinfo", hostinfo); XPRINTS("user", user); XPRINTS("password", password); XPRINTS("hostname", hostname); XPRINTS("port_str", port_str); XPRINTS("path", path); XPRINTS("query", query); XPRINTS("fragment", fragment); XPRINTD("port", port); _FINALLY_: if (error_flag) { if (rv != APR_SUCCESS) { char error_buf[256]; apr_file_printf(astderr, "%s\n", apr_strerror(rv, error_buf, sizeof(error_buf))); } apr_file_printf(astderr, "failed!\n"); return 1; /* 異常終了 */ } apr_file_printf(astdout, "\ndone.\n"); return 0; /* 正常終了 */ } /* end of main */