筑波大学 システム情報工学研究科
コンピュータサイエンス専攻, 電子・情報工学系
新城 靖
<yas@is.tsukuba.ac.jp>
このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~syspro/2010/No9_files/get-query-string.html
あるいは、次のページから手繰っていくこともできます。
http://www.coins.tsukuba.ac.jp/~syspro/2010/
http://www.coins.tsukuba.ac.jp/~yas/
77: char *get_query_string()
78: {
79: char *request_method, *query_string;
80: request_method = getenv("REQUEST_METHOD");
81: if( request_method == 0 )
82: return( 0 );
83: else if( strcmp(request_method,"GET") == 0 )
84: {
85: query_string = getenv("QUERY_STRING");
86: if( query_string == 0 )
87: return( 0 );
88: else
89: return( strdup(query_string) );
90: }
91: else if( strcmp(request_method,"POST") == 0 )
92: {
93: return( read_query_string() );
94: }
95: else
96: {
97: printf("Unknown method: ");
98: safe_print_string( request_method );
99: printf("\n");
100: }
101: }
102:
get_query_string() は、クライアントから送られてきたパラメタを、1つの
文字列として受け取るものである。GET メソッドの場合()は、単に環境変数
REQUEST_METHOD を読めばよい。ただし、文字列の長さの上限がきつい。
strdup() は、文字列をコピーするものである。使い終わったら、free() で解 放する。
POST メソッドの場合は、read_query_string() で続きの処理を行う。
103: char *read_query_string()
104: {
105: int clen ;
106: char *content_length ;
107: char *buf ;
108:
109: content_length = getenv("CONTENT_LENGTH");
110: if( content_length == 0 )
111: {
112: return( 0 );
113: }
114: else
115: {
116: clen = strtol( content_length,0,10 );
117: buf = malloc( clen + 1 );
118: if( buf == 0 )
119: {
120: printf("read_query_string(): no memory\n");
121: exit( -1 );
122: }
123: if( read(0,buf,clen) != clen )
124: {
125: printf("read error.\n");
126: exit( -1 );
127: }
128: buf[clen] = 0 ;
129: return( buf );
130: }
131: }
132:
CONTENT_LENGTH には、10進数でバイト数が含まれている。