You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

68 lines
3.2 KiB
C

#pragma once
#include <ucontext.h>
#include <stdbool.h>
#include <stdio.h>
#include <time.h>
#include "header.h"
struct http_request;
typedef void (*http_server_handler)( struct http_request*, void* handler_data );
struct collection;
// Construct/deconstruct
struct http_request* http_request_new( ucontext_t* main, int sock, const char* remote_addr, http_server_handler handler, void* handler_data );
void http_request_release( struct http_request* req );
// Debuging
void http_request_set_debug( struct http_request* req, bool debug );
// Request linked list handling
void http_request_append_list_front( struct http_request* req, struct http_request** list_head );
int http_request_clear_completed_at( struct http_request** list_head );
int http_request_clear_completed( struct http_request* req );
struct http_request* http_request_get_next( struct http_request* req );
// Raw data handling
char* http_request_read_line( struct http_request* req );
// Request data access
const char* http_request_get_remote_host_address( struct http_request* req );
const char* http_request_get_header( struct http_request* req, const char* header );
void http_request_copy_headers( struct http_request* req, struct collection dst );
// Response handling
void http_request_send_headers( struct http_request* req, int status_code, const char* content_type, bool chunked );
void http_request_begin_send_headers( struct http_request* req, int status_code, bool chunked );
void http_request_send_header( struct http_request* req, const char* header, const char* value );
void http_request_send_header_last_modified( struct http_request* req, time_t t );
void http_request_end_send_headers( struct http_request* req, bool chunked );
void http_request_add_header( struct http_request* req, const char* header, const char* value );
FILE* http_request_get_response_body( struct http_request* req );
FILE* http_request_get_request_data( struct http_request* req );
bool http_request_send_file( struct http_request* req, const char* fs_path, const char* content_type );
// Path routing
const char* http_request_get_relative_path( struct http_request* req, const char* path );
bool http_request_route( struct http_request* req, const char* str );
bool http_request_route_term( struct http_request* req, const char* str );
bool http_request_route_method( struct http_request* req, const char* method );
char* http_request_route_get_dir( struct http_request* req );
char* http_request_route_get_dir_or_file( struct http_request* req );
const char* http_request_route_query_key( struct http_request* req );
const char* http_request_route_query_value( struct http_request* req );
const char* http_request_get_full_path( struct http_request* req );
const char* http_request_get_remaining_path( struct http_request* req );
void http_request_route_eat_path( struct http_request* req, int count );
// Run the request fiber
void http_request_process( struct http_request* req, ucontext_t* fallback );
// Pause the current request until a function call is completed in a worker thread
void http_request_call_async( void (*func)( void* ), void* data );
// Pause the current request until a non-blocking handler is completed
void http_request_call_nonblock( bool (*func)( void* ), void* data );