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