1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-08-01 00:19:27 +02:00
audacity/lib-src/libraptor/src/raptor_www_libxml.c
2010-01-24 09:19:39 +00:00

167 lines
3.9 KiB
C

/* -*- Mode: c; c-basic-offset: 2 -*-
*
* raptor_www_libxml.c - Raptor WWW retrieval via libxml2
*
* Copyright (C) 2003-2008, David Beckett http://purl.org/net/dajobe/
* Copyright (C) 2003-2004, University of Bristol, UK http://www.bristol.ac.uk/
*
* This package is Free Software and part of Redland http://librdf.org/
*
* It is licensed under the following three licenses as alternatives:
* 1. GNU Lesser General Public License (LGPL) V2.1 or any newer version
* 2. GNU General Public License (GPL) V2 or any newer version
* 3. Apache License, V2.0 or any newer version
*
* You may not use this file except in compliance with at least one of
* the above three licenses.
*
* See LICENSE.html or LICENSE.txt at the top of this package for the
* complete terms and further detail along with the license texts for
* the licenses in COPYING.LIB, COPYING and LICENSE-2.0.txt respectively.
*
*
*/
#ifdef HAVE_CONFIG_H
#include <raptor_config.h>
#endif
#ifdef WIN32
#include <win32_raptor_config.h>
#endif
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
/* Raptor includes */
#include "raptor.h"
#include "raptor_internal.h"
#ifdef RAPTOR_WWW_LIBXML
void
raptor_www_libxml_init(raptor_www *www)
{
www->error_handlers.handlers[RAPTOR_LOG_LEVEL_NONE].user_data=www;
www->old_xmlGenericErrorContext=xmlGenericErrorContext;
xmlSetGenericErrorFunc(&www->error_handlers, raptor_libxml_generic_error);
www->ctxt=NULL;
}
void
raptor_www_libxml_free(raptor_www *www)
{
xmlSetGenericErrorFunc(www->old_xmlGenericErrorContext,
raptor_libxml_generic_error);
}
int
raptor_www_libxml_fetch(raptor_www *www)
{
char* headers=NULL;
if(www->proxy)
xmlNanoHTTPScanProxy(www->proxy);
if(www->http_accept || www->user_agent) {
size_t accept_len=0;
size_t ua_len=0;
size_t cc_len=0;
size_t len=0;
char *p;
if(www->http_accept) {
accept_len=strlen(www->http_accept);
len+=accept_len+2; /* \r\n */
}
if(www->user_agent) {
ua_len=strlen(www->user_agent);
len+=12+ua_len+2; /* strlen("User-Agent: ") + \r\n */
}
if(www->cache_control) {
cc_len=strlen(www->cache_control);
len+=cc_len+2; /* \r\n */
}
headers=(char*)RAPTOR_MALLOC(cstring, len+1);
if(!headers)
return 1;
p=headers;
if(www->http_accept) {
strncpy(p, www->http_accept, accept_len);
p+= accept_len;
*p++='\r';
*p++='\n';
}
if(www->user_agent) {
strncpy(p, "User-Agent: ", 12);
p+=12;
strncpy(p, www->user_agent, ua_len);
p+= ua_len;
*p++='\r';
*p++='\n';
}
if(www->cache_control) {
strncpy(p, www->cache_control, cc_len);
p+= cc_len;
*p++='\r';
*p++='\n';
}
*p='\0';
}
www->ctxt=xmlNanoHTTPMethod((const char*)raptor_uri_as_string(www->uri),
NULL, /* HTTP method (default GET) */
NULL, /* input string */
&www->type,
headers,
0); /* input length - ilen */
if(headers)
RAPTOR_FREE(cstring, headers);
if(!www->ctxt)
return 1;
if(www->type) {
if(www->content_type) {
www->content_type(www, www->content_type_userdata, www->type);
if(www->failed) {
xmlNanoHTTPClose(www->ctxt);
return 1;
}
}
xmlFree(www->type);
www->type=NULL;
}
www->status_code=xmlNanoHTTPReturnCode(www->ctxt);
while(1) {
int len=xmlNanoHTTPRead(www->ctxt, www->buffer, RAPTOR_WWW_BUFFER_SIZE);
if(len<0)
break;
www->total_bytes += len;
if(www->write_bytes)
www->write_bytes(www, www->write_bytes_userdata, www->buffer, len, 1);
if(len < RAPTOR_WWW_BUFFER_SIZE || www->failed)
break;
}
xmlNanoHTTPClose(www->ctxt);
return www->failed;
}
#endif /* #ifdef RAPTOR_WWW_LIBXML*/