mirror of
				https://github.com/caddyserver/caddy.git
				synced 2025-10-31 02:27:19 -04:00 
			
		
		
		
	Merge pull request #1409 from mastercactapus/not_a_directory
return 404 for "not a directory" errors
This commit is contained in:
		
						commit
						bdb61f4a1d
					
				| @ -56,6 +56,9 @@ func (fs FileServer) serveFile(w http.ResponseWriter, r *http.Request, name stri | ||||
| 
 | ||||
| 	f, err := fs.Root.Open(name) | ||||
| 	if err != nil { | ||||
| 		// TODO: remove when http.Dir handles this | ||||
| 		// Go issue #18984 | ||||
| 		err = mapFSRootOpenErr(err) | ||||
| 		if os.IsNotExist(err) { | ||||
| 			return http.StatusNotFound, nil | ||||
| 		} else if os.IsPermission(err) { | ||||
| @ -230,3 +233,35 @@ var staticEncodingPriority = []string{ | ||||
| 	"br", | ||||
| 	"gzip", | ||||
| } | ||||
| 
 | ||||
| // mapFSRootOpenErr maps the provided non-nil error | ||||
| // to a possibly better non-nil error. In particular, it turns OS-specific errors | ||||
| // about opening files in non-directories into os.ErrNotExist. | ||||
| // | ||||
| // TODO: remove when http.Dir handles this | ||||
| // Go issue #18984 | ||||
| func mapFSRootOpenErr(originalErr error) error { | ||||
| 	if os.IsNotExist(originalErr) || os.IsPermission(originalErr) { | ||||
| 		return originalErr | ||||
| 	} | ||||
| 
 | ||||
| 	perr, ok := originalErr.(*os.PathError) | ||||
| 	if !ok { | ||||
| 		return originalErr | ||||
| 	} | ||||
| 	name := perr.Path | ||||
| 	parts := strings.Split(name, string(filepath.Separator)) | ||||
| 	for i := range parts { | ||||
| 		if parts[i] == "" { | ||||
| 			continue | ||||
| 		} | ||||
| 		fi, err := os.Stat(strings.Join(parts[:i+1], string(filepath.Separator))) | ||||
| 		if err != nil { | ||||
| 			return originalErr | ||||
| 		} | ||||
| 		if !fi.IsDir() { | ||||
| 			return os.ErrNotExist | ||||
| 		} | ||||
| 	} | ||||
| 	return originalErr | ||||
| } | ||||
|  | ||||
| @ -178,6 +178,11 @@ func TestServeHTTP(t *testing.T) { | ||||
| 			expectedBodyContent: testFiles[filepath.Join("webroot", "sub", "brotli.html.br")], | ||||
| 			expectedEtag:        `W/"1e240-e"`, | ||||
| 		}, | ||||
| 		// Test 20 - treat existing file as a directory. | ||||
| 		{ | ||||
| 			url:            "https://foo/file1.html/other", | ||||
| 			expectedStatus: http.StatusNotFound, | ||||
| 		}, | ||||
| 	} | ||||
| 
 | ||||
| 	for i, test := range tests { | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user