diff --git a/sse-encoder.go b/sse-encoder.go index 7afacd4..49234b3 100644 --- a/sse-encoder.go +++ b/sse-encoder.go @@ -22,6 +22,7 @@ const ContentType = "text/event-stream" var contentType = []string{ContentType} var noCache = []string{"no-cache"} +var replacer = strings.NewReplacer("\n", "\\n", "\r", "\\r") type Event struct { Event string @@ -41,7 +42,7 @@ func Encode(writer io.Writer, event Event) error { func writeId(w stringWriter, id string) { if len(id) > 0 { w.WriteString("id: ") - w.WriteString(escape(id)) + writeEscape(w, id) w.WriteString("\n") } } @@ -49,7 +50,7 @@ func writeId(w stringWriter, id string) { func writeEvent(w stringWriter, event string) { if len(event) > 0 { w.WriteString("event: ") - w.WriteString(escape(event)) + writeEscape(w, event) w.WriteString("\n") } } @@ -73,7 +74,7 @@ func writeData(w stringWriter, data interface{}) error { w.WriteString("\n") default: text := fmt.Sprint(data) - w.WriteString(escape(text)) + writeEscape(w, text) w.WriteString("\n\n") } return nil @@ -98,10 +99,8 @@ func kindOfData(data interface{}) reflect.Kind { return valueType } -func escape(str string) string { +func writeEscape(w stringWriter, str string) { // any-char = %x0000-0009 / %x000B-000C / %x000E-10FFFF // ; a Unicode character other than U+000A LINE FEED (LF) or U+000D CARRIAGE RETURN (CR) - str = strings.Replace(str, "\n", "\\n", -1) - str = strings.Replace(str, "\r", "\\r", -1) - return str + replacer.WriteString(w, str) }