(pages []*serverconfigs.HTTPPageConfig, status int)
| 45 | } |
| 46 | |
| 47 | func (this *HTTPRequest) doPageLookup(pages []*serverconfigs.HTTPPageConfig, status int) (shouldStop bool) { |
| 48 | var url = this.URL() |
| 49 | for _, page := range pages { |
| 50 | if !page.MatchURL(url) { |
| 51 | continue |
| 52 | } |
| 53 | if page.Match(status) { |
| 54 | if len(page.BodyType) == 0 || page.BodyType == serverconfigs.HTTPPageBodyTypeURL { |
| 55 | if urlSchemeRegexp.MatchString(page.URL) { |
| 56 | var newStatus = page.NewStatus |
| 57 | if newStatus <= 0 { |
| 58 | newStatus = status |
| 59 | } |
| 60 | this.doURL(http.MethodGet, page.URL, "", newStatus, true) |
| 61 | return true |
| 62 | } else { |
| 63 | var realpath = path.Clean(page.URL) |
| 64 | if !strings.HasPrefix(realpath, "/pages/") && !strings.HasPrefix(realpath, "pages/") { // only files under "/pages/" can be used |
| 65 | var msg = "404 page not found: '" + page.URL + "'" |
| 66 | this.writer.Header().Set("Content-Type", defaultPageContentType) |
| 67 | this.writer.WriteHeader(http.StatusNotFound) |
| 68 | _, _ = this.writer.Write([]byte(msg)) |
| 69 | return true |
| 70 | } |
| 71 | var file = Tea.Root + Tea.DS + realpath |
| 72 | fp, err := os.Open(file) |
| 73 | if err != nil { |
| 74 | var msg = "404 page not found: '" + page.URL + "'" |
| 75 | this.writer.Header().Set("Content-Type", defaultPageContentType) |
| 76 | this.writer.WriteHeader(http.StatusNotFound) |
| 77 | _, _ = this.writer.Write([]byte(msg)) |
| 78 | return true |
| 79 | } |
| 80 | defer func() { |
| 81 | _ = fp.Close() |
| 82 | }() |
| 83 | |
| 84 | stat, err := fp.Stat() |
| 85 | if err != nil { |
| 86 | var msg = "404 could not read page content: '" + page.URL + "'" |
| 87 | this.writer.Header().Set("Content-Type", defaultPageContentType) |
| 88 | this.writer.WriteHeader(http.StatusNotFound) |
| 89 | _, _ = this.writer.Write([]byte(msg)) |
| 90 | return true |
| 91 | } |
| 92 | |
| 93 | // 修改状态码 |
| 94 | if page.NewStatus > 0 { |
| 95 | // 自定义响应Headers |
| 96 | this.writer.Header().Set("Content-Type", defaultPageContentType) |
| 97 | this.ProcessResponseHeaders(this.writer.Header(), page.NewStatus) |
| 98 | this.writer.Prepare(nil, stat.Size(), page.NewStatus, true) |
| 99 | this.writer.WriteHeader(page.NewStatus) |
| 100 | } else { |
| 101 | this.writer.Header().Set("Content-Type", defaultPageContentType) |
| 102 | this.ProcessResponseHeaders(this.writer.Header(), status) |
| 103 | this.writer.Prepare(nil, stat.Size(), status, true) |
| 104 | this.writer.WriteHeader(status) |
no test coverage detected