summaryrefslogtreecommitdiff
path: root/src/3rdParty/http_tiny
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2014-11-15 12:34:09 +0100
committerAndreas Baumann <mail@andreasbaumann.cc>2014-11-15 12:34:09 +0100
commit160aa748295f1846d6d599d7145cd5d7bdd82f5f (patch)
tree694c4fbfd56ef6852370eec42280b3052a46dd0b /src/3rdParty/http_tiny
parent75df5abae42888bd5bf01fc4a8bd1215413cab67 (diff)
downloadbiruda-160aa748295f1846d6d599d7145cd5d7bdd82f5f.tar.gz
biruda-160aa748295f1846d6d599d7145cd5d7bdd82f5f.tar.bz2
added status to cli mode
Diffstat (limited to 'src/3rdParty/http_tiny')
-rw-r--r--src/3rdParty/http_tiny/LICENSE115
-rw-r--r--src/3rdParty/http_tiny/http_lib.c489
-rw-r--r--src/3rdParty/http_tiny/http_lib.h72
3 files changed, 676 insertions, 0 deletions
diff --git a/src/3rdParty/http_tiny/LICENSE b/src/3rdParty/http_tiny/LICENSE
new file mode 100644
index 0000000..de65da6
--- /dev/null
+++ b/src/3rdParty/http_tiny/LICENSE
@@ -0,0 +1,115 @@
+
+
+ The "Artistic License"
+
+ Preamble
+
+The intent of this document is to state the conditions under which a
+Package may be copied, such that the Copyright Holder maintains some
+semblance of artistic control over the development of the package,
+while giving the users of the package the right to use and distribute
+the Package in a more-or-less customary fashion, plus the right to make
+reasonable modifications.
+
+Definitions:
+
+ "Package" refers to the collection of files distributed by the
+ Copyright Holder, and derivatives of that collection of files
+ created through textual modification.
+
+ "Standard Version" refers to such a Package if it has not been
+ modified, or has been modified in accordance with the wishes
+ of the Copyright Holder.
+
+ "Copyright Holder" is whoever is named in the copyright or
+ copyrights for the package.
+
+ "You" is you, if you're thinking about copying or distributing
+ this Package.
+
+ "Reasonable copying fee" is whatever you can justify on the
+ basis of media cost, duplication charges, time of people involved,
+ and so on. (You will not be required to justify it to the
+ Copyright Holder, but only to the computing community at large
+ as a market that must bear the fee.)
+
+ "Freely Available" means that no fee is charged for the item
+ itself, though there may be fees involved in handling the item.
+ It also means that recipients of the item may redistribute it
+ under the same conditions they received it.
+
+1. You may make and give away verbatim copies of the source form of the
+Standard Version of this Package without restriction, provided that you
+duplicate all of the original copyright notices and associated disclaimers.
+
+2. You may apply bug fixes, portability fixes and other modifications
+derived from the Public Domain or from the Copyright Holder. A Package
+modified in such a way shall still be considered the Standard Version.
+
+3. You may otherwise modify your copy of this Package in any way, provided
+that you insert a prominent notice in each changed file stating how and
+when you changed that file, and provided that you do at least ONE of the
+following:
+
+ a) place your modifications in the Public Domain or otherwise make them
+ Freely Available, such as by posting said modifications to Usenet or
+ an equivalent medium, or placing the modifications on a major archive
+ site such as uunet.uu.net, or by allowing the Copyright Holder to include
+ your modifications in the Standard Version of the Package.
+
+ b) use the modified Package only within your corporation or organization.
+
+ c) rename any non-standard executables so the names do not conflict
+ with standard executables, which must also be provided, and provide
+ a separate manual page for each non-standard executable that clearly
+ documents how it differs from the Standard Version.
+
+ d) make other distribution arrangements with the Copyright Holder.
+
+4. You may distribute the programs of this Package in object code or
+executable form, provided that you do at least ONE of the following:
+
+ a) distribute a Standard Version of the executables and library files,
+ together with instructions (in the manual page or equivalent) on where
+ to get the Standard Version.
+
+ b) accompany the distribution with the machine-readable source of
+ the Package with your modifications.
+
+ c) accompany any non-standard executables with their corresponding
+ Standard Version executables, giving the non-standard executables
+ non-standard names, and clearly documenting the differences in manual
+ pages (or equivalent), together with instructions on where to get
+ the Standard Version.
+
+ d) make other distribution arrangements with the Copyright Holder.
+
+5. You may charge a reasonable copying fee for any distribution of this
+Package. You may charge any fee you choose for support of this Package.
+You may not charge a fee for this Package itself. However,
+you may distribute this Package in aggregate with other (possibly
+commercial) programs as part of a larger (possibly commercial) software
+distribution provided that you do not advertise this Package as a
+product of your own.
+
+6. The scripts and library files supplied as input to or produced as
+output from the programs of this Package do not automatically fall
+under the copyright of this Package, but belong to whomever generated
+them, and may be sold commercially, and may be aggregated with this
+Package.
+
+7. C subroutines supplied by you and linked into this Package in order
+to emulate subroutines and variables of the language defined by this
+Package shall not be considered part of this Package, but are the
+equivalent of input as in Paragraph 6, provided these subroutines do
+not change the language in any way that would cause it to fail the
+regression tests for the language.
+
+8. The name of the Copyright Holder may not be used to endorse or promote
+products derived from this software without specific prior written permission.
+
+9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+
+ The End
diff --git a/src/3rdParty/http_tiny/http_lib.c b/src/3rdParty/http_tiny/http_lib.c
new file mode 100644
index 0000000..916d5bc
--- /dev/null
+++ b/src/3rdParty/http_tiny/http_lib.c
@@ -0,0 +1,489 @@
+/*
+ * Http put/get mini lib
+ * written by L. Demailly
+ * (c) 1998 Laurent Demailly - http://www.demailly.com/~dl/
+ * (c) 1996 Observatoire de Paris - Meudon - France
+ * see LICENSE for terms, conditions and DISCLAIMER OF ALL WARRANTIES
+ *
+ * $Id: http_lib.c,v 3.5 1998/09/23 06:19:15 dl Exp $
+ *
+ * Description : Use http protocol, connects to server to echange data
+ *
+ * $Log: http_lib.c,v $
+ * Revision 3.5 1998/09/23 06:19:15 dl
+ * portability and http 1.x (1.1 and later) compatibility
+ *
+ * Revision 3.4 1998/09/23 05:44:27 dl
+ * added support for HTTP/1.x answers
+ *
+ * Revision 3.3 1996/04/25 19:07:22 dl
+ * using intermediate variable for htons (port) so it does not yell
+ * on freebsd (thx pp for report)
+ *
+ * Revision 3.2 1996/04/24 13:56:08 dl
+ * added proxy support through http_proxy_server & http_proxy_port
+ * some httpd *needs* cr+lf so provide them
+ * simplification + cleanup
+ *
+ * Revision 3.1 1996/04/18 13:53:13 dl
+ * http-tiny release 1.0
+ *
+ *
+ */
+
+static char *rcsid="$Id: http_lib.c,v 3.5 1998/09/23 06:19:15 dl Exp $";
+
+#undef VERBOSE
+
+/* http_lib - Http data exchanges mini library.
+ */
+
+
+#ifndef OSK
+/* unix */
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+#include <ctype.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+static int http_read_line (int fd,char *buffer, int max) ;
+static int http_read_buffer (int fd,char *buffer, int max) ;
+#else
+/* OS/9 includes */
+#include <modes.h>
+#include <types.h>
+#include <machine/reg.h>
+#include <INET/socket.h>
+#include <INET/in.h>
+#include <INET/netdb.h>
+#include <INET/pwd.h>
+extern char *malloc();
+#endif /* OS9/Unix */
+
+#include <stdio.h>
+
+#include "http_lib.h"
+
+#define SERVER_DEFAULT "adonis"
+
+/* pointer to a mallocated string containing server name or NULL */
+char *http_server=NULL ;
+/* server port number */
+int http_port=5757;
+/* pointer to proxy server name or NULL */
+char *http_proxy_server=NULL;
+/* proxy server port number or 0 */
+int http_proxy_port=0;
+/* user agent id string */
+static char *http_user_agent="adlib/3 ($Date: 1998/09/23 06:19:15 $)";
+
+/*
+ * read a line from file descriptor
+ * returns the number of bytes read. negative if a read error occured
+ * before the end of line or the max.
+ * cariage returns (CR) are ignored.
+ */
+static int http_read_line (fd,buffer,max)
+ int fd; /* file descriptor to read from */
+ char *buffer; /* placeholder for data */
+ int max; /* max number of bytes to read */
+{ /* not efficient on long lines (multiple unbuffered 1 char reads) */
+ int n=0;
+ while (n<max) {
+ if (read(fd,buffer,1)!=1) {
+ n= -n;
+ break;
+ }
+ n++;
+ if (*buffer=='\015') continue; /* ignore CR */
+ if (*buffer=='\012') break; /* LF is the separator */
+ buffer++;
+ }
+ *buffer=0;
+ return n;
+}
+
+
+/*
+ * read data from file descriptor
+ * retries reading until the number of bytes requested is read.
+ * returns the number of bytes read. negative if a read error (EOF) occured
+ * before the requested length.
+ */
+static int http_read_buffer (fd,buffer,length)
+ int fd; /* file descriptor to read from */
+ char *buffer; /* placeholder for data */
+ int length; /* number of bytes to read */
+{
+ int n,r;
+ for (n=0; n<length; n+=r) {
+ r=read(fd,buffer,length-n);
+ if (r<=0) return -n;
+ buffer+=r;
+ }
+ return n;
+}
+
+
+typedef enum
+{
+ CLOSE, /* Close the socket after the query (for put) */
+ KEEP_OPEN /* Keep it open */
+} querymode;
+
+#ifndef OSK
+
+static http_retcode http_query(char *command, char *url,
+ char *additional_header, querymode mode,
+ char* data, int length, int *pfd);
+#endif
+
+/* beware that filename+type+rest of header must not exceed MAXBUF */
+/* so we limit filename to 256 and type to 64 chars in put & get */
+#define MAXBUF 512
+
+/*
+ * Pseudo general http query
+ *
+ * send a command and additional headers to the http server.
+ * optionally through the proxy (if http_proxy_server and http_proxy_port are
+ * set).
+ *
+ * Limitations: the url is truncated to first 256 chars and
+ * the server name to 128 in case of proxy request.
+ */
+static http_retcode http_query(command, url, additional_header, mode,
+ data, length, pfd)
+ char *command; /* command to send */
+ char *url; /* url / filename queried */
+ char *additional_header; /* additional header */
+ querymode mode; /* type of query */
+ char *data; /* Data to send after header. If NULL, not data is sent */
+ int length; /* size of data */
+ int *pfd; /* pointer to variable where to set file descriptor value */
+{
+ int s;
+ struct hostent *hp;
+ struct sockaddr_in server;
+ char header[MAXBUF];
+ int hlg;
+ http_retcode ret;
+ int proxy=(http_proxy_server!=NULL && http_proxy_port!=0);
+ int port = proxy ? http_proxy_port : http_port ;
+
+ if (pfd) *pfd=-1;
+
+ /* get host info by name :*/
+ if ((hp = gethostbyname( proxy ? http_proxy_server
+ : ( http_server ? http_server
+ : SERVER_DEFAULT )
+ ))) {
+ memset((char *) &server,0, sizeof(server));
+ memmove((char *) &server.sin_addr, hp->h_addr, hp->h_length);
+ server.sin_family = hp->h_addrtype;
+ server.sin_port = (unsigned short) htons( port );
+ } else
+ return ERRHOST;
+
+ /* create socket */
+ if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0)
+ return ERRSOCK;
+ setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, 0, 0);
+
+ /* connect to server */
+ if (connect(s, &server, sizeof(server)) < 0)
+ ret=ERRCONN;
+ else {
+ if (pfd) *pfd=s;
+
+ /* create header */
+ if (proxy) {
+ sprintf(header,
+"%s http://%.128s:%d/%.256s HTTP/1.0\015\012User-Agent: %s\015\012%s\015\012",
+ command,
+ http_server,
+ http_port,
+ url,
+ http_user_agent,
+ additional_header
+ );
+ } else {
+ sprintf(header,
+"%s /%.256s HTTP/1.0\015\012User-Agent: %s\015\012%s\015\012",
+ command,
+ url,
+ http_user_agent,
+ additional_header
+ );
+ }
+
+ hlg=strlen(header);
+
+ /* send header */
+ if (write(s,header,hlg)!=hlg)
+ ret= ERRWRHD;
+
+ /* send data */
+ else if (length && data && (write(s,data,length)!=length) )
+ ret= ERRWRDT;
+
+ else {
+ /* read result & check */
+ ret=http_read_line(s,header,MAXBUF-1);
+#ifdef VERBOSE
+ fputs(header,stderr);
+ putc('\n',stderr);
+#endif
+ if (ret<=0)
+ ret=ERRRDHD;
+ else if (sscanf(header,"HTTP/1.%*d %03d",(int*)&ret)!=1)
+ ret=ERRPAHD;
+ else if (mode==KEEP_OPEN)
+ return ret;
+ }
+ }
+ /* close socket */
+ close(s);
+ return ret;
+}
+
+
+/*
+ * Put data on the server
+ *
+ * This function sends data to the http data server.
+ * The data will be stored under the ressource name filename.
+ * returns a negative error code or a positive code from the server
+ *
+ * limitations: filename is truncated to first 256 characters
+ * and type to 64.
+ */
+http_retcode http_put(filename, data, length, overwrite, type)
+ char *filename; /* name of the ressource to create */
+ char *data; /* pointer to the data to send */
+ int length; /* length of the data to send */
+ int overwrite; /* flag to request to overwrite the ressource if it
+ was already existing */
+ char *type; /* type of the data, if NULL default type is used */
+{
+ char header[MAXBUF];
+ if (type)
+ sprintf(header,"Content-length: %d\015\012Content-type: %.64s\015\012%s",
+ length,
+ type ,
+ overwrite ? "Control: overwrite=1\015\012" : ""
+ );
+ else
+ sprintf(header,"Content-length: %d\015\012%s",length,
+ overwrite ? "Control: overwrite=1\015\012" : ""
+ );
+ return http_query("PUT",filename,header,CLOSE, data, length, NULL);
+}
+
+
+/*
+ * Get data from the server
+ *
+ * This function gets data from the http data server.
+ * The data is read from the ressource named filename.
+ * Address of new new allocated memory block is filled in pdata
+ * whose length is returned via plength.
+ *
+ * returns a negative error code or a positive code from the server
+ *
+ *
+ * limitations: filename is truncated to first 256 characters
+ */
+http_retcode http_get(filename, pdata, plength, typebuf)
+ char *filename; /* name of the ressource to read */
+ char **pdata; /* address of a pointer variable which will be set
+ to point toward allocated memory containing read data.*/
+ int *plength;/* address of integer variable which will be set to
+ length of the read data */
+ char *typebuf; /* allocated buffer where the read data type is returned.
+ If NULL, the type is not returned */
+
+{
+ http_retcode ret;
+
+ char header[MAXBUF];
+ char *pc;
+ int fd;
+ int n,length=-1;
+
+ if (!pdata) return ERRNULL; else *pdata=NULL;
+ if (plength) *plength=0;
+ if (typebuf) *typebuf='\0';
+
+ ret=http_query("GET",filename,"",KEEP_OPEN, NULL, 0, &fd);
+ if (ret==200) {
+ while (1) {
+ n=http_read_line(fd,header,MAXBUF-1);
+#ifdef VERBOSE
+ fputs(header,stderr);
+ putc('\n',stderr);
+#endif
+ if (n<=0) {
+ close(fd);
+ return ERRRDHD;
+ }
+ /* empty line ? (=> end of header) */
+ if ( n>0 && (*header)=='\0') break;
+ /* try to parse some keywords : */
+ /* convert to lower case 'till a : is found or end of string */
+ for (pc=header; (*pc!=':' && *pc) ; pc++) *pc=tolower(*pc);
+ sscanf(header,"content-length: %d",&length);
+ if (typebuf) sscanf(header,"content-type: %s",typebuf);
+ }
+ if (length<=0) {
+ close(fd);
+ return ERRNOLG;
+ }
+ if (plength) *plength=length;
+ if (!(*pdata=malloc(length))) {
+ close(fd);
+ return ERRMEM;
+ }
+ n=http_read_buffer(fd,*pdata,length);
+ close(fd);
+ if (n!=length) ret=ERRRDDT;
+ } else if (ret>=0) close(fd);
+ return ret;
+}
+
+
+/*
+ * Request the header
+ *
+ * This function outputs the header of thehttp data server.
+ * The header is from the ressource named filename.
+ * The length and type of data is eventually returned (like for http_get(3))
+ *
+ * returns a negative error code or a positive code from the server
+ *
+ * limitations: filename is truncated to first 256 characters
+ */
+http_retcode http_head(filename, plength, typebuf)
+ char *filename; /* name of the ressource to read */
+ int *plength;/* address of integer variable which will be set to
+ length of the data */
+ char *typebuf; /* allocated buffer where the data type is returned.
+ If NULL, the type is not returned */
+{
+/* mostly copied from http_get : */
+ http_retcode ret;
+
+ char header[MAXBUF];
+ char *pc;
+ int fd;
+ int n,length=-1;
+
+ if (plength) *plength=0;
+ if (typebuf) *typebuf='\0';
+
+ ret=http_query("HEAD",filename,"",KEEP_OPEN, NULL, 0, &fd);
+ if (ret==200) {
+ while (1) {
+ n=http_read_line(fd,header,MAXBUF-1);
+#ifdef VERBOSE
+ fputs(header,stderr);
+ putc('\n',stderr);
+#endif
+ if (n<=0) {
+ close(fd);
+ return ERRRDHD;
+ }
+ /* empty line ? (=> end of header) */
+ if ( n>0 && (*header)=='\0') break;
+ /* try to parse some keywords : */
+ /* convert to lower case 'till a : is found or end of string */
+ for (pc=header; (*pc!=':' && *pc) ; pc++) *pc=tolower(*pc);
+ sscanf(header,"content-length: %d",&length);
+ if (typebuf) sscanf(header,"content-type: %s",typebuf);
+ }
+ if (plength) *plength=length;
+ close(fd);
+ } else if (ret>=0) close(fd);
+ return ret;
+}
+
+
+
+/*
+ * Delete data on the server
+ *
+ * This function request a DELETE on the http data server.
+ *
+ * returns a negative error code or a positive code from the server
+ *
+ * limitations: filename is truncated to first 256 characters
+ */
+
+http_retcode http_delete(filename)
+ char *filename; /* name of the ressource to create */
+{
+ return http_query("DELETE",filename,"",CLOSE, NULL, 0, NULL);
+}
+
+
+
+/* parses an url : setting the http_server and http_port global variables
+ * and returning the filename to pass to http_get/put/...
+ * returns a negative error code or 0 if sucessfully parsed.
+ */
+http_retcode http_parse_url(url,pfilename)
+ /* writeable copy of an url */
+ char *url;
+ /* address of a pointer that will be filled with allocated filename
+ * the pointer must be equal to NULL before calling or it will be
+ * automatically freed (free(3))
+ */
+ char **pfilename;
+{
+ char *pc,c;
+
+ http_port=80;
+ if (http_server) {
+ free(http_server);
+ http_server=NULL;
+ }
+ if (*pfilename) {
+ free(*pfilename);
+ *pfilename=NULL;
+ }
+
+ if (strncasecmp("http://",url,7)) {
+#ifdef VERBOSE
+ fprintf(stderr,"invalid url (must start with 'http://')\n");
+#endif
+ return ERRURLH;
+ }
+ url+=7;
+ for (pc=url,c=*pc; (c && c!=':' && c!='/');) c=*pc++;
+ *(pc-1)=0;
+ if (c==':') {
+ if (sscanf(pc,"%d",&http_port)!=1) {
+#ifdef VERBOSE
+ fprintf(stderr,"invalid port in url\n");
+#endif
+ return ERRURLP;
+ }
+ for (pc++; (*pc && *pc!='/') ; pc++) ;
+ if (*pc) pc++;
+ }
+
+ http_server=strdup(url);
+ *pfilename= strdup ( c ? pc : "") ;
+
+#ifdef VERBOSE
+ fprintf(stderr,"host=(%s), port=%d, filename=(%s)\n",
+ http_server,http_port,*pfilename);
+#endif
+ return OK0;
+}
+
diff --git a/src/3rdParty/http_tiny/http_lib.h b/src/3rdParty/http_tiny/http_lib.h
new file mode 100644
index 0000000..1fb7c97
--- /dev/null
+++ b/src/3rdParty/http_tiny/http_lib.h
@@ -0,0 +1,72 @@
+/*
+ * Http put/get mini lib
+ * written by L. Demailly
+ * (c) 1998 Laurent Demailly - http://www.demailly.com/~dl/
+ * (c) 1996 Observatoire de Paris - Meudon - France
+ * see LICENSE for terms, conditions and DISCLAIMER OF ALL WARRANTIES
+ *
+ * $Id: http_lib.h,v 1.4 1998/09/23 06:14:15 dl Exp $
+ *
+ */
+
+ /* declarations */
+
+
+extern char *http_server;
+
+extern int http_port;
+
+extern char *http_proxy_server;
+
+extern int http_proxy_port;
+
+
+/* return type */
+typedef enum {
+
+ /* Client side errors */
+ ERRHOST=-1, /* No such host */
+ ERRSOCK=-2, /* Can't create socket */
+ ERRCONN=-3, /* Can't connect to host */
+ ERRWRHD=-4, /* Write error on socket while writing header */
+ ERRWRDT=-5, /* Write error on socket while writing data */
+ ERRRDHD=-6, /* Read error on socket while reading result */
+ ERRPAHD=-7, /* Invalid answer from data server */
+ ERRNULL=-8, /* Null data pointer */
+ ERRNOLG=-9, /* No/Bad length in header */
+ ERRMEM=-10, /* Can't allocate memory */
+ ERRRDDT=-11,/* Read error while reading data */
+ ERRURLH=-12,/* Invalid url - must start with 'http://' */
+ ERRURLP=-13,/* Invalid port in url */
+
+
+ /* Return code by the server */
+ ERR400=400, /* Invalid query */
+ ERR403=403, /* Forbidden */
+ ERR408=408, /* Request timeout */
+ ERR500=500, /* Server error */
+ ERR501=501, /* Not implemented */
+ ERR503=503, /* Service overloaded */
+
+ /* Succesful results */
+ OK0 = 0, /* successfull parse */
+ OK201=201, /* Ressource succesfully created */
+ OK200=200 /* Ressource succesfully read */
+
+} http_retcode;
+
+
+/* prototypes */
+
+#ifndef OSK
+http_retcode http_put(char *filename, char *data, int length,
+ int overwrite, char *type) ;
+http_retcode http_get(char *filename, char **pdata,int *plength, char *typebuf);
+
+http_retcode http_parse_url(char *url, char **pfilename);
+
+http_retcode http_delete(char *filename) ;
+
+http_retcode http_head(char *filename, int *plength, char *typebuf);
+
+#endif