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
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 );
|
|
|