myht_util.c

最終更新:2009/12/19

myht_util.c

001: /* myht_util.c
002:  * HTTP 用ユーティリティ
003:  */
004: 
005: #include "myht_util.h"
006: 
007: /*
008:  * 1行の文字列からデリミタで区切られた3つの文字列を読み出す関数
009:  * 文字列の領域も確保する。
010:  * 各文字列はヌル文字で終端される。
011:  * 返り値:
012:  *   読み出せた文字列の個数。
013:  *   エラー時には -1。
014:  * ・入力文字列は書き換えられることに注意
015:  */
016: 
017: int read_3strs (
018:   char *line /* IN: 入力文字列 */
019:   , char **x1   /* OUT: 1番目の文字列へのポインタ */
020:   , char **x2   /* OUT: 2番目の文字列へのポインタ */
021:   , char **x3   /* OUT: 3番目の文字列へのポインタ */
022:   , char delim  /* IN: デリミタ文字 */
023: ) {
024:   char *pos = NULL;
025: 
026:   if (!line)
027:     return -1;
028: 
029:   pos = *x1 = line;
030:   
031:   while (*pos && *pos != delim)
032:     pos++;
033: 
034:   if (! *pos)
035:     return 1;
036: 
037:   *pos = '\0';
038:   
039:   *x2 = ++pos;
040:   while (*pos && *pos != delim)
041:     pos++;
042: 
043:   if (! *pos)
044:     return 2;
045: 
046:   *pos = '\0';
047: 
048:   *x3 = ++pos;
049:   /* もし、末尾に空白があってもそのまま。 */
050:   
051:   return 3;
052: }
053: 
054: /* ヘッダ文字列からヘッダ名・ヘッダの値を抽出し、
055:  * テーブルに保存する関数
056:  *
057:  */
058: 
059: void set_entity_header_to_tab (
060:   char *line
061:   , apr_table_t *tab
062: ) {
063:   char *name = NULL;
064:   char *value = NULL;
065:   char *pos = NULL;
066:   
067:   if (!line || !tab)
068:     return;
069: 
070:   name = line;
071:   
072:   pos = strchr(line, ':');
073:   
074:   if (!pos)
075:     return; /* ':' が見つからなかった時は何もしない。 */
076:   
077:   *pos = '\0'; /* name の終端 */
078: 
079:   /* ':' の前の空白の処理をしていないが、本来はすべきだろう。 */
080: 
081:   /* ':' の後の空白のスキップ */
082:   
083:   pos++;
084:   while(*pos && (*pos == ' ' || *pos == '\t'))
085:     pos++;
086: 
087:   value = pos;
088: 
089:   if (name && value)
090:     apr_table_set(tab, name, value);
091: }
092: 
093: /*
094:  * テーブル各キー・値の表示
095:  */
096: 
097: int disp_tab (void *ctx, const char *key, const char *value) {
098:   apr_file_t *out = (apr_file_t*)ctx;
099:   apr_file_printf(out, "[%s]=[%s]\n", key, value);
100:   return TRUE;/* TRUE:continue iteration. FALSE:stop iteration */
101: }
102: 
103: /* URI のパース
104:  * 成功:1
105:  * 失敗:0
106:  */
107: 
108: int my_uri_parse(
109:   apr_pool_t *pool
110:   , const char *uri_str
111:   , apr_uri_t *uri
112: ) {
113:   apr_status_t rv = APR_SUCCESS;
114:   rv = apr_uri_parse(pool, uri_str, uri);
115:   if (rv != APR_SUCCESS) {
116:     return 0;
117:   }
118: 
119:   /* URI スキームは "http" か "https" 限定 */
120:   if ((!uri->scheme) || 
121:     (uri->scheme && (strcmp(uri->scheme, "http") && strcmp(uri->scheme, "https")))
122:   ) {
123:     return 0;
124:   }
125: 
126:   /* ポート番号の補完 */
127:   if (!uri->port_str) {
128:     /* URI にポート番号がない場合には、uri.port_str に値はセットされない。 */
129:     /* ここでは、スキーマ文字列からデフォルトポートを推測している。 */
130:     
131:     uri->port = apr_uri_port_of_scheme(uri->scheme);
132:     uri->port_str = apr_itoa(pool, uri->port);
133:   }
134: 
135:   /* パスの補完 */
136:   if (!uri->path) {
137:     /* URI にパスが指定されていない場合は "/" で補完する。 */
138:     uri->path = "/";
139:   }
140:   
141:   /* 最終的にホストネームとポート番号、パスを取得できたか確認 */
142:   if (!uri->hostname || uri->port <= 0 || !uri->path) {
143:     return 0;
144:   }
145: 
146:   return 1;
147: }
Copyright (C) KAKU PROJECT (2009)KAKU PROJECT (2009)