]> git.proxmox.com Git - libgit2.git/blame - src/transports/httpclient.h
New upstream version 1.3.0+dfsg.1
[libgit2.git] / src / transports / httpclient.h
CommitLineData
22a2d3d5
UG
1/*
2 * Copyright (C) the libgit2 contributors. All rights reserved.
3 *
4 * This file is part of libgit2, distributed under the GNU GPL v2 with
5 * a Linking Exception. For full terms see the included COPYING file.
6 */
7
8#ifndef INCLUDE_transports_httpclient_h__
9#define INCLUDE_transports_httpclient_h__
10
11#include "common.h"
12#include "net.h"
13
14#define GIT_HTTP_STATUS_CONTINUE 100
15#define GIT_HTTP_STATUS_OK 200
16#define GIT_HTTP_MOVED_PERMANENTLY 301
17#define GIT_HTTP_FOUND 302
18#define GIT_HTTP_SEE_OTHER 303
19#define GIT_HTTP_TEMPORARY_REDIRECT 307
20#define GIT_HTTP_PERMANENT_REDIRECT 308
21#define GIT_HTTP_STATUS_UNAUTHORIZED 401
22#define GIT_HTTP_STATUS_PROXY_AUTHENTICATION_REQUIRED 407
23
24typedef struct git_http_client git_http_client;
25
26/** Method for the HTTP request */
27typedef enum {
28 GIT_HTTP_METHOD_GET,
29 GIT_HTTP_METHOD_POST,
30 GIT_HTTP_METHOD_CONNECT
31} git_http_method;
32
33/** An HTTP request */
34typedef struct {
35 git_http_method method; /**< Method for the request */
36 git_net_url *url; /**< Full request URL */
37 git_net_url *proxy; /**< Proxy to use */
38
39 /* Headers */
40 const char *accept; /**< Contents of the Accept header */
41 const char *content_type; /**< Content-Type header (for POST) */
42 git_credential *credentials; /**< Credentials to authenticate with */
43 git_credential *proxy_credentials; /**< Credentials for proxy */
44 git_strarray *custom_headers; /**< Additional headers to deliver */
45
46 /* To POST a payload, either set content_length OR set chunked. */
47 size_t content_length; /**< Length of the POST body */
48 unsigned chunked : 1, /**< Post with chunking */
49 expect_continue : 1; /**< Use expect/continue negotiation */
50} git_http_request;
51
52typedef struct {
53 int status;
54
55 /* Headers */
56 char *content_type;
57 size_t content_length;
58 char *location;
59
60 /* Authentication headers */
61 unsigned server_auth_schemetypes; /**< Schemes requested by remote */
62 unsigned server_auth_credtypes; /**< Supported cred types for remote */
63
64 unsigned proxy_auth_schemetypes; /**< Schemes requested by proxy */
65 unsigned proxy_auth_credtypes; /**< Supported cred types for proxy */
66
67 unsigned chunked : 1, /**< Response body is chunked */
68 resend_credentials : 1; /**< Resend with authentication */
69} git_http_response;
70
71typedef struct {
72 /** Certificate check callback for the remote */
73 git_transport_certificate_check_cb server_certificate_check_cb;
74 void *server_certificate_check_payload;
75
76 /** Certificate check callback for the proxy */
77 git_transport_certificate_check_cb proxy_certificate_check_cb;
78 void *proxy_certificate_check_payload;
79} git_http_client_options;
80
81/**
82 * Create a new httpclient instance with the given options.
83 *
84 * @param out pointer to receive the new instance
85 * @param opts options to create the client with or NULL for defaults
86 */
87extern int git_http_client_new(
88 git_http_client **out,
89 git_http_client_options *opts);
90
91/*
92 * Sends a request to the host specified by the request URL. If the
c25aa7cd 93 * method is POST, either the content_length or the chunked flag must
22a2d3d5
UG
94 * be specified. The body should be provided in subsequent calls to
95 * git_http_client_send_body.
96 *
97 * @param client the client to write the request to
98 * @param request the request to send
99 */
100extern int git_http_client_send_request(
101 git_http_client *client,
102 git_http_request *request);
103
104/*
105 * After sending a request, there may already be a response to read --
106 * either because there was a non-continue response to an expect: continue
107 * request, or because the server pipelined a response to us before we even
108 * sent the request. Examine the state.
109 *
110 * @param client the client to examine
111 * @return true if there's already a response to read, false otherwise
112 */
113extern bool git_http_client_has_response(git_http_client *client);
114
115/**
116 * Sends the given buffer to the remote as part of the request body. The
117 * request must have specified either a content_length or the chunked flag.
118 *
119 * @param client the client to write the request body to
120 * @param buffer the request body
121 * @param buffer_len number of bytes of the buffer to send
122 */
123extern int git_http_client_send_body(
124 git_http_client *client,
125 const char *buffer,
126 size_t buffer_len);
127
128/**
129 * Reads the headers of a response to a request. This will consume the
130 * entirety of the headers of a response from the server. The body (if any)
131 * can be read by calling git_http_client_read_body. Callers must free
132 * the response with git_http_response_dispose.
133 *
134 * @param response pointer to the response object to fill
135 * @param client the client to read the response from
136 */
137extern int git_http_client_read_response(
138 git_http_response *response,
139 git_http_client *client);
140
141/**
142 * Reads some or all of the body of a response. At most buffer_size (or
143 * INT_MAX) bytes will be read and placed into the buffer provided. The
144 * number of bytes read will be returned, or 0 to indicate that the end of
145 * the body has been read.
146 *
147 * @param client the client to read the response from
148 * @param buffer pointer to the buffer to fill
149 * @param buffer_size the maximum number of bytes to read
150 * @return the number of bytes read, 0 on end of body, or error code
151 */
152extern int git_http_client_read_body(
153 git_http_client *client,
154 char *buffer,
155 size_t buffer_size);
156
157/**
158 * Reads all of the (remainder of the) body of the response and ignores it.
159 * None of the data from the body will be returned to the caller.
160 *
161 * @param client the client to read the response from
162 * @return 0 or an error code
163 */
164extern int git_http_client_skip_body(git_http_client *client);
165
166/**
167 * Examines the status code of the response to determine if it is a
168 * redirect of any type (eg, 301, 302, etc).
169 *
170 * @param response the response to inspect
171 * @return true if the response is a redirect, false otherwise
172 */
173extern bool git_http_response_is_redirect(git_http_response *response);
174
175/**
176 * Frees any memory associated with the response.
177 *
178 * @param response the response to free
179 */
180extern void git_http_response_dispose(git_http_response *response);
181
182/**
183 * Frees any memory associated with the client. If any sockets are open,
184 * they will be closed.
185 *
186 * @param client the client to free
187 */
188extern void git_http_client_free(git_http_client *client);
189
190#endif