質問1:
スクリプトが有効なHTTPリターンコード(のような200
)を返す場合、G-WANは、対応するHTTPヘッダーがすでに存在しない限り("HTTP/1.x 200 OK"
ここから開始)、対応するHTTPヘッダーを構築します。
content-type
したがって、スクリプト言語(C、C ++、D、Objective-CなどのG-WAN APIをサポートする言語を除く)で特定の言語を強制するreturn 1
には、応答のすべてのHTTPヘッダーを定義する必要があります。
G-WAN APIをサポートするプログラミング言語はget_env(argv, REPLY_MIME_TYPE);
(およびその他に示されているようにfractal.c
)使用でき、G-WANに残りのヘッダーを構築させることができます。
質問2:
環境変数REQUEST_URI
(有用ですが)は、サポートされているCGI v1仕様(RFC-3875)の一部ではありません。REQUEST_URI
将来のリリースで追加されるようにリクエストしました。
G-WANで提供されるスクリプト例には、v3.12でサポートされている変数がリストされています。
// ----------------------------------------------------------------------------
// CGI/1.1 environment variables:
// ----------------------------------------------------------------------------
// "AUTH_TYPE", // "" | "Basic" | "Digest" | etc.
// "CONTENT_LENGTH", // "" | entity_length
// "CONTENT_TYPE", // "" | content_type
// "GATEWAY_INTERFACE", // "CGI/1.1"
// "PATH_INFO", // "" | ( "/" path )
// "PATH_TRANSLATED", // disk filename for PATH_INFO
// "QUERY_STRING", // "" | ?"hellox.c&name=toto"
// "REMOTE_ADDR", // client IP address
// "REMOTE_HOST", // client DNS name (or IP addr)
// "REMOTE_IDENT", // client identity (RFC 1413), opt
// "REMOTE_USER", // client identity (if auth)
// "REQUEST_METHOD", // "GET" | "HEAD" | "PUT", etc.
// "SCRIPT_NAME", // "" | ("/" path "hello.c")
// "SERVER_NAME", // "gwan.com" | IP address
// "SERVER_PORT", // "80"
// "SERVER_PROTOCOL", // "HTTP/1.1" | "HTTP/1.0" | "HTTP/0.9"
// "SERVER_SOFTWARE", // "G-WAN"
// ----------------------------------------------------------------------------
ただし、次の(より高速な)Goコードを使用して、リクエストとパラメータ(存在する場合)の両方にアクセスできることに注意してください。
// args[1] /opt/gwan/10.10.20.80_80/#192.168.200.80/csp/hello.go
// args[2] arg1=123
// args[3] arg2=456
for i := 1; i < len(os.Args); i++ {
fmt.Printf("args[%d] %s<br>", i, os.Args[i])
}
アップデート
このソースコードをメールで受け取りました:
package main
import "fmt"
import "os"
func main()
{
p := "<h1>Hello world!</h1><p>This is dog bla</p>"
fmt.Printf("%s 200 OK\r\n", os.Getenv("SERVER_PROTOCOL"))
fmt.Print("Content-Type: text/html; charset=UTF-8\r\n")
fmt.Print("Connection: Keep-Alive\r\n")
fmt.Printf("Content-Length: %d\r\n",len(p))
fmt.Print("\r\n")
fmt.Print(p)
}
このコードは正しくないことに注意してください。コンパイルすらできません。G-WANは次のエラーを報告します。
loading.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Error: hell.go
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# command-line-arguments
0.0.0.0_8080/#0.0.0.0/csp/hell.go:7: syntax error: unexpected semicolon or newline before {
0.0.0.0_8080/#0.0.0.0/csp/hell.go:9: non-declaration statement outside function body
0.0.0.0_8080/#0.0.0.0/csp/hell.go:10: non-declaration statement outside function body
0.0.0.0_8080/#0.0.0.0/csp/hell.go:11: non-declaration statement outside function body
0.0.0.0_8080/#0.0.0.0/csp/hell.go:12: non-declaration statement outside function body
0.0.0.0_8080/#0.0.0.0/csp/hell.go:13: non-declaration statement outside function body
0.0.0.0_8080/#0.0.0.0/csp/hell.go:14: non-declaration statement outside function body
0.0.0.0_8080/#0.0.0.0/csp/hell.go:16: syntax error: unexpected }
4|import "os"
5|
6|func main()
7!{
8| p := "<h1>Hello world!</h1><p>This is dog bla</p>"
9| fmt.Printf("%s 200 OK\r\n", os.Getenv("SERVER_PROTOCOL"))
10| fmt.Print("Content-Type: text/html; charset=UTF-8\r\n")
11| fmt.Print("Connection: Keep-Alive\r\n")
To run G-WAN, you must fix the error(s) or remove this Servlet.
これがおそらく、プログラムが「更新」されているのを見たことがない理由です。古いバージョンは、G-WANの実行中に更新された障害のあるバージョンに置き換えられていません。
開発(スクリプトの編集)を行うときは、常にターミナルを調べて、新しく編集したコードがコンパイルされるかどうかを確認する必要があります。
hello.go
(動作中の)例を見てmain()
、(madatory)の予想される定義の要件を確認することをお勧めしますreturn code
。
リターンコードが使用されていない場合(コードのように)、G-WANはデフォルトのHTTPヘッダー(この場合)を挿入し、HTTPヘッダー(HTTP/0.9 200 OK
存在する場合)をバイパスします。その結果、インターネットブラウザーはタイムアウトになるまで待機します。返信の長さがわからないためです。
1-99
例とマニュアルに記載されているように、HTTPヘッダーを作成しないようにG-WANに指示するには、範囲内の値を返す必要があり0 means close connection
ます( 200-600 is reserved for HTTP return codes
G-WANに対応するHTTPヘッダーを生成するように指示します)。