/* WebROaR - Ruby Application Server - http://webroar.in/ * Copyright (C) 2009 Goonj LLC * * This file is part of WebROaR. * * WebROaR is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * WebROaR is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with WebROaR. If not, see . */ #ifndef WR_REQUEST_H_ #define WR_REQUEST_H_ #include #define WR_RESP_BUF_SIZE 1024*64 /** Request structure */ struct wr_req_s { ebb_request *ebb_req; /**< Ebb request */ wr_conn_t *conn; /**< Pointer to Connection */ wr_app_t *app; /**< Application pointer */ wr_wkr_t *wkr; /**< Worker pointer */ wr_u_int id; /**< req id */ /**< flags */ short conn_err; short using_wkr; /**< variable used by the request */ FILE *upload_file; /**< File pointer to store request body */ wr_buffer_t *upload_file_name; /**< File name */ wr_str_t req_uri, req_path, req_query_str, req_fragment; size_t bytes_sent; scgi_t *scgi; /**< SCGI request */ /**< variable used by the response */ char resp_buf[WR_RESP_BUF_SIZE]; /**< Buffer to read processed response from 'webroar-worker' */ size_t resp_buf_len; /**< Response buffer length */ wr_u_short resp_code; size_t resp_body_len; size_t bytes_received; }; /** Create new Request */ wr_req_t* wr_req_new(wr_conn_t*); /** Destroy Request */ void wr_req_free(wr_req_t*); /** Add Request body */ int wr_req_body_add(wr_req_t*, const char*, size_t); /** Invalid request */ void wr_req_invalid(wr_conn_t *, wr_resp_status_t); /** Allocates and initializes ab ebb_request */ ebb_request* wr_new_req_cb(ebb_connection*); /**************************/ /** Dispatch a pending message to free worker */ #define WR_APP_MSG_DISPATCH(app, req, worker) \ void *_w=NULL,*_r=NULL;\ if(app->q_messages->q_count > 0 && app->q_free_workers->q_count > 0){\ WR_QUEUE_FETCH(app->q_free_workers, _w)\ WR_QUEUE_FETCH(app->q_messages, _r)}\ req = (wr_req_t*) _r;\ worker = (wr_wkr_t*) _w; /**** Private macros */ #define WR_EBB_REQ_PATH "REQUEST_PATH" #define WR_EBB_REQ_PATH_LEN 12 #define WR_EBB_QUERY_STR "QUERY_STRING" #define WR_EBB_QUERY_STR_LEN 12 #define WR_EBB_REQ_URI "REQUEST_URI" #define WR_EBB_REQ_URI_LEN 11 #define WR_EBB_FRAGMENT "FRAGMENT" #define WR_EBB_FRAGMENT_LEN 8 #define WR_EBB_CHUNKED "CHUNKED" #define WR_EBB_CHUNKED_LEN 7 #define WR_EBB_REQ_METHOD "REQUEST_METHOD" #define WR_EBB_REQ_METHOD_LEN 14 #define WR_EBB_REQ_METHOD_COPY "COPY" #define WR_EBB_REQ_METHOD_COPY_LEN 4 #define WR_EBB_REQ_METHOD_DELETE "DELETE" #define WR_EBB_REQ_METHOD_DELETE_LEN 6 #define WR_EBB_REQ_METHOD_GET "GET" #define WR_EBB_REQ_METHOD_GET_LEN 3 #define WR_EBB_REQ_METHOD_HEAD "HEAD" #define WR_EBB_REQ_METHOD_HEAD_LEN 4 #define WR_EBB_REQ_METHOD_LOCK "LOCK" #define WR_EBB_REQ_METHOD_LOCK_LEN 4 #define WR_EBB_REQ_METHOD_MKCOL "MKCOL" #define WR_EBB_REQ_METHOD_MKCOL_LEN 5 #define WR_EBB_REQ_METHOD_MOVE "MOVE" #define WR_EBB_REQ_METHOD_MOVE_LEN 4 #define WR_EBB_REQ_METHOD_OPTIONS "OPTIONS" #define WR_EBB_REQ_METHOD_OPTIONS_LEN 7 #define WR_EBB_REQ_METHOD_POST "POST" #define WR_EBB_REQ_METHOD_POST_LEN 4 #define WR_EBB_REQ_METHOD_PROPFIND "PROPFIND" #define WR_EBB_REQ_METHOD_PROPFIND_LEN 8 #define WR_EBB_REQ_METHOD_PROPPATCH "PROPPATCH" #define WR_EBB_REQ_METHOD_PROPPATCH_LEN 9 #define WR_EBB_REQ_METHOD_PUT "PUT" #define WR_EBB_REQ_METHOD_PUT_LEN 3 #define WR_EBB_REQ_METHOD_TRACE "TRACE" #define WR_EBB_REQ_METHOD_TRACE_LEN 5 #define WR_EBB_REQ_METHOD_UNLOCK "UNLOCK" #define WR_EBB_REQ_METHOD_UNLOCK_LEN 6 #define WR_EBB_SVR_PORT "SERVER_PORT" #define WR_EBB_SVR_PORT_LEN 11 #define WR_EBB_HTTP_CLI_IP "REMOTE_ADDR" #define WR_EBB_HTTP_CLI_IP_LEN 11 #define WR_EBB_HTTP_VER "HTTP_VERSION" #define WR_EBB_HTTP_VER_LEN 12 #ifdef HAVE_GNUTLS #define WR_EBB_HTTPS_HEADER "HTTPS" #define WR_EBB_HTTPS_HEADER_LEN 5 #endif #endif /*WR_REQUEST_H_*/