• 検索結果がありません。

インターネット技術特論 CGI 動的文書生成 C:CGI による動的文書生成 (C 言語 ) 山口実靖 課題 ( ろ ) 本学 Web サーバに自作 CGI プログラムを公開し, その URL とプログラムをメー

N/A
N/A
Protected

Academic year: 2021

シェア "インターネット技術特論 CGI 動的文書生成 C:CGI による動的文書生成 (C 言語 ) 山口実靖 課題 ( ろ ) 本学 Web サーバに自作 CGI プログラムを公開し, その URL とプログラムをメー"

Copied!
10
0
0

読み込み中.... (全文を見る)

全文

(1)

インターネット技術特論

C:CGIによる動的文書生成(C言語)

山口 実靖

http://www.ns.kogakuin.ac.jp/~ct13140/inet/

CGI 動的文書生成

インターネット技術特論C-3

課題(ろ)

• 本学Webサーバに自作CGIプログラムを公開し,

そのURLとプログラムをメールにて提出.

– 宛先"[email protected]"

– メールの件名(Subject:)は,必ず"インターネット技術

特論課題ろ"とすること.

• 途中に空白無し. ダブルクォーテーション不要.

– メール本文に,「学籍番号,研究科(学部),専攻(学

科,コース),研究室,氏名,URL」を記述.

– 作成したプログラムをメールに添付.

• 提出期限 13日後の23時59分

質問は早めにMLに!

インターネット技術特論C-4

静的文書 と 動的文書

• Webサーバにおける 静的文書 と 動的文書

• 静的文書

– 事前に保存されている内容を,Webブラウザに返す.

– 毎回,固定的な内容を返す(表示).

• 動的文書(生成)

– 要求時にプログラムを起動し,文書を動的に(そのと

きに)生成する.

– 状況に応じて,ブラウザからの入力に応じて,返す

内容(表示内容)を変更することが可能.

インターネット技術特論C-5

CGI

• CGI (Common Gateway Interface)

– Webサーバ計算機の内部でプログラムを起動し,応

答内容(通常はHTML)を動的に生成し,それ(動的

生成HTML)をWebブラウザに返す仕組み.

インターネット技術特論C-6

CGI

Webブラウザ W eb サ ー バ プ ロ グ ラ ム ① HTTP リクエスト ② プログラム 起動 ③ 実行 データ入力 (環境変数 QUERY_STRING または 標準入力) ④ 実行結果出力 データ出力 (標準出力) ⑤ HTTP 応答

CGI での データ入力

• GETの場合

– 環境変数 QUERY_STRING を読み込む.

• POSTの場合

– 標準入力 を読み込む.

– データ長は環境変数 CONTENT_LENGTH より取得.

とりあえず,保留

CGI での データ出力

• 冒頭に

"Content-type: text/html[改行][改行]"

と記述してから,本文を出力する.

– もし,出力データが"テキストHTML"であるなら.

• 上記は,HTTP ヘッダであり,WebサーバとWebブラウザ

との間の制御情報のやりとりに使用される.

• 実際はより多くの機能があり,上記は必要最低限の出力.

文字コード情報など重要性の高いものもある.

• 詳細は,後述(したい…)

(2)

インターネット技術特論C-9

CGI での データ出力 (例0)

• "<h1>Hello</h1>"という本文を出力し,Web

ブラウザに渡したかったら,

プログラムは

"Content-type: text/html¥n¥n

<h1>hello</h1>"と出力する必要がある.

インターネット技術特論C-10

CGI での データ出力 (例1)

• プログラムが,

"Content-type: text/html¥n¥n

<h2>HelloWorld</h2>"

と出力した場合,

Webブラウザには,

"<h2>HelloWorld</h2>"

と渡される.

正確には,(HTTP1.1使用時は)上記のHTTPヘッダもWebブラウザに渡される. ただし,Webブラウザは,それを(ユーザに対して)表示しない. インターネット技術特論C-11

CGI での データ出力 (例2)

• プログラムが,

"<h2>HelloWorld</h2>"

と出力した場合,

エラーとなる.

インターネット技術特論C-12

CGI プログラムの設置

