11package CADDY_FILE_SERVER
22
33import (
4+ "bytes"
45 "github.com/caddyserver/caddy/v2"
6+ "github.com/caddyserver/caddy/v2/caddyconfig/caddyfile"
7+ "github.com/caddyserver/caddy/v2/caddyconfig/httpcaddyfile"
58 "github.com/caddyserver/caddy/v2/modules/caddyhttp"
69 "github.com/h2non/bimg"
710 "net/http"
811 "strconv"
912)
1013
1114func init () {
12- caddy .RegisterModule (ProxyMiddleware {})
15+ caddy .RegisterModule (Middleware {})
16+ httpcaddyfile .RegisterHandlerDirective ("image_processor" , parseCaddyfile )
1317}
1418
15- type ProxyMiddleware struct {}
19+ type Middleware struct {}
1620
17- func (ProxyMiddleware ) CaddyModule () caddy.ModuleInfo {
21+ func (Middleware ) CaddyModule () caddy.ModuleInfo {
1822 return caddy.ModuleInfo {
1923 ID : "http.handlers.image_processor" ,
20- New : func () caddy.Module { return new (ProxyMiddleware ) },
24+ New : func () caddy.Module { return new (Middleware ) },
2125 }
2226}
2327
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 {
2529
2630 //Automatic return if not options set
2731 if r .URL .RawQuery == "" {
2832 return next .ServeHTTP (w , r )
2933 }
3034
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 {
3440 return err
3541 }
3642
@@ -39,20 +45,32 @@ func (m ProxyMiddleware) ServeHTTP(w http.ResponseWriter, r *http.Request, next
3945 return err
4046 }
4147
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 )
4354 if err != nil {
55+ // @TODO return base response on error if parameter set in caddy file
4456 return err
4557 }
4658
4759 w .Header ().Set ("Content-Length" , strconv .Itoa (len (newImage )))
4860 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 {
5163 return err
5264 }
65+
5366 return nil
5467}
5568
69+ func (m * Middleware ) UnmarshalCaddyfile (d * caddyfile.Dispenser ) error {
70+ return nil
71+
72+ }
73+
5674func getOptions (r * http.Request ) (bimg.Options , error ) {
5775 options := bimg.Options {
5876 Enlarge : true ,
@@ -128,7 +146,14 @@ func getOptions(r *http.Request) (bimg.Options, error) {
128146 return options , nil
129147}
130148
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+
131155// Interface guards
132156var (
133- _ caddyhttp.MiddlewareHandler = (* ProxyMiddleware )(nil )
157+ _ caddyhttp.MiddlewareHandler = (* Middleware )(nil )
158+ _ caddyfile.Unmarshaler = (* Middleware )(nil )
134159)
0 commit comments