- From: Frear <from_w3c@frear.com>
- Date: Fri, 29 Oct 2004 10:22:45 -0500 (CDT)
- To: www-talk@w3.org
- cc: Jim_Ravan@avid.com
Hello! I'm writing to share a modification I just made. I've been using the w3c tool from the libwww package for sending arbitrary POSTs to a website. Recently, I needed the ability to send a cookie along with that POST as well. I found out that the command line tool has no support for cookies. Actually, I retrieved the cookie from the remote system by using grep and sed on w3c with the -vs option, and THEN I realized there was no mechanism to send a cookie back! So, I made an addition to ComLine/src/HTLine.c and now my version of w3c has a -cookie option that can be used to send a cookie. You are expected to enter: -cookie CookieVariable=CookieValue If you look at my code you will see that it is not a very pretty hack - its the minimal effort required to make this support work. I don't do any validity checking, I just expect the command line usage to be whats described above (and thats important to know, because when you use -cookie the next arg is embedded directly into the protocol stream, so you will send out invalid http if you use this option incorrectly). I was able to make my code change because of the *teriffic* information I found from Jim_Ravan@avid.com at http://lists.w3.org/Archives/Public/www-lib/1999JanMar/0372.html I hope my code change is useful to someone out there or perhaps inspires someone to re-do this work correctly. (I'd like my work to resemble the cookie support in wget. That is, you give a cookie-output file and then ComLine uses HTCookie to grab cookies from a server and formats and writes them to the file, and you can give a cookie-input file and ComLine reads that and uses a generator much like I have done to send cookies. But -- the hackish code change that I did was enough effort for me, I'll leave an improvment to the next custodian of this work.) Enjoy! --- ComLine/src/HTLine.c.orig Thu Jun 3 13:42:12 1999 +++ ComLine/src/HTLine.c Thu Oct 28 23:11:40 2004 @@ -142,9 +142,10 @@ PRIVATE void VersionInfo (const char * name) { HTPrint("\nW3C OpenSource Software"); - HTPrint("\n-----------------------\n\n"); + HTPrint("\n-----------------------\n"); + HTPrint("This version was modified for -cookie support\n\n"); HTPrint("\tWebCon version %s\n", APP_VERSION); HTPrint("\tusing the W3C libwww library version %s.\n\n",HTLib_version()); HTPrint("\tTry \"%s -help\" for help\n\n", name ? name : APP_NAME); HTPrint("\tSee \"http://www.w3.org/ComLine/User/\" for user information\n"); @@ -232,8 +233,92 @@ } return YES; } +/* Storage for our cookie.. */ +HTList *cookie_list; +char **cookie_strings; + +/* I don't know why I need to define this, but I do. Thanks to: + * Jim_Ravan@avid.com for writing some help at: + * http://lists.w3.org/Archives/Public/www-lib/1999JanMar/0372.html + */ +struct _HTStream +{ + const HTStreamClass * isa; + HTStream * target; +}; + +static int SendCookie( HTRequest *request, HTStream *stream ) +{ + const char CookiePrefix[] = "Cookie: "; + const char CookieSeperator[] = "; "; + const char CookieSuffix[] = "\n"; + int i=0; + + if( cookie_strings != NULL && cookie_strings[0] != NULL ) + (*stream->target->isa->put_block) \ + (stream->target, CookiePrefix, 8 ); + else + return HT_OK; + + while( cookie_strings[i] != NULL ) { + if( i != 0 ) + (*stream->target->isa->put_block) \ + (stream->target, CookieSeperator, 2 ); + + (*stream->target->isa->put_block) \ + (stream->target, cookie_strings[i], \ + strlen(cookie_strings[i]) ); + i++; + } + (*stream->target->isa->put_block) (stream->target, CookieSuffix, 1 ); + + return HT_OK; +} + +static void AddCookie( char *newStr ) +{ + int len; + + if( cookie_strings == NULL ) { + len = 0; + cookie_strings = malloc( 2*sizeof(char *) ); + if( cookie_strings == NULL ) { + HTPrint("Fatal: Couldn't malloc!\n"); + exit( 1 ); + } + cookie_strings[0] = newStr; + cookie_strings[1] = NULL; + } else { + len = 0; + while( cookie_strings[len] != NULL ) + len++; + cookie_strings = realloc(cookie_strings, (len+2)*sizeof(char *)); + if( cookie_strings == NULL ) { + HTPrint("Fatal: Couldn't realloc!\n"); + exit( 1 ); + } + cookie_strings[len] = newStr; + cookie_strings[++len] = NULL; + } +} + +PRIVATE BOOL InitCookies() +{ + cookie_list = HTList_new(); + if( cookie_list == NULL ) { + HTPrint("Bad cookie list. Bad!\n"); + return NO; + } + if( ! HTList_appendObject( cookie_list, SendCookie ) ) { + HTPrint("Didn't add object.\n"); + return NO; + } + HTHeader_setGenerator( cookie_list ); + return YES; +} + /* ------------------------------------------------------------------------- */ /* MAIN PROGRAM */ /* ------------------------------------------------------------------------- */ @@ -267,8 +352,10 @@ SIOUXSettings.asktosaveonclose = false; argc=ccommand(&argv); #endif + cookie_strings = NULL; + /* Initiate W3C Reference Library with a client profile */ HTProfile_newNoCacheClient(APP_NAME, APP_VERSION); /* Need our own trace and print functions */ @@ -288,8 +375,13 @@ ** matter that we get an encoding that we don't know. */ HTFormat_addCoding("*", HTIdentityCoding, HTIdentityCoding, 0.3); + if( ! InitCookies() ) { + HTPrint("Problem initializing cookies!\n"); + return 1; + } + /* Scan command Line for parameters */ for (arg=1; arg<argc; arg++) { if (*argv[arg] == '-') { @@ -441,8 +533,11 @@ /* TRACE Method */ } else if (!strcasecomp(argv[arg], "-trace")) { method = METHOD_TRACE; + + } else if (!strcmp(argv[arg], "-cookie")) { + AddCookie( argv[++arg] ); } else { if (SHOW_MSG) HTPrint("Bad Argument (%s)\n", argv[arg]); }
Received on Friday, 29 October 2004 15:25:28 UTC