Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --- cgi_plugin.c 2015-06-08 22:28:51.316000000 +0000
- +++ /home/admin/uwsgi/uwsgi-2.0.7/plugins/cgi/cgi_plugin.c 2014-09-05 04:48:15.000000000 +0000
- @@ -265,8 +265,7 @@
- size_t remains = blen;
- char *ptr = buf;
- size_t len = 0;
- - char *key = buf;
- -
- +
- while(remains > 0) {
- ssize_t rlen = uwsgi_read_true_nb(fd, ptr, remains, uc.timeout);
- if (rlen < 0) {
- @@ -287,36 +286,69 @@
- if (status_sent == 0) continue;
- }
- - // char *value = NULL;
- + // send headers
- + char *key = buf;
- + char *value = NULL;
- +
- + for(i=0;i<len;i++) {
- + // end of a line
- + if (buf[i] == '\n') {
- + // end of headers
- + if (key == NULL) {
- + i++;
- + goto send_body;
- + }
- + // invalid header
- + else if (value == NULL) {
- + return -1;
- + }
- + header_size = (buf+i) - key;
- + // security check
- + if (buf+i > buf) {
- + if ((buf[i-1]) == '\r') {
- + header_size--;
- + }
- + }
- +
- +#ifdef UWSGI_DEBUG
- + uwsgi_log("found CGI header: %.*s\n", header_size, key);
- +#endif
- +
- + // Ignore "Status: NNN" header
- + if (header_size >= 11) {
- + if (!strncasecmp("Status: ", key, 8)) {
- + key = NULL;
- + value = NULL;
- + continue;
- + }
- + }
- - // iterate only through bytes we received in the last call to uwsgi_read_true_nb. adjust
- - // the buffer length as we discover headers.
- - for(i=0;i<(size_t)rlen;i++) {
- - if(key[i] == '\n'){
- - header_size = (key+i) - key;
- - if(header_size){
- - uwsgi_response_add_header(wsgi_req, NULL, 0, key, header_size);
- - // uwsgi_log("found CGI header: %d %s\n", header_size, key);
- - key += ++header_size;
- - rlen -= header_size;
- - i=0;
- + uwsgi_response_add_header(wsgi_req, NULL, 0, key, header_size);
- + key = NULL;
- + value = NULL;
- + }
- + else if (buf[i] == ':') {
- + value = buf+i;
- + }
- + else if (buf[i] != '\r') {
- + if (key == NULL) {
- + key = buf + i;
- }
- - else { goto send_body; };
- }
- }
- -
- }
- return -1;
- send_body:
- +
- if (len-i > 0) {
- - uwsgi_log("write_body_do: %s",buf+i);
- uwsgi_response_write_body_do(wsgi_req, buf+i, len-i);
- }
- return 0;
- }
- +
- static char *uwsgi_cgi_get_docroot(char *path_info, uint16_t path_info_len, int *need_free, int *is_a_file, int *discard_base, char **script_name) {
- struct uwsgi_dyn_dict *udd = uc.mountpoint, *choosen_udd = NULL;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement