1 /* Copyright 2002-2004 Justin Erenkrantz and Greg Stein
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
7 * http://www.apache.org/licenses/LICENSE-2.0
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
16 #ifndef SERF_BUCKET_TYPES_H
17 #define SERF_BUCKET_TYPES_H
21 /* this header and serf.h refer to each other, so take a little extra care */
26 #include "serf_declare.h"
30 * @file serf_bucket_types.h
31 * @brief serf-supported bucket types
33 /* ### this whole file needs docco ... */
39 /* ==================================================================== */
42 SERF_DECLARE_DATA extern const serf_bucket_type_t serf_bucket_type_request;
43 #define SERF_BUCKET_IS_REQUEST(b) SERF_BUCKET_CHECK((b), request)
45 SERF_DECLARE(serf_bucket_t *) serf_bucket_request_create(
49 serf_bucket_alloc_t *allocator);
51 SERF_DECLARE(serf_bucket_t *) serf_bucket_request_get_headers(
52 serf_bucket_t *request);
54 SERF_DECLARE(void) serf_bucket_request_become(serf_bucket_t *bucket,
59 /* ==================================================================== */
62 SERF_DECLARE_DATA extern const serf_bucket_type_t serf_bucket_type_response;
63 #define SERF_BUCKET_IS_RESPONSE(b) SERF_BUCKET_CHECK((b), response)
65 SERF_DECLARE(serf_bucket_t *) serf_bucket_response_create(
66 serf_bucket_t *stream,
67 serf_bucket_alloc_t *allocator);
69 #define SERF_HTTP_VERSION(major, minor) ((major) * 1000 + (minor))
70 #define SERF_HTTP_11 SERF_HTTP_VERSION(1, 1)
71 #define SERF_HTTP_10 SERF_HTTP_VERSION(1, 0)
80 * Return the Status-Line information, if available. This function
81 * works like other bucket read functions: it may return APR_EAGAIN or
82 * APR_EOF to signal the state of the bucket for reading. A return
83 * value of APR_SUCCESS will always indicate that status line
84 * information was returned; for other return values the caller must
85 * check the version field in @a sline. A value of 0 means that the
86 * data is not (yet) present.
88 SERF_DECLARE(apr_status_t) serf_bucket_response_status(
90 serf_status_line *sline);
93 * Wait for the HTTP headers to be processed for a @a response.
95 * If the headers are available, APR_SUCCESS is returned.
96 * If the headers aren't available, APR_EAGAIN is returned.
98 SERF_DECLARE(apr_status_t) serf_bucket_response_wait_for_headers(
99 serf_bucket_t *response);
102 * Get the headers bucket for @a response.
104 SERF_DECLARE(serf_bucket_t *) serf_bucket_response_get_headers(
105 serf_bucket_t *response);
108 * Advise the response @a bucket that this was from a HEAD request and
109 * that it should not expect to see a response body.
111 SERF_DECLARE(void) serf_bucket_response_set_head(serf_bucket_t *bucket);
113 /* ==================================================================== */
116 SERF_DECLARE_DATA extern const serf_bucket_type_t serf_bucket_type_aggregate;
117 #define SERF_BUCKET_IS_AGGREGATE(b) SERF_BUCKET_CHECK((b), aggregate)
119 SERF_DECLARE(serf_bucket_t *) serf_bucket_aggregate_create(
120 serf_bucket_alloc_t *allocator);
122 /** Transform @a bucket in-place into an aggregate bucket. */
123 SERF_DECLARE(void) serf_bucket_aggregate_become(serf_bucket_t *bucket);
125 SERF_DECLARE(void) serf_bucket_aggregate_prepend(
126 serf_bucket_t *aggregate_bucket,
127 serf_bucket_t *prepend_bucket);
129 SERF_DECLARE(void) serf_bucket_aggregate_append(
130 serf_bucket_t *aggregate_bucket,
131 serf_bucket_t *append_bucket);
133 SERF_DECLARE(void) serf_bucket_aggregate_prepend_iovec(
134 serf_bucket_t *aggregate_bucket,
138 SERF_DECLARE(void) serf_bucket_aggregate_append_iovec(
139 serf_bucket_t *aggregate_bucket,
143 /* ==================================================================== */
146 SERF_DECLARE_DATA extern const serf_bucket_type_t serf_bucket_type_file;
147 #define SERF_BUCKET_IS_FILE(b) SERF_BUCKET_CHECK((b), file)
149 SERF_DECLARE(serf_bucket_t *) serf_bucket_file_create(
151 serf_bucket_alloc_t *allocator);
153 SERF_DECLARE(apr_file_t *) serf_bucket_file_borrow(serf_bucket_t *bkt);
156 /* ==================================================================== */
159 SERF_DECLARE_DATA extern const serf_bucket_type_t serf_bucket_type_socket;
160 #define SERF_BUCKET_IS_SOCKET(b) SERF_BUCKET_CHECK((b), socket)
162 SERF_DECLARE(serf_bucket_t *) serf_bucket_socket_create(
164 serf_bucket_alloc_t *allocator);
167 /* ==================================================================== */
170 SERF_DECLARE_DATA extern const serf_bucket_type_t serf_bucket_type_simple;
171 #define SERF_BUCKET_IS_SIMPLE(b) SERF_BUCKET_CHECK((b), simple)
173 typedef void (*serf_simple_freefunc_t)(void *baton, const char *data);
175 SERF_DECLARE(serf_bucket_t *) serf_bucket_simple_create(
176 const char *data, apr_size_t len,
177 serf_simple_freefunc_t freefunc,
178 void *freefunc_baton,
179 serf_bucket_alloc_t *allocator);
182 * Equivalent to serf_bucket_simple_create, except that the bucket takes
183 * ownership of a private copy of the data.
185 SERF_DECLARE(serf_bucket_t *) serf_bucket_simple_copy_create(
186 const char *data, apr_size_t len,
187 serf_bucket_alloc_t *allocator);
189 #define SERF_BUCKET_SIMPLE_STRING(s,a) \
190 serf_bucket_simple_create(s, strlen(s), NULL, NULL, a);
192 #define SERF_BUCKET_SIMPLE_STRING_LEN(s,l,a) \
193 serf_bucket_simple_create(s, l, NULL, NULL, a);
195 /* ==================================================================== */
198 /* Note: apr_mmap_t is always defined, but if APR doesn't have mmaps, then
199 the caller can never create an apr_mmap_t to pass to this function. */
201 SERF_DECLARE_DATA extern const serf_bucket_type_t serf_bucket_type_mmap;
202 #define SERF_BUCKET_IS_MMAP(b) SERF_BUCKET_CHECK((b), mmap)
204 SERF_DECLARE(serf_bucket_t *) serf_bucket_mmap_create(
206 serf_bucket_alloc_t *allocator);
209 /* ==================================================================== */
212 SERF_DECLARE_DATA extern const serf_bucket_type_t serf_bucket_type_headers;
213 #define SERF_BUCKET_IS_HEADERS(b) SERF_BUCKET_CHECK((b), headers)
215 SERF_DECLARE(serf_bucket_t *) serf_bucket_headers_create(
216 serf_bucket_alloc_t *allocator);
219 * Set, default: value copied.
221 * Set the specified @a header within the bucket, copying the @a value
222 * into space from this bucket's allocator. The header is NOT copied,
223 * so it should remain in scope at least as long as the bucket.
225 SERF_DECLARE(void) serf_bucket_headers_set(
226 serf_bucket_t *headers_bucket,
231 * Set, copies: header and value copied.
233 * Copy the specified @a header and @a value into the bucket, using space
234 * from this bucket's allocator.
236 SERF_DECLARE(void) serf_bucket_headers_setc(
237 serf_bucket_t *headers_bucket,
244 * Set the specified @a header and @a value into the bucket, without
245 * copying either attribute. Both attributes should remain in scope at
246 * least as long as the bucket.
248 SERF_DECLARE(void) serf_bucket_headers_setn(
249 serf_bucket_t *headers_bucket,
254 * Set, extended: fine grained copy control of header and value.
256 * Set the specified @a header, with length @a header_size with the
257 * @a value, and length @a value_size, into the bucket. The header will
258 * be copied if @a header_copy is set, and the value is copied if
259 * @a value_copy is set. If the values are not copied, then they should
260 * remain in scope at least as long as the bucket.
262 SERF_DECLARE(void) serf_bucket_headers_setx(
263 serf_bucket_t *headers_bucket,
264 const char *header, apr_size_t header_size, int header_copy,
265 const char *value, apr_size_t value_size, int value_copy);
267 SERF_DECLARE(const char *) serf_bucket_headers_get(
268 serf_bucket_t *headers_bucket,
272 * @param baton opaque baton as passed to @see serf_bucket_headers_do
273 * @param key The header key from this iteration through the table
274 * @param value The header value from this iteration through the table
276 typedef int (serf_bucket_headers_do_callback_fn_t)(
282 * @param headers_bucket headers to iterate over
283 * @param func callback routine to invoke for every header in the bucket
284 * @param baton baton to pass on each invocation to func
286 SERF_DECLARE(void) serf_bucket_headers_do(
287 serf_bucket_t *headers_bucket,
288 serf_bucket_headers_do_callback_fn_t func,
292 /* ==================================================================== */
295 SERF_DECLARE_DATA extern const serf_bucket_type_t serf_bucket_type_chunk;
296 #define SERF_BUCKET_IS_CHUNK(b) SERF_BUCKET_CHECK((b), chunk)
298 SERF_DECLARE(serf_bucket_t *) serf_bucket_chunk_create(
299 serf_bucket_t *stream,
300 serf_bucket_alloc_t *allocator);
303 /* ==================================================================== */
306 SERF_DECLARE_DATA extern const serf_bucket_type_t serf_bucket_type_dechunk;
307 #define SERF_BUCKET_IS_DECHUNK(b) SERF_BUCKET_CHECK((b), dechunk)
309 SERF_DECLARE(serf_bucket_t *) serf_bucket_dechunk_create(
310 serf_bucket_t *stream,
311 serf_bucket_alloc_t *allocator);
314 /* ==================================================================== */
317 SERF_DECLARE_DATA extern const serf_bucket_type_t serf_bucket_type_deflate;
318 #define SERF_BUCKET_IS_DEFLATE(b) SERF_BUCKET_CHECK((b), deflate)
320 #define SERF_DEFLATE_GZIP 0
321 #define SERF_DEFLATE_DEFLATE 1
323 SERF_DECLARE(serf_bucket_t *) serf_bucket_deflate_create(
324 serf_bucket_t *stream,
325 serf_bucket_alloc_t *allocator,
329 /* ==================================================================== */
332 SERF_DECLARE_DATA extern const serf_bucket_type_t serf_bucket_type_limit;
333 #define SERF_BUCKET_IS_LIMIT(b) SERF_BUCKET_CHECK((b), limit)
335 SERF_DECLARE(serf_bucket_t *) serf_bucket_limit_create(
336 serf_bucket_t *stream,
338 serf_bucket_alloc_t *allocator);
341 /* ==================================================================== */
344 SERF_DECLARE_DATA extern const serf_bucket_type_t serf_bucket_type_ssl_encrypt;
345 #define SERF_BUCKET_IS_SSL_ENCRYPT(b) SERF_BUCKET_CHECK((b), ssl_encrypt)
347 typedef struct serf_ssl_context_t serf_ssl_context_t;
349 typedef apr_status_t (*serf_ssl_need_client_cert_t)(void *data,
350 const char **cert_path);
352 typedef apr_status_t (*serf_ssl_need_cert_password_t)(void *data,
353 const char *cert_path,
354 const char **password);
357 serf_ssl_client_cert_provider_set(serf_ssl_context_t *context,
358 serf_ssl_need_client_cert_t callback,
363 serf_ssl_client_cert_password_set(serf_ssl_context_t *context,
364 serf_ssl_need_cert_password_t callback,
368 SERF_DECLARE(serf_bucket_t *) serf_bucket_ssl_encrypt_create(
369 serf_bucket_t *stream,
370 serf_ssl_context_t *ssl_context,
371 serf_bucket_alloc_t *allocator);
373 SERF_DECLARE(serf_ssl_context_t *) serf_bucket_ssl_encrypt_context_get(
374 serf_bucket_t *bucket);
376 /* ==================================================================== */
379 SERF_DECLARE_DATA extern const serf_bucket_type_t serf_bucket_type_ssl_decrypt;
380 #define SERF_BUCKET_IS_SSL_DECRYPT(b) SERF_BUCKET_CHECK((b), ssl_decrypt)
382 SERF_DECLARE(serf_bucket_t *) serf_bucket_ssl_decrypt_create(
383 serf_bucket_t *stream,
384 serf_ssl_context_t *ssl_context,
385 serf_bucket_alloc_t *allocator);
387 SERF_DECLARE(serf_ssl_context_t *) serf_bucket_ssl_decrypt_context_get(
388 serf_bucket_t *bucket);
391 /* ==================================================================== */
394 SERF_DECLARE_DATA extern const serf_bucket_type_t serf_bucket_type_barrier;
395 #define SERF_BUCKET_IS_BARRIER(b) SERF_BUCKET_CHECK((b), barrier)
397 SERF_DECLARE(serf_bucket_t *) serf_bucket_barrier_create(
398 serf_bucket_t *stream,
399 serf_bucket_alloc_t *allocator);
402 /* ==================================================================== */
404 /* ### do we need a PIPE bucket type? they are simple apr_file_t objects */
411 #endif /* !SERF_BUCKET_TYPES_H */