• 以下は,工学院大学のWebサーバのルール

– ファイル名は,"*.cgi"である.

– 実行権限は "755" にしておく.

ファイル名が"~.html"であったら, → そのファイルを読み込んで,Webブラウザに返す. ファイル名が"~.cgi"であったら, → そのファイルを実行ファイルとして実行し, その出力(標準出力)をWebブラウザに返す. ファイル名が"~.cgi"だが,実行権限がなかったら, → 実行しようとして,実行できず,エラー Webサーバのポリシー (工学院大学の例) インターネット技術特論C-13

工学院大学のWebサーバの設定

• ホスト www.ns.kogakuin.ac.jp

/etc/httpd/conf/httpd.conf

というファイルに記述されている.

最初のプログラム

インターネット技術特論C-15

000.c

#include <stdio.h>

void main(){

printf("Content-type: text/html¥n¥n");

printf("hello¥n");

}

注意!! 通常,CGIプログラムはC言語では作りません. C言語は,Webアプリケーション開発に不向きです.

Content-type: text/html

hello

実行結果 インターネット技術特論C-16

CGI プログラムの設置

ct13140@green[101]:

pwd

/home/ct13140/public_html/cgi/C

ct13140@green[102]:

gcc 000.c -o 000.cgi

ct13140@green[103]:

ls -alF 000.cgi

-rwxr-xr-x 1 ct13140 user (略) 000.cgi*

ct13140@green[104]:

./000.cgi

Content-type: text/html

hello

(3)

インターネット技術特論C-17

CGI プログラムの設置

• Webブラウザでアクセス

http://www.ns.kogakuin.ac.jp/~ct13140/cgi/C/000.cgi

• 「hello」と表示される.

成功

インターネット技術特論C-18

001.c (ソース)

#include <stdio.h>

void main(){

int i;

printf("Content-type: text/html¥n¥n");

for(i=0; i<10; i++){

printf("%d<br>¥n", i);

}

}

インターネット技術特論C-19

001.c (サーバ上で実行)

Content-type: text/html

0<br>

1<br>

2<br>

3<br>

4<br>

5<br>

6<br>

7<br>

8<br>

9<br>

インターネット技術特論C-20

001.cgiの設置

• Webサーバにて

– gcc 001.c -o 001.cgi

• Webブラウザでアクセス

– http://www.ns.kogakuin.ac.jp/~ct1314

0/cgi/C/001.cgi

0 1 2 3 4 5 6 7 8 9 0<br> 1<br> 2<br> 3<br> 4<br> 5<br> 6<br> 7<br> 8<br> 9<br> Webブラウザ ソースを表示

成功

インターネット技術特論C-21

002.c (ソース)

#include <stdio.h> #include <time.h> int main(void) { time_t tim; struct tm *tm_tim;

char *dow[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};

time(&tim); tm_tim = localtime(&tim); printf("Content-type: text/html¥n¥n"); printf("%d/", tm_tim->tm_year+1900); printf("%d/",tm_tim->tm_mon+1); printf("%d",tm_tim->tm_mday); printf("(%s) ",dow[tm_tim->tm_wday]); printf("%02d:",tm_tim->tm_hour); printf("%02d:",tm_tim->tm_min); printf("%02d¥n",tm_tim->tm_sec); } インターネット技術特論C-22

002.c (サーバ上で実行)

Content-type: text/html

2010/10/12(Tue) 14:40:01

002.cgiの設置

• Webサーバにて

– gcc 002.c -o 002.cgi

• Webブラウザでアクセス

– http://www.ns.kogakuin.ac.jp/~ct1314

0/cgi/C/002.cgi

2010/9/8(Tue) 14:40:01 2010/9/8(Tue) 14:40:01 Webブラウザ ソースを表示

成功

003.c (ソース)

#include <stdio.h> int main(void) { printf("Content-type: text/html¥n¥n"); srand(time(NULL)); printf("rand=%d¥n", rand()); }

(4)

サーバ内のファイルを読み込む

CGIプログラム

インターネット技術特論C-26

004.c (ソース)

