TCP客户端无法正常运行golang

时间:2017-04-26 05:27:08

标签: go tcp

我有用golang编写的rest-ful接口。我需要在每个端点上进行身份验证。一旦身份验证完成,我必须将其转发回tcp服务器。 我创建了一个tcp客户端,来自该通道的任何值都将发送到tcp服务器。通道从http请求正文填充。 问题是,一旦我发出curl命令,客户端就会没有响应;显然我做错了什么不确定是什么问题。有没有人对我的问题有什么见解?

 package main

            import (
                "bufio"
                "encoding/json"
                "flag"
                "fmt"
                "io/ioutil"
                "log"
                "net"
                "net/http"
                "net/http/httputil"
                "net/url"
                "os"
                "strconv"

                auth "github.com/abbot/go-http-auth"
            )

            type Configuration struct {
                Server        string
                Port          int64
                UserName      string
                Pwd           string
                Realm         string
                ProxyPort     int64
                Edeserver     string

            }

            var (
                Config *Configuration
                logp   = flag.Bool("log", false, "enable logging")
            )

            func ReadConfiguration() {
                file, _ := os.Open("Config.json")
                decoder := json.NewDecoder(file)
                Config = &Configuration{}
                err := decoder.Decode(&Config)
                if err != nil {
                    fmt.Println("error:", err)
                }

            }

            func Secret(user, realm string) string {
                if user == Config.UserName {
                    // password is "hello"
                    return Config.Pwd
                }
                return ""
            }

            func reverseProxyTows(w http.ResponseWriter, authenticatedRequest *auth.AuthenticatedRequest) {
                req := &authenticatedRequest.Request

                if *logp {
                    log.Println(" Authenticated Username ", authenticatedRequest.Username)
                    log.Println(" Authenticated URL ", req.URL.RequestURI())
                }

                destinationURL := fmt.Sprintf("http://%s:%d", Config.Server, Config.Port)
                u, err := url.Parse(destinationURL)
                if err != nil {
                    log.Fatal(err)
                }

                if *logp {
                    log.Println("reverse_proxy", u)
                }

                reverseProxy := httputil.NewSingleHostReverseProxy(u)

                reverseProxy.ServeHTTP(w, req)
            }

            func openConnectionTotcp(edechannel chan string) {
                conn, _ := net.Dial("tcp", Config.Edeserver)
                text := <-edechannel
                fmt.Fprintf(conn, text+"\n")
                message, _ := bufio.NewReader(conn).ReadString('\n')
                fmt.Print("Message from server: " + message)
            }


            func main() {
                ReadConfiguration()
                flag.Parse()
                c := make(chan string)
                go openConnectionTotcp(c)

                fmt.Printf("Started proxy to destination server %v:%d and is listening on %d ", Config.Server, Config.Port, Config.ProxyPort)

                authenticator := auth.NewBasicAuthenticator(Config.Realm, Secret)
                http.HandleFunc("/", authenticator.Wrap(reverseProxyTows))
                http.HandleFunc("/tyrion/1", authenticator.Wrap(func(w http.ResponseWriter, authenticatedRequest *auth.AuthenticatedRequest) {
                    req := &authenticatedRequest.Request
                    bodyBytes, err2 := ioutil.ReadAll(req.Body)
                    if err2 != nil {
                        log.Fatal(err2)
                    }
                    bodyString := string(bodyBytes)
                    c <- bodyString
                    fmt.Fprintf(w, "success")
                }))
                http.ListenAndServe(":"+strconv.FormatInt(Config.ProxyPort, 10), nil)
            }

1 个答案:

答案 0 :(得分:0)

您的代码执行会阻止c <- bodyString,因为似乎没有任何内容正在从该无缓冲通道读取。该行将暂停执行,直到另一个例程从通道读取。