|
1 | 1 | package common |
2 | 2 |
|
3 | 3 | import ( |
4 | | - "bytes" |
5 | 4 | "context" |
6 | 5 | "fmt" |
7 | 6 | "io" |
8 | 7 | "net/http" |
9 | 8 | "net/url" |
10 | 9 | "os" |
11 | | - "strconv" |
12 | 10 | "strings" |
13 | 11 |
|
14 | | - "github.com/alist-org/alist/v3/internal/conf" |
| 12 | + "maps" |
| 13 | + |
15 | 14 | "github.com/alist-org/alist/v3/internal/model" |
16 | 15 | "github.com/alist-org/alist/v3/internal/net" |
17 | | - "github.com/alist-org/alist/v3/internal/setting" |
18 | 16 | "github.com/alist-org/alist/v3/internal/stream" |
19 | 17 | "github.com/alist-org/alist/v3/pkg/http_range" |
20 | 18 | "github.com/alist-org/alist/v3/pkg/utils" |
21 | | - "github.com/microcosm-cc/bluemonday" |
22 | 19 | log "github.com/sirupsen/logrus" |
23 | | - "github.com/yuin/goldmark" |
24 | 20 | ) |
25 | 21 |
|
26 | | -func processMarkdown(content []byte) ([]byte, error) { |
27 | | - var buf bytes.Buffer |
28 | | - if err := goldmark.New().Convert(content, &buf); err != nil { |
29 | | - return nil, fmt.Errorf("markdown conversion failed: %w", err) |
30 | | - } |
31 | | - return bluemonday.UGCPolicy().SanitizeBytes(buf.Bytes()), nil |
32 | | -} |
33 | | - |
34 | 22 | func Proxy(w http.ResponseWriter, r *http.Request, link *model.Link, file model.Obj) error { |
35 | | - |
36 | | - //优先处理md文件 |
37 | | - if utils.Ext(file.GetName()) == "md" && setting.GetBool(conf.FilterReadMeScripts) { |
38 | | - var markdownContent []byte |
39 | | - var err error |
40 | | - |
41 | | - if link.MFile != nil { |
42 | | - defer link.MFile.Close() |
43 | | - attachHeader(w, file) |
44 | | - markdownContent, err = io.ReadAll(link.MFile) |
45 | | - if err != nil { |
46 | | - return fmt.Errorf("failed to read markdown content: %w", err) |
47 | | - } |
48 | | - } else if link.RangeReadCloser != nil { |
49 | | - attachHeader(w, file) |
50 | | - rrc, err := link.RangeReadCloser.RangeRead(r.Context(), http_range.Range{Start: 0, Length: -1}) |
51 | | - if err != nil { |
52 | | - return err |
53 | | - } |
54 | | - defer rrc.Close() |
55 | | - markdownContent, err = io.ReadAll(rrc) |
56 | | - if err != nil { |
57 | | - return fmt.Errorf("failed to read markdown content: %w", err) |
58 | | - } |
59 | | - } else { |
60 | | - header := net.ProcessHeader(r.Header, link.Header) |
61 | | - res, err := net.RequestHttp(r.Context(), r.Method, header, link.URL) |
62 | | - if err != nil { |
63 | | - return err |
64 | | - } |
65 | | - defer res.Body.Close() |
66 | | - for h, v := range res.Header { |
67 | | - w.Header()[h] = v |
68 | | - } |
69 | | - w.WriteHeader(res.StatusCode) |
70 | | - if r.Method == http.MethodHead { |
71 | | - return nil |
72 | | - } |
73 | | - markdownContent, err = io.ReadAll(res.Body) |
74 | | - if err != nil { |
75 | | - return fmt.Errorf("failed to read markdown content: %w", err) |
76 | | - } |
77 | | - |
78 | | - } |
79 | | - |
80 | | - safeHTML, err := processMarkdown(markdownContent) |
81 | | - if err != nil { |
82 | | - return err |
83 | | - } |
84 | | - |
85 | | - safeHTMLReader := bytes.NewReader(safeHTML) |
86 | | - w.Header().Set("Content-Length", strconv.FormatInt(int64(len(safeHTML)), 10)) |
87 | | - w.Header().Set("Content-Type", "text/html; charset=utf-8") |
88 | | - _, err = utils.CopyWithBuffer(w, safeHTMLReader) |
89 | | - if err != nil { |
90 | | - return err |
91 | | - } |
92 | | - return nil |
93 | | - } |
94 | | - |
95 | 23 | if link.MFile != nil { |
96 | 24 | defer link.MFile.Close() |
97 | 25 | attachHeader(w, file) |
@@ -152,9 +80,7 @@ func Proxy(w http.ResponseWriter, r *http.Request, link *model.Link, file model. |
152 | 80 | } |
153 | 81 | defer res.Body.Close() |
154 | 82 |
|
155 | | - for h, v := range res.Header { |
156 | | - w.Header()[h] = v |
157 | | - } |
| 83 | + maps.Copy(w.Header(), res.Header) |
158 | 84 | w.WriteHeader(res.StatusCode) |
159 | 85 | if r.Method == http.MethodHead { |
160 | 86 | return nil |
|
0 commit comments