#include <stdio.h> int main(void) { FILE *fp; char txt[1024]; printf("Content-type: text/html¥n¥n"); fp = fopen("004.txt","rt");// ファイル"004.txt"を読み込み形式でopen

if( fp == NULL ){ // もし,open失敗なら.

printf("<h1>File can not open!</h1>¥n"); // エラーを表示して

exit(0); // 終了

}

printf("File open ok.<br>¥n"); // open成功した事を表示.

fread( txt, 1024, 1, fp); // ファイルから1024バイト読み込む txt[1023] = '¥0'; // 配列の最後を終端記号にしておく. printf("file --> [%s]<br>¥n¥n", txt); // 読み込み内容を表示. fclose(fp); // ファイルをclose } "004.txt"を読み込んで, その内容を出力するプログラム. インターネット技術特論C-27

実行(A) : サーバ上で実行

ct13140@green[101]:ls -l 004.txt -rw-r--r-- 1 ct13140 user 6 Sep 11 12:34 004.txt ct13140@green[102]:cat 004.txt hello ct13140@green[103]:./004.cgi Content-type: text/html File open ok.<br> file --> [hello ]<br> ct13140@green[104]: "004.txt"の内容を包含する出力が得られた. インターネット技術特論C-28

実行(A) : Browserで閲覧

http://www.ns.kogakuin.ac.jp/~ct13140/cgi/C/004.cgi

File open ok. file --> [hello ]

File open ok.<br> file --> [hello ]<br> Webブラウザ上の表示 HTMLソース "004.txt"の内容を包含する 出力が得られた. インターネット技術特論C-29

実行(B) : サーバ上で実行

ct13140@green[101]:ls -l 004.txt -rw-r--r-- 1 ct13140 user 15 Sep 11 12:35 004.txt ct13140@green[102]:cat 004.txt hello world ct13140@green[103]:./004.cgi Content-type: text/html File open ok.<br> file --> [hello world ]<br> "004.txt"の内容を変更して 再実行すると. インターネット技術特論C-30

実行(B) : Browserで閲覧

http://www.ns.kogakuin.ac.jp/~ct13140/cgi/C/004.cgi

File open ok.

file --> [hello world ]

File open ok.<br> file --> [hello world ]<br> Webブラウザ上の表示 HTMLソース "004.txt"の内容を変更して 再実行すると. インターネット技術特論C-31

実行(C) : サーバ上で実行

ct13140@green[101]:chmod 600 004.txt ct13140@green[102]:ls -l 004.txt -rw--- 1 ct13140 user 6 Sep 11 12:34 004.txt ct13140@green[103]:cat 004.txt hello ct13140@green[104]:./004.cgi Content-type: text/html File open ok.<br> file --> [hello ]<br> ct13140@green[105]: "004.txt"のパーミッションが600. owner→read可 group→read不可 other→read不可 自分(owner)はread可能なので, "004.txt"の内容は読み込まれた. インターネット技術特論C-32

実行(C) : Browserで閲覧

http://www.ns.kogakuin.ac.jp/~ct13140/cgi/004.cgi

File can not open!

<h1>File can not open!</h1>

Webブラウザ上の表示

HTMLソース

Webサーバプログラム(apache httpd)は,user apache, group apache の権限で動いている. "004.txt"のパーミッションが600. owner→read可 group→read不可 other→read不可 ←このルールが適用される Webサーバ(other)が004.cgiを動かし,004.cgiが004.txt を読み込もうとするが,読み込み権限がなく"読めなかった".

(5)

インターネット技術特論C-33

Webサーバ, httpd, apache

• 工学院大学にはApacheというWebサーバ

(httpd)がインストールされている.

• httpdは,User "apache",Group

"apache"の権限にて動作する.

• CGIプログラムがファイルにアクセスするには,

otherに対するパーミッションが"許可"に成って

いなくてはならない.

インターネット技術特論C-34

CGI と 静的HTML

• CGI(などのサーバサイドプログラムは)

サーバ内でプログラムが動作する

結果として

– 毎回出力を変えることができる.

– 接続相手により出力を変えることができる.

– サーバ内のファイルの読み書きができる.

– サーバ内のRDBMSに接続することができる.

• 特に書き込みが重要.ユーザの情報を残しておける.

アクセスカウンター

インターネット技術特論C-36

005.c (ソース)

1 #include <stdio.h> 2 #include <stdlib.h> 3 void main(void) { 4 int cnt; 5 FILE *fp; 6 printf("Content-type: text/html¥n"); 7 printf("¥n"); 8 fp = fopen("005.txt", "rt"); 9 if( fp == NULL ){ 10 cnt == 0; 11 printf("file read NG.<br>¥n"); 12 } else { 13 char buf[1024]; 14 fread( buf, 1, 1024, fp); 15 fclose(fp); 16 cnt = atoi(buf);

17 printf("file read OK.<br>¥n");

18 } 19 printf("<h1>%d</h1>¥n", cnt); 20 cnt ++; インターネット技術特論C-37

005.c (ソース)

21 fp = fopen("005.txt","wt"); 22 if( fp == NULL ){ 23 printf("file write NG.<br>¥n"); 24 } else { 25 fprintf(fp, "%d", cnt); 26 printf("file write OK.<br>¥n");

27 fclose(fp); 28 } 29 } インターネット技術特論C-38

データファイルのパーミッション

ct13140@green[111]:ls -l 005.txt -rw-rw-rw- 1 ct13140 user 2 Sep 11 12:34 005.txt Q.ファイルのパーミッションを –rw-rw-rw- にするには? A.chmod 666 005.txt Q.赤字の部分(other)が重要なら,chmod 606 005.txt で -rw----rw- にしても良いのか? A.良い.むしろ,その方が好ましい.

実行(A) : サーバ上で実行

ct13140@green[334]:./005.cgi Content-type: text/html file read OK.<br> <h1>28</h1> file write OK.<br>

実行(B) : Browserで閲覧

file read OK.

29

file write OK.

file read OK.<br> <h1>29</h1> file write OK.<br>

Webブラウザ上の表示

HTMLソース

(6)

インターネット技術特論C-41

実行(B’): Browserで閲覧

file read OK.

30

file write OK.

file read OK.<br> <h1>30</h1> file write OK.<br>

Webブラウザ上の表示 HTMLソース 再読み込みすると... http://www.ns.kogakuin.ac.jp/~ct13140/cgi/C/005.cgi インターネット技術特論C-42

数値を画像で表示するカウンタ

• 簡単なトリック(?)で実現可能.

– "0.gif", "1.gif", "2.gif", ... ,

"9.gif" を用意しておく.

– アクセス数が123なら,

<img src="1.gif">

<img src="2.gif">

<img src="3.gif">

と出力すれば, ブラウザが上記ファイルを表示して

くれる.

インターネット技術特論C-43

005_.c

int i;

char temp[1024];

sprintf( temp, "%d", cnt);

for(i=0; i<strlen(temp); i++){

printf("<img src=¥"%c.gif¥">",

temp[i]);

}

"005.c"の19行目の

printf("<h1>%d</h1>¥n", cnt);

の代わりに上記を 書いておけばよい.

インターネット技術特論C-44

実行(A) : Browserで閲覧

http://www.ns.kogakuin.ac.jp/~ct13140/cgi/C/005_.cgi

file read OK.<br>

<img src="1.gif"><img src="2.gif"><img src="3.gif"><br> file write OK.<br>

Webブラウザ上の表示 HTMLソース インターネット技術特論C-45

ファイルのロック

• 本当は,ファイルをロックすべき

– 複数のユーザが同時に読み込むとデータが壊れる.

– Unix には ファイルロック機能がある.

• ただし、通常はRDBMSを用いる.「ファイルへの

書き込み」や「ファイルからの読み込み」は行わ

ない.

• 本講義では当面は放置.

インターネット技術特論C-46

CGIプログラムA

ファイルのロック (幸運なとき)

ファイル

56

read open data read cnt は 56. write open

57

data write close ↓Cntを1増やす cnt は 57. インターネット技術特論C-47

CGIプログラムA

ファイルのロック (不運なとき)

ファイル

56

read open data read write open

57

data write

CGIプログラムB

read open cnt は 0? data read write open data write

1

