Windows 2003 Serverで動くCGIアプリをDelphi6で作るには?


boze  2005-03-09 01:29:50  No: 13662

はじめまして。
Windows 2000 Pro SP4 + Delphi 6 Enterpriseという環境で、
TWebModuleを用いてCGIアプリを作っています。

WebサーバーがWindows 2000であれば、IIS5でもApacheでも
正常に動作するのですが、WebサーバーをWindows 2003 Serverにすると、
CGI Error
The specified CGI application misbehaved by not 
returning a complete set of HTTP headers.
になってしまいます。(IIS6、502エラー。)

Response.ContentとWritelnのどちらで出力してもエラーになります。
また、TWebModuleを使わずに単純なコンソールアプリだとエラーになりません。
更に、Delphi 2005体験版でコンパイルするとエラーにはならないことも判りました。
つまり、Delphi 6のTWebModuleがWindows 2003 Serverではエラーになるようです。

Formから送られてきたname=valueを自前でデコードするということや、
予算の都合上Delphi 2005を購入するということは避けたいので、
Delphi 6のTWebModuleを使ってもCGIエラーを回避できる手段や、
TWebModuleの代替になるものをご存知の方がいましたら、教えて頂きたいです。
よろしくお願いします。


にしの  2005-03-09 05:42:24  No: 13663

Delphi6も、Windows2003Serverもないので未確認ですが。
正しくヘッダが設定されていないのかもしれませんね。

横取り丸
http://hide.maruo.co.jp/software/ydm.html
InetSpy
http://hide.maruo.co.jp/software/inetspy.html

こういったツールを使って、どのようなリクエストが発生しているか確認してみてください。


boze  2005-03-09 18:57:49  No: 13664

にしのさん、返事ありがとうございます。
HttpObserverというソフトを使っているので、
それで取得したリクエストとレスポンスが以下です。
使っているCGIアプリはDelphi6のデモをコンパイルしたものです。

Windows Server 2003
***************************************************************
----------クライアントからのリクエスト内容----------
GET http://svr2003/cgi-bin/WebRequestCGI.exe HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, 
application/x-shockwave-flash, application/vnd.ms-powerpoint, 
application/vnd.ms-excel, application/msword, */*
Referer: http://svr2003/cgi-bin/
Accept-Language: ja
Proxy-Connection: Keep-Alive
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Host: svr2003

----------サーバへ送信したリクエスト内容----------
GET http://svr2003/cgi-bin/WebRequestCGI.exe HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, 
application/x-shockwave-flash, application/vnd.ms-powerpoint, 
application/vnd.ms-excel, application/msword, */*
Referer: http://svr2003/cgi-bin/
Accept-Language: ja
Host: svr2003
Connection: none

----------サーバからのレスポンス内容----------
HTTP/1.1 502 Bad Gateway
Content-Length: 232
Content-Type: text/html
Server: Microsoft-IIS/6.0
Date: Wed, 09 Mar 2005 00:24:11 GMT
Connection: close

<html><head><title>Error</title></head>
<body><head><title>Error in CGI Application</title></head>
<body><h1>CGI Error</h1>
The specified CGI application misbehaved by not returning 
a complete set of HTTP headers.</body></body></html>
***************************************************************

Windows 2000 Sever
***************************************************************
----------クライアントからのリクエスト内容----------
GET http://svr2000/cgi-bin/WebRequestCGI.exe HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, 
application/x-shockwave-flash, application/vnd.ms-powerpoint, 
application/vnd.ms-excel, application/msword, */*
Referer: http://svr2000/cgi-bin/
Accept-Language: ja
Proxy-Connection: Keep-Alive
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Host: svr2000

----------サーバへ送信したリクエスト内容----------
GET http://svr2000/cgi-bin/WebRequestCGI.exe HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, 
application/x-shockwave-flash, application/vnd.ms-powerpoint, 
application/vnd.ms-excel, application/msword, */*
Referer: http://svr2000/cgi-bin/
Accept-Language: ja
Host: svr2000
Connection: none

----------サーバからのレスポンス内容----------
HTTP/1.1 200 OK
Server: Microsoft-IIS/5.0
Date: Wed, 09 Mar 2005 00:27:56 GMT
Content-Type: text/html
Content-Length: 146
Content:

