mirror of
https://gitcode.com/gitea/gitea.git
synced 2025-06-22 12:51:10 +08:00
Move macaron to chi (#14293)
Use [chi](https://github.com/go-chi/chi) instead of the forked [macaron](https://gitea.com/macaron/macaron). Since macaron and chi have conflicts with session share, this big PR becomes a have-to thing. According my previous idea, we can replace macaron step by step but I'm wrong. :( Below is a list of big changes on this PR. - [x] Define `context.ResponseWriter` interface with an implementation `context.Response`. - [x] Use chi instead of macaron, and also a customize `Route` to wrap chi so that the router usage is similar as before. - [x] Create different routers for `web`, `api`, `internal` and `install` so that the codes will be more clear and no magic . - [x] Use https://github.com/unrolled/render instead of macaron's internal render - [x] Use https://github.com/NYTimes/gziphandler instead of https://gitea.com/macaron/gzip - [x] Use https://gitea.com/go-chi/session which is a modified version of https://gitea.com/macaron/session and removed `nodb` support since it will not be maintained. **BREAK** - [x] Use https://gitea.com/go-chi/captcha which is a modified version of https://gitea.com/macaron/captcha - [x] Use https://gitea.com/go-chi/cache which is a modified version of https://gitea.com/macaron/cache - [x] Use https://gitea.com/go-chi/binding which is a modified version of https://gitea.com/macaron/binding - [x] Use https://github.com/go-chi/cors instead of https://gitea.com/macaron/cors - [x] Dropped https://gitea.com/macaron/i18n and make a new one in `code.gitea.io/gitea/modules/translation` - [x] Move validation form structs from `code.gitea.io/gitea/modules/auth` to `code.gitea.io/gitea/modules/forms` to avoid dependency cycle. - [x] Removed macaron log service because it's not need any more. **BREAK** - [x] All form structs have to be get by `web.GetForm(ctx)` in the route function but not as a function parameter on routes definition. - [x] Move Git HTTP protocol implementation to use routers directly. - [x] Fix the problem that chi routes don't support trailing slash but macaron did. - [x] `/api/v1/swagger` now will be redirect to `/api/swagger` but not render directly so that `APIContext` will not create a html render. Notices: - Chi router don't support request with trailing slash - Integration test `TestUserHeatmap` maybe mysql version related. It's failed on my macOS(mysql 5.7.29 installed via brew) but succeed on CI. Co-authored-by: 6543 <6543@obermui.de>
This commit is contained in:
.golangci.ymlgo.modgo.suminit.goinstall.gomodules.txt
cmd
contrib/pr
docs/content
doc/advanced
page
integrations
api_helper_for_declarative_test.goapi_pull_test.goapi_releases_test.gocreate_no_session_test.gointegration_test.golfs_getobject_test.golinks_test.go
modules
auth/sso
cache
context
api.goauth.gocaptcha.gocontext.gocsrf.goform.goorg.gopermission.goprivate.gorepo.goresponse.gosecret.goxsrf.goxsrf_test.go
forms
admin.goauth_form.goorg.gorepo_branch_form.gorepo_form.gorepo_form_test.gouser_form.gouser_form_auth_openid.gouser_form_test.go
lfs
middlewares
session
setting
templates
test
timeutil
translation
validation
web
options/locale
routers
admin
api/v1
admin
api.gomisc
org
repo
branch.gocollaborators.gocommits.gofile.gofork.gogit_hook.gohook.goissue.goissue_comment.goissue_label.goissue_reaction.goissue_tracked_time.gokey.golabel.gomigrate.gomilestone.gopull.gopull_review.gorelease.gorelease_attachment.gorepo.gorepo_test.gostatus.gotopic.gotransfer.go
swagger
user
org
private
repo
branch.goeditor.gohttp.goissue.goissue_label.goissue_label_test.goissue_lock.goissue_timetrack.gomigrate.gomilestone.goprojects.gopull.gopull_review.gorelease.gorelease_test.gorepo.gosetting.gosetting_protected_branch.gosettings_test.gowebhook.gowiki.gowiki_test.go
routes
swagger_json.gouser
templates
vendor
gitea.com
go-chi
binding
cache
captcha
lunny
log
nodb
.gitignoreLICENSEREADME.mdREADME_CN.mdbatch.gobinlog.gobinlog_util.go
config
const.godoc.godump.gogo.modgo.suminfo.gomulti.gonodb.gonodb_db.goreplication.goscan.gostore
t_bit.got_hash.got_kv.got_list.got_set.got_ttl.got_zset.gotx.goutil.gomacaron
binding
captcha
cors
csrf
gzip
i18n
inject
macaron
.drone.yml.gitignoreLICENSEREADME.mdcontext.gogo.modgo.sumlogger.gomacaron.gomacaronlogo.pngrecovery.gorender.goresponse_writer.goreturn_handler.gorouter.gostatic.gotree.goutil_go17.goutil_go18.go
session
.drone.yml.gitignoreLICENSEREADME.md
couchbase
file.goflash.gogo.modgo.summemcache
memory.gomysql
nodb
postgres
session.goutils.gotoolbox
github.com
NYTimes/gziphandler
.gitignore.travis.ymlCODE_OF_CONDUCT.mdCONTRIBUTING.mdLICENSEREADME.mdgo.modgo.sumgzip.gogzip_go18.go
go-chi/cors
siddontang/go-snappy
70
vendor/github.com/go-chi/cors/utils.go
generated
vendored
Normal file
70
vendor/github.com/go-chi/cors/utils.go
generated
vendored
Normal file
@ -0,0 +1,70 @@
|
||||
package cors
|
||||
|
||||
import "strings"
|
||||
|
||||
const toLower = 'a' - 'A'
|
||||
|
||||
type converter func(string) string
|
||||
|
||||
type wildcard struct {
|
||||
prefix string
|
||||
suffix string
|
||||
}
|
||||
|
||||
func (w wildcard) match(s string) bool {
|
||||
return len(s) >= len(w.prefix+w.suffix) && strings.HasPrefix(s, w.prefix) && strings.HasSuffix(s, w.suffix)
|
||||
}
|
||||
|
||||
// convert converts a list of string using the passed converter function
|
||||
func convert(s []string, c converter) []string {
|
||||
out := []string{}
|
||||
for _, i := range s {
|
||||
out = append(out, c(i))
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
// parseHeaderList tokenize + normalize a string containing a list of headers
|
||||
func parseHeaderList(headerList string) []string {
|
||||
l := len(headerList)
|
||||
h := make([]byte, 0, l)
|
||||
upper := true
|
||||
// Estimate the number headers in order to allocate the right splice size
|
||||
t := 0
|
||||
for i := 0; i < l; i++ {
|
||||
if headerList[i] == ',' {
|
||||
t++
|
||||
}
|
||||
}
|
||||
headers := make([]string, 0, t)
|
||||
for i := 0; i < l; i++ {
|
||||
b := headerList[i]
|
||||
if b >= 'a' && b <= 'z' {
|
||||
if upper {
|
||||
h = append(h, b-toLower)
|
||||
} else {
|
||||
h = append(h, b)
|
||||
}
|
||||
} else if b >= 'A' && b <= 'Z' {
|
||||
if !upper {
|
||||
h = append(h, b+toLower)
|
||||
} else {
|
||||
h = append(h, b)
|
||||
}
|
||||
} else if b == '-' || (b >= '0' && b <= '9') {
|
||||
h = append(h, b)
|
||||
}
|
||||
|
||||
if b == ' ' || b == ',' || i == l-1 {
|
||||
if len(h) > 0 {
|
||||
// Flush the found header
|
||||
headers = append(headers, string(h))
|
||||
h = h[:0]
|
||||
upper = true
|
||||
}
|
||||
} else {
|
||||
upper = b == '-'
|
||||
}
|
||||
}
|
||||
return headers
|
||||
}
|
Reference in New Issue
Block a user