Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100644 193 lines (160 sloc) 5.177 kb
29508e1 Isolate shared HTTP request functionality
Nick Hengeveld authored
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
028c297 @glandium Use strbuf in http code
glandium authored
9 #include "strbuf.h"
9fc6440 @glandium Set proxy override with http_init()
glandium authored
10 #include "remote.h"
028c297 @glandium Use strbuf in http code
glandium authored
11
4f5f998 @gitster Clarify that http-push being temporarily disabled with older cURL
gitster authored
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
9cf0430 @julliard http-fetch: Disable use of curl multi support for libcurl < 7.16.
julliard authored
20 #if LIBCURL_VERSION_NUM >= 0x071000
29508e1 Isolate shared HTTP request functionality
Nick Hengeveld authored
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
500ebb0 Work around http-fetch built with cURL 7.16.0
Junio C Hamano authored
32 #if (LIBCURL_VERSION_NUM < 0x070c04) || (LIBCURL_VERSION_NUM == 0x071000)
29508e1 Isolate shared HTTP request functionality
Nick Hengeveld authored
33 #define NO_CURL_EASY_DUPHANDLE
34 #endif
35
c774b2d Patch for http-fetch.c and older curl releases
Art Haas authored
36 #if LIBCURL_VERSION_NUM < 0x070a03
37 #define CURLE_HTTP_RETURNED_ERROR CURLE_HTTP_NOT_FOUND
38 #endif
39
3944ba0 @mstorsjo Allow curl to rewind the read buffers
mstorsjo authored
40 #if LIBCURL_VERSION_NUM < 0x070c03
41 #define NO_CURL_IOCTL
42 #endif
43
c8568e1 Fix HTTP request result processing after slot reuse
Nick Hengeveld authored
44 struct slot_results
45 {
46 CURLcode curl_result;
47 long http_code;
48 };
49
29508e1 Isolate shared HTTP request functionality
Nick Hengeveld authored
50 struct active_request_slot
51 {
52 CURL *curl;
53 FILE *local;
54 int in_use;
55 CURLcode curl_result;
56 long http_code;
baa7b67 HTTP slot reuse fixes
Nick Hengeveld authored
57 int *finished;
c8568e1 Fix HTTP request result processing after slot reuse
Nick Hengeveld authored
58 struct slot_results *results;
29508e1 Isolate shared HTTP request functionality
Nick Hengeveld authored
59 void *callback_data;
60 void (*callback_func)(void *data);
61 struct active_request_slot *next;
62 };
63
64 struct buffer
65 {
028c297 @glandium Use strbuf in http code
glandium authored
66 struct strbuf buf;
67 size_t posn;
29508e1 Isolate shared HTTP request functionality
Nick Hengeveld authored
68 };
69
70 /* Curl request read/write callbacks */
f444e52 @gitster Work around gcc warnings from curl headers
gitster authored
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);
3944ba0 @mstorsjo Allow curl to rewind the read buffers
mstorsjo authored
74 #ifndef NO_CURL_IOCTL
75 extern curlioerr ioctl_buffer(CURL *handle, int cmd, void *clientp);
76 #endif
29508e1 Isolate shared HTTP request functionality
Nick Hengeveld authored
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);
de1a2fd @spearce Smart push over HTTP: client side
spearce authored
82 extern void finish_active_slot(struct active_request_slot *slot);
29508e1 Isolate shared HTTP request functionality
Nick Hengeveld authored
83 extern void finish_all_active_slots(void);
84
85 #ifdef USE_CURL_MULTI
86 extern void fill_active_slots(void);
fc57b6a Make function to refill http queue a callback
Daniel Barkalow authored
87 extern void add_fill_function(void *data, int (*fill)(void *));
29508e1 Isolate shared HTTP request functionality
Nick Hengeveld authored
88 extern void step_active_slots(void);
89 #endif
90
9fc6440 @glandium Set proxy override with http_init()
glandium authored
91 extern void http_init(struct remote *remote);
29508e1 Isolate shared HTTP request functionality
Nick Hengeveld authored
92 extern void http_cleanup(void);
93
94 extern int data_received;
95 extern int active_requests;
e917674 @rctay http*: move common variables and macros to http.[ch]
rctay authored
96 extern int http_is_verbose;
de1a2fd @spearce Smart push over HTTP: client side
spearce authored
97 extern size_t http_post_buffer;
29508e1 Isolate shared HTTP request functionality
Nick Hengeveld authored
98
99 extern char curl_errorstr[CURL_ERROR_SIZE];
100
e8dc37e @glandium Avoid redundant declaration of missing_target()
glandium authored
101 static inline int missing__target(int code, int result)
102 {
103 return /* file:// URL -- do we ever use one??? */
104 (result == CURLE_FILE_COULDNT_READ_FILE) ||
105 /* http:// and https:// URL */
106 (code == 404 && result == CURLE_HTTP_RETURNED_ERROR) ||
107 /* ftp:// URL */
108 (code == 550 && result == CURLE_FTP_COULDNT_RETR_FILE)
109 ;
110 }
111
112 #define missing_target(a) missing__target((a)->http_code, (a)->curl_result)
113
5424bc5 @rctay http*: add helper methods for fetching objects (loose)
rctay authored
114 /* Helpers for modifying and creating URLs */
115 extern void append_remote_object_url(struct strbuf *buf, const char *url,
116 const char *hex,
117 int only_two_digit_prefix);
118 extern char *get_remote_object_url(const char *url, const char *hex,
119 int only_two_digit_prefix);
120
e929cd2 @glandium http.c: new functions for the http API
glandium authored
121 /* Options for http_request_*() */
122 #define HTTP_NO_CACHE 1
123
124 /* Return values for http_request_*() */
125 #define HTTP_OK 0
126 #define HTTP_MISSING_TARGET 1
127 #define HTTP_ERROR 2
128 #define HTTP_START_FAILED 3
129
130 /*
131 * Requests an url and stores the result in a strbuf.
132 *
133 * If the result pointer is NULL, a HTTP HEAD request is made instead of GET.
134 */
135 int http_get_strbuf(const char *url, struct strbuf *result, int options);
136
137 /*
138 * Prints an error message using error() containing url and curl_errorstr,
139 * and returns ret.
140 */
141 int http_error(const char *url, int ret);
142
c13b263 Make walker.fetch_ref() take a struct ref.
Daniel Barkalow authored
143 extern int http_fetch_ref(const char *base, struct ref *ref);
d7e9280 @glandium Move fetch_ref from http-push.c and http-walker.c to http.c
glandium authored
144
b8caac2 @rctay http*: add http_get_info_packs
rctay authored
145 /* Helpers for fetching packs */
146 extern int http_get_info_packs(const char *base_url,
147 struct packed_git **packs_head);
148
2264dfa @rctay http*: add helper methods for fetching packs
rctay authored
149 struct http_pack_request
150 {
151 char *url;
152 struct packed_git *target;
153 struct packed_git **lst;
154 FILE *packfile;
155 char filename[PATH_MAX];
156 char tmpfile[PATH_MAX];
157 struct curl_slist *range_header;
158 struct active_request_slot *slot;
159 };
160
161 extern struct http_pack_request *new_http_pack_request(
162 struct packed_git *target, const char *base_url);
163 extern int finish_http_pack_request(struct http_pack_request *preq);
164 extern void release_http_pack_request(struct http_pack_request *preq);
165
5424bc5 @rctay http*: add helper methods for fetching objects (loose)
rctay authored
166 /* Helpers for fetching object */
167 struct http_object_request
168 {
169 char *url;
170 char filename[PATH_MAX];
171 char tmpfile[PATH_MAX];
172 int localfile;
173 CURLcode curl_result;
174 char errorstr[CURL_ERROR_SIZE];
175 long http_code;
176 unsigned char sha1[20];
177 unsigned char real_sha1[20];
178 git_SHA_CTX c;
179 z_stream stream;
180 int zret;
181 int rename;
182 struct active_request_slot *slot;
183 };
184
185 extern struct http_object_request *new_http_object_request(
186 const char *base_url, unsigned char *sha1);
187 extern void process_http_object_request(struct http_object_request *freq);
188 extern int finish_http_object_request(struct http_object_request *freq);
189 extern void abort_http_object_request(struct http_object_request *freq);
190 extern void release_http_object_request(struct http_object_request *freq);
191
29508e1 Isolate shared HTTP request functionality
Nick Hengeveld authored
192 #endif /* HTTP_H */
Something went wrong with that request. Please try again.