1 #ifndef _RESPONSE_H_ 2 #define _RESPONSE_H_ 3 #include "first.h" 4 5 #include "base_decls.h" 6 #include "buffer.h" 7 #include "array.h" 8 9 #include <time.h> 10 11 int http_response_parse(server *srv, request_st *r); 12 13 typedef struct http_cgi_opts_t { 14 int authorizer; 15 int break_scriptfilename_for_php; 16 const buffer *docroot; 17 const buffer *strip_request_uri; 18 } http_cgi_opts; 19 20 enum { 21 BACKEND_UNSET = 0, 22 BACKEND_PROXY, 23 BACKEND_CGI, 24 BACKEND_FASTCGI, 25 BACKEND_SCGI 26 }; 27 28 typedef struct http_response_opts_t { 29 int fdfmt; 30 int backend; 31 int authorizer; 32 unsigned short local_redir; 33 unsigned short xsendfile_allow; 34 const array *xsendfile_docroot; 35 void *pdata; 36 handler_t(*parse)(request_st *, struct http_response_opts_t *, buffer *, size_t); 37 handler_t(*headers)(request_st *, struct http_response_opts_t *); 38 } http_response_opts; 39 40 typedef int (*http_cgi_header_append_cb)(void *vdata, const char *k, size_t klen, const char *v, size_t vlen); 41 int http_cgi_headers(request_st *r, http_cgi_opts *opts, http_cgi_header_append_cb cb, void *vdata); 42 43 typedef int (*http_response_send_1xx_cb)(request_st *r, connection *con); 44 __attribute_cold__ 45 void http_response_send_1xx_cb_set (http_response_send_1xx_cb fn, int vers); 46 int http_response_send_1xx (request_st *r); 47 48 handler_t http_response_parse_headers(request_st *r, http_response_opts *opts, buffer *hdrs); 49 handler_t http_response_read(request_st *r, http_response_opts *opts, buffer *b, fdnode *fdn); 50 51 __attribute_cold__ 52 handler_t http_response_reqbody_read_error(request_st *r, int http_status); 53 54 int http_response_buffer_append_authority(request_st *r, buffer *o); 55 int http_response_redirect_to_directory(request_st *r, int status); 56 int http_response_handle_cachable(request_st *r, const buffer *mtime); 57 void http_response_body_clear(request_st *r, int preserve_length); 58 void http_response_reset(request_st *r); 59 void http_response_send_file (request_st *r, buffer *path); 60 void http_response_backend_done (request_st *r); 61 void http_response_backend_error (request_st *r); 62 void http_response_upgrade_read_body_unknown(request_st *r); 63 64 __attribute_cold__ 65 int http_response_omit_header(request_st *r, const data_string *ds); 66 67 void http_response_write_header(request_st *r); 68 handler_t http_response_handler(request_st *r); 69 70 __attribute_cold__ 71 void strftime_cache_reset(void); 72 73 const buffer * strftime_cache_get(time_t last_mod); 74 #endif 75