Goのアウトプロセスプログラムにリクエストを配信するウェブサーバーを書いています。gobを使用してパイプを介してResponseWriterとRequestのデータ型を送信しています。
問題は、ゴブを受け取ったときに外部プロセスがハングしていることです。
UPDATEゴブは外部プロセスに正常に送信されていますが、外部プロセスはでブロックされfmt.Fprintf(request.Resp, "Hello")
、そこでフリーズしています。
dispreq.go
package dispreq
import (
"net/http"
)
type DispReq struct {
Resp http.ResponseWriter
Req *http.Request
}
dispatcher.go
package main
import (
"encoding/gob"
"fmt"
"net/http"
"os"
"os/exec"
"dispreq"
)
func dispatch(w http.ResponseWriter, r *http.Request) {
process := exec.Command("./hello")
pipe, piperr := process.StdinPipe()
if piperr != nil {
fmt.Fprintf(os.Stderr, piperr.Error())
return
}
encoder := gob.NewEncoder(pipe)
process.Stdout = os.Stdout
//UPDATE: encoder.Encode(&dispreq.DispReq{w, r})
//UPDATE: process.Start()
process.Start()
encoder.Encode(&dispreq.DispReq{w, r})
pipe.Close()
process.Wait()
}
func main() {
http.HandleFunc("/", dispatch)
http.ListenAndServe(":8080", nil)
}
hello.go
package main
import (
"dispreq"
"encoding/gob"
"os"
"fmt"
)
func main() {
gobDecoder := gob.NewDecoder(os.Stdin)
var request dispreq.DispReq
gobDecoder.Decode(&request)
fmt.Fprintf(request.Resp, "Hello")
}