ecore/ecore_con - Add minimal http server and url cookies examples.

SVN revision: 61350
This commit is contained in:
Rafael Antognolli 2011-07-13 19:04:17 +00:00
parent afaf1b535b
commit e85a63bef5
4 changed files with 336 additions and 0 deletions

View File

@ -545,6 +545,74 @@
* for error handling.
*/
/**
* @page ecore_con_url_cookies_example_c Ecore_Con_Url - Managing cookies
*
* This example shows how to use an @ref Ecore_Con_Url and enable it to
* receive/send cookies. These cookies can be set by the server, saved to a
* file, loaded later from this file and sent again to the server. The complete
* example can be found at @ref ecore_con_url_cookies_example.c
* "ecore_con_url_cookies_example.c"
*
* First we are setting some callbacks for events that will be sent when data
* arrives in our connection (the data is the content of the file being
* downloaded), and when the download is completed. The @c _url_data_cb and
* @c _url_complete_cb are these callbacks:
*
* @dontinclude ecore_con_url_download_example.c
* @skip Eina_Bool
* @until main_loop_quit
* @until }
*
* In the @c main function we parse some parameter from the command line. These
* parameters are the url that we are connecting to, and cookie use policy.
*
* After that we initialize the libraries and create a handler to our request
* using the given url:
*
* @until goto end
* @until }
*
* We also set the event handlers for this request and add a header to it, that
* will inform our custom user agent:
*
* @until User-Agent
*
* Now we start playing with cookies. First, let's call
* ecore_con_url_cookies_init() to inform that we want cookies enabled. We also
* set a file from which we are loading previously set (old) cookies, in case
* that we don't want to clear old cookies or old session cookies.
*
* After that we set the file where we are going to save all valid cookies in
* the @ref Ecore_Con_Url object. This includes previously loaded cookies (that
* weren't cleared) and new cookies set by the response header "Set-Cookie" that
* comes with the response to our request:
*
* @until jar_file_set
*
* And finally, before performing the request, we check the command passed as
* argument in the command line and use it to choose between clearing old
* cookies, clearing just old session cookies, or ignoring old session cookies.
*
* After that we just finish our code as expected:
*
* @until return
* @until }
*
* Notice that in this code, if we want to clear old cookies, we also don't load
* them from the file. This is a bit confusing and the API isn't clear, but
* ecore_con_url_cookies_file_add() will load cookies from the specified files
* just when the operation is really performed (i.e. ecore_con_url_get() is
* called). So if ecore_con_url_cookies_clear() is called before
* ecore_con_url_get(), the old cookies may not have been loaded yet, so they
* are not cleared. To avoid having old cookies loaded, don't add any cookie
* file with ecore_con_url_cookies_file_add().
*
* The function ecore_con_url_cookies_clear() is just useful to clear cookies
* that are already loaded/valid in the @ref Ecore_Con_Url object (from a
* previous request, for example).
*/
/**
* @page ecore_con_url_headers_example_c Ecore_Con_Url - customizing a request
*
@ -821,6 +889,12 @@
* complete example description at @ref ecore_con_url_download_example_c
*/
/**
* @example ecore_con_url_cookies_example.c
* Shows how to manage cookies on a @ref Ecore_Con_Url object. See the complete
* example description at @ref ecore_con_url_cookies_example_c.
*/
/**
* @example ecore_con_server_simple_example.c
* Shows how to setup a simple server that accepts client connections and sends

View File

@ -30,7 +30,9 @@ SRCS = \
ecore_con_lookup_example.c \
ecore_con_url_headers_example.c \
ecore_con_url_download_example.c \
ecore_con_url_cookies_example.c \
ecore_con_server_simple_example.c \
ecore_con_server_http_example.c \
ecore_con_client_simple_example.c \
client_bench.c \
server_bench.c \
@ -65,7 +67,9 @@ pkglib_PROGRAMS += \
ecore_con_lookup_example \
ecore_con_url_headers_example \
ecore_con_url_download_example \
ecore_con_url_cookies_example \
ecore_con_server_simple_example \
ecore_con_server_http_example \
ecore_con_client_simple_example \
ecore_thread_example
@ -73,7 +77,9 @@ ecore_animator_example_LDADD = $(ECOREBASELDADD) @EVAS_LIBS@ $(top_builddir)/src
ecore_con_lookup_example_LDADD = $(ECOREBASELDADD) $(top_builddir)/src/lib/ecore_con/libecore_con.la
ecore_con_url_headers_example_LDADD = $(ECOREBASELDADD) $(top_builddir)/src/lib/ecore_con/libecore_con.la
ecore_con_url_download_example_LDADD = $(ECOREBASELDADD) $(top_builddir)/src/lib/ecore_con/libecore_con.la
ecore_con_url_cookies_example_LDADD = $(ECOREBASELDADD) $(top_builddir)/src/lib/ecore_con/libecore_con.la
ecore_con_server_simple_example_LDADD = $(ECOREBASELDADD) $(top_builddir)/src/lib/ecore_con/libecore_con.la
ecore_con_server_http_example_LDADD = $(ECOREBASELDADD) $(top_builddir)/src/lib/ecore_con/libecore_con.la
ecore_con_client_simple_example_LDADD = $(ECOREBASELDADD) $(top_builddir)/src/lib/ecore_con/libecore_con.la
endif

View File

@ -0,0 +1,137 @@
#include <stdio.h>
#include <sys/time.h>
#include <Ecore.h>
#include <Ecore_Con.h>
#ifdef HAVE_CONFIG_H
# include "config.h"
#else
# define __UNUSED__
#endif
static const char response_template[] =
"HTTP/1.0 200 OK\r\n"
"Server: Ecore_Con custom server\r\n"
"Content-Length: %zd\r\n"
"Content-Type: text/html; charset=UTF-8\r\n"
"Set-Cookie: MYCOOKIE=1; path=/; expires=%s"
"Set-Cookie: SESSIONCOOKIE=1; path=/\r\n"
"\r\n"
"%s"
"\r\n\r\n";
struct _Client {
int sdata;
};
Eina_Bool
_add(void *data __UNUSED__, int type __UNUSED__, Ecore_Con_Event_Client_Add *ev)
{
struct _Client *client = malloc(sizeof(*client));
client->sdata = 0;
static char buf[4096];
char welcome[] = "Welcome to Ecore_Con server!";
int nbytes;
time_t t;
printf("Client with ip %s, port %d, connected = %d!\n",
ecore_con_client_ip_get(ev->client),
ecore_con_client_port_get(ev->client),
ecore_con_client_connected_get(ev->client));
ecore_con_client_data_set(ev->client, client);
t = time(NULL);
t += 60 * 60 * 24;
nbytes = snprintf(buf, sizeof(buf), response_template, sizeof(welcome), ctime(&t), welcome);
ecore_con_client_send(ev->client, buf, nbytes);
ecore_con_client_flush(ev->client);
return ECORE_CALLBACK_RENEW;
}
Eina_Bool
_del(void *data __UNUSED__, int type __UNUSED__, Ecore_Con_Event_Client_Del *ev)
{
struct _Client *client;
if (!ev->client)
return ECORE_CALLBACK_RENEW;
client = ecore_con_client_data_get(ev->client);
printf("Lost client with ip %s!\n", ecore_con_client_ip_get(ev->client));
printf("Total data received from this client: %d\n", client->sdata);
printf("Client was connected for %0.3f seconds.\n",
ecore_con_client_uptime_get(ev->client));
if (client)
free(client);
ecore_con_client_del(ev->client);
return ECORE_CALLBACK_RENEW;
}
Eina_Bool
_data(void *data __UNUSED__, int type __UNUSED__, Ecore_Con_Event_Client_Data *ev)
{
char fmt[128];
struct _Client *client = ecore_con_client_data_get(ev->client);
snprintf(fmt, sizeof(fmt),
"\nReceived %i bytes from client %s port %d:\n"
">>>>>\n"
"%%.%is\n"
">>>>>\n\n",
ev->size, ecore_con_client_ip_get(ev->client),
ecore_con_client_port_get(ev->client), ev->size);
printf(fmt, ev->data);
client->sdata += ev->size;
return ECORE_CALLBACK_RENEW;
}
int main(void)
{
Ecore_Con_Server *svr;
Ecore_Con_Client *cl;
const Eina_List *clients, *l;
eina_init();
ecore_init();
ecore_con_init();
if (!(svr = ecore_con_server_add(ECORE_CON_REMOTE_TCP, "127.0.0.1", 8080, NULL)))
exit(1);
ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_ADD, (Ecore_Event_Handler_Cb)_add, NULL);
ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_DEL, (Ecore_Event_Handler_Cb)_del, NULL);
ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_DATA, (Ecore_Event_Handler_Cb)_data, NULL);
ecore_con_server_client_limit_set(svr, 3, 0);
ecore_main_loop_begin();
clients = ecore_con_server_clients_get(svr);
printf("Clients still connected to this server when exiting: %d\n",
eina_list_count(clients));
EINA_LIST_FOREACH(clients, l, cl)
{
printf("%s\n", ecore_con_client_ip_get(cl));
free(ecore_con_client_data_get(cl));
}
printf("Server was up for %0.3f seconds\n",
ecore_con_server_uptime_get(svr));
ecore_con_shutdown();
ecore_shutdown();
eina_shutdown();
return 0;
}

View File

@ -0,0 +1,119 @@
#include <stdio.h>
#include <Eina.h>
#include <Ecore.h>
#include <Ecore_Con.h>
#ifdef HAVE_CONFIG_H
# include "config.h"
#else
# define __UNUSED__
#endif
#define COOKIEJAR "cookies.jar"
static Eina_Bool
_url_data_cb(void *data __UNUSED__, int type __UNUSED__, void *event_info)
{
Ecore_Con_Event_Url_Data *url_data = event_info;
int i;
printf("\nData received from server:\n>>>>>\n");
for (i = 0; i < url_data->size; i++)
printf("%c", url_data->data[i]);
printf("\n>>>>>>\n\n");
return EINA_TRUE;
}
static Eina_Bool
_url_complete_cb(void *data __UNUSED__, int type __UNUSED__, void *event_info)
{
Ecore_Con_Event_Url_Complete *url_complete = event_info;
const Eina_List *headers, *l;
char *str;
printf("\n");
printf("download completed with status code: %d\n", url_complete->status);
headers = ecore_con_url_response_headers_get(url_complete->url_con);
printf("response headers:\n");
EINA_LIST_FOREACH(headers, l, str)
printf("header: %s", str);
ecore_con_url_cookies_jar_write(url_complete->url_con);
ecore_main_loop_quit();
return EINA_TRUE;
}
int main(int argc, const char *argv[])
{
Ecore_Con_Url *ec_url = NULL;
char cmd = '\0';
Eina_Bool r;
if (argc < 2)
{
printf("need at least one parameter: <url> [command]\n");
return -1;
}
if (argc > 2)
cmd = argv[2][0];
ecore_init();
ecore_con_init();
ecore_con_url_init();
ec_url = ecore_con_url_new(argv[1]);
if (!ec_url)
{
printf("error when creating ecore con url object.\n");
goto end;
}
ecore_event_handler_add(ECORE_CON_EVENT_URL_DATA, _url_data_cb, NULL);
ecore_event_handler_add(ECORE_CON_EVENT_URL_COMPLETE, _url_complete_cb, NULL);
ecore_con_url_additional_header_add(ec_url, "User-Agent", "Ecore_Con client");
ecore_con_url_cookies_init(ec_url);
if (cmd != 'c' && cmd != 's')
ecore_con_url_cookies_file_add(ec_url, COOKIEJAR);
ecore_con_url_cookies_jar_file_set(ec_url, COOKIEJAR);
switch (cmd)
{
case 'c': // clear
printf("Cleaning previously set cookies.\n");
ecore_con_url_cookies_clear(ec_url);
break;
case 's': // clear session
printf("Cleaning previously set session cookies.\n");
ecore_con_url_cookies_session_clear(ec_url);
break;
case 'i': // ignore session
printf("Ignoring old session cookies.\n");
ecore_con_url_cookies_ignore_old_session_set(ec_url, EINA_TRUE);
}
r = ecore_con_url_get(ec_url);
if (!r)
{
printf("could not realize request.\n");
goto free_ec_url;
}
ecore_main_loop_begin();
free_ec_url:
ecore_con_url_free(ec_url);
end:
ecore_con_url_shutdown();
ecore_con_shutdown();
ecore_shutdown();
return 0;
}