Skip to content

Commit

Permalink
refactor invoke before render, add HTML
Browse files Browse the repository at this point in the history
  • Loading branch information
acoshift committed Aug 4, 2018
1 parent 3594bce commit 6147c88
Showing 1 changed file with 28 additions and 20 deletions.
48 changes: 28 additions & 20 deletions result.go
Original file line number Diff line number Diff line change
Expand Up @@ -125,22 +125,21 @@ func (ctx *Context) View(name string, data interface{}) error {
panic(newErrTemplateNotFound(name))
}

ctx.invokeBeforeRender(func() {
return ctx.invokeBeforeRender(func() error {
ctx.setContentType("text/html; charset=utf-8")
ctx.w.WriteHeader(ctx.statusCode())
panicRenderError(t.Execute(ctx.w, data))
return filterRenderError(t.Execute(ctx.w, data))
})
return nil
}

func (ctx *Context) invokeBeforeRender(after func()) {
func (ctx *Context) invokeBeforeRender(after func() error) (err error) {
if ctx.app.beforeRender != nil {
ctx.app.beforeRender(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
after()
err = after()
})).ServeHTTP(ctx.w, ctx.r)
return
}
after()
return after()
}

func (ctx *Context) setContentType(value string) {
Expand All @@ -149,37 +148,46 @@ func (ctx *Context) setContentType(value string) {
}
}

func panicRenderError(err error) {
func filterRenderError(err error) error {
if err == nil {
return
return nil
}
if _, ok := err.(*net.OpError); ok {
return
return nil
}
if err == syscall.EPIPE {
return
return nil
}
panic(err)
return err
}

// JSON encodes given data into json then writes to response writer
func (ctx *Context) JSON(data interface{}) error {
ctx.invokeBeforeRender(func() {
return ctx.invokeBeforeRender(func() error {
ctx.setContentType("application/json; charset=utf-8")
ctx.writeHeader()
json.NewEncoder(ctx.w).Encode(data)
return json.NewEncoder(ctx.w).Encode(data)
})
}

// HTML writes html to response writer
func (ctx *Context) HTML(data []byte) error {
return ctx.invokeBeforeRender(func() error {
ctx.setContentType("text/html; charset=utf-8")
ctx.writeHeader()
_, err := io.Copy(ctx.w, bytes.NewReader(data))
return filterRenderError(err)
})
return nil
}

// String writes string into response writer
func (ctx *Context) String(format string, a ...interface{}) error {
ctx.invokeBeforeRender(func() {
return ctx.invokeBeforeRender(func() error {
ctx.setContentType("text/plain; charset=utf-8")
ctx.writeHeader()
fmt.Fprintf(ctx.w, format, a...)
_, err := fmt.Fprintf(ctx.w, format, a...)
return filterRenderError(err)
})
return nil
}

// StatusText writes status text from seted status code tnto response writer
Expand All @@ -189,12 +197,12 @@ func (ctx *Context) StatusText() error {

// CopyFrom copies src reader into response writer
func (ctx *Context) CopyFrom(src io.Reader) error {
ctx.invokeBeforeRender(func() {
return ctx.invokeBeforeRender(func() error {
ctx.setContentType("application/octet-stream")
ctx.writeHeader()
io.Copy(ctx.w, src)
_, err := io.Copy(ctx.w, src)
return filterRenderError(err)
})
return nil
}

// Bytes writes bytes into response writer
Expand Down

0 comments on commit 6147c88

Please sign in to comment.