26831


GolangのCGIできたリクエストをそのまま別のサーバに送信したいのですが、下記の方法だとBody部分が削除されてしまいます。

どのように修正すればBodyも送信できますでしょうか。

[code]

    package main
    
    import (
        "fmt"
        "io/ioutil"
        "net/http"
        "net/http/cgi"
        "path/filepath"
        "strings"
    )
    
    func main() {
        if err := cgi.Serve(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    
            // ヘッダをセット
            header := w.Header()
            header.Set("Content-Type", "text/html; charset=utf-8")
    
            // Requestを生成
            newRequest, err := http.NewRequest(r.Method, "[address]"+proxyPath+"?"+formValue.Encode(), r.Body)
            if err != nil {
                //fmt.Fprintln(w, err)
                fmt.Println(err)
            }
            client := &http.Client{}
    
            // Request
            resp, err := client.Do(newRequest)
            if err != nil {
                //fmt.Fprintln(w, err)
                fmt.Println(err)
            }
            defer resp.Body.Close()
            b, err := ioutil.ReadAll(resp.Body)
            if err != nil {
                //fmt.Fprintln(w, err)
                fmt.Println(err)
            }
    
            // 結果を出力
            fmt.Fprintf(w, string(b))
        })); err != nil {
            fmt.Println(err)
        }
    }
    
[/code]


CC BY-SA 3.0
2016-06-14T04:49:11.737
26731
2016-06-18T11:21:03.693
2016-06-14T05:01:45.230
7232
question
go
GolangのCGIでリクエストをそのまま別のサーバに送りたい。


解決

[code]

    func main() {
        if err := cgi.Serve(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    
            // ヘッダをセット
            header := w.Header()
            header.Set("Content-Type", "text/html; charset=utf-8")
    
            // パスを取得
            proxyPath := r.FormValue("proxyPath")
            if !filepath.IsAbs(proxyPath) {
                fmt.Fprintf(w, "Invalid request")
                return
            }
            formValue := r.Form
    
            // パスをQueryStringから消去
            formValue.Del("proxyPath")
    
            target, err := url.Parse([address])
            if err != nil {
                fmt.Println(err)
            }
            r.URL, err = url.Parse(address + proxyPath + "?" + formValue.Encode())
            if err != nil {
                fmt.Println(err)
            }
            proxy := httputil.NewSingleHostReverseProxy(target)
            proxy.ServeHTTP(w, r)
        })); err != nil {
            fmt.Println(err)
        }
    }
    
[/code]


CC BY-SA 3.0
2016-06-18T11:21:03.693
26831
2016-06-18T11:21:03.693
7232
26731
answer