问题一:
如果您的脚本返回有效的 HTTP 返回代码(如200
),则 G-WAN 会构建相应的 HTTP 标头,除非它们已经存在(从"HTTP/1.x 200 OK"
此处开始)。
因此,要强制content-type
使用脚本语言(除了那些支持 G-WAN API 的语言,如 C、C++、D 和 Objective-C),您必须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()
和(强制)的要求是什么return code
。
当没有使用返回码时(如在您的代码中),G-WAN 将注入默认 HTTP 标头(HTTP/0.9 200 OK
在您的情况下),这将绕过您的 HTTP 标头(如果有),因此 Internet 浏览器将等待超时因为它不知道你回复的长度。
如示例和手册中所述,要告诉 G-WAN 不要创建 HTTP 标头,您必须返回1-99
范围内的值(0 means close connection
并200-600 is reserved for HTTP return codes
告诉 G-WAN 生成对应的 HTTP 标头)。