1ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 2ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * nanohttp.c: minimalist HTTP GET implementation to fetch external subsets. 3ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * focuses on size, streamability, reentrancy and portability 4ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is clearly not a general purpose HTTP implementation 6ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If you look for one, check: 7ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * http://www.w3.org/Library/ 8ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * See Copyright for the status of this software. 10ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 11ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * daniel@veillard.com 12ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 14ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NEED_SOCKETS 15ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IN_LIBXML 16ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "libxml.h" 17ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 18ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_HTTP_ENABLED 19ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <string.h> 20ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 21ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_STDLIB_H 22ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <stdlib.h> 23ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 24ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_UNISTD_H 25ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <unistd.h> 26ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 27ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_SYS_TYPES_H 28ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <sys/types.h> 29ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 30ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_SYS_SOCKET_H 31ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <sys/socket.h> 32ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 33ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_NETINET_IN_H 34ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <netinet/in.h> 35ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 36ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_ARPA_INET_H 37ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <arpa/inet.h> 38ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 39ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_NETDB_H 40ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <netdb.h> 41ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 42ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_RESOLV_H 43ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_ARPA_NAMESER_H 44ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <arpa/nameser.h> 45ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 46ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <resolv.h> 47ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 48ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_FCNTL_H 4994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun#include <fcntl.h> 50ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 51ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_ERRNO_H 52ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <errno.h> 53ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 54ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_SYS_TIME_H 55ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <sys/time.h> 56ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 57df143a5041f03a22808b59c76698770b74692815Selim Gurun#ifndef HAVE_POLL_H 58ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_SYS_SELECT_H 59ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <sys/select.h> 60ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 61df143a5041f03a22808b59c76698770b74692815Selim Gurun#else 62df143a5041f03a22808b59c76698770b74692815Selim Gurun#include <poll.h> 63df143a5041f03a22808b59c76698770b74692815Selim Gurun#endif 64ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_STRINGS_H 65ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <strings.h> 66ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 67ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_ZLIB_H 68ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <zlib.h> 69ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 70ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 71ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 72ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef VMS 73ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <stropts> 74ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SOCKLEN_T unsigned int 75ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 76ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 77ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(__MINGW32__) || defined(_WIN32_WCE) 78df143a5041f03a22808b59c76698770b74692815Selim Gurun#ifndef _WINSOCKAPI_ 79ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define _WINSOCKAPI_ 80df143a5041f03a22808b59c76698770b74692815Selim Gurun#endif 81ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <wsockcompat.h> 82ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <winsock2.h> 83ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#undef XML_SOCKLEN_T 84ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SOCKLEN_T unsigned int 85ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 86ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 87ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/globals.h> 88ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlerror.h> 89ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlmemory.h> 90ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/parser.h> /* for xmlStr(n)casecmp() */ 91ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/nanohttp.h> 92ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/globals.h> 93ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/uri.h> 94ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 95ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 96ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A couple portability macros 97ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 98ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef _WINSOCKAPI_ 9960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#if !defined(__BEOS__) || defined(__HAIKU__) 100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define closesocket(s) close(s) 101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define SOCKET int 103df143a5041f03a22808b59c76698770b74692815Selim Gurun#define INVALID_SOCKET (-1) 104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef __BEOS__ 107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef PF_INET 108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define PF_INET AF_INET 109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef XML_SOCKLEN_T 113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SOCKLEN_T unsigned int 114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef STANDALONE 117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG_HTTP 118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define xmlStrncasecmp(a, b, n) strncasecmp((char *)a, (char *)b, n) 119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define xmlStrcasecmpi(a, b) strcasecmp((char *)a, (char *)b) 120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_NANO_HTTP_MAX_REDIR 10 123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_NANO_HTTP_CHUNK 4096 125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_NANO_HTTP_CLOSED 0 127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_NANO_HTTP_WRITE 1 128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_NANO_HTTP_READ 2 129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_NANO_HTTP_NONE 4 130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct xmlNanoHTTPCtxt { 132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char *protocol; /* the protocol name */ 133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char *hostname; /* the host name */ 134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int port; /* the port */ 135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char *path; /* the path within the URL */ 136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char *query; /* the query string */ 137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SOCKET fd; /* the file descriptor for the socket */ 138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int state; /* WRITE / READ / CLOSED */ 139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char *out; /* buffer sent (zero terminated) */ 140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char *outptr; /* index within the buffer sent */ 141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char *in; /* the receiving buffer */ 142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char *content; /* the start of the content */ 143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char *inptr; /* the next byte to read from network */ 144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char *inrptr; /* the next byte to give back to the client */ 145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int inlen; /* len of the input buffer */ 146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int last; /* return code for last operation */ 147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int returnValue; /* the protocol return value */ 148df143a5041f03a22808b59c76698770b74692815Selim Gurun int version; /* the protocol version */ 149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ContentLength; /* specified content length from HTTP header */ 150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char *contentType; /* the MIME type for the input */ 151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char *location; /* the new URL in case of redirect */ 152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char *authHeader; /* contents of {WWW,Proxy}-Authenticate header */ 153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char *encoding; /* encoding extracted from the contentType */ 154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char *mimeType; /* Mime-Type extracted from the contentType */ 155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_ZLIB_H 156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project z_stream *strm; /* Zlib stream object */ 157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int usesGzip; /* "Content-Encoding: gzip" was detected */ 158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlNanoHTTPCtxt, *xmlNanoHTTPCtxtPtr; 160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int initialized = 0; 162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic char *proxy = NULL; /* the proxy name if any */ 163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int proxyPort; /* the proxy port if any */ 164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic unsigned int timeout = 60;/* the select() timeout in seconds */ 165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlNanoHTTPFetchContent( void * ctx, char ** ptr, int * len ); 167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlHTTPErrMemory: 170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra: extra informations 171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle an out of memory condition 173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlHTTPErrMemory(const char *extra) 176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlSimpleError(XML_FROM_HTTP, XML_ERR_NO_MEMORY, NULL, NULL, extra); 178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A portability function 182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int socket_errno(void) { 184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef _WINSOCKAPI_ 185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(WSAGetLastError()); 186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else 187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(errno); 188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef SUPPORT_IP6 192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic 193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint have_ipv6(void) { 194df143a5041f03a22808b59c76698770b74692815Selim Gurun SOCKET s; 195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project s = socket (AF_INET6, SOCK_STREAM, 0); 197df143a5041f03a22808b59c76698770b74692815Selim Gurun if (s != INVALID_SOCKET) { 198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project close (s); 199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNanoHTTPInit: 207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Initialize the HTTP protocol layer. 209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Currently it just checks for proxy informations 210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNanoHTTPInit(void) { 214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *env; 215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef _WINSOCKAPI_ 21694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun WSADATA wsaData; 217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (initialized) 220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef _WINSOCKAPI_ 223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) 224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (proxy == NULL) { 228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project proxyPort = 80; 229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project env = getenv("no_proxy"); 230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (env && ((env[0] == '*') && (env[1] == 0))) 231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project env = getenv("http_proxy"); 233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (env != NULL) { 234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNanoHTTPScanProxy(env); 235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project env = getenv("HTTP_PROXY"); 238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (env != NULL) { 239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNanoHTTPScanProxy(env); 240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdone: 244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project initialized = 1; 245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNanoHTTPCleanup: 249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup the HTTP protocol layer. 251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNanoHTTPCleanup(void) { 255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (proxy != NULL) { 256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(proxy); 257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project proxy = NULL; 258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef _WINSOCKAPI_ 260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (initialized) 261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project WSACleanup(); 262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project initialized = 0; 264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNanoHTTPScanURL: 269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTTP context 270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @URL: The URL used to initialize the context 271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (Re)Initialize an HTTP context by parsing the URL and finding 273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the protocol host port and path it indicates. 274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNanoHTTPScanURL(xmlNanoHTTPCtxtPtr ctxt, const char *URL) { 278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlURIPtr uri; 27994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun int len; 28094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Clear any existing data from the context 283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 28494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if (ctxt->protocol != NULL) { 285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->protocol); 286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->protocol = NULL; 287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 28894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if (ctxt->hostname != NULL) { 289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->hostname); 290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->hostname = NULL; 291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 29294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if (ctxt->path != NULL) { 293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->path); 294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->path = NULL; 295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 29694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if (ctxt->query != NULL) { 297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->query); 298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->query = NULL; 299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (URL == NULL) return; 301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project uri = xmlParseURIRaw(URL, 1); 303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (uri == NULL) 304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((uri->scheme == NULL) || (uri->server == NULL)) { 307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeURI(uri); 308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 31094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->protocol = xmlMemStrdup(uri->scheme); 31294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun /* special case of IPv6 addresses, the [] need to be removed */ 31394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if ((uri->server != NULL) && (*uri->server == '[')) { 31494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun len = strlen(uri->server); 31594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if ((len > 2) && (uri->server[len - 1] == ']')) { 31694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun ctxt->hostname = (char *) xmlCharStrndup(uri->server + 1, len -2); 31794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun } else 31894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun ctxt->hostname = xmlMemStrdup(uri->server); 31994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun } else 32094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun ctxt->hostname = xmlMemStrdup(uri->server); 321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (uri->path != NULL) 322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->path = xmlMemStrdup(uri->path); 323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->path = xmlMemStrdup("/"); 325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (uri->query != NULL) 326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->query = xmlMemStrdup(uri->query); 327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (uri->port != 0) 328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->port = uri->port; 329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeURI(uri); 331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNanoHTTPScanProxy: 335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @URL: The proxy URL used to initialize the proxy context 336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (Re)Initialize the HTTP Proxy context by parsing the URL and finding 338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the protocol host port it indicates. 339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Should be like http://myproxy/ or http://myproxy:3128/ 340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A NULL URL cleans up proxy informations. 341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNanoHTTPScanProxy(const char *URL) { 345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlURIPtr uri; 346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 34794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if (proxy != NULL) { 348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(proxy); 349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project proxy = NULL; 350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project proxyPort = 0; 352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_HTTP 354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (URL == NULL) 355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Removing HTTP proxy info\n"); 357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Using HTTP proxy %s\n", URL); 360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (URL == NULL) return; 362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project uri = xmlParseURIRaw(URL, 1); 364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((uri == NULL) || (uri->scheme == NULL) || 365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (strcmp(uri->scheme, "http")) || (uri->server == NULL)) { 366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlIOErr(XML_FROM_HTTP, XML_HTTP_URL_SYNTAX, "Syntax Error\n"); 367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (uri != NULL) 368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeURI(uri); 369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 37194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project proxy = xmlMemStrdup(uri->server); 373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (uri->port != 0) 374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project proxyPort = uri->port; 375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeURI(uri); 377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNanoHTTPNewCtxt: 381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @URL: The URL used to initialize the context 382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate and initialize a new HTTP context. 384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns an HTTP context or NULL in case of error. 386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNanoHTTPCtxtPtr 389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNanoHTTPNewCtxt(const char *URL) { 390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNanoHTTPCtxtPtr ret; 391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlNanoHTTPCtxtPtr) xmlMalloc(sizeof(xmlNanoHTTPCtxt)); 393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHTTPErrMemory("allocating context"); 395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlNanoHTTPCtxt)); 399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->port = 80; 400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->returnValue = 0; 401df143a5041f03a22808b59c76698770b74692815Selim Gurun ret->fd = INVALID_SOCKET; 402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->ContentLength = -1; 403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNanoHTTPScanURL(ret, URL); 405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNanoHTTPFreeCtxt: 411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTTP context 412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Frees the context after closing the connection. 414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNanoHTTPFreeCtxt(xmlNanoHTTPCtxtPtr ctxt) { 418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) return; 419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->hostname != NULL) xmlFree(ctxt->hostname); 420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->protocol != NULL) xmlFree(ctxt->protocol); 421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->path != NULL) xmlFree(ctxt->path); 422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->query != NULL) xmlFree(ctxt->query); 423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->out != NULL) xmlFree(ctxt->out); 424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->in != NULL) xmlFree(ctxt->in); 425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->contentType != NULL) xmlFree(ctxt->contentType); 426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->encoding != NULL) xmlFree(ctxt->encoding); 427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->mimeType != NULL) xmlFree(ctxt->mimeType); 428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->location != NULL) xmlFree(ctxt->location); 429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->authHeader != NULL) xmlFree(ctxt->authHeader); 430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_ZLIB_H 431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->strm != NULL) { 432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project inflateEnd(ctxt->strm); 433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->strm); 434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = XML_NANO_HTTP_NONE; 438df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->fd != INVALID_SOCKET) closesocket(ctxt->fd); 439df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->fd = INVALID_SOCKET; 440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt); 441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNanoHTTPSend: 445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTTP context 446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Send the input needed to initiate the processing on the server side 448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns number of bytes sent or -1 on error. 449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 452df143a5041f03a22808b59c76698770b74692815Selim GurunxmlNanoHTTPSend(xmlNanoHTTPCtxtPtr ctxt, const char *xmt_ptr, int outlen) 453df143a5041f03a22808b59c76698770b74692815Selim Gurun{ 454df143a5041f03a22808b59c76698770b74692815Selim Gurun int total_sent = 0; 455df143a5041f03a22808b59c76698770b74692815Selim Gurun#ifdef HAVE_POLL_H 456df143a5041f03a22808b59c76698770b74692815Selim Gurun struct pollfd p; 457df143a5041f03a22808b59c76698770b74692815Selim Gurun#else 458df143a5041f03a22808b59c76698770b74692815Selim Gurun struct timeval tv; 459df143a5041f03a22808b59c76698770b74692815Selim Gurun fd_set wfd; 460df143a5041f03a22808b59c76698770b74692815Selim Gurun#endif 461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 462df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((ctxt->state & XML_NANO_HTTP_WRITE) && (xmt_ptr != NULL)) { 463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (total_sent < outlen) { 464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nsent = send(ctxt->fd, xmt_ptr + total_sent, 465df143a5041f03a22808b59c76698770b74692815Selim Gurun outlen - total_sent, 0); 466df143a5041f03a22808b59c76698770b74692815Selim Gurun 467df143a5041f03a22808b59c76698770b74692815Selim Gurun if (nsent > 0) 468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total_sent += nsent; 469df143a5041f03a22808b59c76698770b74692815Selim Gurun else if ((nsent == -1) && 470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(EAGAIN) && EAGAIN != EWOULDBLOCK 471df143a5041f03a22808b59c76698770b74692815Selim Gurun (socket_errno() != EAGAIN) && 472df143a5041f03a22808b59c76698770b74692815Selim Gurun#endif 473df143a5041f03a22808b59c76698770b74692815Selim Gurun (socket_errno() != EWOULDBLOCK)) { 474df143a5041f03a22808b59c76698770b74692815Selim Gurun __xmlIOErr(XML_FROM_HTTP, 0, "send failed\n"); 475df143a5041f03a22808b59c76698770b74692815Selim Gurun if (total_sent == 0) 476df143a5041f03a22808b59c76698770b74692815Selim Gurun total_sent = -1; 477df143a5041f03a22808b59c76698770b74692815Selim Gurun break; 478df143a5041f03a22808b59c76698770b74692815Selim Gurun } else { 479df143a5041f03a22808b59c76698770b74692815Selim Gurun /* 480df143a5041f03a22808b59c76698770b74692815Selim Gurun * No data sent 481df143a5041f03a22808b59c76698770b74692815Selim Gurun * Since non-blocking sockets are used, wait for 482df143a5041f03a22808b59c76698770b74692815Selim Gurun * socket to be writable or default timeout prior 483df143a5041f03a22808b59c76698770b74692815Selim Gurun * to retrying. 484df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 485df143a5041f03a22808b59c76698770b74692815Selim Gurun#ifndef HAVE_POLL_H 486df143a5041f03a22808b59c76698770b74692815Selim Gurun#ifndef _WINSOCKAPI_ 487df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->fd > FD_SETSIZE) 488df143a5041f03a22808b59c76698770b74692815Selim Gurun return -1; 489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 490df143a5041f03a22808b59c76698770b74692815Selim Gurun 491df143a5041f03a22808b59c76698770b74692815Selim Gurun tv.tv_sec = timeout; 492df143a5041f03a22808b59c76698770b74692815Selim Gurun tv.tv_usec = 0; 493df143a5041f03a22808b59c76698770b74692815Selim Gurun FD_ZERO(&wfd); 494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef _MSC_VER 495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#pragma warning(push) 496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#pragma warning(disable: 4018) 497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 498df143a5041f03a22808b59c76698770b74692815Selim Gurun FD_SET(ctxt->fd, &wfd); 499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef _MSC_VER 500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#pragma warning(pop) 501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 502df143a5041f03a22808b59c76698770b74692815Selim Gurun (void) select(ctxt->fd + 1, NULL, &wfd, NULL, &tv); 503df143a5041f03a22808b59c76698770b74692815Selim Gurun#else 504df143a5041f03a22808b59c76698770b74692815Selim Gurun p.fd = ctxt->fd; 505df143a5041f03a22808b59c76698770b74692815Selim Gurun p.events = POLLOUT; 506df143a5041f03a22808b59c76698770b74692815Selim Gurun (void) poll(&p, 1, timeout * 1000); 507df143a5041f03a22808b59c76698770b74692815Selim Gurun#endif /* !HAVE_POLL_H */ 508df143a5041f03a22808b59c76698770b74692815Selim Gurun } 509df143a5041f03a22808b59c76698770b74692815Selim Gurun } 510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return total_sent; 513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNanoHTTPRecv: 517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTTP context 518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Read information coming from the HTTP connection. 520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is a blocking call (but it blocks in select(), not read()). 521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of byte read or -1 in case of error. 523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 526df143a5041f03a22808b59c76698770b74692815Selim GurunxmlNanoHTTPRecv(xmlNanoHTTPCtxtPtr ctxt) 527df143a5041f03a22808b59c76698770b74692815Selim Gurun{ 528df143a5041f03a22808b59c76698770b74692815Selim Gurun#ifdef HAVE_POLL_H 529df143a5041f03a22808b59c76698770b74692815Selim Gurun struct pollfd p; 530df143a5041f03a22808b59c76698770b74692815Selim Gurun#else 531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fd_set rfd; 532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project struct timeval tv; 533df143a5041f03a22808b59c76698770b74692815Selim Gurun#endif 534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (ctxt->state & XML_NANO_HTTP_READ) { 537df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->in == NULL) { 538df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->in = (char *) xmlMallocAtomic(65000 * sizeof(char)); 539df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->in == NULL) { 540df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlHTTPErrMemory("allocating input"); 541df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->last = -1; 542df143a5041f03a22808b59c76698770b74692815Selim Gurun return (-1); 543df143a5041f03a22808b59c76698770b74692815Selim Gurun } 544df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->inlen = 65000; 545df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->inptr = ctxt->content = ctxt->inrptr = ctxt->in; 546df143a5041f03a22808b59c76698770b74692815Selim Gurun } 547df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->inrptr > ctxt->in + XML_NANO_HTTP_CHUNK) { 548df143a5041f03a22808b59c76698770b74692815Selim Gurun int delta = ctxt->inrptr - ctxt->in; 549df143a5041f03a22808b59c76698770b74692815Selim Gurun int len = ctxt->inptr - ctxt->inrptr; 550df143a5041f03a22808b59c76698770b74692815Selim Gurun 551df143a5041f03a22808b59c76698770b74692815Selim Gurun memmove(ctxt->in, ctxt->inrptr, len); 552df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->inrptr -= delta; 553df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->content -= delta; 554df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->inptr -= delta; 555df143a5041f03a22808b59c76698770b74692815Selim Gurun } 556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->in + ctxt->inlen) < (ctxt->inptr + XML_NANO_HTTP_CHUNK)) { 557df143a5041f03a22808b59c76698770b74692815Selim Gurun int d_inptr = ctxt->inptr - ctxt->in; 558df143a5041f03a22808b59c76698770b74692815Selim Gurun int d_content = ctxt->content - ctxt->in; 559df143a5041f03a22808b59c76698770b74692815Selim Gurun int d_inrptr = ctxt->inrptr - ctxt->in; 560df143a5041f03a22808b59c76698770b74692815Selim Gurun char *tmp_ptr = ctxt->in; 561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 562df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->inlen *= 2; 563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->in = (char *) xmlRealloc(tmp_ptr, ctxt->inlen); 564df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->in == NULL) { 565df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlHTTPErrMemory("allocating input buffer"); 566df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlFree(tmp_ptr); 567df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->last = -1; 568df143a5041f03a22808b59c76698770b74692815Selim Gurun return (-1); 569df143a5041f03a22808b59c76698770b74692815Selim Gurun } 570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->inptr = ctxt->in + d_inptr; 571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->content = ctxt->in + d_content; 572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->inrptr = ctxt->in + d_inrptr; 573df143a5041f03a22808b59c76698770b74692815Selim Gurun } 574df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->last = recv(ctxt->fd, ctxt->inptr, XML_NANO_HTTP_CHUNK, 0); 575df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->last > 0) { 576df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->inptr += ctxt->last; 577df143a5041f03a22808b59c76698770b74692815Selim Gurun return (ctxt->last); 578df143a5041f03a22808b59c76698770b74692815Selim Gurun } 579df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->last == 0) { 580df143a5041f03a22808b59c76698770b74692815Selim Gurun return (0); 581df143a5041f03a22808b59c76698770b74692815Selim Gurun } 582df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->last == -1) { 583df143a5041f03a22808b59c76698770b74692815Selim Gurun switch (socket_errno()) { 584df143a5041f03a22808b59c76698770b74692815Selim Gurun case EINPROGRESS: 585df143a5041f03a22808b59c76698770b74692815Selim Gurun case EWOULDBLOCK: 586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(EAGAIN) && EAGAIN != EWOULDBLOCK 587df143a5041f03a22808b59c76698770b74692815Selim Gurun case EAGAIN: 588df143a5041f03a22808b59c76698770b74692815Selim Gurun#endif 589df143a5041f03a22808b59c76698770b74692815Selim Gurun break; 590df143a5041f03a22808b59c76698770b74692815Selim Gurun 591df143a5041f03a22808b59c76698770b74692815Selim Gurun case ECONNRESET: 592df143a5041f03a22808b59c76698770b74692815Selim Gurun case ESHUTDOWN: 593df143a5041f03a22808b59c76698770b74692815Selim Gurun return (0); 594df143a5041f03a22808b59c76698770b74692815Selim Gurun 595df143a5041f03a22808b59c76698770b74692815Selim Gurun default: 596df143a5041f03a22808b59c76698770b74692815Selim Gurun __xmlIOErr(XML_FROM_HTTP, 0, "recv failed\n"); 597df143a5041f03a22808b59c76698770b74692815Selim Gurun return (-1); 598df143a5041f03a22808b59c76698770b74692815Selim Gurun } 599df143a5041f03a22808b59c76698770b74692815Selim Gurun } 600df143a5041f03a22808b59c76698770b74692815Selim Gurun#ifdef HAVE_POLL_H 601df143a5041f03a22808b59c76698770b74692815Selim Gurun p.fd = ctxt->fd; 602df143a5041f03a22808b59c76698770b74692815Selim Gurun p.events = POLLIN; 603df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((poll(&p, 1, timeout * 1000) < 1) 604df143a5041f03a22808b59c76698770b74692815Selim Gurun#if defined(EINTR) 605df143a5041f03a22808b59c76698770b74692815Selim Gurun && (errno != EINTR) 606df143a5041f03a22808b59c76698770b74692815Selim Gurun#endif 607df143a5041f03a22808b59c76698770b74692815Selim Gurun ) 608df143a5041f03a22808b59c76698770b74692815Selim Gurun return (0); 609df143a5041f03a22808b59c76698770b74692815Selim Gurun#else /* !HAVE_POLL_H */ 610df143a5041f03a22808b59c76698770b74692815Selim Gurun#ifndef _WINSOCKAPI_ 611df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->fd > FD_SETSIZE) 612df143a5041f03a22808b59c76698770b74692815Selim Gurun return 0; 613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 615df143a5041f03a22808b59c76698770b74692815Selim Gurun tv.tv_sec = timeout; 616df143a5041f03a22808b59c76698770b74692815Selim Gurun tv.tv_usec = 0; 617df143a5041f03a22808b59c76698770b74692815Selim Gurun FD_ZERO(&rfd); 618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef _MSC_VER 620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#pragma warning(push) 621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#pragma warning(disable: 4018) 622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 623df143a5041f03a22808b59c76698770b74692815Selim Gurun 624df143a5041f03a22808b59c76698770b74692815Selim Gurun FD_SET(ctxt->fd, &rfd); 625df143a5041f03a22808b59c76698770b74692815Selim Gurun 626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef _MSC_VER 627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#pragma warning(pop) 628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 629df143a5041f03a22808b59c76698770b74692815Selim Gurun 630df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((select(ctxt->fd + 1, &rfd, NULL, NULL, &tv) < 1) 631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(EINTR) 632df143a5041f03a22808b59c76698770b74692815Selim Gurun && (errno != EINTR) 633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 634df143a5041f03a22808b59c76698770b74692815Selim Gurun ) 635df143a5041f03a22808b59c76698770b74692815Selim Gurun return (0); 636df143a5041f03a22808b59c76698770b74692815Selim Gurun#endif /* !HAVE_POLL_H */ 637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 638df143a5041f03a22808b59c76698770b74692815Selim Gurun return (0); 639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNanoHTTPReadLine: 643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTTP context 644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Read one line in the HTTP server output, usually for extracting 646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the HTTP protocol informations from the answer header. 647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a newly allocated string with a copy of the line, or NULL 649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * which indicate the end of the input. 650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic char * 653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNanoHTTPReadLine(xmlNanoHTTPCtxtPtr ctxt) { 654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char buf[4096]; 655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char *bp = buf; 656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int rc; 65794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (bp - buf < 4095) { 659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->inrptr == ctxt->inptr) { 660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ( (rc = xmlNanoHTTPRecv(ctxt)) == 0) { 661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (bp == buf) 662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *bp = 0; 665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlMemStrdup(buf)); 666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if ( rc == -1 ) { 668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ( NULL ); 669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *bp = *ctxt->inrptr++; 672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*bp == '\n') { 673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *bp = 0; 674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlMemStrdup(buf)); 675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*bp != '\r') 677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project bp++; 678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buf[4095] = 0; 680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlMemStrdup(buf)); 681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNanoHTTPScanAnswer: 686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTTP context 687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @line: an HTTP header line 688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try to extract useful informations from the server answer. 690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We currently parse and process: 691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - The HTTP revision/ return code 692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - The Content-Type, Mime-Type and charset used 693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - The Location for redirect processing. 694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of failure, the file descriptor number otherwise 696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNanoHTTPScanAnswer(xmlNanoHTTPCtxtPtr ctxt, const char *line) { 700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *cur = line; 701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (line == NULL) return; 703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!strncmp(line, "HTTP/", 5)) { 705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int version = 0; 706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0; 707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur += 5; 709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((*cur >= '0') && (*cur <= '9')) { 710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project version *= 10; 711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project version += *cur - '0'; 712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*cur == '.') { 715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((*cur >= '0') && (*cur <= '9')) { 717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project version *= 10; 718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project version += *cur - '0'; 719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((*cur >= '0') && (*cur <= '9')) 722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project version *= 10; 725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((*cur != ' ') && (*cur != '\t')) return; 726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((*cur == ' ') || (*cur == '\t')) cur++; 727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((*cur < '0') || (*cur > '9')) return; 728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((*cur >= '0') && (*cur <= '9')) { 729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret *= 10; 730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret += *cur - '0'; 731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((*cur != 0) && (*cur != ' ') && (*cur != '\t')) return; 734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->returnValue = ret; 735df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->version = version; 736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (!xmlStrncasecmp(BAD_CAST line, BAD_CAST"Content-Type:", 13)) { 737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *charset, *last, *mime; 738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur += 13; 739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((*cur == ' ') || (*cur == '\t')) cur++; 740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->contentType != NULL) 741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->contentType); 742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->contentType = xmlMemStrdup(cur); 743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mime = (const xmlChar *) cur; 744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = mime; 745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((*last != 0) && (*last != ' ') && (*last != '\t') && 746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*last != ';') && (*last != ',')) 747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last++; 748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->mimeType != NULL) 749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->mimeType); 750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->mimeType = (char *) xmlStrndup(mime, last - mime); 751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project charset = xmlStrstr(BAD_CAST ctxt->contentType, BAD_CAST "charset="); 752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (charset != NULL) { 753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project charset += 8; 754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = charset; 755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((*last != 0) && (*last != ' ') && (*last != '\t') && 756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*last != ';') && (*last != ',')) 757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last++; 758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->encoding != NULL) 759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->encoding); 760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->encoding = (char *) xmlStrndup(charset, last - charset); 761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (!xmlStrncasecmp(BAD_CAST line, BAD_CAST"ContentType:", 12)) { 763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *charset, *last, *mime; 764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur += 12; 765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->contentType != NULL) return; 766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((*cur == ' ') || (*cur == '\t')) cur++; 767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->contentType = xmlMemStrdup(cur); 768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mime = (const xmlChar *) cur; 769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = mime; 770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((*last != 0) && (*last != ' ') && (*last != '\t') && 771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*last != ';') && (*last != ',')) 772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last++; 773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->mimeType != NULL) 774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->mimeType); 775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->mimeType = (char *) xmlStrndup(mime, last - mime); 776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project charset = xmlStrstr(BAD_CAST ctxt->contentType, BAD_CAST "charset="); 777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (charset != NULL) { 778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project charset += 8; 779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = charset; 780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((*last != 0) && (*last != ' ') && (*last != '\t') && 781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*last != ';') && (*last != ',')) 782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last++; 783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->encoding != NULL) 784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->encoding); 785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->encoding = (char *) xmlStrndup(charset, last - charset); 786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (!xmlStrncasecmp(BAD_CAST line, BAD_CAST"Location:", 9)) { 788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur += 9; 789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((*cur == ' ') || (*cur == '\t')) cur++; 790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->location != NULL) 791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->location); 792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*cur == '/') { 793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *tmp_http = xmlStrdup(BAD_CAST "http://"); 79494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun xmlChar *tmp_loc = 795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStrcat(tmp_http, (const xmlChar *) ctxt->hostname); 79694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun ctxt->location = 797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (char *) xmlStrcat (tmp_loc, (const xmlChar *) cur); 798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->location = xmlMemStrdup(cur); 800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (!xmlStrncasecmp(BAD_CAST line, BAD_CAST"WWW-Authenticate:", 17)) { 802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur += 17; 803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((*cur == ' ') || (*cur == '\t')) cur++; 804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->authHeader != NULL) 805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->authHeader); 806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->authHeader = xmlMemStrdup(cur); 807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (!xmlStrncasecmp(BAD_CAST line, BAD_CAST"Proxy-Authenticate:", 19)) { 808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur += 19; 809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((*cur == ' ') || (*cur == '\t')) cur++; 810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->authHeader != NULL) 811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->authHeader); 812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->authHeader = xmlMemStrdup(cur); 813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_ZLIB_H 814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ( !xmlStrncasecmp( BAD_CAST line, BAD_CAST"Content-Encoding:", 17) ) { 815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur += 17; 816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((*cur == ' ') || (*cur == '\t')) cur++; 817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ( !xmlStrncasecmp( BAD_CAST cur, BAD_CAST"gzip", 4) ) { 818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->usesGzip = 1; 819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->strm = xmlMalloc(sizeof(z_stream)); 821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->strm != NULL) { 823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->strm->zalloc = Z_NULL; 824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->strm->zfree = Z_NULL; 825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->strm->opaque = Z_NULL; 826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->strm->avail_in = 0; 827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->strm->next_in = Z_NULL; 828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project inflateInit2( ctxt->strm, 31 ); 830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ( !xmlStrncasecmp( BAD_CAST line, BAD_CAST"Content-Length:", 15) ) { 834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur += 15; 835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->ContentLength = strtol( cur, NULL, 10 ); 836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNanoHTTPConnectAttempt: 841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @addr: a socket address structure 842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Attempt a connection to the given IP:port endpoint. It forces 844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * non-blocking semantic on the socket, and allow 60 seconds for 845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the host to answer. 846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of failure, the file descriptor number otherwise 848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 850df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic SOCKET 851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNanoHTTPConnectAttempt(struct sockaddr *addr) 852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 853df143a5041f03a22808b59c76698770b74692815Selim Gurun#ifndef HAVE_POLL_H 854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fd_set wfd; 855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef _WINSOCKAPI_ 856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fd_set xfd; 857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project struct timeval tv; 859df143a5041f03a22808b59c76698770b74692815Selim Gurun#else /* !HAVE_POLL_H */ 860df143a5041f03a22808b59c76698770b74692815Selim Gurun struct pollfd p; 861df143a5041f03a22808b59c76698770b74692815Selim Gurun#endif /* !HAVE_POLL_H */ 862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int status; 863df143a5041f03a22808b59c76698770b74692815Selim Gurun 864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int addrlen; 865df143a5041f03a22808b59c76698770b74692815Selim Gurun 866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SOCKET s; 867df143a5041f03a22808b59c76698770b74692815Selim Gurun 868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef SUPPORT_IP6 869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (addr->sa_family == AF_INET6) { 870df143a5041f03a22808b59c76698770b74692815Selim Gurun s = socket(PF_INET6, SOCK_STREAM, IPPROTO_TCP); 871df143a5041f03a22808b59c76698770b74692815Selim Gurun addrlen = sizeof(struct sockaddr_in6); 872df143a5041f03a22808b59c76698770b74692815Selim Gurun } else 873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 875df143a5041f03a22808b59c76698770b74692815Selim Gurun s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); 876df143a5041f03a22808b59c76698770b74692815Selim Gurun addrlen = sizeof(struct sockaddr_in); 877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 878df143a5041f03a22808b59c76698770b74692815Selim Gurun if (s == INVALID_SOCKET) { 879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_HTTP 880df143a5041f03a22808b59c76698770b74692815Selim Gurun perror("socket"); 881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 882df143a5041f03a22808b59c76698770b74692815Selim Gurun __xmlIOErr(XML_FROM_HTTP, 0, "socket failed\n"); 883df143a5041f03a22808b59c76698770b74692815Selim Gurun return INVALID_SOCKET; 884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef _WINSOCKAPI_ 886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 887df143a5041f03a22808b59c76698770b74692815Selim Gurun u_long one = 1; 888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 889df143a5041f03a22808b59c76698770b74692815Selim Gurun status = ioctlsocket(s, FIONBIO, &one) == SOCKET_ERROR ? -1 : 0; 890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else /* _WINSOCKAPI_ */ 892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(VMS) 893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 894df143a5041f03a22808b59c76698770b74692815Selim Gurun int enable = 1; 895df143a5041f03a22808b59c76698770b74692815Selim Gurun 896df143a5041f03a22808b59c76698770b74692815Selim Gurun status = ioctl(s, FIONBIO, &enable); 897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else /* VMS */ 89960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#if defined(__BEOS__) && !defined(__HAIKU__) 900df143a5041f03a22808b59c76698770b74692815Selim Gurun { 901df143a5041f03a22808b59c76698770b74692815Selim Gurun bool noblock = true; 902df143a5041f03a22808b59c76698770b74692815Selim Gurun 903df143a5041f03a22808b59c76698770b74692815Selim Gurun status = 904df143a5041f03a22808b59c76698770b74692815Selim Gurun setsockopt(s, SOL_SOCKET, SO_NONBLOCK, &noblock, 905df143a5041f03a22808b59c76698770b74692815Selim Gurun sizeof(noblock)); 906df143a5041f03a22808b59c76698770b74692815Selim Gurun } 907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else /* __BEOS__ */ 908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((status = fcntl(s, F_GETFL, 0)) != -1) { 909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef O_NONBLOCK 910df143a5041f03a22808b59c76698770b74692815Selim Gurun status |= O_NONBLOCK; 911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else /* O_NONBLOCK */ 912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef F_NDELAY 913df143a5041f03a22808b59c76698770b74692815Selim Gurun status |= F_NDELAY; 914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* F_NDELAY */ 915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* !O_NONBLOCK */ 916df143a5041f03a22808b59c76698770b74692815Selim Gurun status = fcntl(s, F_SETFL, status); 917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (status < 0) { 919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_HTTP 920df143a5041f03a22808b59c76698770b74692815Selim Gurun perror("nonblocking"); 921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 922df143a5041f03a22808b59c76698770b74692815Selim Gurun __xmlIOErr(XML_FROM_HTTP, 0, "error setting non-blocking IO\n"); 923df143a5041f03a22808b59c76698770b74692815Selim Gurun closesocket(s); 924df143a5041f03a22808b59c76698770b74692815Selim Gurun return INVALID_SOCKET; 925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* !__BEOS__ */ 927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* !VMS */ 928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* !_WINSOCKAPI_ */ 929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 930df143a5041f03a22808b59c76698770b74692815Selim Gurun if (connect(s, addr, addrlen) == -1) { 931df143a5041f03a22808b59c76698770b74692815Selim Gurun switch (socket_errno()) { 932df143a5041f03a22808b59c76698770b74692815Selim Gurun case EINPROGRESS: 933df143a5041f03a22808b59c76698770b74692815Selim Gurun case EWOULDBLOCK: 934df143a5041f03a22808b59c76698770b74692815Selim Gurun break; 935df143a5041f03a22808b59c76698770b74692815Selim Gurun default: 936df143a5041f03a22808b59c76698770b74692815Selim Gurun __xmlIOErr(XML_FROM_HTTP, 0, 937df143a5041f03a22808b59c76698770b74692815Selim Gurun "error connecting to HTTP server"); 938df143a5041f03a22808b59c76698770b74692815Selim Gurun closesocket(s); 939df143a5041f03a22808b59c76698770b74692815Selim Gurun return INVALID_SOCKET; 940df143a5041f03a22808b59c76698770b74692815Selim Gurun } 941df143a5041f03a22808b59c76698770b74692815Selim Gurun } 942df143a5041f03a22808b59c76698770b74692815Selim Gurun#ifndef HAVE_POLL_H 943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tv.tv_sec = timeout; 944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tv.tv_usec = 0; 945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef _MSC_VER 947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#pragma warning(push) 948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#pragma warning(disable: 4018) 949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 950df143a5041f03a22808b59c76698770b74692815Selim Gurun#ifndef _WINSOCKAPI_ 951df143a5041f03a22808b59c76698770b74692815Selim Gurun if (s > FD_SETSIZE) 952df143a5041f03a22808b59c76698770b74692815Selim Gurun return INVALID_SOCKET; 953df143a5041f03a22808b59c76698770b74692815Selim Gurun#endif 954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project FD_ZERO(&wfd); 955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project FD_SET(s, &wfd); 956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 957df143a5041f03a22808b59c76698770b74692815Selim Gurun#ifdef _WINSOCKAPI_ 958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project FD_ZERO(&xfd); 959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project FD_SET(s, &xfd); 960df143a5041f03a22808b59c76698770b74692815Selim Gurun 961df143a5041f03a22808b59c76698770b74692815Selim Gurun switch (select(s + 1, NULL, &wfd, &xfd, &tv)) 962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else 963df143a5041f03a22808b59c76698770b74692815Selim Gurun switch (select(s + 1, NULL, &wfd, NULL, &tv)) 964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef _MSC_VER 966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#pragma warning(pop) 967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 968df143a5041f03a22808b59c76698770b74692815Selim Gurun 969df143a5041f03a22808b59c76698770b74692815Selim Gurun#else /* !HAVE_POLL_H */ 970df143a5041f03a22808b59c76698770b74692815Selim Gurun p.fd = s; 971df143a5041f03a22808b59c76698770b74692815Selim Gurun p.events = POLLOUT; 972df143a5041f03a22808b59c76698770b74692815Selim Gurun switch (poll(&p, 1, timeout * 1000)) 973df143a5041f03a22808b59c76698770b74692815Selim Gurun#endif /* !HAVE_POLL_H */ 974df143a5041f03a22808b59c76698770b74692815Selim Gurun 975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 976df143a5041f03a22808b59c76698770b74692815Selim Gurun case 0: 977df143a5041f03a22808b59c76698770b74692815Selim Gurun /* Time out */ 978df143a5041f03a22808b59c76698770b74692815Selim Gurun __xmlIOErr(XML_FROM_HTTP, 0, "Connect attempt timed out"); 979df143a5041f03a22808b59c76698770b74692815Selim Gurun closesocket(s); 980df143a5041f03a22808b59c76698770b74692815Selim Gurun return INVALID_SOCKET; 981df143a5041f03a22808b59c76698770b74692815Selim Gurun case -1: 982df143a5041f03a22808b59c76698770b74692815Selim Gurun /* Ermm.. ?? */ 983df143a5041f03a22808b59c76698770b74692815Selim Gurun __xmlIOErr(XML_FROM_HTTP, 0, "Connect failed"); 984df143a5041f03a22808b59c76698770b74692815Selim Gurun closesocket(s); 985df143a5041f03a22808b59c76698770b74692815Selim Gurun return INVALID_SOCKET; 986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 988df143a5041f03a22808b59c76698770b74692815Selim Gurun#ifndef HAVE_POLL_H 989df143a5041f03a22808b59c76698770b74692815Selim Gurun if (FD_ISSET(s, &wfd) 990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef _WINSOCKAPI_ 991df143a5041f03a22808b59c76698770b74692815Selim Gurun || FD_ISSET(s, &xfd) 992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 993df143a5041f03a22808b59c76698770b74692815Selim Gurun ) 994df143a5041f03a22808b59c76698770b74692815Selim Gurun#else /* !HAVE_POLL_H */ 995df143a5041f03a22808b59c76698770b74692815Selim Gurun if (p.revents == POLLOUT) 996df143a5041f03a22808b59c76698770b74692815Selim Gurun#endif /* !HAVE_POLL_H */ 997df143a5041f03a22808b59c76698770b74692815Selim Gurun { 998df143a5041f03a22808b59c76698770b74692815Selim Gurun XML_SOCKLEN_T len; 999df143a5041f03a22808b59c76698770b74692815Selim Gurun 1000df143a5041f03a22808b59c76698770b74692815Selim Gurun len = sizeof(status); 1001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef SO_ERROR 1002df143a5041f03a22808b59c76698770b74692815Selim Gurun if (getsockopt(s, SOL_SOCKET, SO_ERROR, (char *) &status, &len) < 1003df143a5041f03a22808b59c76698770b74692815Selim Gurun 0) { 1004df143a5041f03a22808b59c76698770b74692815Selim Gurun /* Solaris error code */ 1005df143a5041f03a22808b59c76698770b74692815Selim Gurun __xmlIOErr(XML_FROM_HTTP, 0, "getsockopt failed\n"); 1006df143a5041f03a22808b59c76698770b74692815Selim Gurun return INVALID_SOCKET; 1007df143a5041f03a22808b59c76698770b74692815Selim Gurun } 1008df143a5041f03a22808b59c76698770b74692815Selim Gurun#endif 1009df143a5041f03a22808b59c76698770b74692815Selim Gurun if (status) { 1010df143a5041f03a22808b59c76698770b74692815Selim Gurun __xmlIOErr(XML_FROM_HTTP, 0, 1011df143a5041f03a22808b59c76698770b74692815Selim Gurun "Error connecting to remote host"); 1012df143a5041f03a22808b59c76698770b74692815Selim Gurun closesocket(s); 1013df143a5041f03a22808b59c76698770b74692815Selim Gurun errno = status; 1014df143a5041f03a22808b59c76698770b74692815Selim Gurun return INVALID_SOCKET; 1015df143a5041f03a22808b59c76698770b74692815Selim Gurun } 1016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1017df143a5041f03a22808b59c76698770b74692815Selim Gurun /* pbm */ 1018df143a5041f03a22808b59c76698770b74692815Selim Gurun __xmlIOErr(XML_FROM_HTTP, 0, "select failed\n"); 1019df143a5041f03a22808b59c76698770b74692815Selim Gurun closesocket(s); 1020df143a5041f03a22808b59c76698770b74692815Selim Gurun return INVALID_SOCKET; 1021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1022df143a5041f03a22808b59c76698770b74692815Selim Gurun 1023df143a5041f03a22808b59c76698770b74692815Selim Gurun return (s); 1024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1025df143a5041f03a22808b59c76698770b74692815Selim Gurun 1026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNanoHTTPConnectHost: 1028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @host: the host name 1029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @port: the port number 1030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Attempt a connection to the given host:port endpoint. It tries 1032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the multiple IP provided by the DNS if available. 1033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of failure, the file descriptor number otherwise 1035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1037df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic SOCKET 1038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNanoHTTPConnectHost(const char *host, int port) 1039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project struct hostent *h; 1041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project struct sockaddr *addr = NULL; 1042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project struct in_addr ia; 1043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project struct sockaddr_in sockin; 1044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef SUPPORT_IP6 1046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project struct in6_addr ia6; 1047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project struct sockaddr_in6 sockin6; 1048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 1050df143a5041f03a22808b59c76698770b74692815Selim Gurun SOCKET s; 1051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset (&sockin, 0, sizeof(sockin)); 1053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef SUPPORT_IP6 1054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset (&sockin6, 0, sizeof(sockin6)); 1055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if !defined(HAVE_GETADDRINFO) && defined(SUPPORT_IP6) && defined(RES_USE_INET6) 1058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (have_ipv6 ()) 1059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 1060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!(_res.options & RES_INIT)) 1061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res_init(); 1062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project _res.options |= RES_USE_INET6; 1063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(HAVE_GETADDRINFO) && defined(SUPPORT_IP6) && !defined(_WIN32) 1067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (have_ipv6 ()) 1068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(HAVE_GETADDRINFO) && (defined(SUPPORT_IP6) || defined(_WIN32)) 1070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 1071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int status; 1072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project struct addrinfo hints, *res, *result; 1073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project result = NULL; 1075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset (&hints, 0,sizeof(hints)); 1076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project hints.ai_socktype = SOCK_STREAM; 1077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project status = getaddrinfo (host, NULL, &hints, &result); 1079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (status) { 1080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlIOErr(XML_FROM_HTTP, 0, "getaddrinfo failed\n"); 1081df143a5041f03a22808b59c76698770b74692815Selim Gurun return INVALID_SOCKET; 1082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (res = result; res; res = res->ai_next) { 1085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res->ai_family == AF_INET) { 1086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res->ai_addrlen > sizeof(sockin)) { 1087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlIOErr(XML_FROM_HTTP, 0, "address size mismatch\n"); 1088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project freeaddrinfo (result); 1089df143a5041f03a22808b59c76698770b74692815Selim Gurun return INVALID_SOCKET; 1090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy (&sockin, res->ai_addr, res->ai_addrlen); 1092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sockin.sin_port = htons (port); 1093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project addr = (struct sockaddr *)&sockin; 1094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef SUPPORT_IP6 1095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (have_ipv6 () && (res->ai_family == AF_INET6)) { 1096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res->ai_addrlen > sizeof(sockin6)) { 1097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlIOErr(XML_FROM_HTTP, 0, "address size mismatch\n"); 1098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project freeaddrinfo (result); 1099df143a5041f03a22808b59c76698770b74692815Selim Gurun return INVALID_SOCKET; 1100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy (&sockin6, res->ai_addr, res->ai_addrlen); 1102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sockin6.sin6_port = htons (port); 1103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project addr = (struct sockaddr *)&sockin6; 1104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 1106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; /* for */ 1107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project s = xmlNanoHTTPConnectAttempt (addr); 1109df143a5041f03a22808b59c76698770b74692815Selim Gurun if (s != INVALID_SOCKET) { 1110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project freeaddrinfo (result); 1111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (s); 1112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (result) 1116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project freeaddrinfo (result); 1117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(HAVE_GETADDRINFO) && defined(SUPPORT_IP6) && !defined(_WIN32) 1120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if !defined(HAVE_GETADDRINFO) || !defined(_WIN32) 1123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 1124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project h = gethostbyname (host); 1125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (h == NULL) { 1126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 1128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Okay, I got fed up by the non-portability of this error message 1129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * extraction code. it work on Linux, if it work on your platform 1130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and one want to enable it, send me the defined(foobar) needed 1131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(HAVE_NETDB_H) && defined(HOST_NOT_FOUND) && defined(linux) 1133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *h_err_txt = ""; 1134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (h_errno) { 1136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case HOST_NOT_FOUND: 1137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project h_err_txt = "Authoritive host not found"; 1138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case TRY_AGAIN: 1141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project h_err_txt = 1142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Non-authoritive host not found or server failure."; 1143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case NO_RECOVERY: 1146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project h_err_txt = 1147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Non-recoverable errors: FORMERR, REFUSED, or NOTIMP."; 1148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 115094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun#ifdef NO_ADDRESS 1151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case NO_ADDRESS: 1152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project h_err_txt = 1153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Valid name, no data record of requested type."; 1154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 115594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun#endif 1156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 1158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project h_err_txt = "No error text defined."; 1159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlIOErr(XML_FROM_HTTP, 0, h_err_txt); 1162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else 1163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlIOErr(XML_FROM_HTTP, 0, "Failed to resolve host"); 1164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1165df143a5041f03a22808b59c76698770b74692815Selim Gurun return INVALID_SOCKET; 1166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; h->h_addr_list[i]; i++) { 1169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (h->h_addrtype == AF_INET) { 1170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* A records (IPv4) */ 1171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((unsigned int) h->h_length > sizeof(ia)) { 1172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlIOErr(XML_FROM_HTTP, 0, "address size mismatch\n"); 1173df143a5041f03a22808b59c76698770b74692815Selim Gurun return INVALID_SOCKET; 1174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy (&ia, h->h_addr_list[i], h->h_length); 1176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sockin.sin_family = h->h_addrtype; 1177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sockin.sin_addr = ia; 117894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun sockin.sin_port = (unsigned short)htons ((unsigned short)port); 1179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project addr = (struct sockaddr *) &sockin; 1180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef SUPPORT_IP6 1181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (have_ipv6 () && (h->h_addrtype == AF_INET6)) { 1182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* AAAA records (IPv6) */ 1183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((unsigned int) h->h_length > sizeof(ia6)) { 1184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlIOErr(XML_FROM_HTTP, 0, "address size mismatch\n"); 1185df143a5041f03a22808b59c76698770b74692815Selim Gurun return INVALID_SOCKET; 1186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy (&ia6, h->h_addr_list[i], h->h_length); 1188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sockin6.sin6_family = h->h_addrtype; 1189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sockin6.sin6_addr = ia6; 1190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sockin6.sin6_port = htons (port); 1191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project addr = (struct sockaddr *) &sockin6; 1192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 1194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; /* for */ 1195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project s = xmlNanoHTTPConnectAttempt (addr); 1197df143a5041f03a22808b59c76698770b74692815Selim Gurun if (s != INVALID_SOCKET) 1198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (s); 1199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_HTTP 1204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 1205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlNanoHTTPConnectHost: unable to connect to '%s'.\n", 1206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project host); 1207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1208df143a5041f03a22808b59c76698770b74692815Selim Gurun return INVALID_SOCKET; 1209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNanoHTTPOpen: 1214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @URL: The URL to load 1215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @contentType: if available the Content-Type information will be 1216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returned at that location 1217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This function try to open a connection to the indicated resource 1219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * via HTTP GET. 1220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns NULL in case of failure, otherwise a request handler. 1222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The contentType, if provided must be freed by the caller 1223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid* 1226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNanoHTTPOpen(const char *URL, char **contentType) { 1227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (contentType != NULL) *contentType = NULL; 1228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlNanoHTTPMethod(URL, NULL, NULL, contentType, NULL, 0)); 1229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNanoHTTPOpenRedir: 1233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @URL: The URL to load 1234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @contentType: if available the Content-Type information will be 1235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returned at that location 1236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @redir: if available the redirected URL will be returned 1237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This function try to open a connection to the indicated resource 1239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * via HTTP GET. 1240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns NULL in case of failure, otherwise a request handler. 1242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The contentType, if provided must be freed by the caller 1243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid* 1246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNanoHTTPOpenRedir(const char *URL, char **contentType, char **redir) { 1247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (contentType != NULL) *contentType = NULL; 1248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (redir != NULL) *redir = NULL; 1249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlNanoHTTPMethodRedir(URL, NULL, NULL, contentType, redir, NULL,0)); 1250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNanoHTTPRead: 1254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the HTTP context 1255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @dest: a buffer 1256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len: the buffer length 1257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This function tries to read @len bytes from the existing HTTP connection 1259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and saves them in @dest. This is a blocking call. 1260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of byte read. 0 is an indication of an end of connection. 1262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * -1 indicates a parameter error. 1263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 1265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNanoHTTPRead(void *ctx, void *dest, int len) { 1266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNanoHTTPCtxtPtr ctxt = (xmlNanoHTTPCtxtPtr) ctx; 1267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_ZLIB_H 1268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int bytes_read = 0; 1269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int orig_avail_in; 1270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int z_ret; 1271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctx == NULL) return(-1); 1274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dest == NULL) return(-1); 1275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (len <= 0) return(0); 1276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_ZLIB_H 1278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->usesGzip == 1) { 1279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->strm == NULL) return(0); 128094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 1281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->strm->next_out = dest; 1282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->strm->avail_out = len; 1283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->strm->avail_in = ctxt->inptr - ctxt->inrptr; 1284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (ctxt->strm->avail_out > 0 && 1286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->strm->avail_in > 0 || xmlNanoHTTPRecv(ctxt) > 0)) { 1287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project orig_avail_in = ctxt->strm->avail_in = 1288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->inptr - ctxt->inrptr - bytes_read; 1289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->strm->next_in = BAD_CAST (ctxt->inrptr + bytes_read); 1290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project z_ret = inflate(ctxt->strm, Z_NO_FLUSH); 1292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project bytes_read += orig_avail_in - ctxt->strm->avail_in; 1293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (z_ret != Z_OK) break; 1295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->inrptr += bytes_read; 1298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(len - ctxt->strm->avail_out); 1299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (ctxt->inptr - ctxt->inrptr < len) { 1303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlNanoHTTPRecv(ctxt) <= 0) break; 1304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->inptr - ctxt->inrptr < len) 1306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len = ctxt->inptr - ctxt->inrptr; 1307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(dest, ctxt->inrptr, len); 1308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->inrptr += len; 1309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(len); 1310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNanoHTTPClose: 1314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the HTTP context 1315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This function closes an HTTP context, it ends up the connection and 1317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * free all data related to it. 1318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 1320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNanoHTTPClose(void *ctx) { 1321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNanoHTTPCtxtPtr ctxt = (xmlNanoHTTPCtxtPtr) ctx; 1322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctx == NULL) return; 1324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNanoHTTPFreeCtxt(ctxt); 1326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNanoHTTPMethodRedir: 1330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @URL: The URL to load 1331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @method: the HTTP method to use 1332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @input: the input string if any 1333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @contentType: the Content-Type information IN and OUT 1334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @redir: the redirected URL OUT 1335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @headers: the extra headers 1336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ilen: input length 1337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This function try to open a connection to the indicated resource 1339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * via HTTP using the given @method, adding the given extra headers 1340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and the input buffer for the request content. 1341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns NULL in case of failure, otherwise a request handler. 1343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The contentType, or redir, if provided must be freed by the caller 1344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid* 1347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNanoHTTPMethodRedir(const char *URL, const char *method, const char *input, 1348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char **contentType, char **redir, 1349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *headers, int ilen ) { 1350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNanoHTTPCtxtPtr ctxt; 1351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char *bp, *p; 1352df143a5041f03a22808b59c76698770b74692815Selim Gurun int blen; 1353df143a5041f03a22808b59c76698770b74692815Selim Gurun SOCKET ret; 1354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbRedirects = 0; 1355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char *redirURL = NULL; 1356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_HTTP 1357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int xmt_bytes; 1358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 135994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 1360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (URL == NULL) return(NULL); 1361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (method == NULL) method = "GET"; 1362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNanoHTTPInit(); 1363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectretry: 1365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (redirURL == NULL) 1366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt = xmlNanoHTTPNewCtxt(URL); 1367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 1368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt = xmlNanoHTTPNewCtxt(redirURL); 1369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->location = xmlMemStrdup(redirURL); 1370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ( ctxt == NULL ) { 1373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ( NULL ); 1374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->protocol == NULL) || (strcmp(ctxt->protocol, "http"))) { 1377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlIOErr(XML_FROM_HTTP, XML_HTTP_URL_SYNTAX, "Not a valid HTTP URI"); 1378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNanoHTTPFreeCtxt(ctxt); 1379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (redirURL != NULL) xmlFree(redirURL); 1380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->hostname == NULL) { 1383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlIOErr(XML_FROM_HTTP, XML_HTTP_UNKNOWN_HOST, 1384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Failed to identify host in URI"); 1385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNanoHTTPFreeCtxt(ctxt); 1386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (redirURL != NULL) xmlFree(redirURL); 1387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (proxy) { 1390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project blen = strlen(ctxt->hostname) * 2 + 16; 1391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlNanoHTTPConnectHost(proxy, proxyPort); 1392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 1394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project blen = strlen(ctxt->hostname); 1395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlNanoHTTPConnectHost(ctxt->hostname, ctxt->port); 1396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1397df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ret == INVALID_SOCKET) { 1398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNanoHTTPFreeCtxt(ctxt); 1399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (redirURL != NULL) xmlFree(redirURL); 1400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->fd = ret; 1403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (input == NULL) 1405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ilen = 0; 1406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project blen += 36; 1408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (headers != NULL) 1410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project blen += strlen(headers) + 2; 1411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (contentType && *contentType) 141260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott /* reserve for string plus 'Content-Type: \r\n" */ 1413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project blen += strlen(*contentType) + 16; 1414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->query != NULL) 141560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott /* 1 for '?' */ 1416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project blen += strlen(ctxt->query) + 1; 1417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project blen += strlen(method) + strlen(ctxt->path) + 24; 1418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_ZLIB_H 141960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott /* reserve for possible 'Accept-Encoding: gzip' string */ 1420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project blen += 23; 1421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 142260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (ctxt->port != 80) { 142360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott /* reserve space for ':xxxxx', incl. potential proxy */ 142460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (proxy) 142560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott blen += 12; 142660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott else 142760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott blen += 6; 142860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 1429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project bp = (char*)xmlMallocAtomic(blen); 1430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ( bp == NULL ) { 1431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNanoHTTPFreeCtxt( ctxt ); 1432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHTTPErrMemory("allocating header buffer"); 1433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ( NULL ); 1434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project p = bp; 1437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (proxy) { 1439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->port != 80) { 144094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun p += snprintf( p, blen - (p - bp), "%s http://%s:%d%s", 1441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project method, ctxt->hostname, 144294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun ctxt->port, ctxt->path ); 1443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 144494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun else 1445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project p += snprintf( p, blen - (p - bp), "%s http://%s%s", method, 144694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun ctxt->hostname, ctxt->path); 1447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project p += snprintf( p, blen - (p - bp), "%s %s", method, ctxt->path); 1450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->query != NULL) 1452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project p += snprintf( p, blen - (p - bp), "?%s", ctxt->query); 1453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->port == 80) { 145594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun p += snprintf( p, blen - (p - bp), " HTTP/1.0\r\nHost: %s\r\n", 1456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->hostname); 1457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project p += snprintf( p, blen - (p - bp), " HTTP/1.0\r\nHost: %s:%d\r\n", 1459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->hostname, ctxt->port); 1460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_ZLIB_H 1463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project p += snprintf(p, blen - (p - bp), "Accept-Encoding: gzip\r\n"); 1464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 146694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if (contentType != NULL && *contentType) 1467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project p += snprintf(p, blen - (p - bp), "Content-Type: %s\r\n", *contentType); 1468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (headers != NULL) 1470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project p += snprintf( p, blen - (p - bp), "%s", headers ); 1471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (input != NULL) 1473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(p, blen - (p - bp), "Content-Length: %d\r\n\r\n", ilen ); 1474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(p, blen - (p - bp), "\r\n"); 1476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_HTTP 1478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 1479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "-> %s%s", proxy? "(Proxy) " : "", bp); 1480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((blen -= strlen(bp)+1) < 0) 1481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 1482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "ERROR: overflowed buffer by %d bytes\n", -blen); 1483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->outptr = ctxt->out = bp; 1485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = XML_NANO_HTTP_WRITE; 1486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project blen = strlen( ctxt->out ); 1487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_HTTP 1488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmt_bytes = xmlNanoHTTPSend(ctxt, ctxt->out, blen ); 1489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ( xmt_bytes != blen ) 1490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError( xmlGenericErrorContext, 1491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlNanoHTTPMethodRedir: Only %d of %d %s %s\n", 1492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmt_bytes, blen, 1493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "bytes of HTTP headers sent to host", 1494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->hostname ); 1495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else 1496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNanoHTTPSend(ctxt, ctxt->out, blen ); 1497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ( input != NULL ) { 1500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_HTTP 1501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmt_bytes = xmlNanoHTTPSend( ctxt, input, ilen ); 1502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ( xmt_bytes != ilen ) 1504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError( xmlGenericErrorContext, 150594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun "xmlNanoHTTPMethodRedir: Only %d of %d %s %s\n", 1506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmt_bytes, ilen, 1507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "bytes of HTTP content sent to host", 1508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->hostname ); 1509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else 1510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNanoHTTPSend( ctxt, input, ilen ); 1511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = XML_NANO_HTTP_READ; 1515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((p = xmlNanoHTTPReadLine(ctxt)) != NULL) { 1517df143a5041f03a22808b59c76698770b74692815Selim Gurun if (*p == 0) { 1518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->content = ctxt->inrptr; 1519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(p); 1520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNanoHTTPScanAnswer(ctxt, p); 1523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_HTTP 1525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "<- %s\n", p); 1526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(p); 1528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->location != NULL) && (ctxt->returnValue >= 300) && 1531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->returnValue < 400)) { 1532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_HTTP 1533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 1534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "\nRedirect to: %s\n", ctxt->location); 1535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ( xmlNanoHTTPRecv(ctxt) > 0 ) ; 1537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nbRedirects < XML_NANO_HTTP_MAX_REDIR) { 1538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nbRedirects++; 1539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (redirURL != NULL) 1540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(redirURL); 1541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project redirURL = xmlMemStrdup(ctxt->location); 1542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNanoHTTPFreeCtxt(ctxt); 1543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto retry; 1544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNanoHTTPFreeCtxt(ctxt); 1546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (redirURL != NULL) xmlFree(redirURL); 1547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_HTTP 1548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 1549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlNanoHTTPMethodRedir: Too many redirects, aborting ...\n"); 1550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (contentType != NULL) { 1555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->contentType != NULL) 1556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *contentType = xmlMemStrdup(ctxt->contentType); 1557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *contentType = NULL; 1559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((redir != NULL) && (redirURL != NULL)) { 1562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *redir = redirURL; 1563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (redirURL != NULL) 1565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(redirURL); 1566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (redir != NULL) 1567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *redir = NULL; 1568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_HTTP 1571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->contentType != NULL) 1572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 1573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "\nCode %d, content-type '%s'\n\n", 1574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->returnValue, ctxt->contentType); 1575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 1577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "\nCode %d, no content-type\n\n", 1578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->returnValue); 1579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((void *) ctxt); 1582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNanoHTTPMethod: 1586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @URL: The URL to load 1587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @method: the HTTP method to use 1588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @input: the input string if any 1589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @contentType: the Content-Type information IN and OUT 1590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @headers: the extra headers 1591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ilen: input length 1592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This function try to open a connection to the indicated resource 1594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * via HTTP using the given @method, adding the given extra headers 1595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and the input buffer for the request content. 1596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns NULL in case of failure, otherwise a request handler. 1598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The contentType, if provided must be freed by the caller 1599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid* 1602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNanoHTTPMethod(const char *URL, const char *method, const char *input, 1603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char **contentType, const char *headers, int ilen) { 1604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlNanoHTTPMethodRedir(URL, method, input, contentType, 1605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, headers, ilen)); 1606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNanoHTTPFetch: 1610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @URL: The URL to load 1611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @filename: the filename where the content should be saved 1612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @contentType: if available the Content-Type information will be 1613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returned at that location 1614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This function try to fetch the indicated resource via HTTP GET 1616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and save it's content in the file. 1617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of failure, 0 incase of success. The contentType, 1619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if provided must be freed by the caller 1620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 1622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNanoHTTPFetch(const char *URL, const char *filename, char **contentType) { 1623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *ctxt = NULL; 1624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char *buf = NULL; 1625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int fd; 1626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int len; 1627df143a5041f03a22808b59c76698770b74692815Selim Gurun int ret = 0; 1628df143a5041f03a22808b59c76698770b74692815Selim Gurun 1629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (filename == NULL) return(-1); 1630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt = xmlNanoHTTPOpen(URL, contentType); 1631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) return(-1); 1632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 163394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if (!strcmp(filename, "-")) 1634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fd = 0; 1635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 1636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fd = open(filename, O_CREAT | O_WRONLY, 00644); 1637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (fd < 0) { 1638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNanoHTTPClose(ctxt); 1639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((contentType != NULL) && (*contentType != NULL)) { 1640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(*contentType); 1641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *contentType = NULL; 1642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNanoHTTPFetchContent( ctxt, &buf, &len ); 1648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ( len > 0 ) { 1649df143a5041f03a22808b59c76698770b74692815Selim Gurun if (write(fd, buf, len) == -1) { 1650df143a5041f03a22808b59c76698770b74692815Selim Gurun ret = -1; 1651df143a5041f03a22808b59c76698770b74692815Selim Gurun } 1652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNanoHTTPClose(ctxt); 1655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project close(fd); 1656df143a5041f03a22808b59c76698770b74692815Selim Gurun return(ret); 1657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_OUTPUT_ENABLED 1660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNanoHTTPSave: 1662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the HTTP context 1663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @filename: the filename where the content should be saved 1664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This function saves the output of the HTTP transaction to a file 1666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * It closes and free the context at the end 1667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of failure, 0 incase of success. 1669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 1671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNanoHTTPSave(void *ctxt, const char *filename) { 1672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char *buf = NULL; 1673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int fd; 1674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int len; 1675df143a5041f03a22808b59c76698770b74692815Selim Gurun int ret = 0; 1676df143a5041f03a22808b59c76698770b74692815Selim Gurun 1677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (filename == NULL)) return(-1); 1678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 167994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if (!strcmp(filename, "-")) 1680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fd = 0; 1681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 1682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fd = open(filename, O_CREAT | O_WRONLY, 0666); 1683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (fd < 0) { 1684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNanoHTTPClose(ctxt); 1685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNanoHTTPFetchContent( ctxt, &buf, &len ); 1690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ( len > 0 ) { 1691df143a5041f03a22808b59c76698770b74692815Selim Gurun if (write(fd, buf, len) == -1) { 1692df143a5041f03a22808b59c76698770b74692815Selim Gurun ret = -1; 1693df143a5041f03a22808b59c76698770b74692815Selim Gurun } 1694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNanoHTTPClose(ctxt); 1697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project close(fd); 1698df143a5041f03a22808b59c76698770b74692815Selim Gurun return(ret); 1699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_OUTPUT_ENABLED */ 1701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNanoHTTPReturnCode: 1704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the HTTP context 1705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get the latest HTTP return code received 1707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the HTTP return code for the request. 1709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 1711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNanoHTTPReturnCode(void *ctx) { 1712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNanoHTTPCtxtPtr ctxt = (xmlNanoHTTPCtxtPtr) ctx; 1713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) return(-1); 1715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt->returnValue); 1717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNanoHTTPAuthHeader: 1721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the HTTP context 1722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get the authentication header of an HTTP context 1724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the stashed value of the WWW-Authenticate or Proxy-Authenticate 1726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * header. 1727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectconst char * 1729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNanoHTTPAuthHeader(void *ctx) { 1730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNanoHTTPCtxtPtr ctxt = (xmlNanoHTTPCtxtPtr) ctx; 1731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) return(NULL); 1733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt->authHeader); 1735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNanoHTTPContentLength: 1739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the HTTP context 1740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Provides the specified content length from the HTTP header. 1742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Return the specified content length from the HTTP header. Note that 1744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a value of -1 indicates that the content length element was not included in 1745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the response header. 1746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 1748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNanoHTTPContentLength( void * ctx ) { 1749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNanoHTTPCtxtPtr ctxt = (xmlNanoHTTPCtxtPtr)ctx; 1750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ( ( ctxt == NULL ) ? -1 : ctxt->ContentLength ); 1752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNanoHTTPRedir: 1756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the HTTP context 1757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Provides the specified redirection URL if available from the HTTP header. 1759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Return the specified redirection URL or NULL if not redirected. 1761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectconst char * 1763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNanoHTTPRedir( void * ctx ) { 1764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNanoHTTPCtxtPtr ctxt = (xmlNanoHTTPCtxtPtr)ctx; 1765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ( ( ctxt == NULL ) ? NULL : ctxt->location ); 1767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNanoHTTPEncoding: 1771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the HTTP context 1772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Provides the specified encoding if specified in the HTTP headers. 1774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Return the specified encoding or NULL if not available 1776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectconst char * 1778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNanoHTTPEncoding( void * ctx ) { 1779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNanoHTTPCtxtPtr ctxt = (xmlNanoHTTPCtxtPtr)ctx; 1780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ( ( ctxt == NULL ) ? NULL : ctxt->encoding ); 1782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNanoHTTPMimeType: 1786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the HTTP context 1787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Provides the specified Mime-Type if specified in the HTTP headers. 1789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Return the specified Mime-Type or NULL if not available 1791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectconst char * 1793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNanoHTTPMimeType( void * ctx ) { 1794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNanoHTTPCtxtPtr ctxt = (xmlNanoHTTPCtxtPtr)ctx; 1795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ( ( ctxt == NULL ) ? NULL : ctxt->mimeType ); 1797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNanoHTTPFetchContent: 1801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the HTTP context 1802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ptr: pointer to set to the content buffer. 1803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len: integer pointer to hold the length of the content 1804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if all the content was read 1806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if all the content was read and available, returns 180894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * -1 if received content length was less than specified or an error 1809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * occurred. 1810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 1812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNanoHTTPFetchContent( void * ctx, char ** ptr, int * len ) { 1813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNanoHTTPCtxtPtr ctxt = (xmlNanoHTTPCtxtPtr)ctx; 1814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int rc = 0; 1816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int cur_lgth; 1817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int rcvd_lgth; 1818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int dummy_int; 1819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char * dummy_ptr = NULL; 1820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Dummy up return input parameters if not provided */ 1822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ( len == NULL ) 1824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len = &dummy_int; 1825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ( ptr == NULL ) 1827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ptr = &dummy_ptr; 1828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* But can't work without the context pointer */ 1830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ( ( ctxt == NULL ) || ( ctxt->content == NULL ) ) { 1832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *len = 0; 1833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *ptr = NULL; 1834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ( -1 ); 1835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project rcvd_lgth = ctxt->inptr - ctxt->content; 1838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ( (cur_lgth = xmlNanoHTTPRecv( ctxt )) > 0 ) { 1840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project rcvd_lgth += cur_lgth; 1842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ( (ctxt->ContentLength > 0) && (rcvd_lgth >= ctxt->ContentLength) ) 1843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *ptr = ctxt->content; 1847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *len = rcvd_lgth; 1848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ( ( ctxt->ContentLength > 0 ) && ( rcvd_lgth < ctxt->ContentLength ) ) 1850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project rc = -1; 1851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if ( rcvd_lgth == 0 ) 1852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project rc = -1; 1853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ( rc ); 1855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef STANDALONE 1858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint main(int argc, char **argv) { 1859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char *contentType = NULL; 1860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (argv[1] != NULL) { 186294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if (argv[2] != NULL) 1863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNanoHTTPFetch(argv[1], argv[2], &contentType); 1864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNanoHTTPFetch(argv[1], "-", &contentType); 1866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (contentType != NULL) xmlFree(contentType); 1867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 1869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "%s: minimal HTTP GET implementation\n", argv[0]); 1870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 1871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "\tusage %s [ URL [ filename ] ]\n", argv[0]); 1872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNanoHTTPCleanup(); 1874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlMemoryDump(); 1875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 1876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* STANDALONE */ 1878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else /* !LIBXML_HTTP_ENABLED */ 1879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef STANDALONE 1880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <stdio.h> 1881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint main(int argc, char **argv) { 1882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 1883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "%s : HTTP support not compiled in\n", argv[0]); 1884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 1885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* STANDALONE */ 1887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_HTTP_ENABLED */ 1888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define bottom_nanohttp 1889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "elfgcchack.h" 1890