|  | @@ -2675,8 +2675,9 @@ static void interpret_uri(struct mg_connection *conn,    /* in: request */
 | 
											
												
													
														|  |                            )
 |  |                            )
 | 
											
												
													
														|  |  {
 |  |  {
 | 
											
												
													
														|  |      struct vec a, b;
 |  |      struct vec a, b;
 | 
											
												
													
														|  | -    const char *rewrite, *uri = conn->request_info.uri,
 |  | 
 | 
											
												
													
														|  | -                          *root = conn->ctx->config[DOCUMENT_ROOT];
 |  | 
 | 
											
												
													
														|  | 
 |  | +    const char *rewrite,
 | 
											
												
													
														|  | 
 |  | +               *uri = conn->request_info.uri,
 | 
											
												
													
														|  | 
 |  | +               *root = conn->ctx->config[DOCUMENT_ROOT];
 | 
											
												
													
														|  |      char *p;
 |  |      char *p;
 | 
											
												
													
														|  |      int match_len;
 |  |      int match_len;
 | 
											
												
													
														|  |      char gz_path[PATH_MAX];
 |  |      char gz_path[PATH_MAX];
 | 
											
										
											
												
													
														|  | @@ -4041,14 +4042,18 @@ static int read_request(FILE *fp, struct mg_connection *conn,
 | 
											
												
													
														|  |                          char *buf, int bufsiz, int *nread)
 |  |                          char *buf, int bufsiz, int *nread)
 | 
											
												
													
														|  |  {
 |  |  {
 | 
											
												
													
														|  |      int request_len, n = 0;
 |  |      int request_len, n = 0;
 | 
											
												
													
														|  | 
 |  | +    time_t last_action_time = 0;
 | 
											
												
													
														|  | 
 |  | +    double request_timout = atof(conn->ctx->config[REQUEST_TIMEOUT]) / 1000.0;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      request_len = get_request_len(buf, *nread);
 |  |      request_len = get_request_len(buf, *nread);
 | 
											
												
													
														|  |      while (conn->ctx->stop_flag == 0 &&
 |  |      while (conn->ctx->stop_flag == 0 &&
 | 
											
												
													
														|  |             *nread < bufsiz && request_len == 0 &&
 |  |             *nread < bufsiz && request_len == 0 &&
 | 
											
												
													
														|  | 
 |  | +           difftime(last_action_time, conn->birth_time) <= request_timout &&
 | 
											
												
													
														|  |             (n = pull(fp, conn, buf + *nread, bufsiz - *nread)) > 0) {
 |  |             (n = pull(fp, conn, buf + *nread, bufsiz - *nread)) > 0) {
 | 
											
												
													
														|  |          *nread += n;
 |  |          *nread += n;
 | 
											
												
													
														|  |          assert(*nread <= bufsiz);
 |  |          assert(*nread <= bufsiz);
 | 
											
												
													
														|  |          request_len = get_request_len(buf, *nread);
 |  |          request_len = get_request_len(buf, *nread);
 | 
											
												
													
														|  | 
 |  | +        last_action_time = (request_timout > 0.0) ? time(NULL) : 0;
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      return request_len <= 0 && n <= 0 ? -1 : request_len;
 |  |      return request_len <= 0 && n <= 0 ? -1 : request_len;
 | 
											
										
											
												
													
														|  | @@ -6505,7 +6510,7 @@ static int getreq(struct mg_connection *conn, char *ebuf, size_t ebuf_len, int t
 | 
											
												
													
														|  |      if (conn->request_len == 0 && conn->data_len == conn->buf_size) {
 |  |      if (conn->request_len == 0 && conn->data_len == conn->buf_size) {
 | 
											
												
													
														|  |          snprintf(ebuf, ebuf_len, "%s", "Request Too Large");
 |  |          snprintf(ebuf, ebuf_len, "%s", "Request Too Large");
 | 
											
												
													
														|  |      } else if (conn->request_len <= 0) {
 |  |      } else if (conn->request_len <= 0) {
 | 
											
												
													
														|  | -        snprintf(ebuf, ebuf_len, "%s", "Client closed connection");
 |  | 
 | 
											
												
													
														|  | 
 |  | +        snprintf(ebuf, ebuf_len, "%s", "Client sent malformed request");
 | 
											
												
													
														|  |      } else if (parse_http_message(conn->buf, conn->buf_size,
 |  |      } else if (parse_http_message(conn->buf, conn->buf_size,
 | 
											
												
													
														|  |                                    &conn->request_info) <= 0) {
 |  |                                    &conn->request_info) <= 0) {
 | 
											
												
													
														|  |          snprintf(ebuf, ebuf_len, "Bad request: [%.*s]", conn->data_len, conn->buf);
 |  |          snprintf(ebuf, ebuf_len, "Bad request: [%.*s]", conn->data_len, conn->buf);
 |