1 #ifndef __GSK_HTTP_REQUEST_H_
2 #define __GSK_HTTP_REQUEST_H_
3 
4 #ifndef __GSK_HTTP_HEADER_H_
5 #include "gskhttpheader.h"
6 #endif
7 
8 G_BEGIN_DECLS
9 
10 typedef struct _GskHttpRequestClass GskHttpRequestClass;
11 typedef struct _GskHttpRequest GskHttpRequest;
12 
13 #define GSK_TYPE_HTTP_REQUEST              (gsk_http_request_get_type ())
14 #define GSK_HTTP_REQUEST(obj)              (G_TYPE_CHECK_INSTANCE_CAST ((obj), GSK_TYPE_HTTP_REQUEST, GskHttpRequest))
15 #define GSK_HTTP_REQUEST_CLASS(klass)      (G_TYPE_CHECK_CLASS_CAST ((klass), GSK_TYPE_HTTP_REQUEST, GskHttpRequestClass))
16 #define GSK_HTTP_REQUEST_GET_CLASS(obj)    (G_TYPE_INSTANCE_GET_CLASS ((obj), GSK_TYPE_HTTP_REQUEST, GskHttpRequestClass))
17 #define GSK_IS_HTTP_REQUEST(obj)           (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GSK_TYPE_HTTP_REQUEST))
18 #define GSK_IS_HTTP_REQUEST_CLASS(klass)   (G_TYPE_CHECK_CLASS_TYPE ((klass), GSK_TYPE_HTTP_REQUEST))
19 
20 struct _GskHttpRequestClass
21 {
22   GskHttpHeaderClass base_class;
23 };
24 struct _GskHttpRequest
25 {
26   GskHttpHeader base_instance;
27 
28   /*< public >*/
29   /* the command: GET, PUT, POST, HEAD, etc */
30   GskHttpVerb                   verb;
31 
32   /* Note that HTTP/1.1 servers must accept the entire
33    * URL being included in `path'! (maybe including http:// ... */
34   char                         *path;
35 
36   GskHttpCharSet           *accept_charsets;              /* Accept-CharSet */
37   GskHttpContentEncodingSet*accept_content_encodings;     /* Accept-Encoding */
38   GskHttpTransferEncodingSet*accept_transfer_encodings;   /* TE */
39   GskHttpMediaTypeSet      *accept_media_types;           /* Accept */
40   GskHttpAuthorization     *authorization;                /* Authorization */
41   GskHttpLanguageSet       *accept_languages;             /* Accept-Languages */
42   char                     *host;                         /* Host */
43 
44   gboolean                  had_if_match;
45   char                    **if_match;             /* If-Match */
46   glong                     if_modified_since;    /* If-Modified-Since */
47   char                     *user_agent;           /* User-Agent */
48 
49   char                     *referrer;             /* Referer */
50 
51   char                     *from;      /* The From: header (sect 14.22) */
52 
53   /* List of Cookie: headers. */
54   GSList                   *cookies;
55 
56   GskHttpAuthorization     *proxy_authorization;
57 
58   int                       keep_alive_seconds;   /* -1 if not used */
59 
60   /* rarely used: */
61   int                       max_forwards;         /* -1 if not used */
62 
63   /* Nonstandard User-Agent information.
64      Many browsers provide this data to allow
65      dynamic content to take advantage of the
66      client configuration.  (0 indicated "not supplied").  */
67   unsigned                  ua_width, ua_height;
68   char                     *ua_color;
69   char                     *ua_os;
70   char                     *ua_cpu;
71   char                     *ua_language;
72 
73   GskHttpRequestCacheDirective *cache_control;        /* Cache-Control */
74 };
75 
76 /* --- cookies --- */
77 void            gsk_http_request_add_cookie      (GskHttpRequest *header,
78                                                   GskHttpCookie  *cookie);
79 void            gsk_http_request_remove_cookie   (GskHttpRequest *header,
80                                                   GskHttpCookie  *cookie);
81 GskHttpCookie  *gsk_http_request_find_cookie     (GskHttpRequest *header,
82                                                   const char     *key);
83 
84 void gsk_http_request_set_cache_control (GskHttpRequest               *request,
85                                          GskHttpRequestCacheDirective *directive);
86 
87 gboolean        gsk_http_request_has_content_body (GskHttpRequest *request);
88 
89 /* request specific functions */
90 /* unhandled: if_match */
91 void            gsk_http_request_add_charsets            (GskHttpRequest *header,
92                                                           GskHttpCharSet *char_sets);
93 void            gsk_http_request_clear_charsets          (GskHttpRequest *header);
94 void            gsk_http_request_add_content_encodings   (GskHttpRequest *header,
95                                                           GskHttpContentEncodingSet *set);
96 void            gsk_http_request_clear_content_encodings (GskHttpRequest *header);
97 void            gsk_http_request_add_transfer_encodings  (GskHttpRequest *header,
98                                                           GskHttpTransferEncodingSet *set);
99 void            gsk_http_request_clear_transfer_encodings(GskHttpRequest *header);
100 void            gsk_http_request_add_media               (GskHttpRequest *header,
101                                                           GskHttpMediaTypeSet *set);
102 void            gsk_http_request_clear_media             (GskHttpRequest *header);
103 void            gsk_http_request_set_authorization       (GskHttpRequest  *request,
104 					                  gboolean         is_proxy_auth,
105 					                  GskHttpAuthorization *auth);
106 GskHttpAuthorization*
107                 gsk_http_request_peek_authorization      (GskHttpRequest  *request,
108 				                          gboolean    is_proxy_auth);
109 /* Requests */
110 GskHttpRequest *gsk_http_request_new_blank               (void);
111 GskHttpRequest *gsk_http_request_new                     (GskHttpVerb  verb,
112 						          const char  *path);
113 
114 typedef enum
115 {
116   GSK_HTTP_REQUEST_FIRST_LINE_ERROR,
117   GSK_HTTP_REQUEST_FIRST_LINE_SIMPLE,
118   GSK_HTTP_REQUEST_FIRST_LINE_FULL
119 } GskHttpRequestFirstLineStatus;
120 
121 GskHttpRequestFirstLineStatus
122                 gsk_http_request_parse_first_line        (GskHttpRequest *request,
123 				                          const char     *line,
124                                                           GError        **error);
125 
126 GHashTable     *gsk_http_request_parse_cgi_query_string  (const char     *query_string);
127 
128 /* XXX: duplicates gsk_url_split_form_urlencoded! */
129 char **         gsk_http_parse_cgi_query_string          (const char     *query_string,
130                                                           GError        **error);
131 
132 /* macros to get/set properties.  */
133 #define gsk_http_request_set_verb(request, verb)	\
134     g_object_set(GSK_HTTP_REQUEST(request), "verb", (GskHttpVerb)(verb), NULL)
135 #define gsk_http_request_get_verb(request) (GSK_HTTP_REQUEST(request)->verb)
136 #define gsk_http_request_set_if_modified_since(request, t) \
137     g_object_set(GSK_HTTP_REQUEST(request), "if-modified-since", (long)(t), NULL)
138 #define gsk_http_request_get_if_modified_since(request) \
139     (GSK_HTTP_REQUEST(request)->if_modified_since)
140 #define gsk_http_request_set_from(request, from)			      \
141   g_object_set (GSK_HTTP_REQUEST(request), "from", (const char *) (from), NULL)
142 #define gsk_http_request_set_host(request, host)			      \
143   g_object_set (GSK_HTTP_REQUEST(request), "host", (const char *) (host), NULL)
144 #define gsk_http_request_peek_from(request)				      \
145   (GSK_HTTP_REQUEST(request)->from)
146 #define gsk_http_request_set_user_agent(request, user_agent)	              \
147   g_object_set (GSK_HTTP_REQUEST(request), "user-agent", (const char *) (user_agent), NULL)
148 #define gsk_http_request_peek_user_agent(request)		              \
149   (GSK_HTTP_REQUEST(request)->user_agent)
150 
151 G_END_DECLS
152 
153 #endif
154