1 #ifndef __GSK_HTTP_SERVER_H_
2 #define __GSK_HTTP_SERVER_H_
3 
4 #include "gskhttpheader.h"
5 #include "gskhttprequest.h"
6 #include "gskhttpresponse.h"
7 #include "../gskstream.h"
8 #include "../gskmainloop.h"
9 
10 G_BEGIN_DECLS
11 
12 /* --- typedefs --- */
13 typedef struct _GskHttpServer GskHttpServer;
14 typedef struct _GskHttpServerResponse GskHttpServerResponse;
15 typedef struct _GskHttpServerClass GskHttpServerClass;
16 /* --- type macros --- */
17 GType gsk_http_server_get_type(void) G_GNUC_CONST;
18 #define GSK_TYPE_HTTP_SERVER			(gsk_http_server_get_type ())
19 #define GSK_HTTP_SERVER(obj)              (G_TYPE_CHECK_INSTANCE_CAST ((obj), GSK_TYPE_HTTP_SERVER, GskHttpServer))
20 #define GSK_HTTP_SERVER_CLASS(klass)      (G_TYPE_CHECK_CLASS_CAST ((klass), GSK_TYPE_HTTP_SERVER, GskHttpServerClass))
21 #define GSK_HTTP_SERVER_GET_CLASS(obj)    (G_TYPE_INSTANCE_GET_CLASS ((obj), GSK_TYPE_HTTP_SERVER, GskHttpServerClass))
22 #define GSK_IS_HTTP_SERVER(obj)           (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GSK_TYPE_HTTP_SERVER))
23 #define GSK_IS_HTTP_SERVER_CLASS(klass)   (G_TYPE_CHECK_CLASS_TYPE ((klass), GSK_TYPE_HTTP_SERVER))
24 
25 typedef gboolean (*GskHttpServerTrap) (GskHttpServer *server,
26 				       gpointer       data);
27 
28 /* --- structures --- */
29 struct _GskHttpServerClass
30 {
31   GskStreamClass stream_class;
32   void         (*set_poll_request) (GskHttpServer *server,
33 				    gboolean       do_poll);
34   void         (*shutdown_request) (GskHttpServer *server);
35 };
36 struct _GskHttpServer
37 {
38   GskStream      stream;
39   GskHook        has_request_hook;
40   GskBuffer      incoming;
41   GskHttpServerResponse *first_response;
42   GskHttpServerResponse *last_response;
43   GskHttpServerResponse *trapped_response;
44   guint read_poll : 1;
45   guint write_poll : 1;
46   guint got_close : 1;
47   gint keepalive_idle_timeout_ms;       /* or -1 for no timeout */
48   GskSource *keepalive_idle_timeout;
49 };
50 
51 /* --- prototypes --- */
52 #define GSK_HTTP_SERVER_HOOK(client)	(&GSK_HTTP_SERVER (client)->has_request_hook)
53 #define gsk_http_server_trap(server,func,shutdown,data,destroy)  	     \
54 	gsk_hook_trap (GSK_HTTP_SERVER_HOOK (server), (GskHookFunc) func,    \
55 		       (GskHookFunc) shutdown, data, destroy)
56 #define gsk_http_server_untrap(server)			     	             \
57         gsk_hook_untrap (GSK_HTTP_SERVER_HOOK (server))
58 
59 
60 GskHttpServer  *gsk_http_server_new         (void);
61 gboolean        gsk_http_server_get_request (GskHttpServer   *server,
62 					     GskHttpRequest **request_out,
63 					     GskStream      **post_data_out);
64 void            gsk_http_server_respond     (GskHttpServer   *server,
65 					     GskHttpRequest  *request,
66 					     GskHttpResponse *response,
67 					     GskStream       *content);
68 void            gsk_http_server_set_idle_timeout
69                                             (GskHttpServer   *server,
70                                              gint             millis);
71 
72 
73 
74 
75 G_END_DECLS
76 
77 #endif
78