cnt は 56. ↓Cntを1増やす cnt は 57. close close ↓Cntを1増やす cnt は 1? close close

環境変数を取得する

(7)

インターネット技術特論C-49

環境変数

• CGIプログラムは,各種環境変数の値を調査す

ることにより多くの情報を得ることが可能.

– 接続クライアント情報,サーバ情報など

• 環境変数はgetenv(環境変数名)で取得可能.

– 例

env = getenv( "REMOTE_ADDR" ); if( env != NULL ){

printf("REMOTE_ADDR : %s<br>¥n", env); } インターネット技術特論C-50

CGIの環境変数

• RVER_SOFTWARE

• SERVER_NAME

• GATEWAY_INTERFACE

• SERVER_PROTOCOL

• SERVER_PORT

• REQUEST_METHOD

• PATH_INFO

• PATH_TRANSLATED

• SCRIPT_NAME

詳しくは、CGIの仕様書↓を! http://hoohoo.ncsa.illinois.edu/cgi/env.html

• QUERY_STRING

• REMOTE_HOST

• REMOTE_ADDR

• AUTH_TYPE

• REMOTE_USER

• REMOTE_IDENT

• CONTENT_TYPE

• CONTENT_LENGTH

• HTTP_ACCEPT

• HTTP_USER_AGENT

インターネット技術特論C-51

006.c (ソース)

#include <stdio.h> #include <stdlib.h> void main(){ char *env; printf("Content-Type: text/html¥n¥n"); env = getenv( "REMOTE_ADDR" ); if( env != NULL ){

printf("REMOTE_ADDR : %s<br>¥n", env); } else { printf("REMOTE_ADDR : NULL<br>¥n"); } } 接続してきたクライアントのIPアドレス情報 "REMOTE_ADDR"の内容を表示するプログラム. 接続元により表示内容を変えるプログラムも作成可能.

Browserからの入力を処理する

インターネット技術特論C-53

Browser から CGIプログラムへの

データの流れ

Webブラウザ W e b サ ー バ プ ロ グ ラ ム ①

GET

または

POST

② プログラム 起動 ③ 実行 データ入力 (環境変数 QUERY_STRING または 標準入力) ④ 実行結果出力 データ出力 (標準出力) ⑤ HTTP 応答 インターネット技術特論C-54

データ入力可能なHTML

<form action="007.cgi" method="GET"> A:<input type="text" name="aa"><br> B:<input type="text" name="bb"><br> <input type="submit" value="OK"> <input type="reset" value="Reset"> </form> ユーザがここに入力したデータは, 「”aa”の値」として, サーバに送信される. ユーザがここに入力したデータは, 「”bb”の値」として, サーバに送信される.

↑Browserでの表示

データ入力可能なHTML

<form action="007.cgi" method="GET">

A:<input type="text" name="aa"><br>

B:<input type="text" name="bb"><br>

<input type="submit" value="OK">

<input type="reset" value="Reset">

</form>

上記のHTMLの赤字部の意味.

<form>から</form>で受け付けた入力データを,

007.cgi に送信する.送信方法は"GET"である.

(送信方法には,GETとPOSTがある)

データ入力可能なHTML

<form action="007.cgi" method="GET">

A:

<input type="text" name="aa">

<br>

B:

<input type="text" name="bb">

<br>

<input type="submit" value="OK">

<input type="reset" value="Reset">

</form>

上記のHTMLの色文字の意味.

“text”形式の入力をユーザから受け付ける.

その入力データは”aa”と名がついてサーバに送られる.

“text”形式の入力をユーザから受け付ける.

その入力データは”bb”と名がついてサーバに送られる.

(8)

インターネット技術特論C-57

データ入力可能なHTML

<form action="007.cgi" method="GET">

A:<input type="text" name="aa"><br>

B:<input type="text" name="bb"><br>

<input type="submit" value="OK">

<input type="reset" value="Reset">

</form>

上記のHTMLの色文字の意味.

“OK”の文字が記された「送信ボタン」が表示される.

「送信ボタン」とは,そのボタンを押したら入力データが サーバに送られるボタンのこと.

“Reset”の文字が記された「Resetボタン」が表示される.

「Resetボタン」とは,そのボタンを押したら入力データが クリアさせるボタンのこと. インターネット技術特論C-58

データ送信手法 GET , POST

• 送信方法は GET と POST の2種類がある.

• どちらを用いても,実現できることはほぼ同一.

– サイズの大きなデータの送信にはPOSTの方が適し

ている.

– 表示したくないデータ(パスワードなど)の転送に

GETは不適切.(ただし,POSTが安全という訳では

ない)

– 詳細は後述.

インターネット技術特論C-59

Browserからの入力を

受け取るCGIプログラム

• 環境変数REQUEST_METHODに送信手法が

"GET"または"POST"として格納される.

• データ送信手法が“GET”の場合

– 環境変数”QUERY_STRING” に(すべての)情報

が格納されているので,それを読み込み解析する.

• データ送信手法が“POST”の場合

– 標準入力より転送データを読み込むことが可能.

– データ長

(バイト数)

は環境変数CONTENT_LENGTH

に格納されている.

インターネット技術特論C-60

余談

• バッファーオーバーフローに気をつけましょう.

• 例

– int x[100];

と確保した場合は,

x[0]~x[99]しか使用してはなりません.

当然なら x[-1]やx[100]やx[120]はNG.

– 特にStack上に確保した配列は危険.

• 配列のすぐ近くにreturn addressがあります.

• return addressを悪意あるユーザに操作されてしま

うと,PCを任意の場所にとばされてしまいます.

インターネット技術特論C-61 #define BUFSIZE 1024 #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) {

char *env, buf[BUFSIZE];

printf("Content-type: text/html¥n"); printf("¥n");

printf("<a href=¥"007.html¥">back</a><br>¥n"); env = getenv( "REQUEST_METHOD" );

if( env == NULL ){

printf("(?_?) %s:%d¥n", __FILE__, __LINE__); exit(1); }

Browserからの入力を

受け取るCGIプログラム

インターネット技術特論C-62 if( ! strcmp(env,"POST") ){ int len; printf("POST<br>¥n");

len = fread(buf, 1, BUFSIZE-1, stdin); buf[len] = '¥0';

printf("[%s]<br>¥n", buf); } else {

printf("GET<br>¥n");

env = getenv( "QUERY_STRING" ); if( env != NULL){

printf("[%s]<br>¥n", env); } else { printf("QUERY_STRING is NULL.<br>¥n"); } } }

Browserからの入力を

受け取るCGIプログラム

インターネット技術特論C-63

GET による送信例

http://www.ns.kogakuin.ac.jp/~ct13140/ cgi/C/007.cgi?aa=Hoge&bb=Fuga ユーザが左の様に入力し, OK(submit)を押すと,

A: Hoge

B: Fuga

GET

[aa=Hoge&bb=Fuga]

インターネット技術特論C-64

GET による送信例

http://www.ns.kogakuin.ac.jp/~ct13140/ cgi/C/007.cgi?aa=Hoge&bb=Piyo URL欄に上の様に入力し,接続すると、

GET

[aa=Hoge&bb=Piyo]

http://www.ns.kogakuin.ac.jp/ ~ct13140/cgi/C/ 007.cgi?aa=Bar&bb=Foo

GET

[aa=Bar&bb=Foo]

(9)

インターネット技術特論C-65

データ受信に関する仕様 (GET)

• GETの場合.

– 環境変数REQUEST_METHODに"GET"が格納され

ている.

– 環境変数QUERY_STRINGに

"nameA=valueA&nameB=valueB&nameC=val

ueC…"のフォーマットでデータ名とデータが格納さて

いる.

• ただし,"データ名"はHTMLのフォームのnameで指定し

たデータ名

インターネット技術特論C-66

データ受信の方法 (GET)

• GETの場合.

– 環境変数REQUEST_METHODを調査.

– もし,"GET"であったら,以下を行う.

• "POST"であった場合は後述.

– (1) 環境変数QUERY_STRINGに格納されている

文字列を読み込む.

– (2) 文字列を"&"で分割する.

– (3) それぞれを"="で分割して,入力されたデータ

を取得する.

インターネット技術特論C-67

