The proper way to interpret this check50 error is:
Requesting cat.exe returns error code 501 : the right answer is error code 501
\ expected output, but not "HTTP/1.1 404 Not Found...: server returned a 404
If you read through server from around line 182, you will find the block of code that uses all the assigned functions. Since your server returns 404 when cat.exe is called by check50, and the only 404 in the program comes at line 209 in server, that must be where the error is being produced. But why? Simply put, path is built by concatenating the abs_path that was returned from parse with the document root. You can conclude, therefore, that the abs_path is wrong.
The best tool to discover why abs_path is wrong is gdb. Some tips here. A second choice would be to troubleshoot and debug with printfs. Some tips about that: make sure that main sees abs_path the same way that your parse function does. This format string "%s<-" could prove useful. By putting a "marker" at the end of the string, you'll be sure to know if your string contains any non-printing characters.