From 29508e1efb8d5a18f78ca0f9be45fdde49ef6b76 Mon Sep 17 00:00:00 2001 From: Nick Hengeveld Date: Fri, 18 Nov 2005 11:02:58 -0800 Subject: Isolate shared HTTP request functionality Move shared HTTP request functionality out of http-fetch and http-push, and replace the two fwrite_buffer/fwrite_buffer_dynamic functions with one fwrite_buffer function that does dynamic buffering. Use slot callbacks to process responses to fetch object transfer requests and push transfer requests, and put all of http-push into an #ifdef check for curl multi support. Signed-off-by: Nick Hengeveld Signed-off-by: Junio C Hamano --- http.h | 95 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 http.h (limited to 'http.h') diff --git a/http.h b/http.h new file mode 100644 index 0000000000..ed4ea3340e --- /dev/null +++ b/http.h @@ -0,0 +1,95 @@ +#ifndef HTTP_H +#define HTTP_H + +#include "cache.h" + +#include +#include + +#if LIBCURL_VERSION_NUM >= 0x070908 +#define USE_CURL_MULTI +#define DEFAULT_MAX_REQUESTS 5 +#endif + +#if LIBCURL_VERSION_NUM < 0x070704 +#define curl_global_cleanup() do { /* nothing */ } while(0) +#endif +#if LIBCURL_VERSION_NUM < 0x070800 +#define curl_global_init(a) do { /* nothing */ } while(0) +#endif + +#if LIBCURL_VERSION_NUM < 0x070c04 +#define NO_CURL_EASY_DUPHANDLE +#endif + +struct active_request_slot +{ + CURL *curl; + FILE *local; + int in_use; + CURLcode curl_result; + long http_code; + void *callback_data; + void (*callback_func)(void *data); + struct active_request_slot *next; +}; + +struct buffer +{ + size_t posn; + size_t size; + void *buffer; +}; + +/* Curl request read/write callbacks */ +extern size_t fread_buffer(void *ptr, size_t eltsize, size_t nmemb, + struct buffer *buffer); +extern size_t fwrite_buffer(const void *ptr, size_t eltsize, + size_t nmemb, struct buffer *buffer); +extern size_t fwrite_null(const void *ptr, size_t eltsize, + size_t nmemb, struct buffer *buffer); + +/* Slot lifecycle functions */ +extern struct active_request_slot *get_active_slot(void); +extern int start_active_slot(struct active_request_slot *slot); +extern void run_active_slot(struct active_request_slot *slot); +extern void finish_all_active_slots(void); + +#ifdef USE_CURL_MULTI +extern void fill_active_slots(void); +extern void step_active_slots(void); +#endif + +extern void http_init(void); +extern void http_cleanup(void); + +extern int data_received; +extern int active_requests; + +#ifdef USE_CURL_MULTI +extern int max_requests; +extern CURLM *curlm; +#endif +#ifndef NO_CURL_EASY_DUPHANDLE +extern CURL *curl_default; +#endif +extern char curl_errorstr[CURL_ERROR_SIZE]; + +extern int curl_ssl_verify; +extern char *ssl_cert; +#if LIBCURL_VERSION_NUM >= 0x070902 +extern char *ssl_key; +#endif +#if LIBCURL_VERSION_NUM >= 0x070908 +extern char *ssl_capath; +#endif +extern char *ssl_cainfo; +extern long curl_low_speed_limit; +extern long curl_low_speed_time; + +extern struct curl_slist *pragma_header; +extern struct curl_slist *no_range_header; + +extern struct active_request_slot *active_queue_head; + +#endif /* HTTP_H */ -- cgit v1.2.3