This example shows how to use an 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 \hyperlink{ecore_con_url_cookies_example_8c-example}{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 {\ttfamily \+\_\+url\+\_\+data\+\_\+cb} and {\ttfamily \+\_\+url\+\_\+complete\+\_\+cb} are these callbacks\+:

 
\begin{DoxyCodeInclude}
\textcolor{keyword}{static} \hyperlink{group__Eina__Types__Group_ga3fe0caf72e93b1bab1ca8ee3ccf3f226}{Eina\_Bool}
\_url\_progress\_cb(\textcolor{keywordtype}{void} *data EINA\_UNUSED, \textcolor{keywordtype}{int} type EINA\_UNUSED, \textcolor{keywordtype}{void} *event\_info)
\{
   \hyperlink{struct__Ecore__Con__Event__Url__Progress}{Ecore\_Con\_Event\_Url\_Progress} *url\_progress = event\_info;
   \textcolor{keywordtype}{float} percent;

   \textcolor{keywordflow}{if} (url\_progress->\hyperlink{struct__Ecore__Con__Event__Url__Progress_a7443bc2bc747c37290d53d41e0d378b5}{down}.\hyperlink{struct__Ecore__Con__Event__Url__Progress_a4ac5badcaedbbbdab002e162c11ed26b}{total} > 0)
     \{
        \textcolor{keyword}{struct }\_request *req = \hyperlink{group__Ecore__Con__Url__Group_gacad8548217172607bad2d2741935ffaa}{ecore\_con\_url\_data\_get}(url\_progress->
      \hyperlink{struct__Ecore__Con__Event__Url__Progress_a262d26bbc8e5483dc64e819a157a0b62}{url\_con});
        req->size = url\_progress->\hyperlink{struct__Ecore__Con__Event__Url__Progress_a7443bc2bc747c37290d53d41e0d378b5}{down}.\hyperlink{struct__Ecore__Con__Event__Url__Progress_a328d3ce438f4b9b093c4be9a4c8146a2}{now};

        percent = (url\_progress->\hyperlink{struct__Ecore__Con__Event__Url__Progress_a7443bc2bc747c37290d53d41e0d378b5}{down}.\hyperlink{struct__Ecore__Con__Event__Url__Progress_a328d3ce438f4b9b093c4be9a4c8146a2}{now} / url\_progress->\hyperlink{struct__Ecore__Con__Event__Url__Progress_a7443bc2bc747c37290d53d41e0d378b5}{down}.\hyperlink{struct__Ecore__Con__Event__Url__Progress_a4ac5badcaedbbbdab002e162c11ed26b}{total}) * 100;
        printf(\textcolor{stringliteral}{"Total of download complete: %0.1f (%0.0f)%%\(\backslash\)n"},
               percent, url\_progress->\hyperlink{struct__Ecore__Con__Event__Url__Progress_a7443bc2bc747c37290d53d41e0d378b5}{down}.\hyperlink{struct__Ecore__Con__Event__Url__Progress_a328d3ce438f4b9b093c4be9a4c8146a2}{now});
     \}

   printf(\textcolor{stringliteral}{"status: %d\(\backslash\)n"}, \hyperlink{group__Ecore__Con__Url__Group_gaf2e8dc10b2fcad5bbf012c0936424251}{ecore\_con\_url\_status\_code\_get}(url\_progress->
      \hyperlink{struct__Ecore__Con__Event__Url__Progress_a262d26bbc8e5483dc64e819a157a0b62}{url\_con}));

   \textcolor{keywordflow}{return} \hyperlink{group__Eina__Types__Group_ga05c12dacc8b4058994df842b41be85fc}{EINA\_TRUE};
\}

\textcolor{keyword}{static} \hyperlink{group__Eina__Types__Group_ga3fe0caf72e93b1bab1ca8ee3ccf3f226}{Eina\_Bool}
\_url\_complete\_cb(\textcolor{keywordtype}{void} *data EINA\_UNUSED, \textcolor{keywordtype}{int} type EINA\_UNUSED, \textcolor{keywordtype}{void} *event\_info)
\{
   \hyperlink{struct__Ecore__Con__Event__Url__Complete}{Ecore\_Con\_Event\_Url\_Complete} *url\_complete = event\_info;

   \textcolor{keyword}{struct }\_request *req = \hyperlink{group__Ecore__Con__Url__Group_gacad8548217172607bad2d2741935ffaa}{ecore\_con\_url\_data\_get}(url\_complete->
      \hyperlink{struct__Ecore__Con__Event__Url__Complete_a58335ec0eac21f9c0828695922807039}{url\_con});
   \textcolor{keywordtype}{int} nbytes = \hyperlink{group__Ecore__Con__Url__Group_ga9587eb74811d11b69b281a715b6fd1a1}{ecore\_con\_url\_received\_bytes\_get}(url\_complete->
      \hyperlink{struct__Ecore__Con__Event__Url__Complete_a58335ec0eac21f9c0828695922807039}{url\_con});

   printf(\textcolor{stringliteral}{"\(\backslash\)n"});
   printf(\textcolor{stringliteral}{"download completed with status code: %d\(\backslash\)n"}, url\_complete->\hyperlink{struct__Ecore__Con__Event__Url__Complete_ab842caa1615a911c3578e0dfeae5f773}{status});
   printf(\textcolor{stringliteral}{"Total size of downloaded file: %ld bytes\(\backslash\)n"}, req->size);
   printf(\textcolor{stringliteral}{"Total size of downloaded file: %d bytes "}
          \textcolor{stringliteral}{"(from received\_bytes\_get)\(\backslash\)n"}, nbytes);
   \hyperlink{group__Ecore__Main__Loop__Group_ga95cf8e97dff0716433c2c5474d606a98}{ecore\_main\_loop\_quit}();

   \textcolor{keywordflow}{return} \hyperlink{group__Eina__Types__Group_ga05c12dacc8b4058994df842b41be85fc}{EINA\_TRUE};
\}

\end{DoxyCodeInclude}


In the {\ttfamily 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\+:


\begin{DoxyCodeInclude}

\textcolor{keywordtype}{int}
main(\textcolor{keywordtype}{int} argc, \textcolor{keyword}{const} \textcolor{keywordtype}{char} *argv[])
\{
   Ecore\_Con\_Url *ec\_url = NULL;
   \textcolor{keyword}{struct }\_request *req;
   \textcolor{keywordtype}{int} fd;
   \textcolor{keyword}{const} \textcolor{keywordtype}{char} *filename = \textcolor{stringliteral}{"downloadedfile.dat"};

   \textcolor{keywordflow}{if} (argc < 2)
     \{
        printf(\textcolor{stringliteral}{"need one parameter: <url>\(\backslash\)n"});
        \textcolor{keywordflow}{return} -1;
     \}

   fd = open(filename, O\_CREAT | O\_BINARY | O\_WRONLY | O\_TRUNC, 0644);

   \textcolor{keywordflow}{if} (fd == -1)
     \{
        printf(\textcolor{stringliteral}{"error: could not open file for writing: \(\backslash\)"%s\(\backslash\)"\(\backslash\)n"},
               filename);
        \textcolor{keywordflow}{return} -1;
     \}

   \hyperlink{group__Ecore__Init__Group_ga77757609684a2c922dc5ec398274751b}{ecore\_init}();
   \hyperlink{group__Ecore__Con__Events__Group_gacf5ecf42c516bb9c8b6759721e9559bd}{ecore\_con\_init}();
   \hyperlink{group__Ecore__Con__Url__Group_gac3fbeaf9cde529362e4567fc37e45c9f}{ecore\_con\_url\_init}();

   ec\_url = \hyperlink{group__Ecore__Con__Url__Group_gae40b7c1a94413166c61524b707118f19}{ecore\_con\_url\_new}(argv[1]);
   \textcolor{keywordflow}{if} (!ec\_url)
     \{
        printf(\textcolor{stringliteral}{"error when creating ecore con url object.\(\backslash\)n"});
        \textcolor{keywordflow}{goto} end;
     \}

\end{DoxyCodeInclude}


We also set the event handlers for this request and add a header to it, that will inform our custom user agent\+:


\begin{DoxyCodeInclude}

\end{DoxyCodeInclude}


Now we start playing with cookies. First, let\textquotesingle{}s call \hyperlink{group__Ecore__Con__Url__Group_gae5c1b9a66fefc8787639f7c8a93385f7}{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\textquotesingle{}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 Ecore\+\_\+\+Con\+\_\+\+Url object. This includes previously loaded cookies (that weren\textquotesingle{}t cleared) and new cookies set by the response header \char`\"{}\+Set-\/\+Cookie\char`\"{} that comes with the response to our request\+:


\begin{DoxyCodeInclude}

\end{DoxyCodeInclude}


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\+:


\begin{DoxyCodeInclude}

\end{DoxyCodeInclude}


Notice that in this code, if we want to clear old cookies, we also don\textquotesingle{}t load them from the file. This is a bit confusing and the A\+PI isn\textquotesingle{}t clear, but \hyperlink{group__Ecore__Con__Url__Group_ga77166d4a6fc33910e695535c8e856719}{ecore\+\_\+con\+\_\+url\+\_\+cookies\+\_\+file\+\_\+add()} will load cookies from the specified files just when the operation is really performed (i.\+e. \hyperlink{group__Ecore__Con__Url__Group_ga46f75358256eec26bd99eef96b25ffa8}{ecore\+\_\+con\+\_\+url\+\_\+get()} is called). So if \hyperlink{group__Ecore__Con__Url__Group_ga551d90e851f84148c3c5d130513538d9}{ecore\+\_\+con\+\_\+url\+\_\+cookies\+\_\+clear()} is called before \hyperlink{group__Ecore__Con__Url__Group_ga46f75358256eec26bd99eef96b25ffa8}{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\textquotesingle{}t add any cookie file with \hyperlink{group__Ecore__Con__Url__Group_ga77166d4a6fc33910e695535c8e856719}{ecore\+\_\+con\+\_\+url\+\_\+cookies\+\_\+file\+\_\+add()}.

The function \hyperlink{group__Ecore__Con__Url__Group_ga551d90e851f84148c3c5d130513538d9}{ecore\+\_\+con\+\_\+url\+\_\+cookies\+\_\+clear()} is just useful to clear cookies that are already loaded/valid in the Ecore\+\_\+\+Con\+\_\+\+Url object (from a previous request, for example). 