1
1
package CADDY_FILE_SERVER
2
2
3
3
import (
4
+ "bytes"
4
5
"github.com/caddyserver/caddy/v2"
6
+ "github.com/caddyserver/caddy/v2/caddyconfig/caddyfile"
7
+ "github.com/caddyserver/caddy/v2/caddyconfig/httpcaddyfile"
5
8
"github.com/caddyserver/caddy/v2/modules/caddyhttp"
6
9
"github.com/h2non/bimg"
7
10
"net/http"
8
11
"strconv"
9
12
)
10
13
11
14
func init () {
12
- caddy .RegisterModule (ProxyMiddleware {})
15
+ caddy .RegisterModule (Middleware {})
16
+ httpcaddyfile .RegisterHandlerDirective ("image_processor" , parseCaddyfile )
13
17
}
14
18
15
- type ProxyMiddleware struct {}
19
+ type Middleware struct {}
16
20
17
- func (ProxyMiddleware ) CaddyModule () caddy.ModuleInfo {
21
+ func (Middleware ) CaddyModule () caddy.ModuleInfo {
18
22
return caddy.ModuleInfo {
19
23
ID : "http.handlers.image_processor" ,
20
- New : func () caddy.Module { return new (ProxyMiddleware ) },
24
+ New : func () caddy.Module { return new (Middleware ) },
21
25
}
22
26
}
23
27
24
- func (m ProxyMiddleware ) ServeHTTP (w http.ResponseWriter , r * http.Request , next caddyhttp.Handler ) error {
28
+ func (m Middleware ) ServeHTTP (w http.ResponseWriter , r * http.Request , next caddyhttp.Handler ) error {
25
29
26
30
//Automatic return if not options set
27
31
if r .URL .RawQuery == "" {
28
32
return next .ServeHTTP (w , r )
29
33
}
30
34
31
- rw := & ResponseWrapper {w : w }
32
- err := next .ServeHTTP (rw , r )
33
- if err != nil {
35
+ responseRecorder := caddyhttp .NewResponseRecorder (w , & bytes.Buffer {}, func (status int , header http.Header ) bool {
36
+ return true
37
+ })
38
+
39
+ if err := next .ServeHTTP (responseRecorder , r ); err != nil {
34
40
return err
35
41
}
36
42
@@ -39,20 +45,32 @@ func (m ProxyMiddleware) ServeHTTP(w http.ResponseWriter, r *http.Request, next
39
45
return err
40
46
}
41
47
42
- newImage , err := bimg .NewImage (rw .buf .Bytes ()).Process (options )
48
+ recordedResponse := responseRecorder .Buffer ()
49
+ if recordedResponse .Len () == 0 {
50
+ return next .ServeHTTP (w , r )
51
+ }
52
+
53
+ newImage , err := bimg .NewImage (recordedResponse .Bytes ()).Process (options )
43
54
if err != nil {
55
+ // @TODO return base response on error if parameter set in caddy file
44
56
return err
45
57
}
46
58
47
59
w .Header ().Set ("Content-Length" , strconv .Itoa (len (newImage )))
48
60
w .Header ().Set ("Content-Type" , "image/" + bimg .NewImage (newImage ).Type ())
49
- _ , err = w . Write ( newImage )
50
- if err != nil {
61
+
62
+ if _ , err = w . Write ( newImage ); err != nil {
51
63
return err
52
64
}
65
+
53
66
return nil
54
67
}
55
68
69
+ func (m * Middleware ) UnmarshalCaddyfile (d * caddyfile.Dispenser ) error {
70
+ return nil
71
+
72
+ }
73
+
56
74
func getOptions (r * http.Request ) (bimg.Options , error ) {
57
75
options := bimg.Options {
58
76
Enlarge : true ,
@@ -128,7 +146,14 @@ func getOptions(r *http.Request) (bimg.Options, error) {
128
146
return options , nil
129
147
}
130
148
149
+ func parseCaddyfile (h httpcaddyfile.Helper ) (caddyhttp.MiddlewareHandler , error ) {
150
+ var m Middleware
151
+ err := m .UnmarshalCaddyfile (h .Dispenser )
152
+ return m , err
153
+ }
154
+
131
155
// Interface guards
132
156
var (
133
- _ caddyhttp.MiddlewareHandler = (* ProxyMiddleware )(nil )
157
+ _ caddyhttp.MiddlewareHandler = (* Middleware )(nil )
158
+ _ caddyfile.Unmarshaler = (* Middleware )(nil )
134
159
)
0 commit comments