00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00031
00032 #ifndef _http_client_h_
00033 #define _http_client_h_
00034 #ifdef __cplusplus
00035 #define EXTERN_C extern "C"
00036 #else
00037 #define EXTERN_C
00038 #endif
00039 #include "genlib/closesocket/upnpclosesocket.h"
00040 #include <fcntl.h>
00041 #include <string.h>
00042 #include <sys/types.h>
00043 #include <time.h>
00044 #include <errno.h>
00045 #include <ctype.h>
00046 #include <stdlib.h>
00047 #include <sys/socket.h>
00048 #include <netinet/in.h>
00049 #include <unistd.h>
00050 #include <netdb.h>
00051 #include <sys/time.h>
00052 #include "tools/config.h"
00053 #include "upnp.h"
00054
00055
00056
00057 #define HTTP_DATE_LENGTH 37 // length for HTTP DATE:
00058
00059 #define SEPARATORS "()<>@,;:\\\"/[]?={} \t"
00060 #define MARK "-_.!~*'()"
00061 #define RESERVED ";/?:@&=+$,"
00062 #define HTTP_SUCCESS 1
00063 #define HTTP_E_BAD_URL UPNP_E_INVALID_URL
00064 #define HTTP_E_READ_SOCKET UPNP_E_SOCKET_READ
00065 #define HTTP_E_BIND_SOCKET UPNP_E_SOCKET_BIND
00066 #define HTTP_E_WRITE_SOCKET UPNP_E_SOCKET_WRITE
00067 #define HTTP_E_CONNECT_SOCKET UPNP_E_SOCKET_CONNECT
00068 #define HTTP_E_SOCKET UPNP_E_OUTOF_SOCKET
00069 #define HTTP_E_BAD_RESPONSE UPNP_E_BAD_RESPONSE
00070 #define HTTP_E_BAD_REQUEST UPNP_E_BAD_REQUEST
00071 #define HTTP_E_BAD_IP_ADDRESS UPNP_E_INVALID_URL
00072 #define FALSE 0
00073 #define TAB 9
00074 #define CR 13
00075 #define LF 10
00076 #define RESPONSE_TIMEOUT 30
00077 #define SOCKET_BUFFER_SIZE 5000
00078
00079 enum hostType { HOSTNAME, IPv4address };
00080 enum pathType { ABS_PATH, REL_PATH, OPAQUE_PART };
00081 enum uriType { ABSOLUTE, RELATIVE };
00082
00083
00084
00085
00086 typedef struct SOCKET_BUFFER{
00087 char buff[SOCKET_BUFFER_SIZE];
00088 int size;
00089 struct SOCKET_BUFFER *next;
00090 } socket_buffer;
00091
00092
00093
00094
00095
00096 typedef struct TOKEN {
00097 char * buff;
00098 int size;
00099 } token;
00100
00101
00102
00103
00104
00105
00106 typedef struct HOSTPORT {
00107 token text;
00108 struct sockaddr_in IPv4address;
00109 } hostport_type;
00110
00111
00112
00113 typedef struct URI{
00114 enum uriType type;
00115 token scheme;
00116 enum pathType path_type;
00117 token pathquery;
00118 token fragment;
00119 hostport_type hostport;
00120 } uri_type;
00121
00122
00123
00124
00125
00126 typedef struct URL_LIST {
00127 int size;
00128 char * URLs;
00129 uri_type *parsedURLs;
00130 } URL_list;
00131
00132 typedef struct HTTP_HEADER {
00133 token header;
00134 token value;
00135 struct HTTP_HEADER * next;
00136 } http_header;
00137
00138 typedef struct HTTP_STATUS_LINE{
00139 token http_version;
00140 token status_code;
00141 token reason_phrase;
00142 } http_status;
00143
00144 typedef struct HTTP_REQUEST_LINE {
00145 token http_version;
00146 uri_type request_uri;
00147 token method;
00148 } http_request;
00149
00150
00151
00152 typedef struct HTTP_MESSAGE {
00153 http_status status;
00154 http_request request;
00155 http_header * header_list;
00156 token content;
00157 } http_message;
00158
00159
00160 EXTERN_C int transferHTTP( char * request, char * toSend,
00161 int toSendSize, char **out, char * Url);
00162
00163
00164 EXTERN_C int transferHTTPRaw( char * toSend, int toSendSize,
00165 char **out, char *URL);
00166
00167
00168 EXTERN_C int transferHTTPparsedURL( char * request,
00169 char * toSend, int toSendSize,
00170 char **out, uri_type *URL);
00171
00172
00173
00174
00175 EXTERN_C void currentTmToHttpDate(char *out);
00176
00177
00178 EXTERN_C char * resolve_rel_url( char * base_url, char * rel_url);
00179
00180 EXTERN_C int parse_uri( char * in, int max, uri_type * out);
00181
00182 EXTERN_C int token_cmp( token *in1, token *in2);
00183
00184 EXTERN_C int token_string_casecmp( token * in1, char * in2);
00185
00186 EXTERN_C int token_string_cmp( token * in1, char * in2);
00187
00188 EXTERN_C int parse_http_response( char * in, http_message * out,
00189 int max_len);
00190
00191 EXTERN_C int parse_http_request( char * in, http_message *out,
00192 int max_len);
00193
00194 EXTERN_C int search_for_header( http_message * in,
00195 char * header, token *out_value);
00196
00197
00198
00199 EXTERN_C int parse_hostport( char* in, int max, hostport_type *out );
00200
00201 EXTERN_C size_t write_bytes(int fd, char * bytes, size_t n,
00202 int timeout);
00203 EXTERN_C void free_http_message(http_message * message);
00204 EXTERN_C int copy_URL_list( URL_list *in, URL_list *out);
00205 EXTERN_C void free_URL_list(URL_list * list);
00206 EXTERN_C int parse_port(int max, char * port, unsigned short int * out);
00207
00208 EXTERN_C int parse_http_line( char * in, int max_size);
00209 EXTERN_C int parse_not_LWS( char *in, token *out, int max_size);
00210 EXTERN_C int parse_LWS( char * in, int max_size);
00211 EXTERN_C int parse_token( char * in, token * out, int max_size);
00212 EXTERN_C ssize_t readLine(int fd, char *out, int max, int *timeout);
00213 EXTERN_C int remove_dots(char * in, int size);
00214
00215
00216 DBGONLY(EXTERN_C void print_http_request(http_message
00217 *message,Dbg_Level DLevel,
00218 Dbg_Module Module,char *DbgFileName,
00219 int DbgLineNo););
00220
00221 DBGONLY(EXTERN_C void print_http_response(http_message *message,
00222 Dbg_Level DLevel,
00223 Dbg_Module Module,char *DbgFileName,
00224 int DbgLineNo););
00225
00226 DBGONLY(EXTERN_C void print_token( token * in,
00227 Dbg_Level DLevel,
00228 Dbg_Module Module,
00229 char *DbgFileName,
00230 int DbgLineNo););
00231
00232 DBGONLY(EXTERN_C void print_status_line(http_status *in,
00233 Dbg_Level DLevel,
00234 Dbg_Module Module,
00235 char *DbgFileName,
00236 int DbgLineNo););
00237
00238 DBGONLY(EXTERN_C void print_request_line(http_request *in,
00239 Dbg_Level DLevel,
00240 Dbg_Module Module,
00241 char *DbgFileName,int DbgLineNo));
00242
00243 DBGONLY(EXTERN_C void print_uri( uri_type *in,
00244 Dbg_Level DLevel,
00245 Dbg_Module Module,
00246 char *DbgFileName,
00247 int DbgLineNo););
00248
00249 #endif