27828


以下のようなGolangのリバースプロキシのプログラムを書きました。

[code]

    package main
    
    import (
        "fmt"
        "io/ioutil"
        "log"
        "net/http"
        "net/http/cgi"
        "net/http/httputil"
        "net/url"
        "os"
        "path/filepath"
        "strings"
    )
    
    func main() {
        f, err := os.OpenFile(LogFile, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
        if err != nil {
            fmt.Println(err)
        }
    
        defer f.Close()
        log.SetOutput(f)
        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")
    
            address, err := loadAddress(r.URL.Path)
            if err != nil {
                log.Fatalln(err)
            }
    
            target, err := url.Parse(address)
            if err != nil {
                log.Fatalln(err)
            }
            r.URL, err = url.Parse(address + proxyPath + "?" + formValue.Encode())
            if err != nil {
                log.Fatalln(err)
            }
            proxy := httputil.NewSingleHostReverseProxy(target)
            proxy.ServeHTTP(w, r)
        })); err != nil {
            log.Fatalln(err)
        }
    }
    
[/code]

このプログラムでJSONデータは正しくプロキシされますが、ファイルをアップロードした時に下記のエラーが出ました。

`2016/07/23 21:05:48 http: proxy error: http: ContentLength=91525 with Body
length 0`

なぜ、Bodyの長さが0になってしまっているのでしょうか。

ちなみにアップロード用htmlは下記のものです。

[code]

    <!DOCTYPE html>
    <html>
      <head>
        <title>画像アップロードテスト</title>
        <meta charset="utf-8">
      </head>
      <body>
        <form method="post" action="/rev-proxy/?proxyPath=/upload" enctype="multipart/form-data">
          <input type="file" name="file">
          <input type="submit" value="送信">
        </form>
      </body>
    </html>
    
[/code]

**追記**  
エラーは <https://golang.org/src/net/http/httputil/reverseproxy.go#L212>
で出ている模様です。

<https://golang.org/src/net/http/transfer.go#L242> でContentLength=91525 with
Body length 0が出ていました。


CC BY-SA 3.0
2016-07-23T12:17:56.273
27824
2016-07-24T05:31:26.907
2016-07-24T01:26:19.587
7232
7232
question
html go
golangのリバースプロキシでmultipart/form-dataをアップロードするとbodyが0になる


自己解決しました。`FormValue`が内部でmultipartを読みだしていたので`Reader`が空になっていました。FormValueを使わず、代わりに`r.URL.Query()`を使うことで解決できました。


CC BY-SA 3.0
2016-07-24T02:22:11.313
27828
2016-07-24T05:31:26.907
2016-07-24T05:31:26.907
8000
7232
27824
answer