Я использую канал для передачи сообщений от обработчика HTTP:
package server
import (
"bytes"
"errors"
"io/ioutil"
"log"
"net/http"
)
type Server struct {}
func (s Server) Listen() chan interface{} {
ch := make(chan interface{})
http.HandleFunc("/", handle(ch))
go http.ListenAndServe(":8080", nil)
return ch
}
func handle(ch chan interface{}) func(http.ResponseWriter, *http.Request) {
return func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
b, err := ioutil.ReadAll(r.Body)
defer r.Body.Close()
if err != nil {
ch <- errors.New(string(500))
return
}
w.Write([]byte("Hello World"))
log.Print("about to pass to handler channel")
ch <- bytes.NewBuffer(b)
log.Print("passed to handler channel")
}
}
Когда я делаю запрос к серверу, работающему на порту 8080, поток блокируется в этой строке:
ch <- bytes.NewBuffer(b)
Почему это происходит?Если вы заметили, я запускаю слушателя в рутине.Я также понял, что HTTP-дескрипторы происходят в отдельном потоке.Если я удаляю вышеуказанную строку, поток становится разблокированным, и программа работает, как ожидалось.Что я делаю не так?
Чтобы уточнить, я хочу иметь возможность передавать тело запроса POST на канал.Справка.
ОБНОВЛЕНИЕ: Я читаю из канала в главном потоке:
listenerChan := n.Listen()
go SendRequest("POST", "http://localhost:8080", []byte("hello"))
for listenedMsg := range listenerChan {
log.Print("listened message>>>> ", listenedMsg)
}
Но поток все еще блокируется на той же строке.Для пояснения, нет ничего плохого в том, как я отправляю запрос.Если я удалю строку отправки канала выше, поток не блокируется.