筑波大学 システム情報工学研究科 コンピュータサイエンス専攻, 電子・情報工学系 新城 靖 <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進数でバイト数が含まれている。