4

Content-TypeCGIスクリプトのように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:
4

1 に答える 1

3

質問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 codesG-WANに対応するHTTPヘッダーを生成するように指示します)。

于 2013-01-16T16:11:20.577 に答える