8 changed files with 2 additions and 449 deletions
-
1ext/standard/basic_functions.c
-
3ext/standard/basic_functions.h
-
2ext/standard/config.m4
-
2ext/standard/config.w32
-
373ext/standard/url_scanner.c
-
54ext/standard/url_scanner.h
-
8win32/php5dll.dsp
-
8win32/php5dllts.dsp
@ -1,373 +0,0 @@ |
|||||
/* |
|
||||
+----------------------------------------------------------------------+ |
|
||||
| PHP Version 5 | |
|
||||
+----------------------------------------------------------------------+ |
|
||||
| Copyright (c) 1997-2009 The PHP Group | |
|
||||
+----------------------------------------------------------------------+ |
|
||||
| This source file is subject to version 3.01 of the PHP license, | |
|
||||
| that is bundled with this package in the file LICENSE, and is | |
|
||||
| available through the world-wide-web at the following url: | |
|
||||
| http://www.php.net/license/3_01.txt | |
|
||||
| If you did not receive a copy of the PHP license and are unable to | |
|
||||
| obtain it through the world-wide-web, please send a note to | |
|
||||
| license@php.net so we can mail you a copy immediately. | |
|
||||
+----------------------------------------------------------------------+ |
|
||||
| Author: Hartmut Holzgraefe <hholzgra@php.net> | |
|
||||
+----------------------------------------------------------------------+ |
|
||||
*/ |
|
||||
/* $Id$ */ |
|
||||
|
|
||||
#include "php.h" |
|
||||
|
|
||||
#include "php_globals.h" |
|
||||
|
|
||||
#include <sys/types.h> |
|
||||
#include <stdio.h> |
|
||||
#include <stdlib.h> |
|
||||
#include <string.h> |
|
||||
#include "basic_functions.h" |
|
||||
#include "url_scanner.h" |
|
||||
|
|
||||
#ifndef BUFSIZE |
|
||||
#define BUFSIZE 256 |
|
||||
#endif |
|
||||
|
|
||||
int php_url_scanner_activate(TSRMLS_D) |
|
||||
{ |
|
||||
url_adapt(NULL,0,NULL,NULL); |
|
||||
return SUCCESS; |
|
||||
} |
|
||||
|
|
||||
|
|
||||
int php_url_scanner_deactivate(TSRMLS_D) |
|
||||
{ |
|
||||
url_adapt(NULL,0,NULL,NULL); |
|
||||
return SUCCESS; |
|
||||
} |
|
||||
|
|
||||
/* {{{ url_attr_addon |
|
||||
*/ |
|
||||
static char *url_attr_addon(const char *tag,const char *attr,const char *val,const char *buf) |
|
||||
{ |
|
||||
int flag = 0; |
|
||||
|
|
||||
if (!strcasecmp(tag,"a") && !strcasecmp(attr,"href")) { |
|
||||
flag = 1; |
|
||||
} else if (!strcasecmp(tag,"area" ) && !strcasecmp(attr,"href" )) { |
|
||||
flag = 1; |
|
||||
} else if (!strcasecmp(tag,"form" ) && !strcasecmp(attr,"action" )) { |
|
||||
flag = 1; |
|
||||
} else if (!strcasecmp(tag,"frame") && !strcasecmp(attr,"source" )) { |
|
||||
flag = 1; |
|
||||
} else if (!strcasecmp(tag,"img" ) && !strcasecmp(attr,"action" )) { |
|
||||
flag = 1; |
|
||||
} |
|
||||
if(flag && !strstr(val,buf) && !strchr(val,':')) { |
|
||||
char *result; |
|
||||
TSRMLS_FETCH(); |
|
||||
|
|
||||
spprintf(&result, 0, "%s%s", (strchr(val,'?') ? PG(arg_separator).output : "?"), buf); |
|
||||
return result; |
|
||||
} |
|
||||
return NULL; |
|
||||
} |
|
||||
/* }}} */ |
|
||||
|
|
||||
#define US BG(url_adapt_state) |
|
||||
|
|
||||
/* {{{ url_adapt_ext |
|
||||
*/ |
|
||||
char *url_adapt_ext(const char *src, uint srclen, const char *name, const char *val, size_t *newlen) |
|
||||
{ |
|
||||
char buf[1024]; |
|
||||
|
|
||||
snprintf(buf, sizeof(buf)-1, "%s=%s", name, val); |
|
||||
|
|
||||
return url_adapt(src, srclen, buf, newlen); |
|
||||
} |
|
||||
/* }}} */ |
|
||||
|
|
||||
/* {{{ url_adapt |
|
||||
*/ |
|
||||
char *url_adapt(const char *src, size_t srclen, const char *data, size_t *newlen) |
|
||||
{ |
|
||||
char *out,*outp; |
|
||||
int maxl,n; |
|
||||
TSRMLS_FETCH(); |
|
||||
|
|
||||
if(src==NULL) { |
|
||||
US.state=STATE_NORMAL; |
|
||||
if(US.tag) { efree(US.tag); US.tag =NULL; } |
|
||||
if(US.attr) { efree(US.attr); US.attr=NULL; } |
|
||||
if(US.val) { efree(US.val); US.val =NULL; } |
|
||||
return NULL; |
|
||||
} |
|
||||
|
|
||||
if(srclen==0) |
|
||||
srclen=strlen(src); |
|
||||
|
|
||||
out=malloc(srclen+1); |
|
||||
maxl=srclen; |
|
||||
n=srclen; |
|
||||
|
|
||||
*newlen=0; |
|
||||
outp=out; |
|
||||
|
|
||||
while(n--) { |
|
||||
switch(US.state) { |
|
||||
case STATE_NORMAL: |
|
||||
if(*src=='<') |
|
||||
US.state=STATE_TAG_START; |
|
||||
break; |
|
||||
|
|
||||
case STATE_TAG_START: |
|
||||
if(! isalnum(*src)) |
|
||||
US.state=STATE_NORMAL; |
|
||||
US.state=STATE_TAG; |
|
||||
US.ml=BUFSIZE; |
|
||||
US.p=US.tag=erealloc(US.tag,US.ml); |
|
||||
*(US.p)++=*src; |
|
||||
US.l=1; |
|
||||
break; |
|
||||
|
|
||||
case STATE_TAG: |
|
||||
if(isalnum(*src)) { |
|
||||
*(US.p)++ = *src; |
|
||||
US.l++; |
|
||||
if(US.l==US.ml) { |
|
||||
US.ml+=BUFSIZE; |
|
||||
US.tag=erealloc(US.tag,US.ml); |
|
||||
US.p = US.tag+US.l; |
|
||||
} |
|
||||
} else if (isspace(*src)) { |
|
||||
US.state = STATE_IN_TAG; |
|
||||
*US.p='\0'; |
|
||||
US.tag=erealloc(US.tag,US.l); |
|
||||
} else { |
|
||||
US.state = STATE_NORMAL; |
|
||||
efree(US.tag); |
|
||||
US.tag=NULL; |
|
||||
} |
|
||||
break; |
|
||||
|
|
||||
case STATE_IN_TAG: |
|
||||
if(isalnum(*src)) { |
|
||||
US.state=STATE_TAG_ATTR; |
|
||||
US.ml=BUFSIZE; |
|
||||
US.p=US.attr=erealloc(US.attr,US.ml); |
|
||||
*(US.p)++=*src; |
|
||||
US.l=1; |
|
||||
} else if (! isspace(*src)) { |
|
||||
US.state = STATE_NORMAL; |
|
||||
efree(US.tag); |
|
||||
US.tag=NULL; |
|
||||
} |
|
||||
break; |
|
||||
|
|
||||
case STATE_TAG_ATTR: |
|
||||
if(isalnum(*src)) { |
|
||||
*US.p++=*src; |
|
||||
++US.l; |
|
||||
if(US.l==US.ml) { |
|
||||
US.ml+=BUFSIZE; |
|
||||
US.attr=erealloc(US.attr,US.ml); |
|
||||
US.p = US.attr+US.l; |
|
||||
} |
|
||||
if(US.l==US.ml) { |
|
||||
US.ml+=BUFSIZE; |
|
||||
US.attr=erealloc(US.attr,US.ml); |
|
||||
US.p = US.attr+US.l; |
|
||||
} |
|
||||
} else if(isspace(*src)||(*src=='=')){ |
|
||||
US.state=STATE_TAG_IS; |
|
||||
*US.p=0; |
|
||||
US.attr=erealloc(US.attr,US.l); |
|
||||
} else if(*src=='>') { |
|
||||
US.state=STATE_NORMAL; |
|
||||
} else { |
|
||||
efree(US.attr); |
|
||||
US.attr=NULL; |
|
||||
US.state=STATE_IN_TAG; |
|
||||
} |
|
||||
break; |
|
||||
|
|
||||
case STATE_TAG_IS: |
|
||||
case STATE_TAG_IS2: |
|
||||
if(*src=='>'){ |
|
||||
US.state=STATE_NORMAL; |
|
||||
if(! (US.attr_done)) { |
|
||||
char *p; |
|
||||
p=url_attr_addon(US.tag,US.attr,"",data); |
|
||||
if(p) { |
|
||||
int l= strlen(p); |
|
||||
maxl+=l; |
|
||||
out=realloc(out,maxl); |
|
||||
outp=out+*newlen; |
|
||||
strlcpy(outp,p,maxl); |
|
||||
outp+=l; |
|
||||
*newlen+=l; |
|
||||
efree(p); |
|
||||
} |
|
||||
} |
|
||||
} else if(*src=='#') { |
|
||||
if(! (US.attr_done)) { |
|
||||
char *p; |
|
||||
US.attr_done=1; |
|
||||
p=url_attr_addon(US.tag,US.attr,"#",data); |
|
||||
if(p) { |
|
||||
int l= strlen(p); |
|
||||
maxl+=l; |
|
||||
out=realloc(out,maxl); |
|
||||
outp=out+*newlen; |
|
||||
strlcpy(outp, p, maxl); |
|
||||
outp+=l; |
|
||||
*newlen+=l; |
|
||||
efree(p); |
|
||||
} |
|
||||
} |
|
||||
} else if(!isspace(*src)&&(*src!='=')) { |
|
||||
US.ml=BUFSIZE; |
|
||||
US.p=US.val=erealloc(US.val,US.ml); |
|
||||
US.l=0; |
|
||||
US.attr_done=0; |
|
||||
if((*src=='"')||(*src=='\'')) { |
|
||||
US.state=STATE_TAG_QVAL2; |
|
||||
US.delim=*src; |
|
||||
} else { |
|
||||
US.state=STATE_TAG_VAL; |
|
||||
*US.p++=*src; |
|
||||
US.l++; |
|
||||
} |
|
||||
} |
|
||||
break; |
|
||||
|
|
||||
|
|
||||
case STATE_TAG_QVAL2: |
|
||||
if(*src=='#') { |
|
||||
if(! (US.attr_done)) { |
|
||||
char *p; |
|
||||
US.attr_done=1; |
|
||||
*US.p='\0'; |
|
||||
p=url_attr_addon(US.tag,US.attr,US.val,data); |
|
||||
if(p) { |
|
||||
int l= strlen(p); |
|
||||
maxl+=l; |
|
||||
out=realloc(out,maxl); |
|
||||
outp=out+*newlen; |
|
||||
strlcpy(outp,p,maxl); |
|
||||
outp+=l; |
|
||||
*newlen+=l; |
|
||||
efree(p); |
|
||||
} |
|
||||
} |
|
||||
} else if(*src==US.delim) { |
|
||||
US.state=STATE_IN_TAG; |
|
||||
*US.p='\0'; |
|
||||
if(! (US.attr_done)) { |
|
||||
char *p; |
|
||||
p=url_attr_addon(US.tag,US.attr,US.val,data); |
|
||||
if(p) { |
|
||||
int l= strlen(p); |
|
||||
maxl+=l; |
|
||||
out=realloc(out,maxl); |
|
||||
outp=out+*newlen; |
|
||||
strlcpy(outp,p,maxl); |
|
||||
outp+=l; |
|
||||
*newlen+=l; |
|
||||
efree(p); |
|
||||
} |
|
||||
} |
|
||||
break; |
|
||||
} else if(*src=='\\') { |
|
||||
US.state=STATE_TAG_QVAL2b; |
|
||||
} else if (*src=='>') { |
|
||||
US.state=STATE_NORMAL; |
|
||||
} |
|
||||
|
|
||||
*US.p++=*src; |
|
||||
++US.l; |
|
||||
if(US.l==US.ml) { |
|
||||
US.ml+=BUFSIZE; |
|
||||
US.val=erealloc(US.val,US.ml); |
|
||||
US.p = US.val+US.l; |
|
||||
} |
|
||||
|
|
||||
break; |
|
||||
|
|
||||
case STATE_TAG_QVAL2b: |
|
||||
US.state=STATE_TAG_QVAL2; |
|
||||
*US.p++=*src; |
|
||||
++US.l; |
|
||||
if(US.l==US.ml) { |
|
||||
US.ml+=BUFSIZE; |
|
||||
US.val=erealloc(US.val,US.ml); |
|
||||
US.p = US.val+US.l; |
|
||||
} |
|
||||
break; |
|
||||
|
|
||||
case STATE_TAG_VAL: |
|
||||
case STATE_TAG_VAL2: |
|
||||
if(*src=='#') { |
|
||||
if(! (US.attr_done)) { |
|
||||
char *p; |
|
||||
US.attr_done=1; |
|
||||
*US.p='\0'; |
|
||||
p=url_attr_addon(US.tag,US.attr,US.val,data); |
|
||||
if(p) { |
|
||||
int l= strlen(p); |
|
||||
maxl+=l; |
|
||||
out=realloc(out,maxl); |
|
||||
outp=out+*newlen; |
|
||||
strlcpy(outp,p,maxl); |
|
||||
outp+=l; |
|
||||
*newlen+=l; |
|
||||
efree(p); |
|
||||
} |
|
||||
} |
|
||||
} else if(isspace(*src)||(*src=='>')) { |
|
||||
US.state=(*src=='>')?STATE_NORMAL:STATE_IN_TAG; |
|
||||
*US.p='\0'; |
|
||||
if(! (US.attr_done)) { |
|
||||
char *p; |
|
||||
p=url_attr_addon(US.tag,US.attr,US.val,data); |
|
||||
if(p) { |
|
||||
int l= strlen(p); |
|
||||
maxl+=l; |
|
||||
out=realloc(out,maxl); |
|
||||
outp=out+*newlen; |
|
||||
strlcpy(outp,p,maxl); |
|
||||
outp+=l; |
|
||||
*newlen+=l; |
|
||||
efree(p); |
|
||||
} |
|
||||
} |
|
||||
} else { |
|
||||
*US.p++=*src; |
|
||||
US.l++; |
|
||||
if(US.l==US.ml) { |
|
||||
US.ml+=BUFSIZE; |
|
||||
US.val=erealloc(US.val,US.ml); |
|
||||
US.p = US.val+US.l; |
|
||||
} |
|
||||
} |
|
||||
break; |
|
||||
default: |
|
||||
break; |
|
||||
} |
|
||||
|
|
||||
*outp++=*src++; |
|
||||
*newlen+=1; |
|
||||
} |
|
||||
*outp='\0'; |
|
||||
return out; |
|
||||
} |
|
||||
/* }}} */ |
|
||||
|
|
||||
/* |
|
||||
* Local variables: |
|
||||
* tab-width: 4 |
|
||||
* c-basic-offset: 4 |
|
||||
* End: |
|
||||
* vim600: sw=4 ts=4 fdm=marker |
|
||||
* vim<600: sw=4 ts=4 |
|
||||
*/ |
|
||||
@ -1,54 +0,0 @@ |
|||||
/* |
|
||||
+----------------------------------------------------------------------+ |
|
||||
| PHP Version 5 | |
|
||||
+----------------------------------------------------------------------+ |
|
||||
| Copyright (c) 1997-2009 The PHP Group | |
|
||||
+----------------------------------------------------------------------+ |
|
||||
| This source file is subject to version 3.01 of the PHP license, | |
|
||||
| that is bundled with this package in the file LICENSE, and is | |
|
||||
| available through the world-wide-web at the following url: | |
|
||||
| http://www.php.net/license/3_01.txt | |
|
||||
| If you did not receive a copy of the PHP license and are unable to | |
|
||||
| obtain it through the world-wide-web, please send a note to | |
|
||||
| license@php.net so we can mail you a copy immediately. | |
|
||||
+----------------------------------------------------------------------+ |
|
||||
| Author: Sascha Schumann <sascha@schumann.cx> | |
|
||||
+----------------------------------------------------------------------+ |
|
||||
*/ |
|
||||
/* $Id$ */ |
|
||||
|
|
||||
#ifndef URI_SCANNER_H |
|
||||
#define URI_SCANNER_H |
|
||||
|
|
||||
int php_url_scanner_activate(TSRMLS_D); |
|
||||
int php_url_scanner_deactivate(TSRMLS_D); |
|
||||
|
|
||||
char *url_adapt(const char *src, size_t srclen, const char *data, size_t *newlen); |
|
||||
|
|
||||
enum url_state { |
|
||||
STATE_NORMAL, |
|
||||
STATE_TAG_START, |
|
||||
STATE_TAG, |
|
||||
STATE_IN_TAG, |
|
||||
STATE_TAG_ATTR, |
|
||||
STATE_TAG_IS, |
|
||||
STATE_TAG_IS2, |
|
||||
STATE_TAG_VAL, |
|
||||
STATE_TAG_VAL2, |
|
||||
STATE_TAG_QVAL1, |
|
||||
STATE_TAG_QVAL2, |
|
||||
STATE_TAG_QVAL2b |
|
||||
}; |
|
||||
|
|
||||
typedef struct url_adapt_struct { |
|
||||
enum url_state state; |
|
||||
char *tag; |
|
||||
char *attr; |
|
||||
char *val; |
|
||||
char delim; |
|
||||
char *p; |
|
||||
int l, ml; |
|
||||
int attr_done; |
|
||||
} url_adapt_state_t; |
|
||||
|
|
||||
#endif |
|
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue