[v10.0/forgejo] fix: return 404 for empty repositories (#7014)
**Backport:** https://codeberg.org/forgejo/forgejo/pulls/7003 Some endpoints (`/api/v1/repos/*/*/raw`, `/api/v1/repos/*/*/media`, ...; anything that uses both `context.ReferencesGitRepo()` and `context.RepoRefForAPI` really) returned a 500 when the repository was completely empty. This resulted in some confusion in https://github.com/datalad/datalad-usage-dashboard/issues/47 because the same request for a non-existent file in a repository could sometimes generate a 404 and sometimes a 500, depending on if the git repository is initialized at all or not. Returning a 404 seems more appropriate here, since this isn't an unexpected internal error, but just another way of not finding the requested data. Co-authored-by: Matthias Riße <m.risse@fz-juelich.de> Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/7014 Reviewed-by: Gusted <gusted@noreply.codeberg.org> Co-authored-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org> Co-committed-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
This commit is contained in:
		
					parent
					
						
							
								932afb2036
							
						
					
				
			
			
				commit
				
					
						3eacbfead9
					
				
			
		
					 2 changed files with 26 additions and 0 deletions
				
			
		| 
						 | 
					@ -353,6 +353,11 @@ func RepoRefForAPI(next http.Handler) http.Handler {
 | 
				
			||||||
	return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
 | 
						return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
 | 
				
			||||||
		ctx := GetAPIContext(req)
 | 
							ctx := GetAPIContext(req)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if ctx.Repo.Repository.IsEmpty {
 | 
				
			||||||
 | 
								ctx.NotFound(fmt.Errorf("repository is empty"))
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if ctx.Repo.GitRepo == nil {
 | 
							if ctx.Repo.GitRepo == nil {
 | 
				
			||||||
			ctx.InternalServerError(fmt.Errorf("no open git repo"))
 | 
								ctx.InternalServerError(fmt.Errorf("no open git repo"))
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -136,3 +136,24 @@ func TestEmptyRepoAddFileByAPI(t *testing.T) {
 | 
				
			||||||
	DecodeJSON(t, resp, &apiRepo)
 | 
						DecodeJSON(t, resp, &apiRepo)
 | 
				
			||||||
	assert.Equal(t, "new_branch", apiRepo.DefaultBranch)
 | 
						assert.Equal(t, "new_branch", apiRepo.DefaultBranch)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestEmptyRepoAPIRequestsReturn404(t *testing.T) {
 | 
				
			||||||
 | 
						defer tests.PrepareTestEnv(t)()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						session := loginUser(t, "user30")
 | 
				
			||||||
 | 
						token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadRepository)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						t.Run("Raw", func(t *testing.T) {
 | 
				
			||||||
 | 
							defer tests.PrintCurrentTest(t)()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							req := NewRequest(t, "GET", "/api/v1/repos/user30/empty/raw/main/something").AddTokenAuth(token)
 | 
				
			||||||
 | 
							_ = session.MakeRequest(t, req, http.StatusNotFound)
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						t.Run("Media", func(t *testing.T) {
 | 
				
			||||||
 | 
							defer tests.PrintCurrentTest(t)()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							req := NewRequest(t, "GET", "/api/v1/repos/user30/empty/media/main/something").AddTokenAuth(token)
 | 
				
			||||||
 | 
							_ = session.MakeRequest(t, req, http.StatusNotFound)
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue