Я делаю sse, важный код:
var clientes=new(sync.Map)
type canalesStruct struct{
sender chan []byte
close chan bool
}
func (broker *brokerStruct) ServeHTTP(w http.ResponseWriter, r *http.Request) {
flusher, ok := w.(http.Flusher)
if !ok {
http.Error(w, "Streaming unsupported!", http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "text/event-stream")
w.Header().Set("Cache-Control", "no-cache")
w.Header().Set("Connection", "keep-alive")
var ID string
//Get the ID somehow
canales:=new(canalesStruct)
canales.sender=make(chan []byte)
canales.close=make(chan bool)
clientes.store(ID,canales)
notify := w.(http.CloseNotifier).CloseNotify()
defer func() {
clientes.Delete(ID)
}()
for {
select {
case <-notify:
return
case <-canales.close:
return
case data:= <-canales.sender:
fmt.Fprintf(w, "data: %s\n\n",data)
flusher.Flush()
}
}
}
func sendDataToChanelID(ID string,data []byte){
canalesRaw,_:=clientes.Load(ID)
canales,_:=canalRaw(*canalesStruct)
canales.sender <-data
}
Итак, у меня есть два вопроса:
- Если соединение обрывается ВО ВРЕМЯ получения данных, будет ли fmt.Fprintf продолжать ждать бесконечно или оно вернется немедленно?
- Если он возвращается немедленно, проблем нет, но если он продолжает ждать, как я могу обернуть «fmt.Fprintf», чтобы вернуться, если превышено время ожидания?
r.Context()
отменяется, вам необходимо прервать обработку вашего запроса. - person Flimzy   schedule 12.07.2018