-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathhttp.go
105 lines (89 loc) · 2.09 KB
/
http.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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package main
import (
"io"
"log"
"net/http"
"net/url"
)
type Server struct {
storage *Storage
renderer *Renderer
name, addr string
}
func NewServer(storage *Storage, renderer *Renderer, name, addr string) *Server {
return &Server{storage, renderer, name, addr}
}
// Root handler of bin. Validates and routes requests
func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
log.Println("http:", r.RemoteAddr, r.Method, r.URL.RequestURI())
switch r.Method {
case "GET":
if r.URL.Path == "/" {
// "main" page
s.HandleMainPage(w, r)
} else {
// paste page
s.HandleGetPaste(w, r)
}
case "POST":
// handle upload
s.HandleUpload(w, r)
default:
http.Error(w, "", 405)
}
}
func (s *Server) HandleMainPage(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("hello\n"))
}
func (s *Server) HandleGetPaste(w http.ResponseWriter, r *http.Request) {
id := r.URL.Path[1:]
if len(id) != ID_LENGTH {
http.NotFound(w, r)
}
file, err := s.storage.Open(id)
if err != nil {
log.Print("http: failed to open paste: ", err)
http.Error(w, "internal error\n", 500)
return
}
defer file.Close()
err = s.renderer.RenderTo(w, file)
//_, err = io.Copy(w, file)
if err != nil {
log.Print("http: failed to deliver paste: ", err)
}
}
func (s *Server) HandleUpload(w http.ResponseWriter, r *http.Request) {
defer r.Body.Close()
id, file, err := s.storage.Create()
if err != nil {
log.Print("upload: Failed to create paste: ", err)
http.Error(w, "internal error", 500)
return
}
defer file.Close()
_, err = io.Copy(file, r.Body)
if err != nil {
log.Print("upload: Failed to fill paste: ", err)
http.Error(w, "internal error", 500)
return
}
var host string
if s.name == "" {
host = r.Header.Get("Host")
if host == "" {
if s.addr[0] == ':' {
host = "localhost" + s.addr
} else {
host = s.addr
}
}
} else {
host = s.name
}
pasteURL := &url.URL{Scheme: "http", Host: host, Path: "/" + id}
_, err = w.Write([]byte(pasteURL.String() + "\n"))
if err != nil {
log.Print("upload: client does not received paste url: ", err)
}
}