Bläddra i källkod

Performance improvement in renders

Manu Mtz-Almeida 10 år sedan
förälder
incheckning
a9dad532ae
6 ändrade filer med 17 tillägg och 40 borttagningar
  1. 3 3
      render/html.go
  2. 11 7
      render/json.go
  3. 1 22
      render/render.go
  4. 0 6
      render/render_test.go
  5. 1 1
      render/text.go
  6. 1 1
      render/xml.go

+ 3 - 3
render/html.go

@@ -21,14 +21,14 @@ type (
 )
 )
 
 
 func (html HTMLRender) Render(w http.ResponseWriter, code int, data ...interface{}) error {
 func (html HTMLRender) Render(w http.ResponseWriter, code int, data ...interface{}) error {
-	WriteHeader(w, code, "text/html")
+	writeHeader(w, code, "text/html; charset=utf-8")
 	file := data[0].(string)
 	file := data[0].(string)
 	args := data[1]
 	args := data[1]
 	return html.Template.ExecuteTemplate(w, file, args)
 	return html.Template.ExecuteTemplate(w, file, args)
 }
 }
 
 
 func (r *HTMLDebugRender) Render(w http.ResponseWriter, code int, data ...interface{}) error {
 func (r *HTMLDebugRender) Render(w http.ResponseWriter, code int, data ...interface{}) error {
-	WriteHeader(w, code, "text/html")
+	writeHeader(w, code, "text/html; charset=utf-8")
 	file := data[0].(string)
 	file := data[0].(string)
 	obj := data[1]
 	obj := data[1]
 
 
@@ -57,7 +57,7 @@ func (_ htmlPlainRender) Render(w http.ResponseWriter, code int, data ...interfa
 }
 }
 
 
 func WriteHTMLString(w http.ResponseWriter, code int, format string, values []interface{}) {
 func WriteHTMLString(w http.ResponseWriter, code int, format string, values []interface{}) {
-	WriteHeader(w, code, "text/html")
+	writeHeader(w, code, "text/html; charset=utf-8")
 	if len(values) > 0 {
 	if len(values) > 0 {
 		fmt.Fprintf(w, format, values...)
 		fmt.Fprintf(w, format, values...)
 	} else {
 	} else {

+ 11 - 7
render/json.go

@@ -16,16 +16,20 @@ func (_ jsonRender) Render(w http.ResponseWriter, code int, data ...interface{})
 }
 }
 
 
 func (_ indentedJSON) Render(w http.ResponseWriter, code int, data ...interface{}) error {
 func (_ indentedJSON) Render(w http.ResponseWriter, code int, data ...interface{}) error {
-	WriteHeader(w, code, "application/json")
-	jsonData, err := json.MarshalIndent(data[0], "", "    ")
+	return WriteIndentedJSON(w, code, data[0])
+}
+
+func WriteJSON(w http.ResponseWriter, code int, data interface{}) error {
+	writeHeader(w, code, "application/json; charset=utf-8")
+	return json.NewEncoder(w).Encode(data)
+}
+
+func WriteIndentedJSON(w http.ResponseWriter, code int, data interface{}) error {
+	writeHeader(w, code, "application/json; charset=utf-8")
+	jsonData, err := json.MarshalIndent(data, "", "    ")
 	if err != nil {
 	if err != nil {
 		return err
 		return err
 	}
 	}
 	_, err = w.Write(jsonData)
 	_, err = w.Write(jsonData)
 	return err
 	return err
 }
 }
-
-func WriteJSON(w http.ResponseWriter, code int, data interface{}) error {
-	WriteHeader(w, code, "application/json")
-	return json.NewEncoder(w).Encode(data)
-}

+ 1 - 22
render/render.go

@@ -22,28 +22,7 @@ var (
 	_            Render = &HTMLDebugRender{}
 	_            Render = &HTMLDebugRender{}
 )
 )
 
 
-func WriteHeader(w http.ResponseWriter, code int, contentType string) {
-	contentType = joinStrings(contentType, "; charset=utf-8")
+func writeHeader(w http.ResponseWriter, code int, contentType string) {
 	w.Header().Set("Content-Type", contentType)
 	w.Header().Set("Content-Type", contentType)
 	w.WriteHeader(code)
 	w.WriteHeader(code)
 }
 }
-
-func joinStrings(a ...string) string {
-	if len(a) == 0 {
-		return ""
-	}
-	if len(a) == 1 {
-		return a[0]
-	}
-	n := 0
-	for i := 0; i < len(a); i++ {
-		n += len(a[i])
-	}
-
-	b := make([]byte, n)
-	n = 0
-	for _, s := range a {
-		n += copy(b[n:], s)
-	}
-	return string(b)
-}

+ 0 - 6
render/render_test.go

@@ -145,9 +145,3 @@ func TestRenderHTMLTemplate(t *testing.T) {
 	assert.Equal(t, w.Body.String(), "Hello alexandernyquist")
 	assert.Equal(t, w.Body.String(), "Hello alexandernyquist")
 	assert.Equal(t, w.Header().Get("Content-Type"), "text/html; charset=utf-8")
 	assert.Equal(t, w.Header().Get("Content-Type"), "text/html; charset=utf-8")
 }
 }
-
-func TestRenderJoinStrings(t *testing.T) {
-	assert.Equal(t, joinStrings("a", "BB", "c"), "aBBc")
-	assert.Equal(t, joinStrings("a", "", "c"), "ac")
-	assert.Equal(t, joinStrings("text/html", "; charset=utf-8"), "text/html; charset=utf-8")
-}

+ 1 - 1
render/text.go

@@ -15,7 +15,7 @@ func (_ plainTextRender) Render(w http.ResponseWriter, code int, data ...interfa
 }
 }
 
 
 func WritePlainText(w http.ResponseWriter, code int, format string, values []interface{}) {
 func WritePlainText(w http.ResponseWriter, code int, format string, values []interface{}) {
-	WriteHeader(w, code, "text/plain")
+	writeHeader(w, code, "text/plain; charset=utf-8")
 	// we assume w.Write can not fail, is that right?
 	// we assume w.Write can not fail, is that right?
 	if len(values) > 0 {
 	if len(values) > 0 {
 		fmt.Fprintf(w, format, values...)
 		fmt.Fprintf(w, format, values...)

+ 1 - 1
render/xml.go

@@ -12,6 +12,6 @@ func (_ xmlRender) Render(w http.ResponseWriter, code int, data ...interface{})
 }
 }
 
 
 func WriteXML(w http.ResponseWriter, code int, data interface{}) error {
 func WriteXML(w http.ResponseWriter, code int, data interface{}) error {
-	WriteHeader(w, code, "application/xml")
+	writeHeader(w, code, "application/xml; charset=utf-8")
 	return xml.NewEncoder(w).Encode(data)
 	return xml.NewEncoder(w).Encode(data)
 }
 }