LCOV - code coverage report
Current view: top level - http - php_http_url.h (source / functions) Hit Total Coverage
Test: PHP Code Coverage Lines: 95 102 93.1 %
Date: 2014-11-03 12:21:11 Functions: 4 4 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :     +--------------------------------------------------------------------+
       3             :     | PECL :: http                                                       |
       4             :     +--------------------------------------------------------------------+
       5             :     | Redistribution and use in source and binary forms, with or without |
       6             :     | modification, are permitted provided that the conditions mentioned |
       7             :     | in the accompanying LICENSE file are met.                          |
       8             :     +--------------------------------------------------------------------+
       9             :     | Copyright (c) 2004-2014, Michael Wallner <mike@php.net>            |
      10             :     +--------------------------------------------------------------------+
      11             : */
      12             : 
      13             : #ifndef PHP_HTTP_URL_H
      14             : #define PHP_HTTP_URL_H
      15             : 
      16             : #include <ext/standard/url.h>
      17             : 
      18             : #define PHP_HTTP_URL_REPLACE            0x000
      19             : #define PHP_HTTP_URL_JOIN_PATH          0x001
      20             : #define PHP_HTTP_URL_JOIN_QUERY         0x002
      21             : #define PHP_HTTP_URL_STRIP_USER         0x004
      22             : #define PHP_HTTP_URL_STRIP_PASS         0x008
      23             : #define PHP_HTTP_URL_STRIP_AUTH         (PHP_HTTP_URL_STRIP_USER|PHP_HTTP_URL_STRIP_PASS)
      24             : #define PHP_HTTP_URL_STRIP_PORT         0x020
      25             : #define PHP_HTTP_URL_STRIP_PATH         0x040
      26             : #define PHP_HTTP_URL_STRIP_QUERY        0x080
      27             : #define PHP_HTTP_URL_STRIP_FRAGMENT     0x100
      28             : #define PHP_HTTP_URL_STRIP_ALL ( \
      29             :         PHP_HTTP_URL_STRIP_AUTH | \
      30             :         PHP_HTTP_URL_STRIP_PORT | \
      31             :         PHP_HTTP_URL_STRIP_PATH | \
      32             :         PHP_HTTP_URL_STRIP_QUERY | \
      33             :         PHP_HTTP_URL_STRIP_FRAGMENT \
      34             : )
      35             : #define PHP_HTTP_URL_FROM_ENV           0x1000
      36             : #define PHP_HTTP_URL_SANITIZE_PATH      0x2000
      37             : 
      38             : typedef struct php_http_url_part {
      39             :         char *str;
      40             :         size_t len;
      41             : } php_http_url_part_t;
      42             : 
      43             : /* parse multibyte according to locale */
      44             : #define PHP_HTTP_URL_PARSE_MBLOC  0x001
      45             : /* parse utf8 multibyte sequences */
      46             : #define PHP_HTTP_URL_PARSE_MBUTF8 0x002
      47             : /* convert multibyte hostnames to IDNA */
      48             : #define PHP_HTTP_URL_PARSE_TOIDN  0x010
      49             : /* percent encode multibyte sequences in userinfo, path, query and fragment */
      50             : #define PHP_HTTP_URL_PARSE_TOPCT  0x020
      51             : 
      52             : typedef struct php_http_url {
      53             :         /* compatible to php_url, but do not use php_url_free() */
      54             :         char *scheme;
      55             :         char *user;
      56             :         char *pass;
      57             :         char *host;
      58             :         unsigned short port;
      59             :         char *path;
      60             :         char *query;
      61             :         char *fragment;
      62             : } php_http_url_t;
      63             : 
      64             : PHP_HTTP_API php_http_url_t *php_http_url_parse(const char *str, size_t len, unsigned flags TSRMLS_DC);
      65             : PHP_HTTP_API void php_http_url_free(php_http_url_t **url);
      66             : 
      67             : PHP_HTTP_API void php_http_url(int flags, const php_url *old_url, const php_url *new_url, php_url **url_ptr, char **url_str, size_t *url_len TSRMLS_DC);
      68             : 
      69             : PHP_HTTP_API STATUS php_http_url_encode_hash(HashTable *hash, const char *pre_encoded_str, size_t pre_encoded_len, char **encoded_str, size_t *encoded_len TSRMLS_DC);
      70             : PHP_HTTP_API STATUS php_http_url_encode_hash_ex(HashTable *hash, php_http_buffer_t *qstr, const char *arg_sep_str, size_t arg_sep_len, const char *val_sep_str, size_t val_sep_len, const char *pre_encoded_str, size_t pre_encoded_len TSRMLS_DC);
      71             : 
      72          27 : static inline void php_http_url_argsep(const char **str, size_t *len TSRMLS_DC)
      73             : {
      74          27 :         if (SUCCESS != php_http_ini_entry(ZEND_STRL("arg_separator.output"), str, len, 0 TSRMLS_CC) || !*len) {
      75           0 :                 *str = PHP_HTTP_URL_ARGSEP;
      76           0 :                 *len = lenof(PHP_HTTP_URL_ARGSEP);
      77             :         }
      78          27 : }
      79             : 
      80          15 : static inline void php_http_url_to_string(php_url *url, char **url_str, size_t *url_len TSRMLS_DC)
      81             : {
      82             :         php_http_buffer_t buf;
      83             : 
      84          15 :         php_http_buffer_init(&buf);
      85             : 
      86          15 :         if (url->scheme && *url->scheme) {
      87          15 :                 php_http_buffer_appendl(&buf, url->scheme);
      88          15 :                 php_http_buffer_appends(&buf, "://");
      89             :         } else {
      90           0 :                 php_http_buffer_appends(&buf, "//");
      91             :         }
      92             : 
      93          15 :         if (url->user && *url->user) {
      94           4 :                 php_http_buffer_appendl(&buf, url->user);
      95           4 :                 if (url->pass && *url->pass) {
      96           4 :                         php_http_buffer_appends(&buf, ":");
      97           4 :                         php_http_buffer_appendl(&buf, url->pass);
      98             :                 }
      99           4 :                 php_http_buffer_appends(&buf, "@");
     100             :         }
     101             : 
     102          15 :         if (url->host && *url->host) {
     103          15 :                 php_http_buffer_appendl(&buf, url->host);
     104             :         } else {
     105           0 :                 php_http_buffer_appends(&buf, "localhost");
     106             :         }
     107             : 
     108          15 :         if (url->port) {
     109           7 :                 php_http_buffer_appendf(&buf, ":%hu", url->port);
     110             :         }
     111             : 
     112          15 :         if (url->path && *url->path) {
     113          15 :                 php_http_buffer_appendl(&buf, url->path);
     114             :         }
     115             : 
     116          15 :         if (url->query && *url->query) {
     117          11 :                 php_http_buffer_appends(&buf, "?");
     118          11 :                 php_http_buffer_appendl(&buf, url->query);
     119             :         }
     120             : 
     121          15 :         if (url->fragment && *url->fragment) {
     122           4 :                 php_http_buffer_appends(&buf, "#");
     123           4 :                 php_http_buffer_appendl(&buf, url->fragment);
     124             :         }
     125             : 
     126          15 :         php_http_buffer_shrink(&buf);
     127          15 :         php_http_buffer_fix(&buf);
     128             : 
     129          15 :         if (url_len) {
     130          12 :                 *url_len = buf.used;
     131             :         }
     132             : 
     133          15 :         if (url_str) {
     134          15 :                 *url_str = buf.data;
     135             :         } else {
     136           0 :                 php_http_buffer_dtor(&buf);
     137             :         }
     138          15 : }
     139             : 
     140          27 : static inline php_url *php_http_url_from_struct(php_url *url, HashTable *ht TSRMLS_DC)
     141             : {
     142             :         zval **e;
     143             :         
     144          27 :         if (!url) {
     145          27 :                 url = emalloc(sizeof(*url));
     146             :         }
     147          27 :         memset(url, 0, sizeof(*url));
     148             :         
     149          27 :         if (SUCCESS == zend_hash_find(ht, "scheme", sizeof("scheme"), (void *) &e)) {
     150          22 :                 zval *cpy = php_http_ztyp(IS_STRING, *e);
     151          22 :                 url->scheme = estrndup(Z_STRVAL_P(cpy), Z_STRLEN_P(cpy));
     152          22 :                 zval_ptr_dtor(&cpy);
     153             :         }
     154          27 :         if (SUCCESS == zend_hash_find(ht, "user", sizeof("user"), (void *) &e)) {
     155          21 :                 zval *cpy = php_http_ztyp(IS_STRING, *e);
     156          21 :                 url->user = estrndup(Z_STRVAL_P(cpy), Z_STRLEN_P(cpy));
     157          21 :                 zval_ptr_dtor(&cpy);
     158             :         }
     159          27 :         if (SUCCESS == zend_hash_find(ht, "pass", sizeof("pass"), (void *) &e)) {
     160          21 :                 zval *cpy = php_http_ztyp(IS_STRING, *e);
     161          21 :                 url->pass = estrndup(Z_STRVAL_P(cpy), Z_STRLEN_P(cpy));
     162          21 :                 zval_ptr_dtor(&cpy);
     163             :         }
     164          27 :         if (SUCCESS == zend_hash_find(ht, "host", sizeof("host"), (void *) &e)) {
     165          22 :                 zval *cpy = php_http_ztyp(IS_STRING, *e);
     166          22 :                 url->host = estrndup(Z_STRVAL_P(cpy), Z_STRLEN_P(cpy));
     167          22 :                 zval_ptr_dtor(&cpy);
     168             :         }
     169          27 :         if (SUCCESS == zend_hash_find(ht, "path", sizeof("path"), (void *) &e)) {
     170          23 :                 zval *cpy = php_http_ztyp(IS_STRING, *e);
     171          23 :                 url->path = estrndup(Z_STRVAL_P(cpy), Z_STRLEN_P(cpy));
     172          23 :                 zval_ptr_dtor(&cpy);
     173             :         }
     174          27 :         if (SUCCESS == zend_hash_find(ht, "query", sizeof("query"), (void *) &e)) {
     175          25 :                 zval *cpy = php_http_ztyp(IS_STRING, *e);
     176          25 :                 url->query = estrndup(Z_STRVAL_P(cpy), Z_STRLEN_P(cpy));
     177          25 :                 zval_ptr_dtor(&cpy);
     178             :         }
     179          27 :         if (SUCCESS == zend_hash_find(ht, "fragment", sizeof("fragment"), (void *) &e)) {
     180          21 :                 zval *cpy = php_http_ztyp(IS_STRING, *e);
     181          21 :                 url->fragment = estrndup(Z_STRVAL_P(cpy), Z_STRLEN_P(cpy));
     182          21 :                 zval_ptr_dtor(&cpy);
     183             :         }
     184          27 :         if (SUCCESS == zend_hash_find(ht, "port", sizeof("port"), (void *) &e)) {
     185          22 :                 zval *cpy = php_http_ztyp(IS_LONG, *e);
     186          22 :                 url->port = (unsigned short) Z_LVAL_P(cpy);
     187          22 :                 zval_ptr_dtor(&cpy);
     188             :         }
     189             :         
     190          27 :         return url;
     191             : }
     192             : 
     193          23 : static inline HashTable *php_http_url_to_struct(php_url *url, zval *strct TSRMLS_DC)
     194             : {
     195             :         zval arr;
     196             :         
     197          23 :         if (strct) {
     198          23 :                 switch (Z_TYPE_P(strct)) {
     199             :                         default:
     200           6 :                                 zval_dtor(strct);
     201           6 :                                 array_init(strct);
     202             :                                 /* no break */
     203             :                         case IS_ARRAY:
     204             :                         case IS_OBJECT:
     205          23 :                                 INIT_PZVAL_ARRAY((&arr), HASH_OF(strct));
     206          23 :                                 break;
     207             :                 }
     208             :         } else {
     209           0 :                 INIT_PZVAL(&arr);
     210           0 :                 array_init(&arr);
     211             :         }
     212             :         
     213          23 :         if (url) {
     214          23 :                 if (url->scheme) {
     215          23 :                         add_assoc_string(&arr, "scheme", url->scheme, 1);
     216             :                 }
     217          23 :                 if (url->user) {
     218          14 :                         add_assoc_string(&arr, "user", url->user, 1);
     219             :                 }
     220          23 :                 if (url->pass) {
     221          14 :                         add_assoc_string(&arr, "pass", url->pass, 1);
     222             :                 }
     223          23 :                 if (url->host) {
     224          23 :                         add_assoc_string(&arr, "host", url->host, 1);
     225             :                 }
     226          23 :                 if (url->port) {
     227          17 :                         add_assoc_long(&arr, "port", (long) url->port);
     228             :                 }
     229          23 :                 if (url->path) {
     230          23 :                         add_assoc_string(&arr, "path", url->path, 1);
     231             :                 }
     232          23 :                 if (url->query) {
     233          21 :                         add_assoc_string(&arr, "query", url->query, 1);
     234             :                 }
     235          23 :                 if (url->fragment) {
     236          14 :                         add_assoc_string(&arr, "fragment", url->fragment, 1);
     237             :                 }
     238             :         }
     239             :         
     240          23 :         return Z_ARRVAL(arr);
     241             : }
     242             : 
     243             : PHP_HTTP_API zend_class_entry *php_http_url_class_entry;
     244             : PHP_MINIT_FUNCTION(http_url);
     245             : 
     246             : #define php_http_url_object_new php_http_object_new
     247             : #define php_http_url_object_new_ex php_http_object_new_ex
     248             : 
     249             : #endif
     250             : 
     251             : /*
     252             :  * Local variables:
     253             :  * tab-width: 4
     254             :  * c-basic-offset: 4
     255             :  * End:
     256             :  * vim600: noet sw=4 ts=4 fdm=marker
     257             :  * vim<600: noet sw=4 ts=4
     258             :  */
     259             : 

Generated by: LCOV version 1.11