Advertisement
Guest User

Untitled

a guest
Jul 6th, 2015
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.27 KB | None | 0 0
  1.  
  2. --- cgi_plugin.c 2015-06-08 22:28:51.316000000 +0000
  3. +++ /home/admin/uwsgi/uwsgi-2.0.7/plugins/cgi/cgi_plugin.c 2014-09-05 04:48:15.000000000 +0000
  4. @@ -265,8 +265,7 @@
  5. size_t remains = blen;
  6. char *ptr = buf;
  7. size_t len = 0;
  8. - char *key = buf;
  9. -
  10. +
  11. while(remains > 0) {
  12. ssize_t rlen = uwsgi_read_true_nb(fd, ptr, remains, uc.timeout);
  13. if (rlen < 0) {
  14. @@ -287,36 +286,69 @@
  15. if (status_sent == 0) continue;
  16. }
  17.  
  18. - // char *value = NULL;
  19. + // send headers
  20. + char *key = buf;
  21. + char *value = NULL;
  22. +
  23. + for(i=0;i<len;i++) {
  24. + // end of a line
  25. + if (buf[i] == '\n') {
  26. + // end of headers
  27. + if (key == NULL) {
  28. + i++;
  29. + goto send_body;
  30. + }
  31. + // invalid header
  32. + else if (value == NULL) {
  33. + return -1;
  34. + }
  35. + header_size = (buf+i) - key;
  36. + // security check
  37. + if (buf+i > buf) {
  38. + if ((buf[i-1]) == '\r') {
  39. + header_size--;
  40. + }
  41. + }
  42. +
  43. +#ifdef UWSGI_DEBUG
  44. + uwsgi_log("found CGI header: %.*s\n", header_size, key);
  45. +#endif
  46. +
  47. + // Ignore "Status: NNN" header
  48. + if (header_size >= 11) {
  49. + if (!strncasecmp("Status: ", key, 8)) {
  50. + key = NULL;
  51. + value = NULL;
  52. + continue;
  53. + }
  54. + }
  55.  
  56. - // iterate only through bytes we received in the last call to uwsgi_read_true_nb. adjust
  57. - // the buffer length as we discover headers.
  58. - for(i=0;i<(size_t)rlen;i++) {
  59. - if(key[i] == '\n'){
  60. - header_size = (key+i) - key;
  61. - if(header_size){
  62. - uwsgi_response_add_header(wsgi_req, NULL, 0, key, header_size);
  63. - // uwsgi_log("found CGI header: %d %s\n", header_size, key);
  64. - key += ++header_size;
  65. - rlen -= header_size;
  66. - i=0;
  67. + uwsgi_response_add_header(wsgi_req, NULL, 0, key, header_size);
  68. + key = NULL;
  69. + value = NULL;
  70. + }
  71. + else if (buf[i] == ':') {
  72. + value = buf+i;
  73. + }
  74. + else if (buf[i] != '\r') {
  75. + if (key == NULL) {
  76. + key = buf + i;
  77. }
  78. - else { goto send_body; };
  79. }
  80. }
  81. -
  82. }
  83.  
  84. return -1;
  85.  
  86. send_body:
  87. +
  88. if (len-i > 0) {
  89. - uwsgi_log("write_body_do: %s",buf+i);
  90. uwsgi_response_write_body_do(wsgi_req, buf+i, len-i);
  91. }
  92.  
  93. return 0;
  94. }
  95. +
  96. 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) {
  97.  
  98. struct uwsgi_dyn_dict *udd = uc.mountpoint, *choosen_udd = NULL;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement