亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何從狀態為 101 切換協議的響應中讀取正文

如何從狀態為 101 切換協議的響應中讀取正文

Go
蠱毒傳說 2022-05-23 17:41:23
我連接到 Kubernetes 集群中的服務器,使用 POST 請求和標頭來升級請求。我正在使用以下功能:func PostRequest(client *http.Client, url string, bodyData []byte) (*http.Response, error){    req, _ := http.NewRequest("POST", url, bytes.NewBuffer(bodyData))    //req.Header.Set("Authorization", "Bearer " + BEARER_TOKEN)    req.Header.Set("X-Stream-Protocol-Version", "v2.channel.k8s.io")    req.Header.Set("X-Stream-Protocol-Version", "channel.k8s.io")    req.Header.Set("Upgrade", "SPDY/3.1")    req.Header.Set("Connection","upgrade")    req.Header.Set("Content-Type", "application/x-www-form-urlencoded")    resp, err := (*client).Do(req)    return resp, err}收到回復后,我試圖閱讀它,但當我閱讀正文時它卡住了:url2 := "https://<serveri_ip>:10250/exec/default/mypod/mycontainer?command=ls&command=/&input=1&output=1&tty=1"resp, err := PostRequest(api.GlobalClient, url2, []byte(""))fmt.Println(r.Status)fmt.Println(r.Header)bodyBytes, err := ioutil.ReadAll(r.Body) // -> it stuck herefmt.Println(string(bodyBytes))  我想它試圖打開 websocket,所以我嘗試像這樣使用gorilla websocket 庫:u := url.URL{Scheme: "ws", Host: "<node_ip>:10250", Path: "/exec/default/mypod/mycontainer?command=ls&command=/&input=1&output=1&tty=1"}interrupt := make(chan os.Signal, 1)signal.Notify(interrupt, os.Interrupt)c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)if err != nil {  log.Fatal("dial:", err)}defer c.Close()但是它打印了一個錯誤:2020/04/04 20:51:25 撥號:websocket:握手錯誤我做錯了什么?如何從狀態“切換協議”中讀取響應正文
查看完整描述

1 回答

?
慕虎7371278

TA貢獻1802條經驗 獲得超4個贊

我設法用 Kubernetes go-client庫做到了:


package main


import (

    "crypto/tls"

    "fmt"

    "net/http"

    "net/url"

    "os"

    "time"


    restclient "k8s.io/client-go/rest"

    "k8s.io/client-go/tools/remotecommand"

)



func main(){


    /*req.Header.Add("X-Stream-Protocol-Version", "v4.channel.k8s.io")

    req.Header.Add("X-Stream-Protocol-Version", "v3.channel.k8s.io")

    req.Header.Add("X-Stream-Protocol-Version", "v2.channel.k8s.io")

    req.Header.Add("X-Stream-Protocol-Version", "channel.k8s.io")

    req.Header.Add("Connection", "upgrade")

    req.Header.Add("Upgrade", "SPDY/3.1")*/

    //url2 := "https://123.123.123.123:10250/exec/default/my-pod/nginx?command=ls&command=/&input=1&output=1&tty=1"

    tr := &http.Transport{

        MaxIdleConns:       10,

        IdleConnTimeout:    30 * time.Second,

        DisableCompression: true,

        TLSClientConfig: &tls.Config{InsecureSkipVerify: true},

    }


    config := &restclient.Config{

        Host:                "https://123.123.123.123:10250",

        APIPath:             "/exec/default/my-pod/nginx",

        TLSClientConfig:     restclient.TLSClientConfig{

            Insecure: true,

        },

        Transport:           tr,

    }


    url3 := &url.URL{

        Scheme:     "https",

        Opaque:     "",

        User:       nil,

        Host:       "123.123.123.123:10250",

        Path:       "/exec/default/my-pod/nginx",

        RawPath:    "",

        RawQuery:   "command=ls&command=/&input=1&output=1&tty=1",

    }

    exec, err := remotecommand.NewSPDYExecutor(config, "POST", url3)

    if err != nil {

        fmt.Println(err)

    }


    // Thanks for this blog post https://www.henryxieblogs.com/2019/05/

    err = exec.Stream(remotecommand.StreamOptions{

        Stdin:  os.Stdin,

        Stdout: os.Stdout,

        Stderr: os.Stderr,

        Tty:true,

    })


    fmt.Println(err)

}


查看完整回答
反對 回復 2022-05-23
  • 1 回答
  • 0 關注
  • 142 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號