Pull to refresh
14
-2
Send message

Согласно спецификации сервер должен закрыть соединение с ошибкой если получил незамаскированный фрейм. Например, gorilla/websocket строго этому следует, даже если соединение зашифровано (wss://, WebSocket over SSL/TLS).

В нашем случае мы довольно вольно с этим обращаемся.

Нам не нужно проверять наличие маски, если маска отсутствует, то размер данных не будет соответствовать заявленному или следующий фрейм будет "кривым" и тогда сервер закроет соединение.

func sseHandler(w http.ResponseWriter, r *http.Request) {
	f, ok := w.(http.Flusher)
	if !ok {
		return
	}
	w.Header().Set("Content-Type", "text/event-stream")
	w.Header().Set("Cache-Control", "no-cache")
	w.Header().Set("Connection", "keep-alive")
	f.Flush()
	for {
		_, err := fmt.Fprintf(w, "data: Hello, World!\n\n")
		if err != nil {
			return
		}
		f.Flush()
		time.Sleep(time.Second * 2)
	}
}

Все эти сложности связаны с безопасностью. Чтобы злоумышленники не подделывали запросы, не атаковали прокси-сервера ("cross-protocol attacks", "cache poisoning").

Sec-WebSocket-Accept также позволяет убедиться в том, что сервер действительно поддерживает WebSocket протокол (What is Sec-WebSocket-Key for?).

Information

Rating
Does not participate
Registered
Activity