mirror of https://github.com/nealey/eris.git
Merge branch 'master' of /home/neale/projects/net/eris
This commit is contained in:
commit
6121939bf0
5
CHANGES
5
CHANGES
|
@ -1,3 +1,8 @@
|
||||||
|
4.2:
|
||||||
|
Remove some bugs in CGI's "Status:" code (reported by Alyssa Milburn).
|
||||||
|
Make extract_header_field less fragile (reported by Alyssa Milburn).
|
||||||
|
Possibly fix fake_sendfile (reported by Alyssa Milburn).
|
||||||
|
|
||||||
4.1:
|
4.1:
|
||||||
Fix 0.9 not detected with query_string (Alyssa Milburn).
|
Fix 0.9 not detected with query_string (Alyssa Milburn).
|
||||||
|
|
||||||
|
|
7
README
7
README
|
@ -81,11 +81,6 @@ if no specific directory for the virtual host was there.
|
||||||
eris implements el-cheapo HTTP ranges (only byte ranges and only of the
|
eris implements el-cheapo HTTP ranges (only byte ranges and only of the
|
||||||
form x-y, not multiple ranges).
|
form x-y, not multiple ranges).
|
||||||
|
|
||||||
eris implements content type matching and Accepts: parsing, but the
|
|
||||||
content type table is compiled in, i.e. to change it, you have to change
|
|
||||||
the source code. Shouldn't be a problem because you _have_ the source
|
|
||||||
code ;)
|
|
||||||
|
|
||||||
eris will change dots at the start of file or directory names to colons
|
eris will change dots at the start of file or directory names to colons
|
||||||
in the query before trying to answer them.
|
in the query before trying to answer them.
|
||||||
|
|
||||||
|
@ -95,8 +90,6 @@ eris will use sendfile on Linux to enable zero-copy TCP.
|
||||||
|
|
||||||
If eris is given the -c option, it will regard files
|
If eris is given the -c option, it will regard files
|
||||||
whose names end with ".cgi" as CGI programs and try to execute them.
|
whose names end with ".cgi" as CGI programs and try to execute them.
|
||||||
CGI programs starting with "nph-" will be handled as no-parse-header
|
|
||||||
CGIs.
|
|
||||||
Please see <http://hoohoo.ncsa.uiuc.edu/cgi/interface.html> for the CGI specification.
|
Please see <http://hoohoo.ncsa.uiuc.edu/cgi/interface.html> for the CGI specification.
|
||||||
|
|
||||||
|
|
||||||
|
|
24
eris.c
24
eris.c
|
@ -111,7 +111,6 @@ time_t ims;
|
||||||
|
|
||||||
|
|
||||||
#define BUFFER_SIZE 8192
|
#define BUFFER_SIZE 8192
|
||||||
char stdout_buf[BUFFER_SIZE];
|
|
||||||
|
|
||||||
|
|
||||||
/** Log a request */
|
/** Log a request */
|
||||||
|
@ -406,9 +405,20 @@ cgi_parent(int cin, int cout, int passthru)
|
||||||
dolog(302, 0);
|
dolog(302, 0);
|
||||||
exit(0);
|
exit(0);
|
||||||
} else if (! strcasecmp(cgiheader, "Status")) {
|
} else if (! strcasecmp(cgiheader, "Status")) {
|
||||||
char *txt = val + 4;
|
char *txt;
|
||||||
|
|
||||||
code = atoi(val);
|
if (val) {
|
||||||
|
code = (int)strtol(val, &txt, 10);
|
||||||
|
} else {
|
||||||
|
code = 0;
|
||||||
|
}
|
||||||
|
if (code < 100) {
|
||||||
|
header(500, "Internal Error");
|
||||||
|
printf("CGI returned Status: %d\n", code);
|
||||||
|
dolog(500, 0);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
for (; *txt == ' '; txt += 1);
|
||||||
header(code, txt);
|
header(code, txt);
|
||||||
} else {
|
} else {
|
||||||
header(200, "OK");
|
header(200, "OK");
|
||||||
|
@ -453,7 +463,7 @@ cgi_parent(int cin, int cout, int passthru)
|
||||||
}
|
}
|
||||||
|
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
dolog(200, size);
|
dolog(code, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -500,7 +510,7 @@ serve_cgi(char *relpath)
|
||||||
* Main HTTPd
|
* Main HTTPd
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void
|
ssize_t
|
||||||
fake_sendfile(int out_fd, int in_fd, off_t *offset, size_t count)
|
fake_sendfile(int out_fd, int in_fd, off_t *offset, size_t count)
|
||||||
{
|
{
|
||||||
char buf[BUFFER_SIZE];
|
char buf[BUFFER_SIZE];
|
||||||
|
@ -529,6 +539,8 @@ fake_sendfile(int out_fd, int in_fd, off_t *offset, size_t count)
|
||||||
}
|
}
|
||||||
l -= m;
|
l -= m;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return l;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -580,7 +592,7 @@ serve_file(int fd, char *filename, struct stat *st)
|
||||||
alarm(SENDFILE_TIMEOUT);
|
alarm(SENDFILE_TIMEOUT);
|
||||||
sent = sendfile(1, fd, &range_start, count);
|
sent = sendfile(1, fd, &range_start, count);
|
||||||
if (-1 == sent) {
|
if (-1 == sent) {
|
||||||
fake_sendfile(1, fd, &range_start, count);
|
sent = fake_sendfile(1, fd, &range_start, count);
|
||||||
}
|
}
|
||||||
remain -= sent;
|
remain -= sent;
|
||||||
}
|
}
|
||||||
|
|
|
@ -75,7 +75,7 @@ extract_header_field(char *buf, char **val, int cgi)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (; (buf[len-1] == '\n') || (buf[len-1] == '\r'); len -= 1);
|
for (; (len > 0) && ((buf[len-1] == '\n') || (buf[len-1] == '\r')); len -= 1);
|
||||||
buf[len] = 0;
|
buf[len] = 0;
|
||||||
|
|
||||||
return len;
|
return len;
|
||||||
|
|
21
test.sh
21
test.sh
|
@ -64,7 +64,18 @@ chmod +x default/redir.cgi
|
||||||
|
|
||||||
cat <<'EOD' > default/status.cgi
|
cat <<'EOD' > default/status.cgi
|
||||||
#! /bin/sh
|
#! /bin/sh
|
||||||
echo "Status: 300 wat"
|
case "$PATH_INFO" in
|
||||||
|
/empty)
|
||||||
|
echo "Status"
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
/nostat)
|
||||||
|
echo "Status: "
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Status: 300 wat"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
echo "Merf: merf"
|
echo "Merf: merf"
|
||||||
echo
|
echo
|
||||||
echo "james"
|
echo "james"
|
||||||
|
@ -240,7 +251,13 @@ title "Redirect"
|
||||||
printf 'GET /redir.cgi HTTP/1.0\r\n\r\n' | $HTTPD_CGI 2>/dev/null | grep -Fq 'Location: http://example.com/froot' && pass || fail
|
printf 'GET /redir.cgi HTTP/1.0\r\n\r\n' | $HTTPD_CGI 2>/dev/null | grep -Fq 'Location: http://example.com/froot' && pass || fail
|
||||||
|
|
||||||
title "Status"
|
title "Status"
|
||||||
printf 'GET /status.cgi HTTP/1.0\r\n\r\n' | $HTTPD_CGI 2>/dev/null | d | grep -q '^HTTP/1.0 300 wat#%' && pass || fail
|
printf 'GET /status.cgi HTTP/1.0\r\n\r\n' | $HTTPD_CGI 2>&1 | d | grep -q '^HTTP/1.0 300 wat#%.*.null. 300 6' && pass || fail
|
||||||
|
|
||||||
|
title "Status bug"
|
||||||
|
printf 'GET /status.cgi/empty HTTP/1.0\r\n\r\n' | $HTTPD_CGI 2>/dev/null | d | grep -q '^HTTP/1.0 500 ' && pass || fail
|
||||||
|
|
||||||
|
title "No status"
|
||||||
|
printf 'GET /status.cgi/nostat HTTP/1.0\r\n\r\n' | $HTTPD_CGI 2>/dev/null | d | grep -q '^HTTP/1.0 500 ' && pass || fail
|
||||||
|
|
||||||
|
|
||||||
H "Timeouts"
|
H "Timeouts"
|
||||||
|
|
Loading…
Reference in New Issue