Method = GET<BR>
URL = <BR>
User Agent = <BR>
Cookie = <BR>
From = <BR>
Remote Address = 192.168.0.2<BR>
Remote Host = 192.168.0.2<BR>
***************************************************************


boze  2005-03-09 20:09:32  No: 13665

Delphi6のUpdatePack2とRTLのアップデート3を当てて、
再び同じ物をコンパイルして試したところ、
Internal Server Error 500になりました・・・。

----------サーバからのレスポンス内容----------
HTTP/1.1 500 モジュール 'ntdll.dll' のアドレス 77F2831D で
アドレス 004047C5 に対する書き込み違反がおきました。
Content-Length: 240
Content-Type: text/html
Server: Microsoft-IIS/6.0
Content: 
Date: Wed, 09 Mar 2005 01:49:47 GMT
Connection: close

<html><title>Internal Server Error 500</title>
<h1>Internal Server Error 500</h1><hr>
Exception: EAccessViolation<br>
Message: モジュール 'ntdll.dll' のアドレス 77F2831D で
アドレス 004047C5 に対する書き込み違反がおきました。<br></html>


にしの  2005-03-10 00:03:55  No: 13666

ソースがシンプルで、TWebModuleのソースがプロジェクトに含まれていないのであれば、Delphiのバグですかね。
こちらには環境がないので試せません。
CGI実行形式でなく、NSAPIやISAPIのDLL形式にしてみるとか。
他に対処法が思いつきません。


pppi  2005-03-10 03:32:33  No: 13667

http://onigiri.s3.xrea.com:8080/delphi/index.php?%5B%5BApache2.0.40%B0%CA%B9%DF%A4%D8%A4%CE%C2%D0%B1%FE%CA%FD%CB%A1%5D%5D
Web系  よく知らないんですけど  みかけたのでお知らせします
Ver7でしたら  Apacheが  どうのこうのってかいてありますよ
Ver6では  どうかは  わかりません


にしの  2005-03-10 03:43:57  No: 13668

CGI実行形式は、あくまでも実行ファイルですので、今回の件とは別のようです。

余談となりますが、CGI実行形式の動作は、EXEの動作と同じです。
実行時に、環境変数QUERY_STRINGに、GETで渡されたパラメータが格納されます。
POSTの場合は、環境変数CONTENT_LENGTHに格納された長さのパラメータが、標準コンソールを通して渡されます。
これらを処理すれば、TWebModuleを使わずともCGI実行形式のファイルは作ることができるのですが、

> Formから送られてきたname=valueを自前でデコードするということや、
> 予算の都合上Delphi 2005を購入するということは避けたいので、

ということでしたので。
簡単なフィールドの抽出だけでしたら、渡されたパラメータを&で区切り、さらに=で区切って名前と値に分け、名前と値のURLエンコードを戻すだけです。
ファイルの送信などの場合は、もうちょっと面倒です。


boze  2005-03-10 05:13:39  No: 13669

pppiさん、にしのさん、ありがとうございます。

2003上にDelphi6インストールしてコンパイルしてみたりも
してみたのですがやはり中々上手くいきません。。。
自前でデコード処理書く方が早い気もしてきたので
その方向でいこうと思います。


マッコ  2005-03-10 05:59:25  No: 13670

この問題に関係ないか知れませんがD6のソースが不足しているところがあり
unit CGIApp;の
procedure DoneApplication;
begin
  try
    Application.Free;
    Application := nil;
  except
    on E:Exception do
      if Assigned(HandleShutdownException) then
      {HandleShutdownExceptionこれが不足本当はunit WebBrokerに
      インプリメントされているはずが去れていない;

      begin
        Application := nil;  // Application of no use at this point so clear it
        Classes.ApplicationHandleException := nil;
        HandleShutdownException(E);
      end;
  end;
end;

D7のunit WebBrokerにはインプリメントされています。ボーランドはどのように
コンパイルしたか不思議です、このような不足はD6では多々あります、
D7、2005のソースがあればそちらのソースを見ると不足のソースが見つかる場合があります、
ちなみにCorbaはD7、2005を見ないとソースは解読できません。


boze  2005-03-10 18:40:39  No: 13671

マッコさん、ありがとうございます。
D6ってちょっとダメなんですね。。。
上記参考にさせて頂いて試してみます。

D7もD2005も体験版しかないですが、
ソースが見れそうなら覗いてみます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加