diff options
author | Andreas Baumann <mail@andreasbaumann.cc> | 2014-11-15 12:34:09 +0100 |
---|---|---|
committer | Andreas Baumann <mail@andreasbaumann.cc> | 2014-11-15 12:34:09 +0100 |
commit | 160aa748295f1846d6d599d7145cd5d7bdd82f5f (patch) | |
tree | 694c4fbfd56ef6852370eec42280b3052a46dd0b /src/3rdParty/http_tiny | |
parent | 75df5abae42888bd5bf01fc4a8bd1215413cab67 (diff) | |
download | biruda-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/LICENSE | 115 | ||||
-rw-r--r-- | src/3rdParty/http_tiny/http_lib.c | 489 | ||||
-rw-r--r-- | src/3rdParty/http_tiny/http_lib.h | 72 |
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 |