データ受信の方法 (GET)

• (1) QUERY_STRINGを読み込む.

– "aa=Hoge&bb=Piyo"であった.

• (2) 文字列を"&"で分割.

– "aa=Hoge"と"bb=Piyo"

• (3) それぞれを"="で分割

– "aa"="Hoge"

– "bb"="Piyo"

インターネット技術特論C-68

POST による送信例

http://www.ns.kogakuin.ac.jp/~ct13140/cgi/C/007.cgi ユーザが左の様に入力し, OK(submit)を押すと,

A: Hoge

B: Fuga

POST

[aa=Hoge&bb=Fuga]

後ろに何 も付いて いない インターネット技術特論C-69

データ受信に関する仕様 (POST)

• POSTの場合.

– 環境変数REQUEST_METHODに"POST"が格納さ

れている.

– データは標準入力より読込可能.データのバイト数

は環境変数CONTENT_LENGTHに設定されている.

"nameA=valueA&nameB=valueB&nameC=val

ueC…"のフォーマットでデータ名とデータが格納さて

いる.

• これは"GET"と同様である.

インターネット技術特論C-70

データ受信の方法 (POST)

• POSTの場合.

– 環境変数REQUEST_METHODを調査.

– もし,"POST"であったら,以下を行う.

– (1) 標準入力よりCONTENT_LENGTHバイト読み

込む.

• ただし,サンプルは読込量はバッファサイズにしている.

– (2) 文字列を"&"で分割する.

– (3) それぞれを"="で分割して,入力されたデータ

を取得する.

特殊記号,日本語のデータの処理

http://www.ns.kogakuin.ac.jp/~ct13140/ cgi/C/007.cgi?aa=%82%B3%82%CB&bb=%82%E2%82%B7 ユーザが上の様に入力し, OK(submit)を押すと,

A: さね

B: やす

GET

[aa=%82%B3%82%CB&bb=%82%E2%82%B7]

• aa=%82%B3%82%CB&bb=%82%E2%82%B7

– 文字コード82 B3 → "さ"

– 文字コード82 CB → "ね"

– 文字コード82 E2 → "や"

– 文字コード82 B7 → "す"

• 2バイト文字は,そのまま転送されず"%文字

コード"の形式で転送される.

– ただし,文字コードは16進数表記

バイナリエディタ Bz http://www.zob.ne.jp/~c.mos/soft/bz.html

(10)

インターネット技術特論C-73

特殊記号,日本語のデータの処理

http://www.ns.kogakuin.ac.jp/~ct13140/ cgi/C/007.cgi?aa=abc%23d%3Fe+f<g%26h%3Di&bb= ユーザが上の様に入力し, OK(submit)を押すと,

A: abc#d?e f<g&h=i+j

B:

GET

[aa=abc%23d%3Fe+f%3Cg%26h%3Di%2Bj&bb=]

インターネット技術特論C-74

特殊記号,日本語のデータの処理

• "

半角スペース

"は"

+

"に変換される

• 特殊文字,文字コード31以下の文字,文字コー

ド128以上の文字は,"

%文字コード

"に変換され

る.

– 日本語文字の処理方法は,当面保留.

参照

関連したドキュメント

Der Kaiser - so heißt es - hat Dir, dem Einzelnen, dem jämmerlichen Untertanen, dem winzig vor der kaiserlichen Sonne in die fernste Ferne geflüchteten Schatten, gerade Dir hat

この 文書 はコンピューターによって 英語 から 自動的 に 翻訳 されているため、 言語 が 不明瞭 になる 可能性 があります。.. このドキュメントは、 元 のドキュメントに 比 べて

方法 理論的妥当性および先行研究の結果に基づいて,日常生活動作を構成する7動作領域より

  「教育とは,発達しつつある個人のなかに  主観的な文化を展開させようとする文化活動

[r]

 “ボランティア”と言えば、ラテン語を語源とし、自

関西学院大学には、スポーツ系、文化系のさまざまな課

自然言語というのは、生得 な文法 があるということです。 生まれつき に、人 に わっている 力を って乳幼児が獲得できる言語だという え です。 語の それ自 も、 から