2021-01-05 16:05:40 +03:00
// Copyright 2020 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2021-01-05 16:05:40 +03:00
2021-06-09 02:33:54 +03:00
package install
2021-01-05 16:05:40 +03:00
import (
"fmt"
2023-03-04 05:12:02 +03:00
"html"
2021-01-05 16:05:40 +03:00
"net/http"
2021-01-26 18:36:53 +03:00
"code.gitea.io/gitea/modules/public"
2021-01-05 16:05:40 +03:00
"code.gitea.io/gitea/modules/setting"
2021-01-26 18:36:53 +03:00
"code.gitea.io/gitea/modules/web"
2021-06-09 02:33:54 +03:00
"code.gitea.io/gitea/routers/common"
2022-05-04 14:56:20 +03:00
"code.gitea.io/gitea/routers/web/healthcheck"
2021-04-06 22:44:05 +03:00
"code.gitea.io/gitea/services/forms"
2021-01-05 16:05:40 +03:00
)
Refactor web route (#24080)
The old code is unnecessarily complex, and has many misuses.
Old code "wraps" a lot, wrap wrap wrap, it's difficult to understand
which kind of handler is used.
The new code uses a general approach, we do not need to write all kinds
of handlers into the "wrapper", do not need to wrap them again and
again.
New code, there are only 2 concepts:
1. HandlerProvider: `func (h any) (handlerProvider func (next)
http.Handler)`, it can be used as middleware
2. Use HandlerProvider to get the final HandlerFunc, and use it for
`r.Get()`
And we can decouple the route package from context package (see the
TODO).
# FAQ
## Is `reflect` safe?
Yes, all handlers are checked during startup, see the `preCheckHandler`
comment. If any handler is wrong, developers could know it in the first
time.
## Does `reflect` affect performance?
No. https://github.com/go-gitea/gitea/pull/24080#discussion_r1164825901
1. This reflect code only runs for each web handler call, handler is far
more slower: 10ms-50ms
2. The reflect is pretty fast (comparing to other code): 0.000265ms
3. XORM has more reflect operations already
2023-04-20 21:49:06 +03:00
// Routes registers the installation routes
2023-05-23 04:29:15 +03:00
func Routes ( ) * web . Route {
2023-04-27 09:06:45 +03:00
base := web . NewRoute ( )
base . Use ( common . ProtocolMiddlewares ( ) ... )
2023-07-21 15:14:20 +03:00
base . Methods ( "GET, HEAD" , "/assets/*" , public . FileHandlerFunc ( ) )
2021-01-26 18:36:53 +03:00
2023-04-27 09:06:45 +03:00
r := web . NewRoute ( )
2023-05-04 09:36:34 +03:00
r . Use ( common . Sessioner ( ) , Contexter ( ) )
2023-03-04 05:12:02 +03:00
r . Get ( "/" , Install ) // it must be on the root, because the "install.js" use the window.location to replace the "localhost" AppURL
2021-06-09 02:33:54 +03:00
r . Post ( "/" , web . Bind ( forms . InstallForm { } ) , SubmitInstall )
2023-03-04 05:12:02 +03:00
r . Get ( "/post-install" , InstallDone )
2022-05-04 14:56:20 +03:00
r . Get ( "/api/healthz" , healthcheck . Check )
Refactor web route (#24080)
The old code is unnecessarily complex, and has many misuses.
Old code "wraps" a lot, wrap wrap wrap, it's difficult to understand
which kind of handler is used.
The new code uses a general approach, we do not need to write all kinds
of handlers into the "wrapper", do not need to wrap them again and
again.
New code, there are only 2 concepts:
1. HandlerProvider: `func (h any) (handlerProvider func (next)
http.Handler)`, it can be used as middleware
2. Use HandlerProvider to get the final HandlerFunc, and use it for
`r.Get()`
And we can decouple the route package from context package (see the
TODO).
# FAQ
## Is `reflect` safe?
Yes, all handlers are checked during startup, see the `preCheckHandler`
comment. If any handler is wrong, developers could know it in the first
time.
## Does `reflect` affect performance?
No. https://github.com/go-gitea/gitea/pull/24080#discussion_r1164825901
1. This reflect code only runs for each web handler call, handler is far
more slower: 10ms-50ms
2. The reflect is pretty fast (comparing to other code): 0.000265ms
3. XORM has more reflect operations already
2023-04-20 21:49:06 +03:00
r . NotFound ( installNotFound )
2023-04-27 09:06:45 +03:00
base . Mount ( "" , r )
return base
2021-01-26 18:36:53 +03:00
}
2022-01-20 14:41:25 +03:00
func installNotFound ( w http . ResponseWriter , req * http . Request ) {
2023-03-04 05:12:02 +03:00
w . Header ( ) . Add ( "Content-Type" , "text/html; charset=utf-8" )
w . Header ( ) . Add ( "Refresh" , fmt . Sprintf ( "1; url=%s" , setting . AppSubURL + "/" ) )
// do not use 30x status, because the "post-install" page needs to use 404/200 to detect if Gitea has been installed.
// the fetch API could follow 30x requests to the page with 200 status.
w . WriteHeader ( http . StatusNotFound )
_ , _ = fmt . Fprintf ( w , ` Not Found. <a href="%s">Go to default page</a>. ` , html . EscapeString ( setting . AppSubURL + "/" ) )
2022-01-20 14:41:25 +03:00
}