/*@@ @file Cookies.c @date Mon Sep 18 21:08:37 2000 @author Tom Goodale @desc Cookie stuff. @enddesc @version $Header$ @@*/ #include "cctk.h" #include #include #include "util_String.h" #include "http_Request.h" #include "http_Cookies.h" #define STRING_NAMESPACE 1 #include "SString.h" static const char *rcsid = "$Header$"; CCTK_FILEVERSION(CactusConnect_HTTPD_Cookies_c) /******************************************************************** ********************* Local Data Types *********************** ********************************************************************/ /******************************************************************** ********************* Local Routine Prototypes ********************* ********************************************************************/ /******************************************************************** ********************* Other Routine Prototypes ********************* ********************************************************************/ /******************************************************************** ********************* Local Data ***************************** ********************************************************************/ /******************************************************************** ********************* External Routines ********************** ********************************************************************/ /*@@ @routine HTTP_CookieSend @date Mon Sep 18 22:42:35 2000 @author Tom Goodale @desc Sends a cookie to a browser. @enddesc @calls @calledby @history @endhistory @@*/ int HTTP_CookieSend(httpRequest *request, const char *name, const char *value, const char *path, const char *domain, const char *expires, int secure) { String *message = String_New(); SetToCString(message, "Set-Cookie: "); ConcatCString(message, name); ConcatCString(message, "="); ConcatCString(message, value); if(path) { ConcatCString(message, "; path="); ConcatCString(message, path); } if(domain) { ConcatCString(message, "; domain="); ConcatCString(message, domain); } if(expires) { ConcatCString(message, "; expires="); ConcatCString(message, expires); } if(secure) { ConcatCString(message, "; secure"); } ConcatCString(message, "\r\n"); Send_HTTP_String(request, message); String_Delete( message ); return 0; } /*@@ @routine HTTP_CookieCancel @date Mon Sep 18 22:43:04 2000 @author Tom Goodale @desc Cancels a cookie. @enddesc @calls @calledby @history @endhistory @@*/ int HTTP_CookieCancel(httpRequest *request, const char *name, const char *path) { String *message = String_New(); /* Clear the value */ SetToCString(message, "Set-Cookie: "); ConcatCString(message, name); ConcatCString(message, "="); if(path) { ConcatCString(message, "; path="); ConcatCString(message, path); } /* Pick a date in the past */ ConcatCString(message, "; expires Sun Sep 17 21:57:45 CEST 2000"); ConcatCString(message, "\r\n"); Send_HTTP_String(request, message); String_Delete( message ); return 0; } /*@@ @routine HTTP_CookieGet @date Mon Sep 18 22:43:20 2000 @author Tom Goodale @desc Gets the value of a cookie from a request. @enddesc @calls @calledby @history @endhistory @@*/ char *HTTP_CookieGet(httpRequest *request, const char *name) { char *retval = NULL; /* Get the cookie header */ const char *header = HTTP_HeaderValue(request,"Cookie"); if(header) { char *copy = Util_Strdup(header); char *position = copy; /* Search for name=value */ while((position = strstr(position, name)) != NULL) { position += strlen(name); if(*position == '=') { char *start = position+1; position=strstr(start, ";"); if(position) { *position = 0; } retval = Util_Strdup(start); break; } } free(copy); } return retval; } /******************************************************************** ********************* Local Routines ************************* ********************************************************************/