13 #define DEFAULT_MAX_REQUESTS 5
16 * CURLOPT_USE_SSL was known as CURLOPT_FTP_SSL up to 7.16.4,
17 * and the constants were known as CURLFTPSSL_*
19 #if !defined(CURLOPT_USE_SSL) && defined(CURLOPT_FTP_SSL)
20 #define CURLOPT_USE_SSL CURLOPT_FTP_SSL
21 #define CURLUSESSL_TRY CURLFTPSSL_TRY
28 long http_connectcode
;
31 struct active_request_slot
{
37 struct slot_results
*results
;
39 void (*callback_func
)(void *data
);
40 struct active_request_slot
*next
;
48 /* Curl request read/write callbacks */
49 size_t fread_buffer(char *ptr
, size_t eltsize
, size_t nmemb
, void *strbuf
);
50 size_t fwrite_buffer(char *ptr
, size_t eltsize
, size_t nmemb
, void *strbuf
);
51 size_t fwrite_null(char *ptr
, size_t eltsize
, size_t nmemb
, void *strbuf
);
52 curlioerr
ioctl_buffer(CURL
*handle
, int cmd
, void *clientp
);
54 /* Slot lifecycle functions */
55 struct active_request_slot
*get_active_slot(void);
56 int start_active_slot(struct active_request_slot
*slot
);
57 void run_active_slot(struct active_request_slot
*slot
);
58 void finish_all_active_slots(void);
61 * This will run one slot to completion in a blocking manner, similar to how
62 * curl_easy_perform would work (but we don't want to use that, because
63 * we do not want to intermingle calls to curl_multi and curl_easy).
66 int run_one_slot(struct active_request_slot
*slot
,
67 struct slot_results
*results
);
69 void fill_active_slots(void);
70 void add_fill_function(void *data
, int (*fill
)(void *));
71 void step_active_slots(void);
73 void http_init(struct remote
*remote
, const char *url
,
75 void http_cleanup(void);
76 struct curl_slist
*http_copy_default_headers(void);
78 extern long int git_curl_ipresolve
;
79 extern int active_requests
;
80 extern int http_is_verbose
;
81 extern ssize_t http_post_buffer
;
82 extern struct credential http_auth
;
84 extern char curl_errorstr
[CURL_ERROR_SIZE
];
86 enum http_follow_config
{
91 extern enum http_follow_config http_follow_config
;
93 static inline int missing__target(int code
, int result
)
95 return /* file:// URL -- do we ever use one??? */
96 (result
== CURLE_FILE_COULDNT_READ_FILE
) ||
97 /* http:// and https:// URL */
98 (code
== 404 && result
== CURLE_HTTP_RETURNED_ERROR
) ||
100 (code
== 550 && result
== CURLE_FTP_COULDNT_RETR_FILE
)
104 #define missing_target(a) missing__target((a)->http_code, (a)->curl_result)
107 * Normalize curl results to handle CURL_FAILONERROR (or lack thereof). Failing
108 * http codes have their "result" converted to CURLE_HTTP_RETURNED_ERROR, and
109 * an appropriate string placed in the errorstr buffer (pass curl_errorstr if
110 * you don't have a custom buffer).
112 void normalize_curl_result(CURLcode
*result
, long http_code
, char *errorstr
,
115 /* Helpers for modifying and creating URLs */
116 void append_remote_object_url(struct strbuf
*buf
, const char *url
,
118 int only_two_digit_prefix
);
119 char *get_remote_object_url(const char *url
, const char *hex
,
120 int only_two_digit_prefix
);
122 /* Options for http_get_*() */
123 struct http_get_options
{
127 /* If non-NULL, returns the content-type of the response. */
128 struct strbuf
*content_type
;
131 * If non-NULL, and content_type above is non-NULL, returns
132 * the charset parameter from the content-type. If none is
133 * present, returns an empty string.
135 struct strbuf
*charset
;
138 * If non-NULL, returns the URL we ended up at, including any
139 * redirects we followed.
141 struct strbuf
*effective_url
;
144 * If both base_url and effective_url are non-NULL, the base URL will
145 * be munged to reflect any redirections going from the requested url
146 * to effective_url. See the definition of update_url_from_redirect
149 struct strbuf
*base_url
;
152 * If not NULL, contains additional HTTP headers to be sent with the
153 * request. The strings in the list must not be freed until after the
154 * request has completed.
156 struct string_list
*extra_headers
;
159 /* Return values for http_get_*() */
161 #define HTTP_MISSING_TARGET 1
163 #define HTTP_START_FAILED 3
164 #define HTTP_REAUTH 4
165 #define HTTP_NOAUTH 5
168 * Requests a URL and stores the result in a strbuf.
170 * If the result pointer is NULL, a HTTP HEAD request is made instead of GET.
172 int http_get_strbuf(const char *url
, struct strbuf
*result
, struct http_get_options
*options
);
174 int http_fetch_ref(const char *base
, struct ref
*ref
);
176 /* Helpers for fetching packs */
177 int http_get_info_packs(const char *base_url
,
178 struct packed_git
**packs_head
);
180 struct http_pack_request
{
184 * index-pack command to run. Must be terminated by NULL.
186 * If NULL, defaults to {"index-pack", "--stdin", NULL}.
188 const char **index_pack_args
;
189 unsigned preserve_index_pack_stdout
: 1;
192 struct strbuf tmpfile
;
193 struct active_request_slot
*slot
;
196 struct http_pack_request
*new_http_pack_request(
197 const unsigned char *packed_git_hash
, const char *base_url
);
198 struct http_pack_request
*new_direct_http_pack_request(
199 const unsigned char *packed_git_hash
, char *url
);
200 int finish_http_pack_request(struct http_pack_request
*preq
);
201 void release_http_pack_request(struct http_pack_request
*preq
);
204 * Remove p from the given list, and invoke install_packed_git() on it.
206 * This is a convenience function for users that have obtained a list of packs
207 * from http_get_info_packs() and have chosen a specific pack to fetch.
209 void http_install_packfile(struct packed_git
*p
,
210 struct packed_git
**list_to_remove_from
);
212 /* Helpers for fetching object */
213 struct http_object_request
{
215 struct strbuf tmpfile
;
217 CURLcode curl_result
;
218 char errorstr
[CURL_ERROR_SIZE
];
220 struct object_id oid
;
221 struct object_id real_oid
;
226 struct active_request_slot
*slot
;
229 struct http_object_request
*new_http_object_request(
230 const char *base_url
, const struct object_id
*oid
);
231 void process_http_object_request(struct http_object_request
*freq
);
232 int finish_http_object_request(struct http_object_request
*freq
);
233 void abort_http_object_request(struct http_object_request
*freq
);
234 void release_http_object_request(struct http_object_request
*freq
);
237 * Instead of using environment variables to determine if curl tracing happens,
238 * behave as if GIT_TRACE_CURL=1 and GIT_TRACE_CURL_NO_DATA=1 is set. Call this
239 * before calling setup_curl_trace().
241 void http_trace_curl_no_data(void);
243 /* setup routine for curl_easy_setopt CURLOPT_DEBUGFUNCTION */
244 void setup_curl_trace(CURL
*handle
);