]> git.ipfire.org Git - thirdparty/git.git/blame - http.h
treewide: remove unnecessary includes from header files
[thirdparty/git.git] / http.h
CommitLineData
29508e1e
NH
1#ifndef HTTP_H
2#define HTTP_H
3
d88dbaa7
EN
4struct packed_git;
5
d88dbaa7 6#include "git-zlib.h"
29508e1e
NH
7
8#include <curl/curl.h>
9#include <curl/easy.h>
10
028c2976 11#include "strbuf.h"
9fc6440d 12#include "remote.h"
1966d9f3 13#include "url.h"
028c2976 14
29508e1e 15#define DEFAULT_MAX_REQUESTS 5
29508e1e 16
9cba13ca 17struct slot_results {
c8568e13
NH
18 CURLcode curl_result;
19 long http_code;
0972ccd9 20 long auth_avail;
372370f1 21 long http_connectcode;
c8568e13
NH
22};
23
9cba13ca 24struct active_request_slot {
29508e1e 25 CURL *curl;
29508e1e
NH
26 int in_use;
27 CURLcode curl_result;
28 long http_code;
baa7b67d 29 int *finished;
c8568e13 30 struct slot_results *results;
29508e1e
NH
31 void *callback_data;
32 void (*callback_func)(void *data);
33 struct active_request_slot *next;
34};
35
9cba13ca 36struct buffer {
028c2976
MH
37 struct strbuf buf;
38 size_t posn;
29508e1e
NH
39};
40
41/* Curl request read/write callbacks */
55454427
DL
42size_t fread_buffer(char *ptr, size_t eltsize, size_t nmemb, void *strbuf);
43size_t fwrite_buffer(char *ptr, size_t eltsize, size_t nmemb, void *strbuf);
44size_t fwrite_null(char *ptr, size_t eltsize, size_t nmemb, void *strbuf);
fe7e44e1 45int seek_buffer(void *clientp, curl_off_t offset, int origin);
29508e1e
NH
46
47/* Slot lifecycle functions */
55454427
DL
48struct active_request_slot *get_active_slot(void);
49int start_active_slot(struct active_request_slot *slot);
50void run_active_slot(struct active_request_slot *slot);
51void finish_all_active_slots(void);
29508e1e 52
beed336c
JK
53/*
54 * This will run one slot to completion in a blocking manner, similar to how
55 * curl_easy_perform would work (but we don't want to use that, because
56 * we do not want to intermingle calls to curl_multi and curl_easy).
57 *
58 */
59int run_one_slot(struct active_request_slot *slot,
60 struct slot_results *results);
61
55454427
DL
62void fill_active_slots(void);
63void add_fill_function(void *data, int (*fill)(void *));
64void step_active_slots(void);
29508e1e 65
55454427 66void http_init(struct remote *remote, const char *url,
ad6dad09 67 int proactive_auth);
55454427
DL
68void http_cleanup(void);
69struct curl_slist *http_copy_default_headers(void);
29508e1e 70
c915f11e 71extern long int git_curl_ipresolve;
29508e1e 72extern int active_requests;
e9176745 73extern int http_is_verbose;
37ee680d 74extern ssize_t http_post_buffer;
2501aff8 75extern struct credential http_auth;
29508e1e 76
29508e1e
NH
77extern char curl_errorstr[CURL_ERROR_SIZE];
78
50d34137
JK
79enum http_follow_config {
80 HTTP_FOLLOW_NONE,
81 HTTP_FOLLOW_ALWAYS,
82 HTTP_FOLLOW_INITIAL
83};
84extern enum http_follow_config http_follow_config;
85
e8dc37e0
MH
86static 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
a3722bcb
JK
99/*
100 * Normalize curl results to handle CURL_FAILONERROR (or lack thereof). Failing
101 * http codes have their "result" converted to CURLE_HTTP_RETURNED_ERROR, and
102 * an appropriate string placed in the errorstr buffer (pass curl_errorstr if
103 * you don't have a custom buffer).
104 */
105void normalize_curl_result(CURLcode *result, long http_code, char *errorstr,
106 size_t errorlen);
107
5424bc55 108/* Helpers for modifying and creating URLs */
55454427 109void append_remote_object_url(struct strbuf *buf, const char *url,
ad6dad09
DL
110 const char *hex,
111 int only_two_digit_prefix);
55454427 112char *get_remote_object_url(const char *url, const char *hex,
ad6dad09 113 int only_two_digit_prefix);
5424bc55 114
1bbcc224
JK
115/* Options for http_get_*() */
116struct http_get_options {
117 unsigned no_cache:1,
50d34137 118 initial_request:1;
e929cd20 119
1bbcc224
JK
120 /* If non-NULL, returns the content-type of the response. */
121 struct strbuf *content_type;
78868962 122
e3131626
JK
123 /*
124 * If non-NULL, and content_type above is non-NULL, returns
125 * the charset parameter from the content-type. If none is
126 * present, returns an empty string.
127 */
128 struct strbuf *charset;
129
78868962
JK
130 /*
131 * If non-NULL, returns the URL we ended up at, including any
132 * redirects we followed.
133 */
134 struct strbuf *effective_url;
c93c92f3
JK
135
136 /*
137 * If both base_url and effective_url are non-NULL, the base URL will
138 * be munged to reflect any redirections going from the requested url
139 * to effective_url. See the definition of update_url_from_redirect
140 * for details.
141 */
142 struct strbuf *base_url;
8ff14ed4
BW
143
144 /*
145 * If not NULL, contains additional HTTP headers to be sent with the
146 * request. The strings in the list must not be freed until after the
147 * request has completed.
148 */
149 struct string_list *extra_headers;
1bbcc224
JK
150};
151
152/* Return values for http_get_*() */
e929cd20
MH
153#define HTTP_OK 0
154#define HTTP_MISSING_TARGET 1
155#define HTTP_ERROR 2
156#define HTTP_START_FAILED 3
42653c09
SC
157#define HTTP_REAUTH 4
158#define HTTP_NOAUTH 5
3e8084f1 159#define HTTP_NOMATCHPUBLICKEY 6
e929cd20
MH
160
161/*
a7793a74 162 * Requests a URL and stores the result in a strbuf.
e929cd20
MH
163 *
164 * If the result pointer is NULL, a HTTP HEAD request is made instead of GET.
165 */
1bbcc224 166int http_get_strbuf(const char *url, struct strbuf *result, struct http_get_options *options);
e929cd20 167
c1d024b8
DS
168/*
169 * Downloads a URL and stores the result in the given file.
170 *
171 * If a previous interrupted download is detected (i.e. a previous temporary
172 * file is still around) the download is resumed.
173 */
174int http_get_file(const char *url, const char *filename,
175 struct http_get_options *options);
176
55454427 177int http_fetch_ref(const char *base, struct ref *ref);
d7e92806 178
b8caac2b 179/* Helpers for fetching packs */
55454427 180int http_get_info_packs(const char *base_url,
ad6dad09 181 struct packed_git **packs_head);
b8caac2b 182
b0c4adcd
LL
183/* Helper for getting Accept-Language header */
184const char *http_get_accept_language_header(void);
185
9cba13ca 186struct http_pack_request {
2264dfa5 187 char *url;
8d5d2a34
JT
188
189 /*
726b25a9
JT
190 * index-pack command to run. Must be terminated by NULL.
191 *
192 * If NULL, defaults to {"index-pack", "--stdin", NULL}.
8d5d2a34 193 */
726b25a9
JT
194 const char **index_pack_args;
195 unsigned preserve_index_pack_stdout : 1;
8d5d2a34 196
2264dfa5 197 FILE *packfile;
390c6cbc 198 struct strbuf tmpfile;
2264dfa5
TRC
199 struct active_request_slot *slot;
200};
201
55454427 202struct http_pack_request *new_http_pack_request(
eb053492 203 const unsigned char *packed_git_hash, const char *base_url);
8d5d2a34
JT
204struct http_pack_request *new_direct_http_pack_request(
205 const unsigned char *packed_git_hash, char *url);
55454427
DL
206int finish_http_pack_request(struct http_pack_request *preq);
207void release_http_pack_request(struct http_pack_request *preq);
2264dfa5 208
eb053492
JT
209/*
210 * Remove p from the given list, and invoke install_packed_git() on it.
211 *
212 * This is a convenience function for users that have obtained a list of packs
213 * from http_get_info_packs() and have chosen a specific pack to fetch.
214 */
215void http_install_packfile(struct packed_git *p,
216 struct packed_git **list_to_remove_from);
217
5424bc55 218/* Helpers for fetching object */
9cba13ca 219struct http_object_request {
5424bc55 220 char *url;
390c6cbc 221 struct strbuf tmpfile;
5424bc55
TRC
222 int localfile;
223 CURLcode curl_result;
224 char errorstr[CURL_ERROR_SIZE];
225 long http_code;
f0be0db1
JK
226 struct object_id oid;
227 struct object_id real_oid;
eed0e60f 228 git_hash_ctx c;
ef49a7a0 229 git_zstream stream;
5424bc55
TRC
230 int zret;
231 int rename;
232 struct active_request_slot *slot;
233};
234
55454427 235struct http_object_request *new_http_object_request(
f0be0db1 236 const char *base_url, const struct object_id *oid);
55454427
DL
237void process_http_object_request(struct http_object_request *freq);
238int finish_http_object_request(struct http_object_request *freq);
239void abort_http_object_request(struct http_object_request *freq);
240void release_http_object_request(struct http_object_request *freq);
5424bc55 241
7167a62b
JT
242/*
243 * Instead of using environment variables to determine if curl tracing happens,
244 * behave as if GIT_TRACE_CURL=1 and GIT_TRACE_CURL_NO_DATA=1 is set. Call this
245 * before calling setup_curl_trace().
246 */
247void http_trace_curl_no_data(void);
248
74c682d3
EP
249/* setup routine for curl_easy_setopt CURLOPT_DEBUGFUNCTION */
250void setup_curl_trace(CURL *handle);
29508e1e 251#endif /* HTTP_H */