mirror of
https://github.com/BookStackApp/BookStack.git
synced 2026-02-10 03:12:20 +03:00
API returns HTTP 500 instead of 404 on not found #3841
Closed
opened 2026-02-05 07:38:45 +03:00 by OVERLORD
·
5 comments
No Branch/Tag Specified
development
l10n_development
release
llm_only
vectors
v25-11
docker_env
drawio_rendering
user_permissions
ldap_host_failover
svg_image
prosemirror
captcha_example
fix/video-export
v25.12.3
v25.12.2
v25.12.1
v25.12
v25.11.6
v25.11.5
v25.11.4
v24.11.4
v25.11.3
v25.11.2
v25.11.1
v25.11
v25.07.3
v25.07.2
v25.07.1
v25.07
v25.05.2
v25.05.1
v25.05
v25.02.5
v25.02.4
v25.02.3
v25.02.2
v25.02.1
v25.02
v24.12.1
v24.12
v24.10.3
v24.10.2
v24.10.1
v24.10
v24.05.4
v24.05.3
v24.05.2
v24.05.1
v24.05
v24.02.3
v24.02.2
v24.02.1
v24.02
v23.12.3
v23.12.2
v23.12.1
v23.12
v23.10.4
v23.10.3
v23.10.2
v23.10.1
v23.10
v23.08.3
v23.08.2
v23.08.1
v23.08
v23.06.2
v23.06.1
v23.06
v23.05.2
v23.05.1
v23.05
v23.02.3
v23.02.2
v23.02.1
v23.02
v23.01.1
v23.01
v22.11.1
v22.11
v22.10.2
v22.10.1
v22.10
v22.09.1
v22.09
v22.07.3
v22.07.2
v22.07.1
v22.07
v22.06.2
v22.06.1
v22.06
v22.04.2
v22.04.1
v22.04
v22.03.1
v22.03
v22.02.3
v22.02.2
v22.02.1
v22.02
v21.12.5
v21.12.4
v21.12.3
v21.12.2
v21.12.1
v21.12
v21.11.3
v21.11.2
v21.11.1
v21.11
v21.10.3
v21.10.2
v21.10.1
v21.10
v21.08.6
v21.08.5
v21.08.4
v21.08.3
v21.08.2
v21.08.1
v21.08
v21.05.4
v21.05.3
v21.05.2
v21.05.1
v21.05
v21.04.6
v21.04.5
v21.04.4
v21.04.3
v21.04.2
v21.04.1
v21.04
v0.31.8
v0.31.7
v0.31.6
v0.31.5
v0.31.4
v0.31.3
v0.31.2
v0.31.1
v0.31.0
v0.30.7
v0.30.6
v0.30.5
v0.30.4
v0.30.3
v0.30.2
v0.30.1
v0.30.0
v0.29.3
v0.29.2
v0.29.1
v0.29.0
v0.28.3
v0.28.2
v0.28.1
v0.28.0
v0.27.5
v0.27.4
v0.27.3
v0.27.2
v0.27.1
v0.27
v0.26.4
v0.26.3
v0.26.2
v0.26.1
v0.26.0
v0.25.5
v0.25.4
v0.25.3
v0.25.2
v0.25.1
v0.25.0
v0.24.3
v0.24.2
v0.24.1
v0.24.0
v0.23.2
v0.23.1
v0.23.0
v0.22.0
v0.21.0
v0.20.3
v0.20.2
v0.20.1
v0.20.0
v0.19.0
v0.18.5
v0.18.4
v0.18.3
v0.18.2
v0.18.1
v0.18.0
v0.17.4
v0.17.3
v0.17.2
v0.17.1
v0.17.0
v0.16.3
v0.16.2
v0.16.1
v0.16.0
v0.15.3
v0.15.2
v0.15.1
v0.15.0
v0.14.3
v0.14.2
v0.14.1
v0.14.0
v0.13.1
v0.13.0
v0.12.2
v0.12.1
v0.12.0
v0.11.2
v0.11.1
v0.11.0
v0.10.0
v0.9.3
v0.9.2
v0.9.1
v0.9.0
v0.8.2
v0.8.1
v0.8.0
v0.7.6
v0.7.5
v0.7.4
v0.7.3
0.7.2
v.0.7.1
v0.7.0
v0.6.3
v0.6.2
v0.6.1
v0.6.0
v0.5.0
Labels
Clear labels
🎨 Design
📖 Docs Update
🐛 Bug
🐛 Bug
:cat2:🐈 Possible duplicate
💿 Database
☕ Open to discussion
💻 Front-End
🐕 Support
🚪 Authentication
🌍 Translations
🔌 API Task
🏭 Back-End
⛲ Upstream
🔨 Feature Request
🛠️ Enhancement
🛠️ Enhancement
🛠️ Enhancement
❤️ Happy feedback
🔒 Security
🔍 Pending Validation
💆 UX
📝 WYSIWYG Editor
🌔 Out of scope
🔩 API Request
:octocat: Admin/Meta
🖌️ View Customization
❓ Question
🚀 Priority
🛡️ Blocked
🚚 Export System
♿ A11y
🔧 Maintenance
> Markdown Editor
pull-request
Mirrored from GitHub Pull Request
No Label
🐛 Bug
Milestone
No items
No Milestone
Projects
Clear projects
No project
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: starred/BookStack#3841
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @devdot on GitHub (Jun 8, 2023).
Describe the Bug
When requesting a non-existing page, the API returns HTTP 500 instead of 404. The JSON looks like this:
When I read the documentation (https://demo.bookstackapp.com/api/docs#error-handling) I assumed it meant that the API returns matching HTTP statuses when possible.
After clarifying on discord (thanks @ssddanbrown !), this behavior is not expected.
Steps to Reproduce
Expected Behaviour
HTTP 404 Not Found
Screenshots or Additional Context
No response
Browser Details
No response
Exact BookStack Version
v23.05.2
PHP Version
No response
Hosting Environment
ubuntu-22.04
@devdot commented on GitHub (Jun 8, 2023):
I've implemented a test to verify the issue:
ecf99fa0edLooking into the issue, there are two relevant places:
Exceptions\NotFoundException
getStatusdoes not exist (would be called by the exception handler, see below)getStatusExceptions\Handler::renderApiException
$codeis 500 and Exception->getCode() only called on specific exceptions (not Exceptions\NotFoundException)$code$codeused to be set by Exception->getCode, but was changed:b4fa82e329$codefrom Exception->getCode by defaultSolution 2 seems to be more generic and elegant, therefore I'll submit a PR
@ssddanbrown commented on GitHub (Jun 13, 2023):
Thank you for much for the PR @devdot, it looks great.
The only thing I'd be nervous about is essentially always using the exception code as a status code by default.
We can't be sure what exceptions might go through this, and I don't think we can always assure they'd be using http aligned codes.
Could I propose a tweak on your solution 1 above?
The
NotFoundExceptionextendsPrettyException. Looking atPrettyException, that specific exception class does expect the code to be a http status code (where not zero otherwise default to 500).getStatuscould instead be added toPrettyExceptionto generically handle these types of exceptions across the API, without assuming codes as statuses for all exceptions.Optionally, If you wanted to go a step further, you could look to clean up some of the messiness/duplication I've created here over the years. There's the
getStatusmethod check & use, which is pretty hacky, but there's already this:5e8ec56196/app/Exceptions/Handler.php (L85-L88)Instead of checking against
HttpExceptionhere, we could check for an instance ofHttpExceptionInterface, then implement that interface withinPrettyException. Other exceptions making use ofgetStatushere could be updated to useHttpExceptionInterfacealso, so thengetStatuscould be removed. That way, we've sticking to one main method of setting http status in exceptions, in a manner working to interfaces instead of my hacky method checks.@devdot commented on GitHub (Jun 13, 2023):
Hi @ssddanbrown, I agree, using the exception code as HTTP status could go wrong in unexpected ways. I was actually quite surprised to see that it used to be like that (as I referenced above) and that all tests still go green after I reverted back to always using
getCode.I think using
HttpExceptionInterfaceis the best option. Yes, I found it a bit messy to figure out whats going on in the exception handler, so a clean up as you described would be good. I'll update the PR in the next few days@devdot commented on GitHub (Jun 15, 2023):
This issue should be done with #4291 , unless you'd want to go forward with a bigger refactoring of exceptions as I've outlined in #4309
@ssddanbrown commented on GitHub (Jun 15, 2023):
Addressed in #4291, to be part of next feature release.