@@ -14,59 +14,61 @@ import (
1414 "gopkg.d7z.net/gitea-pages/pkg/core"
1515)
1616
17- var FilterInstDirect core.FilterInstance = func (config core.FilterParams ) (core.FilterCall , error ) {
18- var param struct {
19- Prefix string `json:"prefix"`
20- }
21- if err := config .Unmarshal (& param ); err != nil {
22- return nil , err
23- }
24- param .Prefix = strings .Trim (param .Prefix , "/" ) + "/"
25- return func (ctx core.FilterContext , writer http.ResponseWriter , request * http.Request , next core.NextCall ) error {
26- err := next (ctx , writer , request )
27- if (err != nil && ! errors .Is (err , os .ErrNotExist )) || err == nil {
28- return err
17+ func FilterInstDirect (_ core.Params ) (core.FilterInstance , error ) {
18+ return func (config core.Params ) (core.FilterCall , error ) {
19+ var param struct {
20+ Prefix string `json:"prefix"`
2921 }
30- if request .Method != http .MethodHead && request .Method != http .MethodGet {
31- http .Error (writer , "Method not allowed" , http .StatusMethodNotAllowed )
32- return nil
22+ if err := config .Unmarshal (& param ); err != nil {
23+ return nil , err
3324 }
34- var resp * http.Response
35- var path string
36- defaultPath := param .Prefix + strings .TrimSuffix (ctx .Path , "/" )
37- for _ , p := range []string {defaultPath , defaultPath + "/index.html" } {
38- zap .L ().Debug ("direct fetch" , zap .String ("path" , p ))
39- resp , err = ctx .NativeOpen (request .Context (), p , nil )
40- if err != nil {
41- if resp != nil {
42- resp .Body .Close ()
43- }
44- if ! errors .Is (err , os .ErrNotExist ) {
45- zap .L ().Debug ("error" , zap .Any ("error" , err ))
46- return err
25+ param .Prefix = strings .Trim (param .Prefix , "/" ) + "/"
26+ return func (ctx core.FilterContext , writer http.ResponseWriter , request * http.Request , next core.NextCall ) error {
27+ err := next (ctx , writer , request )
28+ if (err != nil && ! errors .Is (err , os .ErrNotExist )) || err == nil {
29+ return err
30+ }
31+ if request .Method != http .MethodHead && request .Method != http .MethodGet {
32+ http .Error (writer , "Method not allowed" , http .StatusMethodNotAllowed )
33+ return nil
34+ }
35+ var resp * http.Response
36+ var path string
37+ defaultPath := param .Prefix + strings .TrimSuffix (ctx .Path , "/" )
38+ for _ , p := range []string {defaultPath , defaultPath + "/index.html" } {
39+ zap .L ().Debug ("direct fetch" , zap .String ("path" , p ))
40+ resp , err = ctx .NativeOpen (request .Context (), p , nil )
41+ if err != nil {
42+ if resp != nil {
43+ resp .Body .Close ()
44+ }
45+ if ! errors .Is (err , os .ErrNotExist ) {
46+ zap .L ().Debug ("error" , zap .Any ("error" , err ))
47+ return err
48+ }
49+ continue
4750 }
48- continue
51+ path = p
52+ break
53+ }
54+ if resp == nil {
55+ return os .ErrNotExist
56+ }
57+ defer resp .Body .Close ()
58+ if err != nil {
59+ return err
4960 }
50- path = p
51- break
52- }
53- if resp == nil {
54- return os .ErrNotExist
55- }
56- defer resp .Body .Close ()
57- if err != nil {
58- return err
59- }
6061
61- writer .Header ().Set ("Content-Type" , mime .TypeByExtension (filepath .Ext (path )))
62- lastMod , err := time .Parse (http .TimeFormat , resp .Header .Get ("Last-Modified" ))
63- if err == nil {
64- if seeker , ok := resp .Body .(io.ReadSeeker ); ok {
65- http .ServeContent (writer , request , filepath .Base (path ), lastMod , seeker )
66- return nil
62+ writer .Header ().Set ("Content-Type" , mime .TypeByExtension (filepath .Ext (path )))
63+ lastMod , err := time .Parse (http .TimeFormat , resp .Header .Get ("Last-Modified" ))
64+ if err == nil {
65+ if seeker , ok := resp .Body .(io.ReadSeeker ); ok {
66+ http .ServeContent (writer , request , filepath .Base (path ), lastMod , seeker )
67+ return nil
68+ }
6769 }
68- }
69- _ , err = io . Copy ( writer , resp . Body )
70- return err
70+ _ , err = io . Copy ( writer , resp . Body )
71+ return err
72+ }, nil
7173 }, nil
7274}
0 commit comments