/*
 * webkernel.h
 *
 * A small embeddable web server.
 *
 * Header file.
 *
 * Author: Dario Rodriguez dario@softhome.net
 * This library is licensed on the terms of the GNU LGPL v2+
 */

#ifndef WEBKERNEL_H
#define WEBKERNEL_H
#include <sys/select.h>
#include "iobuf.h"
#include "socklib.h"

typedef void wk;
typedef enum wk_event {
        wke_init=0,
        wke_fini,
        wke_connected,
        wke_closed,
} wk_event;

typedef struct wk_uri {
        char *method;
        char *protocol;
        char *path;
        char *query;
        char *headers;
        void *uriuserptr;
} wk_uri;

typedef enum wk_error {
        wkerr_notfound=404,
        wkerr_internal=500,
        wkerr_notimplemented=501,
} wk_error;

wk *wk_init(int port, sselect *ssel, void (*callback_event)(/*wk *web,int connid, wk_event event, void *userptr*/), void (*callback_http)(/*wk *web,int connid, wk_uri *uri, void *userptr*/), void (*callback_continuation)(/*wk *web,int connid, wk_uri *uri, void *userptr*/), void *userptr);
void wk_free(wk *web);

wk_uri *wk_geturi(wk *web, int connid); /* for use in callback_event() when wke_closed */

int wk_service(wk *web); /* To be called after sselelect_wait() but before sselect_getXXX() */

int wk_serve_buffer_as_file(wk *web, int connid, void *data, int datalen, const char *mime);
int wk_serve_file(wk *web, int connid, char *filename, const char *mime);
int wk_serve_error(wk *web, int connid, wk_error wkerror);
int wk_writestr(wk *web, int connid, char *str);
int wk_write(wk *web, int connid, void *data, int datalen);
int wk_close(wk *web, int connid);

char *wk_uri_getheader(wk_uri *wkuri, char *header, char *defaultvalue);
char *wk_uri_getheaderbynum(wk_uri *wkuri, int num);

const char *mime_getdefault(const char *filename, const char *defaultmime);

siobuf *wk_iobufget(wk *web);
void wk_iobuffree(wk *web, int iobufnum);

#endif