source: code/trunk/partage.go@ 2

Last change on this file since 2 was 2, checked in by dev, 4 years ago

Remove useless if imbrication

File size: 2.5 KB
Line 
1package main
2
3import (
4 "fmt"
5 "io"
6 "io/ioutil"
7 "net/http"
8 "os"
9 "path"
10 "path/filepath"
11)
12
13var conf struct {
14 bind string
15 filepath string
16 rootdir string
17 baseuri string
18 maxsize int64
19}
20
21func contenttype(f *os.File) string {
22 buffer := make([]byte, 512)
23
24 _, err := f.Read(buffer)
25 if err != nil {
26 return ""
27 }
28
29 mime := http.DetectContentType(buffer)
30
31 return mime
32}
33
34func writefile(f *os.File, s io.ReadCloser) int {
35 buffer := make([]byte, 4096)
36
37 var sz int
38
39 for {
40 n, err := s.Read(buffer)
41
42 if err == io.EOF {
43 n, err := f.Write(buffer[:n])
44 if err != nil {
45 fmt.Println(err)
46 }
47 sz += n
48 break
49 }
50 if err != nil {
51 fmt.Println(err)
52 return -1
53 }
54
55 n, err = f.Write(buffer[:n])
56 if err != nil {
57 fmt.Println(err)
58 }
59 sz += n
60 }
61
62 f.Sync()
63 return sz
64}
65
66func servefile(f *os.File, w http.ResponseWriter) {
67 buffer := make([]byte, 4096)
68
69 mime := contenttype(f)
70 w.Header().Set("Content-Type", mime)
71
72 f.Seek(0, 0)
73 for {
74 n, err := f.Read(buffer)
75
76 if err != nil {
77 if err == io.EOF {
78 _, err := w.Write(buffer[:n])
79 if err != nil {
80 fmt.Println(err)
81 }
82 break
83 }
84 fmt.Println(err)
85 return
86 }
87
88 _, err = w.Write(buffer[:n])
89 if err != nil {
90 fmt.Println(err)
91 }
92 }
93}
94
95func parse(w http.ResponseWriter, r *http.Request) {
96
97 fmt.Printf("%s %s\n", r.Method, r.URL.Path)
98
99 // Max 15 Gb uploads
100 if r.ContentLength > conf.maxsize {
101 w.WriteHeader(http.StatusRequestEntityTooLarge)
102 w.Write([]byte("File is too big"))
103 }
104
105 err := r.ParseForm()
106 if err != nil {
107 fmt.Printf("%s %s: %s", r.Method, r.URL.Path, err)
108 }
109
110 switch r.Method {
111 case "PUT":
112 tmp, _ := ioutil.TempFile(conf.filepath, "*"+path.Ext(r.URL.Path))
113 f, err := os.Create(tmp.Name())
114 if err != nil {
115 fmt.Println(err)
116 return
117 }
118 defer f.Close()
119
120 if writefile(f, r.Body) < 0 {
121 w.WriteHeader(http.StatusInternalServerError)
122 return
123 }
124
125 resp := conf.baseuri + "/" + filepath.Base(tmp.Name())
126 w.Write([]byte(resp))
127
128 case "GET":
129 // r.URL.Path is sanitized regarding "." and ".."
130 filename := r.URL.Path
131 if r.URL.Path == "/" {
132 filename = "/index.html"
133 }
134
135 f, err := os.Open(conf.rootdir + filename)
136 if err != nil {
137 w.WriteHeader(http.StatusNotFound)
138 fmt.Println(err)
139 return
140 }
141 defer f.Close()
142
143 servefile(f, w)
144 }
145}
146
147func main() {
148 conf.bind = "0.0.0.0:8080"
149 conf.maxsize = 28 * 1024 * 1024
150 conf.filepath = "/tmp"
151 conf.rootdir = "./static"
152 conf.baseuri = "http://192.168.0.3:8080"
153
154 http.HandleFunc("/", parse)
155 http.ListenAndServe("0.0.0.0:8080", nil)
156}
Note: See TracBrowser for help on using the repository browser.