Nick Hengeveld | 29508e1 | 2005-11-18 11:02:58 -0800 | [diff] [blame] | 1 | #ifndef HTTP_H |
| 2 | #define HTTP_H |
| 3 | |
| 4 | #include "cache.h" |
| 5 | |
| 6 | #include <curl/curl.h> |
| 7 | #include <curl/easy.h> |
| 8 | |
Mike Hommey | 028c297 | 2007-12-09 20:30:59 +0100 | [diff] [blame] | 9 | #include "strbuf.h" |
| 10 | |
Alexandre Julliard | 9cf0430 | 2007-05-02 14:53:23 +0200 | [diff] [blame] | 11 | #if LIBCURL_VERSION_NUM >= 0x071000 |
Nick Hengeveld | 29508e1 | 2005-11-18 11:02:58 -0800 | [diff] [blame] | 12 | #define USE_CURL_MULTI |
| 13 | #define DEFAULT_MAX_REQUESTS 5 |
| 14 | #endif |
| 15 | |
| 16 | #if LIBCURL_VERSION_NUM < 0x070704 |
| 17 | #define curl_global_cleanup() do { /* nothing */ } while(0) |
| 18 | #endif |
| 19 | #if LIBCURL_VERSION_NUM < 0x070800 |
| 20 | #define curl_global_init(a) do { /* nothing */ } while(0) |
| 21 | #endif |
| 22 | |
Junio C Hamano | 500ebb0 | 2006-12-27 13:59:26 -0800 | [diff] [blame] | 23 | #if (LIBCURL_VERSION_NUM < 0x070c04) || (LIBCURL_VERSION_NUM == 0x071000) |
Nick Hengeveld | 29508e1 | 2005-11-18 11:02:58 -0800 | [diff] [blame] | 24 | #define NO_CURL_EASY_DUPHANDLE |
| 25 | #endif |
| 26 | |
Art Haas | c774b2d | 2006-09-19 07:20:19 -0500 | [diff] [blame] | 27 | #if LIBCURL_VERSION_NUM < 0x070a03 |
| 28 | #define CURLE_HTTP_RETURNED_ERROR CURLE_HTTP_NOT_FOUND |
| 29 | #endif |
| 30 | |
Nick Hengeveld | c8568e1 | 2006-01-31 11:06:55 -0800 | [diff] [blame] | 31 | struct slot_results |
| 32 | { |
| 33 | CURLcode curl_result; |
| 34 | long http_code; |
| 35 | }; |
| 36 | |
Nick Hengeveld | 29508e1 | 2005-11-18 11:02:58 -0800 | [diff] [blame] | 37 | struct active_request_slot |
| 38 | { |
| 39 | CURL *curl; |
| 40 | FILE *local; |
| 41 | int in_use; |
| 42 | CURLcode curl_result; |
| 43 | long http_code; |
Nick Hengeveld | baa7b67 | 2006-03-10 20:18:01 -0800 | [diff] [blame] | 44 | int *finished; |
Nick Hengeveld | c8568e1 | 2006-01-31 11:06:55 -0800 | [diff] [blame] | 45 | struct slot_results *results; |
Nick Hengeveld | 29508e1 | 2005-11-18 11:02:58 -0800 | [diff] [blame] | 46 | void *callback_data; |
| 47 | void (*callback_func)(void *data); |
| 48 | struct active_request_slot *next; |
| 49 | }; |
| 50 | |
| 51 | struct buffer |
| 52 | { |
Mike Hommey | 028c297 | 2007-12-09 20:30:59 +0100 | [diff] [blame] | 53 | struct strbuf buf; |
| 54 | size_t posn; |
Nick Hengeveld | 29508e1 | 2005-11-18 11:02:58 -0800 | [diff] [blame] | 55 | }; |
| 56 | |
| 57 | /* Curl request read/write callbacks */ |
| 58 | extern size_t fread_buffer(void *ptr, size_t eltsize, size_t nmemb, |
| 59 | struct buffer *buffer); |
| 60 | extern size_t fwrite_buffer(const void *ptr, size_t eltsize, |
Mike Hommey | 028c297 | 2007-12-09 20:30:59 +0100 | [diff] [blame] | 61 | size_t nmemb, struct strbuf *buffer); |
Nick Hengeveld | 29508e1 | 2005-11-18 11:02:58 -0800 | [diff] [blame] | 62 | extern size_t fwrite_null(const void *ptr, size_t eltsize, |
Mike Hommey | 028c297 | 2007-12-09 20:30:59 +0100 | [diff] [blame] | 63 | size_t nmemb, struct strbuf *buffer); |
Nick Hengeveld | 29508e1 | 2005-11-18 11:02:58 -0800 | [diff] [blame] | 64 | |
| 65 | /* Slot lifecycle functions */ |
| 66 | extern struct active_request_slot *get_active_slot(void); |
| 67 | extern int start_active_slot(struct active_request_slot *slot); |
| 68 | extern void run_active_slot(struct active_request_slot *slot); |
| 69 | extern void finish_all_active_slots(void); |
Mark Wooding | 53f3138 | 2006-02-07 10:07:39 +0000 | [diff] [blame] | 70 | extern void release_active_slot(struct active_request_slot *slot); |
Nick Hengeveld | 29508e1 | 2005-11-18 11:02:58 -0800 | [diff] [blame] | 71 | |
| 72 | #ifdef USE_CURL_MULTI |
| 73 | extern void fill_active_slots(void); |
Daniel Barkalow | fc57b6a | 2007-09-10 23:02:34 -0400 | [diff] [blame] | 74 | extern void add_fill_function(void *data, int (*fill)(void *)); |
Nick Hengeveld | 29508e1 | 2005-11-18 11:02:58 -0800 | [diff] [blame] | 75 | extern void step_active_slots(void); |
| 76 | #endif |
| 77 | |
| 78 | extern void http_init(void); |
| 79 | extern void http_cleanup(void); |
| 80 | |
| 81 | extern int data_received; |
| 82 | extern int active_requests; |
| 83 | |
Nick Hengeveld | 29508e1 | 2005-11-18 11:02:58 -0800 | [diff] [blame] | 84 | extern char curl_errorstr[CURL_ERROR_SIZE]; |
| 85 | |
Mike Hommey | e8dc37e | 2007-12-10 22:36:09 +0100 | [diff] [blame] | 86 | static inline int missing__target(int code, int result) |
| 87 | { |
| 88 | return /* file:// URL -- do we ever use one??? */ |
| 89 | (result == CURLE_FILE_COULDNT_READ_FILE) || |
| 90 | /* http:// and https:// URL */ |
| 91 | (code == 404 && result == CURLE_HTTP_RETURNED_ERROR) || |
| 92 | /* ftp:// URL */ |
| 93 | (code == 550 && result == CURLE_FTP_COULDNT_RETR_FILE) |
| 94 | ; |
| 95 | } |
| 96 | |
| 97 | #define missing_target(a) missing__target((a)->http_code, (a)->curl_result) |
| 98 | |
Mike Hommey | d7e9280 | 2007-12-11 00:08:25 +0100 | [diff] [blame] | 99 | extern int http_fetch_ref(const char *base, const char *ref, unsigned char *sha1); |
| 100 | |
Nick Hengeveld | 29508e1 | 2005-11-18 11:02:58 -0800 | [diff] [blame] | 101 | #endif /* HTTP_H */ |