| 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 | |
| 9 | #include "strbuf.h" |
| 10 | #include "remote.h" |
| 11 | |
| 12 | /* |
| 13 | * We detect based on the cURL version if multi-transfer is |
| 14 | * usable in this implementation and define this symbol accordingly. |
| 15 | * This is not something Makefile should set nor users should pass |
| 16 | * via CFLAGS. |
| 17 | */ |
| 18 | #undef USE_CURL_MULTI |
| 19 | |
| 20 | #if LIBCURL_VERSION_NUM >= 0x071000 |
| 21 | #define USE_CURL_MULTI |
| 22 | #define DEFAULT_MAX_REQUESTS 5 |
| 23 | #endif |
| 24 | |
| 25 | #if LIBCURL_VERSION_NUM < 0x070704 |
| 26 | #define curl_global_cleanup() do { /* nothing */ } while(0) |
| 27 | #endif |
| 28 | #if LIBCURL_VERSION_NUM < 0x070800 |
| 29 | #define curl_global_init(a) do { /* nothing */ } while(0) |
| 30 | #endif |
| 31 | |
| 32 | #if (LIBCURL_VERSION_NUM < 0x070c04) || (LIBCURL_VERSION_NUM == 0x071000) |
| 33 | #define NO_CURL_EASY_DUPHANDLE |
| 34 | #endif |
| 35 | |
| 36 | #if LIBCURL_VERSION_NUM < 0x070a03 |
| 37 | #define CURLE_HTTP_RETURNED_ERROR CURLE_HTTP_NOT_FOUND |
| 38 | #endif |
| 39 | |
| 40 | #if LIBCURL_VERSION_NUM < 0x070c03 |
| 41 | #define NO_CURL_IOCTL |
| 42 | #endif |
| 43 | |
| 44 | struct slot_results |
| 45 | { |
| 46 | CURLcode curl_result; |
| 47 | long http_code; |
| 48 | }; |
| 49 | |
| 50 | struct active_request_slot |
| 51 | { |
| 52 | CURL *curl; |
| 53 | FILE *local; |
| 54 | int in_use; |
| 55 | CURLcode curl_result; |
| 56 | long http_code; |
| 57 | int *finished; |
| 58 | struct slot_results *results; |
| 59 | void *callback_data; |
| 60 | void (*callback_func)(void *data); |
| 61 | struct active_request_slot *next; |
| 62 | }; |
| 63 | |
| 64 | struct buffer |
| 65 | { |
| 66 | struct strbuf buf; |
| 67 | size_t posn; |
| 68 | }; |
| 69 | |
| 70 | /* Curl request read/write callbacks */ |
| 71 | extern size_t fread_buffer(void *ptr, size_t eltsize, size_t nmemb, void *strbuf); |
| 72 | extern size_t fwrite_buffer(const void *ptr, size_t eltsize, size_t nmemb, void *strbuf); |
| 73 | extern size_t fwrite_null(const void *ptr, size_t eltsize, size_t nmemb, void *strbuf); |
| 74 | #ifndef NO_CURL_IOCTL |
| 75 | extern curlioerr ioctl_buffer(CURL *handle, int cmd, void *clientp); |
| 76 | #endif |
| 77 | |
| 78 | /* Slot lifecycle functions */ |
| 79 | extern struct active_request_slot *get_active_slot(void); |
| 80 | extern int start_active_slot(struct active_request_slot *slot); |
| 81 | extern void run_active_slot(struct active_request_slot *slot); |
| 82 | extern void finish_all_active_slots(void); |
| 83 | extern void release_active_slot(struct active_request_slot *slot); |
| 84 | |
| 85 | #ifdef USE_CURL_MULTI |
| 86 | extern void fill_active_slots(void); |
| 87 | extern void add_fill_function(void *data, int (*fill)(void *)); |
| 88 | extern void step_active_slots(void); |
| 89 | #endif |
| 90 | |
| 91 | extern struct curl_slist *no_pragma_header; |
| 92 | |
| 93 | #define RANGE_HEADER_SIZE 30 |
| 94 | |
| 95 | extern void http_init(struct remote *remote); |
| 96 | extern void http_cleanup(void); |
| 97 | |
| 98 | extern int data_received; |
| 99 | extern int active_requests; |
| 100 | extern int http_is_verbose; |
| 101 | |
| 102 | extern char curl_errorstr[CURL_ERROR_SIZE]; |
| 103 | |
| 104 | static inline int missing__target(int code, int result) |
| 105 | { |
| 106 | return /* file:// URL -- do we ever use one??? */ |
| 107 | (result == CURLE_FILE_COULDNT_READ_FILE) || |
| 108 | /* http:// and https:// URL */ |
| 109 | (code == 404 && result == CURLE_HTTP_RETURNED_ERROR) || |
| 110 | /* ftp:// URL */ |
| 111 | (code == 550 && result == CURLE_FTP_COULDNT_RETR_FILE) |
| 112 | ; |
| 113 | } |
| 114 | |
| 115 | #define missing_target(a) missing__target((a)->http_code, (a)->curl_result) |
| 116 | |
| 117 | extern int http_fetch_ref(const char *base, struct ref *ref); |
| 118 | |
| 119 | #endif /* HTTP_H */ |