Translates incoming SPDY requests to http server on localhost. Uses libcurl. No error handling for curl requests. TODO:
#include "platform.h"
#include <unistd.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include <stdio.h>
#include <ctype.h>
#include <errno.h>
#include "microspdy.h"
#include <curl/curl.h>
#include <assert.h>
#include <getopt.h>
#include <regex.h>
Go to the source code of this file.
Defines | |
#define | ERROR_RESPONSE "502 Bad Gateway" |
#define | PRINT_INFO(msg) |
#define | PRINT_INFO2(fmt,...) |
#define | PRINT_VERBOSE(msg) |
#define | PRINT_VERBOSE2(fmt,...) |
#define | CURL_SETOPT(handle, opt, val) |
#define | DIE(msg) |
Functions | |
static void | free_uri (struct URI *uri) |
static int | init_parse_uri (regex_t *preg) |
static void | deinit_parse_uri (regex_t *preg) |
static int | parse_uri (regex_t *preg, const char *full_uri, struct URI **uri) |
static bool | store_in_buffer (const void *src, size_t src_size, void **dst, size_t *dst_size) |
static ssize_t | get_from_buffer (void **src, size_t *src_size, void *dst, size_t max_size) |
static void | catch_signal (int signal) |
static void | new_session_cb (void *cls, struct SPDY_Session *session) |
static void | session_closed_cb (void *cls, struct SPDY_Session *session, int by_client) |
static int | spdy_post_data_cb (void *cls, struct SPDY_Request *request, const void *buf, size_t size, bool more) |
ssize_t | response_callback (void *cls, void *buffer, size_t max, bool *more) |
static void | cleanup (struct Proxy *proxy) |
static void | response_done_callback (void *cls, struct SPDY_Response *response, struct SPDY_Request *request, enum SPDY_RESPONSE_RESULT status, bool streamopened) |
static size_t | curl_header_cb (void *ptr, size_t size, size_t nmemb, void *userp) |
static size_t | curl_write_cb (void *contents, size_t size, size_t nmemb, void *userp) |
static size_t | curl_read_cb (void *ptr, size_t size, size_t nmemb, void *userp) |
static int | iterate_cb (void *cls, const char *name, const char *const *value, int num_values) |
static void | standard_request_handler (void *cls, struct SPDY_Request *request, uint8_t priority, const char *method, const char *path, const char *version, const char *host, const char *scheme, struct SPDY_NameValue *headers, bool more) |
static int | run () |
Variables | |
struct global_options | glob_opt |
static int | loop = 1 |
static CURLM * | multi_handle |
static int | still_running = 0 |
static regex_t | uri_preg |
static bool | call_spdy_run |
static bool | call_curl_run |
int | debug_num_curls |
Translates incoming SPDY requests to http server on localhost. Uses libcurl. No error handling for curl requests. TODO:
Definition in file proxy.c.
#define CURL_SETOPT | ( | handle, | |||
opt, | |||||
val | ) |
do{\ int ret; \ if(CURLE_OK != (ret = curl_easy_setopt(handle, opt, val))) \ { \ PRINT_INFO2("curl_easy_setopt failed (%i = %i)", opt, ret); \ abort(); \ } \ }\ while(0)
Definition at line 126 of file proxy.c.
Referenced by standard_request_handler().
#define DIE | ( | msg | ) |
do{\ printf("FATAL ERROR (line %i): %s\n", __LINE__, msg);\ fflush(stdout);\ exit(EXIT_FAILURE);\ }\ while(0)
Definition at line 137 of file proxy.c.
Referenced by cleanup(), curl_header_cb(), iterate_cb(), new_session_cb(), run(), and standard_request_handler().
#define ERROR_RESPONSE "502 Bad Gateway" |
#define PRINT_INFO | ( | msg | ) |
do{\ fprintf(stdout, "%i:%s\n", __LINE__, msg);\ fflush(stdout);\ }\ while(0)
Definition at line 90 of file proxy.c.
Referenced by curl_read_cb(), curl_write_cb(), response_callback(), run(), spdy_post_data_cb(), and standard_request_handler().
#define PRINT_INFO2 | ( | fmt, | |||
... | ) |
do{\ fprintf(stdout, "%i\n", __LINE__);\ fprintf(stdout, fmt,##__VA_ARGS__);\ fprintf(stdout, "\n");\ fflush(stdout);\ }\ while(0)
Definition at line 97 of file proxy.c.
Referenced by cleanup(), curl_header_cb(), run(), spdy_post_data_cb(), and standard_request_handler().
#define PRINT_VERBOSE | ( | msg | ) |
do{\ if(glob_opt.verbose){\ fprintf(stdout, "%i:%s\n", __LINE__, msg);\ fflush(stdout);\ }\ }\ while(0)
Definition at line 106 of file proxy.c.
Referenced by curl_header_cb(), curl_read_cb(), curl_write_cb(), new_session_cb(), response_callback(), run(), and spdy_post_data_cb().
#define PRINT_VERBOSE2 | ( | fmt, | |||
... | ) |
do{\ if(glob_opt.verbose){\ fprintf(stdout, "%i\n", __LINE__);\ fprintf(stdout, fmt,##__VA_ARGS__);\ fprintf(stdout, "\n");\ fflush(stdout);\ }\ }\ while(0)
Definition at line 115 of file proxy.c.
Referenced by curl_header_cb(), curl_read_cb(), curl_write_cb(), iterate_cb(), response_callback(), run(), session_closed_cb(), spdy_post_data_cb(), and standard_request_handler().
static void catch_signal | ( | int | signal | ) | [static] |
static void cleanup | ( | struct Proxy * | proxy | ) | [static] |
Definition at line 483 of file proxy.c.
References debug_num_curls, DIE, multi_handle, and PRINT_INFO2.
Referenced by internal_add_connection(), response_done_callback(), and run().
static size_t curl_header_cb | ( | void * | ptr, | |
size_t | size, | |||
size_t | nmemb, | |||
void * | userp | |||
) | [static] |
Definition at line 528 of file proxy.c.
References call_spdy_run, DIE, NULL, PRINT_INFO2, PRINT_VERBOSE, PRINT_VERBOSE2, response_callback(), response_done_callback(), SPDY_build_response_with_callback(), SPDY_destroy_response(), SPDY_HTTP_HEADER_CONNECTION, SPDY_HTTP_HEADER_KEEP_ALIVE, SPDY_HTTP_HEADER_TRANSFER_ENCODING, SPDY_name_value_add(), SPDY_name_value_destroy(), SPDY_name_value_lookup(), SPDY_queue_response(), and SPDY_YES.
Referenced by standard_request_handler().
static size_t curl_read_cb | ( | void * | ptr, | |
size_t | size, | |||
size_t | nmemb, | |||
void * | userp | |||
) | [static] |
Definition at line 727 of file proxy.c.
References get_from_buffer(), PRINT_INFO, PRINT_VERBOSE, and PRINT_VERBOSE2.
Referenced by standard_request_handler().
static size_t curl_write_cb | ( | void * | contents, | |
size_t | size, | |||
size_t | nmemb, | |||
void * | userp | |||
) | [static] |
Definition at line 683 of file proxy.c.
References call_spdy_run, PRINT_INFO, PRINT_VERBOSE, PRINT_VERBOSE2, and store_in_buffer().
Referenced by standard_request_handler().
static void deinit_parse_uri | ( | regex_t * | preg | ) | [static] |
static void free_uri | ( | struct URI * | uri | ) | [static] |
Definition at line 189 of file proxy.c.
References NULL.
Referenced by parse_uri(), and standard_request_handler().
static ssize_t get_from_buffer | ( | void ** | src, | |
size_t * | src_size, | |||
void * | dst, | |||
size_t | max_size | |||
) | [static] |
Definition at line 332 of file proxy.c.
References NULL.
Referenced by curl_read_cb(), and response_callback().
static int init_parse_uri | ( | regex_t * | preg | ) | [static] |
static int iterate_cb | ( | void * | cls, | |
const char * | name, | |||
const char *const * | value, | |||
int | num_values | |||
) | [static] |
Definition at line 790 of file proxy.c.
References DIE, NULL, PRINT_VERBOSE2, and SPDY_YES.
Referenced by standard_request_handler().
static void new_session_cb | ( | void * | cls, | |
struct SPDY_Session * | session | |||
) | [static] |
Definition at line 367 of file proxy.c.
References DIE, NULL, PRINT_VERBOSE, and SPDY_set_cls_to_session().
Referenced by run().
static int parse_uri | ( | regex_t * | preg, | |
const char * | full_uri, | |||
struct URI ** | uri | |||
) | [static] |
Definition at line 233 of file proxy.c.
References free_uri(), and NULL.
Referenced by standard_request_handler().
ssize_t response_callback | ( | void * | cls, | |
void * | buffer, | |||
size_t | max, | |||
bool * | more | |||
) |
Definition at line 441 of file proxy.c.
References get_from_buffer(), PRINT_INFO, PRINT_VERBOSE, and PRINT_VERBOSE2.
Referenced by curl_header_cb().
static void response_done_callback | ( | void * | cls, | |
struct SPDY_Response * | response, | |||
struct SPDY_Request * | request, | |||
enum SPDY_RESPONSE_RESULT | status, | |||
bool | streamopened | |||
) | [static] |
Definition at line 506 of file proxy.c.
References cleanup(), NULL, SPDY_destroy_request(), SPDY_destroy_response(), and SPDY_RESPONSE_RESULT_SUCCESS.
Referenced by curl_header_cb(), and run().
static int run | ( | ) | [static] |
Definition at line 972 of file proxy.c.
References call_curl_run, call_spdy_run, catch_signal(), cleanup(), debug_num_curls, deinit_parse_uri(), DIE, ERROR_RESPONSE, glob_opt, init_parse_uri(), loop, multi_handle, new_session_cb(), NULL, PRINT_INFO, PRINT_INFO2, PRINT_VERBOSE, PRINT_VERBOSE2, response_done_callback(), session_closed_cb(), SPDY_build_response(), SPDY_DAEMON_FLAG_NO, SPDY_DAEMON_FLAG_NO_DELAY, SPDY_DAEMON_OPTION_END, SPDY_DAEMON_OPTION_FLAGS, SPDY_DAEMON_OPTION_IO_SUBSYSTEM, SPDY_DAEMON_OPTION_SESSION_TIMEOUT, SPDY_DAEMON_OPTION_SOCK_ADDR, SPDY_deinit(), SPDY_destroy_request(), SPDY_destroy_response(), SPDY_get_fdset(), SPDY_get_timeout(), SPDY_HTTP_BAD_GATEWAY, SPDY_HTTP_VERSION_1_1, SPDY_init, SPDY_IO_SUBSYSTEM_OPENSSL, SPDY_IO_SUBSYSTEM_RAW, SPDY_name_value_destroy(), SPDY_NO, spdy_post_data_cb(), SPDY_queue_response(), SPDY_run(), SPDY_start_daemon(), SPDY_stop_daemon(), SPDY_YES, standard_request_handler(), still_running, and uri_preg.
static void session_closed_cb | ( | void * | cls, | |
struct SPDY_Session * | session, | |||
int | by_client | |||
) | [static] |
Definition at line 386 of file proxy.c.
References NULL, PRINT_VERBOSE2, and SPDY_get_cls_from_session().
Referenced by run().
static int spdy_post_data_cb | ( | void * | cls, | |
struct SPDY_Request * | request, | |||
const void * | buf, | |||
size_t | size, | |||
bool | more | |||
) | [static] |
Definition at line 404 of file proxy.c.
References call_curl_run, PRINT_INFO, PRINT_INFO2, PRINT_VERBOSE, PRINT_VERBOSE2, SPDY_get_cls_from_request(), SPDY_YES, and store_in_buffer().
Referenced by run().
static void standard_request_handler | ( | void * | cls, | |
struct SPDY_Request * | request, | |||
uint8_t | priority, | |||
const char * | method, | |||
const char * | path, | |||
const char * | version, | |||
const char * | host, | |||
const char * | scheme, | |||
struct SPDY_NameValue * | headers, | |||
bool | more | |||
) | [static] |
Definition at line 830 of file proxy.c.
References call_curl_run, curl_header_cb(), curl_read_cb(), CURL_SETOPT, curl_write_cb(), debug_num_curls, DIE, free_uri(), glob_opt, iterate_cb(), multi_handle, NULL, parse_uri(), PRINT_INFO, PRINT_INFO2, PRINT_VERBOSE2, SPDY_get_cls_from_request(), SPDY_get_cls_from_session(), SPDY_get_session_for_request(), SPDY_HTTP_METHOD_POST, SPDY_name_value_create(), SPDY_name_value_iterate(), SPDY_set_cls_to_request(), still_running, and uri_preg.
Referenced by run().
static bool store_in_buffer | ( | const void * | src, | |
size_t | src_size, | |||
void ** | dst, | |||
size_t * | dst_size | |||
) | [static] |
Definition at line 312 of file proxy.c.
References NULL.
Referenced by curl_write_cb(), and spdy_post_data_cb().
bool call_curl_run [static] |
Definition at line 154 of file proxy.c.
Referenced by run(), spdy_post_data_cb(), and standard_request_handler().
bool call_spdy_run [static] |
Definition at line 153 of file proxy.c.
Referenced by curl_header_cb(), curl_write_cb(), and run().
int debug_num_curls |
Definition at line 156 of file proxy.c.
Referenced by cleanup(), run(), and standard_request_handler().
struct global_options glob_opt |
Referenced by run(), and standard_request_handler().
int loop = 1 [static] |
Definition at line 145 of file proxy.c.
Referenced by catch_signal(), and run().
CURLM* multi_handle [static] |
Definition at line 147 of file proxy.c.
Referenced by cleanup(), run(), and standard_request_handler().
int still_running = 0 [static] |
Definition at line 149 of file proxy.c.
Referenced by run(), and standard_request_handler().
regex_t uri_preg [static] |
Definition at line 151 of file proxy.c.
Referenced by run(), and standard_request_handler().