システムプログラム(第9週): get_query_string()

                                       筑波大学 システム情報工学研究科 
                                       コンピュータサイエンス専攻, 電子・情報工学系
                                       新城 靖
                                       <yas@is.tsukuba.ac.jp>

このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~syspro/2011/2011-06-22/get-query-string.html
あるいは、次のページから手繰っていくこともできます。
http://www.coins.tsukuba.ac.jp/~syspro/2011/
http://www.coins.tsukuba.ac.jp/~yas/

get_query_string()

get_query_string() は、CGI でプログラムが実行された時に パラメタが含まれた文字列を読み込むプログラムである。
  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() で続きの処理を行う。

read_query_string()

read_query_string() は、CGI でPOSTメソッドが使われた時にパラメタを標準 入力から読み込む。
 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進数でバイト数が含まれている。
Last updated: 2011/06/20 15:19:09
Yasushi Shinjo / <yas@is.tsukuba.ac.jp>