Annotation of embedaddon/libpdel/http/http_internal.h, revision 1.1.1.1
1.1 misho 1:
2: /*
3: * Copyright (c) 2001-2002 Packet Design, LLC.
4: * All rights reserved.
5: *
6: * Subject to the following obligations and disclaimer of warranty,
7: * use and redistribution of this software, in source or object code
8: * forms, with or without modifications are expressly permitted by
9: * Packet Design; provided, however, that:
10: *
11: * (i) Any and all reproductions of the source or object code
12: * must include the copyright notice above and the following
13: * disclaimer of warranties; and
14: * (ii) No rights are granted, in any manner or form, to use
15: * Packet Design trademarks, including the mark "PACKET DESIGN"
16: * on advertising, endorsements, or otherwise except as such
17: * appears in the above copyright notice or in the software.
18: *
19: * THIS SOFTWARE IS BEING PROVIDED BY PACKET DESIGN "AS IS", AND
20: * TO THE MAXIMUM EXTENT PERMITTED BY LAW, PACKET DESIGN MAKES NO
21: * REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, REGARDING
22: * THIS SOFTWARE, INCLUDING WITHOUT LIMITATION, ANY AND ALL IMPLIED
23: * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
24: * OR NON-INFRINGEMENT. PACKET DESIGN DOES NOT WARRANT, GUARANTEE,
25: * OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF, OR THE RESULTS
26: * OF THE USE OF THIS SOFTWARE IN TERMS OF ITS CORRECTNESS, ACCURACY,
27: * RELIABILITY OR OTHERWISE. IN NO EVENT SHALL PACKET DESIGN BE
28: * LIABLE FOR ANY DAMAGES RESULTING FROM OR ARISING OUT OF ANY USE
29: * OF THIS SOFTWARE, INCLUDING WITHOUT LIMITATION, ANY DIRECT,
30: * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE, OR CONSEQUENTIAL
31: * DAMAGES, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, LOSS OF
32: * USE, DATA OR PROFITS, HOWEVER CAUSED AND UNDER ANY THEORY OF
33: * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
35: * THE USE OF THIS SOFTWARE, EVEN IF PACKET DESIGN IS ADVISED OF
36: * THE POSSIBILITY OF SUCH DAMAGE.
37: *
38: * Author: Archie Cobbs <archie@freebsd.org>
39: */
40:
41: #ifndef _PDEL_HTTP_HTTP_INTERNAL_H_
42: #define _PDEL_HTTP_HTTP_INTERNAL_H_
43:
44: #include "debug/debug.h"
45:
46: #ifndef __FreeBSD__
47: #define __printflike(x,y)
48: #endif
49:
50: /* HTTP connection */
51: struct http_connection {
52: void *owner; /* owner (server or client) */
53: struct http_request *req; /* request structure */
54: struct http_response *resp; /* response structure */
55: struct in_addr local_ip; /* local host ip */
56: u_int16_t local_port; /* local host port */
57: struct in_addr remote_ip; /* remote host ip */
58: u_int16_t remote_port; /* remote host port */
59: FILE *fp; /* connection to peer */
60: pthread_t tid; /* connection thread id */
61: u_char keep_alive; /* connection keep-alive */
62: u_char server; /* we are server (not client) */
63: u_char proxy; /* proxy request/response */
64: u_char started; /* conn. thread has started */
65: LIST_ENTRY(http_connection) next; /* next in connection list */
66: http_logger_t *logger; /* error logging routine */
67: SSL_CTX *ssl; /* ssl context, if doing ssl */
68: int sock; /* socket cached */
69: };
70:
71: /* HTTP request name, value pair */
72: struct http_nvp {
73: char *name;
74: char *value;
75: };
76:
77: /* HTTP request/response common info */
78: struct http_message {
79: struct http_connection *conn; /* associated connection */
80: struct http_head *head; /* headers */
81: char *host; /* decoded url host */
82: char *path; /* decoded url pathname */
83: char *query; /* encoded query string */
84: FILE *input; /* entity input stream */
85: u_int input_len; /* input length, or UINT_MAX */
86: u_int input_read; /* input length read so far */
87: FILE *output; /* entity output stream */
88: u_char *output_buf; /* buffered output, if any */
89: int output_len; /* buffered output length */
90: u_char buffered; /* output is buffered */
91: u_char no_headers; /* don't send any headers */
92: u_char hdrs_sent; /* header was sent */
93: u_char no_body; /* no entity data is allowed */
94: u_char skip_body; /* no entity data to be sent */
95: };
96:
97: /* HTTP request */
98: struct http_request {
99: struct http_message *msg; /* common req/reply info */
100: int num_nvp; /* number of n-v pairs */
101: struct http_nvp *nvp; /* name, value pairs */
102: char *username; /* authorization username */
103: char *password; /* authorization password */
104: };
105:
106: /* HTTP response */
107: struct http_response {
108: struct http_message *msg; /* common req/reply info */
109: u_int code; /* http response code */
110: };
111:
112: __BEGIN_DECLS
113:
114: /*
115: * http_head methods
116: */
117: extern struct http_head *_http_head_new(void);
118: extern int _http_head_read(struct http_head *head, FILE *fp, int req);
119: extern int _http_head_read_headers(struct http_head *head, FILE *fp);
120: extern int _http_head_write(struct http_head *head, FILE *fp);
121: extern struct http_head *_http_head_copy(struct http_head *head);
122: extern void _http_head_reset(struct http_head *head);
123: extern void _http_head_free(struct http_head **headp);
124: extern const char *_http_head_get(struct http_head *head, const char *name);
125: extern int _http_head_get_headers(struct http_head *head,
126: const char **names, size_t max_names);
127: extern int _http_head_set(struct http_head *head, int append,
128: const char *name, const char *valfmt, ...)
129: __printflike(4, 5);
130: extern int _http_head_vset(struct http_head *head, int append,
131: const char *name, const char *valfmt, va_list args);
132: extern int _http_head_num_headers(struct http_head *head);
133: extern int _http_head_get_by_index(struct http_head *head, u_int index,
134: const char **namep, const char **valuep);
135: extern int _http_head_remove(struct http_head *head, const char *name);
136: extern int _http_head_err_response(struct http_head **headp, int code);
137: extern int _http_head_has_anything(struct http_head *head);
138: extern int _http_head_want_keepalive(struct http_head *head);
139:
140: /*
141: * http_request methods
142: */
143: extern int _http_request_new(struct http_connection *conn);
144: extern int _http_request_read(struct http_connection *conn);
145: extern void _http_request_free(struct http_request **reqp);
146:
147: /*
148: * http_response methods
149: */
150: extern int _http_response_new(struct http_connection *conn);
151: extern int _http_response_read(struct http_connection *conn,
152: char *errbuf, int size);
153: extern void _http_response_free(struct http_response **respp);
154:
155: /*
156: * http_message methods
157: */
158: extern struct http_message *_http_message_new(void);
159: extern void _http_message_free(struct http_message **msgp);
160: extern int _http_message_read(struct http_message *msg, int req);
161: extern FILE *_http_message_get_output(struct http_message *msg, int buffer);
162: extern struct in_addr _http_message_get_remote_ip(struct http_message *msg);
163: extern u_int16_t _http_message_get_remote_port(struct http_message *msg);
164: extern int _http_message_has_anything(struct http_message *msg);
165: extern void _http_message_send_headers(struct http_message *msg,
166: int unbuffer);
167: extern void _http_message_send_body(struct http_message *msg);
168: extern int _http_message_vset_header(struct http_message *msg, int append,
169: const char *name, const char *valfmt, va_list args);
170: extern int _http_message_remove_header(struct http_message *msg,
171: const char *name);
172: extern const char *_http_message_connection_header(struct http_message *msg);
173: extern int _http_message_get_raw_socket(struct http_message *msg);
174:
175: /*
176: * http_connection methods
177: */
178: extern struct http_connection *_http_connection_create(FILE *fp, int sock,
179: int server, struct in_addr ip, u_int16_t port,
180: SSL_CTX *ssl, http_logger_t *logger, u_int timeout);
181: extern void _http_connection_free(struct http_connection **connp);
182:
183: /*
184: * Client connection caching functions
185: */
186: extern struct http_connection_cache *_http_connection_cache_create(
187: struct pevent_ctx *ctx, u_int max_num, u_int max_idle);
188: extern void _http_connection_cache_destroy(
189: struct http_connection_cache **cachep);
190: extern int _http_connection_cache_get(struct http_connection_cache *cache,
191: const struct sockaddr_in *peer, const SSL_CTX *ssl,
192: FILE **fpp, int *sockp);
193: extern int _http_connection_cache_put(struct http_connection_cache *cache,
194: const struct sockaddr_in *peer, const SSL_CTX *ssl,
195: FILE *fp, int sock);
196:
197: /*
198: * Misc
199: */
200: extern void _http_ssl_init(void);
201:
202: __END_DECLS
203:
204: #endif /* _PDEL_HTTP_HTTP_INTERNAL_H_ */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>