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
00030
00031
00032
00033 #ifndef GENLIB_NET_URI_H
00034 #define GENLIB_NET_URI_H
00035
00036
00041 #if !defined(WIN32)
00042 #include <sys/param.h>
00043 #endif
00044
00045
00046 #include "UpnpGlobal.h"
00047 #include "UpnpInet.h"
00048
00049
00050 #include <ctype.h>
00051 #include <errno.h>
00052 #include <fcntl.h>
00053 #include <stdlib.h>
00054 #include <string.h>
00055 #if defined(BSD)
00056 #include <sys/socket.h>
00057 #endif
00058 #include <sys/types.h>
00059 #include <time.h>
00060
00061
00062 #ifdef WIN32
00063 #else
00064 #include <arpa/inet.h>
00065 #include <netdb.h>
00066 #endif
00067
00068
00069 #ifdef WIN32
00070 #define strncasecmp strnicmp
00071 #else
00072
00073 #endif
00074
00075
00076 #ifdef __cplusplus
00077 extern "C" {
00078 #endif
00079
00080
00081 #define HTTP_DATE_LENGTH 37 // length for HTTP DATE:
00082
00083 #define SEPARATORS "()<>@,;:\\\"/[]?={} \t"
00084 #define MARK "-_.!~*'()"
00085 #define RESERVED ";/?:@&=+$,{}" //added {} for compatibility
00086 #define HTTP_SUCCESS 1
00087
00088
00089 #define FALSE 0
00090 #define TAB 9
00091 #define CR 13
00092 #define LF 10
00093 #define SOCKET_BUFFER_SIZE 5000
00094
00095
00096 enum hostType {
00097 HOSTNAME,
00098 IPv4address
00099 };
00100
00101
00102 enum pathType {
00103 ABS_PATH,
00104 REL_PATH,
00105 OPAQUE_PART
00106 };
00107
00108
00109 #ifdef WIN32
00110
00111 enum uriType {
00112 absolute,
00113 relative
00114 };
00115 #else
00116 enum uriType {
00117 ABSOLUTE,
00118 RELATIVE
00119 };
00120 #endif
00121
00122
00127 typedef struct TOKEN {
00128 const char *buff;
00129 size_t size;
00130 } token;
00131
00132
00137 typedef struct HOSTPORT {
00139 token text;
00140
00141 struct sockaddr_storage IPaddress;
00142 } hostport_type;
00143
00144
00148 typedef struct URI{
00149 enum uriType type;
00150 token scheme;
00151 enum pathType path_type;
00152 token pathquery;
00153 token fragment;
00154 hostport_type hostport;
00155 } uri_type;
00156
00157
00162 typedef struct URL_LIST {
00164 int size;
00166 char *URLs;
00168 uri_type *parsedURLs;
00169 } URL_list;
00170
00171
00184 int replace_escaped(
00186 char *in,
00188 int index,
00190 size_t *max);
00191
00192
00204 int copy_URL_list(
00206 URL_list *in,
00208 URL_list *out);
00209
00216 void free_URL_list(
00218 URL_list *list);
00219
00220
00224 #ifdef DEBUG
00225 void print_uri(
00227 uri_type *in);
00228 #else
00229 static UPNP_INLINE void print_uri(uri_type *in) {}
00230 #endif
00231
00232
00236 #ifdef DEBUG
00237 void print_token(
00239 token *in);
00240 #else
00241 static UPNP_INLINE void print_token(token * in) {}
00242 #endif
00243
00244
00253 int token_string_casecmp(
00255 token *in1,
00257 char *in2);
00258
00259
00268 int token_string_cmp(
00270 token *in1,
00272 char *in2);
00273
00274
00283 int token_cmp(
00285 token *in1,
00287 token *in2);
00288
00289
00297 int parse_hostport(
00299 const char *in,
00301 int max,
00304 hostport_type *out);
00305
00306
00316 int remove_escaped_chars(
00318 char *in,
00320 size_t *size);
00321
00322
00345 int remove_dots(
00347 char *in,
00349 size_t size);
00350
00351
00366 char *resolve_rel_url(
00368 char *base_url,
00370 char *rel_url);
00371
00372
00385 int parse_uri(
00387 const char *in,
00389 int max,
00391 uri_type *out);
00392
00393
00402 int parse_uri_and_unescape(
00404 char *in,
00406 int max,
00408 uri_type *out);
00409
00410
00416 int parse_token(
00418 char *in,
00420 token *out,
00422 int max_size);
00423
00424
00425
00426
00427 #if 0
00428 #define HTTP_E_BAD_URL UPNP_E_INVALID_URL
00429 #define HTTP_E_READ_SOCKET UPNP_E_SOCKET_READ
00430 #define HTTP_E_BIND_SOCKET UPNP_E_SOCKET_BIND
00431 #define HTTP_E_WRITE_SOCKET UPNP_E_SOCKET_WRITE
00432 #define HTTP_E_CONNECT_SOCKET UPNP_E_SOCKET_CONNECT
00433 #define HTTP_E_SOCKET UPNP_E_OUTOF_SOCKET
00434 #define HTTP_E_BAD_RESPONSE UPNP_E_BAD_RESPONSE
00435 #define HTTP_E_BAD_REQUEST UPNP_E_BAD_REQUEST
00436 #define HTTP_E_BAD_IP_ADDRESS UPNP_E_INVALID_URL
00437
00438 #define RESPONSE_TIMEOUT 30
00439 #endif
00440
00441 #if 0
00442
00446 typedef struct SOCKET_BUFFER{
00447 char buff[SOCKET_BUFFER_SIZE];
00448 int size;
00449 struct SOCKET_BUFFER *next;
00450 } socket_buffer;
00451
00452
00453 typedef struct HTTP_HEADER {
00454 token header;
00455 token value;
00456 struct HTTP_HEADER * next;
00457 } http_header;
00458
00459
00460 typedef struct HTTP_STATUS_LINE{
00461 token http_version;
00462 token status_code;
00463 token reason_phrase;
00464 } http_status;
00465
00466
00467 typedef struct HTTP_REQUEST_LINE {
00468 token http_version;
00469 uri_type request_uri;
00470 token method;
00471 } http_request;
00472
00473
00477 typedef struct HTTP_MESSAGE {
00478 http_status status;
00479 http_request request;
00480 http_header * header_list;
00481 token content;
00482 } http_message;
00483 #endif
00484
00485
00486 #if 0
00487 int transferHTTP(
00488 char *request,
00489 char *toSend,
00490 int toSendSize,
00491 char **out,
00492 char *Url);
00493
00494
00495 int transferHTTPRaw(
00496 char *toSend,
00497 int toSendSize,
00498 char **out,
00499 char *URL);
00500
00501
00505 int transferHTTPparsedURL(
00506 char *request,
00507 char *toSend,
00508 int toSendSize,
00509 char **out,
00510 uri_type *URL);
00511
00512
00518 void currentTmToHttpDate(
00519 char *out);
00520
00521
00522 int parse_http_response(
00523 char *in,
00524 http_message *out,
00525 int max_len);
00526
00527
00528 int parse_http_request(
00529 char *in,
00530 http_message *out,
00531 int max_len);
00532
00533
00534 void print_http_message(
00535 http_message *message);
00536
00537
00538 int search_for_header(
00539 http_message *in,
00540 char *header,
00541 token *out_value);
00542
00543
00544 void print_status_line(
00545 http_status *in);
00546
00547
00548 void print_request_line(
00549 http_request *in);
00550
00551
00552 int parse_http_line(
00553 char *in,
00554 int max_size);
00555
00556
00557 int parse_not_LWS(
00558 char *in,
00559 token *out,
00560 int max_size);
00561
00562
00563 int parse_LWS(
00564 char *in,
00565 int max_size);
00566
00567
00568 size_t write_bytes(
00569 int fd,
00570 char *bytes,
00571 size_t n,
00572 int timeout);
00573
00574
00575 void free_http_message(
00576 http_message *message);
00577
00578
00579 #endif
00580
00581
00582 #ifdef __cplusplus
00583 }
00584 #endif
00585
00586
00587 #endif
00588