- From: Bastiaan Schaap <b.schaap@siteminds.nl>
- Date: Thu, 08 Dec 2005 15:55:56 +0100
- To: www-lib@w3.org
Hi all,
It's been quite a while since I did C/C++ programming, and I am trying
to write a simple program that downloads a text-file from a url,
protected with basic http authentication. All it needs to do is put the
result in a text-file called: http_buffer.txt. However, my function
seems to 'hang' if I try to download from a protected url. I've searched
the archives, but I could only find one relevant entry which solution I
have tried.
I have the following function, based on the libwww sample code:
int download(char *url) {
// A file to save the result in
FILE *logfile;
// HTTP request and reply variables
HTRequest *request = HTRequest_new();
HTList *converters = HTList_new(); /* List of converters */
HTList *encodings = HTList_new(); /* List of encoders */
HTChunk *chunk = NULL;
// Initialize libwww core
HTLibInit("JustATest", "0.1B");
// set up our own traces
HTPrint_setCallback(printer);
HTTrace_setCallback(tracer);
// Add our own code to handle username/password authentication
HTAlert_deleteOpcode(HT_A_USER_PW);
HTAlert_add(httpbasicauth, HT_A_USER_PW);
// Turn on TRACE so we can see what is going on
HTSetTraceMessageMask("sop");
// On windows we must always set up the eventloop
HTEventInit();
// Register the default set of transport protocols
HTTransportInit();
// Register the default set of protocol modules
HTProtocolInit();
// Register the default set of BEFORE and AFTER callback functions
HTNetInit();
// Register the default set of converters
HTConverterInit(converters);
HTFormat_setConversion(converters);
// Register the default set of transfer encoders and decoders
HTTransferEncoderInit(encodings);
HTFormat_setTransferCoding(encodings);
// Register the default set of MIME header parsers
HTMIMEInit();
// Add our own filter to handle termination
HTNet_addAfter(term_handler, NULL, NULL, HT_ALL, HT_FILTER_LAST);
// Set up the request and pass it to the Library
HTRequest_setOutputFormat(request, WWW_SOURCE);
HTRequest_setPreemptive(request, YES);
// Open the file to store the download in
logfile=fopen("http_buffer.txt","w");
if (url) {
char *cwd = HTGetCurrentDirectoryURL();
char *absolute_url = HTParse(url, cwd, PARSE_ALL);
HTAnchor *anchor = HTAnchor_findAddress(absolute_url);
chunk = HTLoadAnchorToChunk(anchor, request);
HT_FREE(absolute_url);
HT_FREE(cwd);
// If chunk != NULL then we have the data
if (chunk) {
char *string;
// wait until the request is over
HTEventList_loop(request);
string = HTChunk_toCString(chunk);
// Append the string to the result-file
if(logfile != 0) {
// Append the line to the logfile
fprintf(logfile,"%s",string);
}
// Debug: print chunk to screen
//HTPrint("%s", string ? string : "no text");
// Free string
HT_FREE(string);
}
} else {
// We didn't get a correct url..
writelogline("Error: no url found for downloading.\n");
}
// Close the result-file
if (logfile != 0) {
fclose(logfile);
}
// Clean up the request
HTRequest_delete(request);
HTFormat_deleteAll();
// On windows, shut down eventloop as well
HTEventTerminate();
// Terminate the Library
HTLibTerminate();
return 0;
}
If I understand correctly, by calling the HTAlert_add, I've added my own
'event-handler' for the HT_A_USER_PW event. I've implemented this as
follows (taken from the CommandLine example program by mr. Nielsen):
PRIVATE BOOL httpbasicauth( HTRequest * request, HTAlertOpcode op, int
msgnum, const char * dfault, void * input, HTAlertPar * reply) {
// Reply the username and password to the server
writelogline("Sending basic http authentication info...");
HTAlert_setReplyMessage(reply, "it_is_i");
HTAlert_setReplySecret(reply, "leclerc");
return YES;
}
However, if I call my download function with a protected url, it seems
to 'hang'. From my log I can see it never enters the httpbasicauth
function... I'm probably making a n00b mistake here, but any help is
much appreciated!
Cheers,
Bastiaan Schaap
Received on Friday, 9 December 2005 09:11:14 UTC