Я подключен к серверу в кластере 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 here
fmt.Println(string(bodyBytes))
Я полагаю, что он пытался открыть веб-сокет, поэтому я попытался использовать библиотеку веб-сокета гориллы , например:
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: плохое рукопожатие
Что я делаю не так?
Как мне прочитать тело ответа из состояния "Протоколы переключения"