我试图像Content-Type
通过CGI脚本一样设置HTTP标头。
在PHP
:
header('Content-Type: text/plain');
// or
echo 'Content-Type: text/plain', "\r\n\r\n"; // as first line
或在Go
:
fmt.Print("Content-Type: text/plain\r\n\r\n") // as first line
两者都对输出没有影响。
如何才能做到这一点?
编辑
我还Go
使用CGI
包在中尝试了以下方法:
package main
import "fmt"
import "os"
import "net/http/cgi"
func main() {
r,e := cgi.Request()
if e != nil {
fmt.Println(e)
os.Exit(200)
}
fmt.Printf("%#v", r)
os.Exit(200)
}
但是我得到了错误:
cgi: failed to parse REQUEST_URI into a URL:
问题1:
如果您的脚本返回有效的HTTP返回码(如200
),则G-WAN会构建相应的HTTP标头,除非它们已经存在(从"HTTP/1.x 200 OK"
此处开始)。
因此,要强制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()
和的预期定义(强制性)有什么要求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标头)。
在Apache、Nginx、LightTPD、IIS/ASP之外,还有很多免费Web Server可作为替代。G-WAN便是其中之一,它的大小只有100KB,使用C脚本实时执行,脚本速度与静态网页一样快。作者声称多数程序员是用C编程:在18万个开源项目中,有47%是用C,28%用Java,11%用PHP。目前开发者只释出了Windows版,但认为G-WAN在Linux和Solaris上的运行速度将
问题内容: 我是Python和MySQL的新手,这是我的第一个Stack问题。因此,如果我遗漏了一些明显的内容,请提前道歉。但是,在问之前,我确实确实尝试过对此进行研究。 我正在尝试学习Python,MySQL和CGI脚本的基础知识。为此,我一直在阅读http://www.tutorialspoint.com/python/python_cgi_programming.htm和http://www
主要内容:示例,执行测试标签呈现类型为“”的“”类型的HTML元素。此标签将外部JavaScript文件添加到JSF页面。 以下JSF标签 - 被渲染成以下HTML代码 - 示例 以下是文件: 中的代码 - 以下是文件: 中的代码 - 以下是文件: 中的代码 - 执行测试 使用 NetBeans 创建一个Web工程,名称为:Outputscript,并使用以上代码。运行项目,Tomcat启动完成后,在浏览器地址栏中输入以
(警告:缺乏适当安全防护措施的CGI脚本可能会让您的网站陷入危险状态。本文中的脚本只是简单的样例,不保证在真实网站上使用的安全性。) CGI脚本是驻留在Web服务器上的脚本,而且可以被客户端(浏览器)运行。客户端通过脚本的URL来访问脚本,就像访问普通页面一样。服务器识别出请求的URL是一个脚本,于是就运行该脚本。服务器如何识别特定的URL为脚本取决于服务器的管理员。在本文中我们假设脚本都存放在一
问题内容: 所以我有一个脚本,可以在服务器上输出详细信息。问题是我需要输出是。最好的方法是什么?这是bash脚本: 所以我想要的输出是这样的: 谢谢。 问题答案: 如果只需要输出小的JSON,请使用: 或者,如果您需要产生更大的JSON,请使用[leandro-mora]解释的heredoc。如果您使用here- doc解决方案,请确保对他的回答进行投票: 一些较新的发行版具有一个名为:或类似名称
问题内容: 我有一个bash脚本,在其中我需要遍历find命令的输出的每一行,但是看来我正在遍历find命令中的每个Word(以空格分隔)。到目前为止,我的脚本如下所示: 我希望这会产生如下输出: 但是我很想得到这样的输出: 我在这里做错了什么? 问题答案: 由于您没有使用的任何更高级的功能,因此可以使用简单的模式来遍历子目录: