forked from naoina/kocha
-
Notifications
You must be signed in to change notification settings - Fork 0
/
result.go
49 lines (41 loc) · 1007 Bytes
/
result.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package kocha
import (
"io"
"net/http"
)
// Result is the interface that result.
type Result interface {
Proc(*Response)
}
// resultContent represents a result of any content.
type resultContent struct {
// The content body.
Body io.Reader
}
// Proc writes content to response.
//
// If Body implements io.Closer interface, call Body.Close() in end of Proc.
func (r *resultContent) Proc(res *Response) {
if closer, ok := r.Body.(io.Closer); ok {
defer closer.Close()
}
if _, err := io.Copy(res, r.Body); err != nil {
panic(err)
}
}
// resultRedirect represents a result of redirect.
type resultRedirect struct {
Request *Request
// URL for redirect.
URL string
// Whether the redirect with 301 Moved Permanently.
Permanently bool
}
// Proc writes redirect header to response.
func (r *resultRedirect) Proc(res *Response) {
statusCode := http.StatusFound
if r.Permanently {
statusCode = http.StatusMovedPermanently
}
http.Redirect(res, r.Request.Request, r.URL, statusCode)
}