Skip to content

Commit

Permalink
Merge pull request #1 from xcir/experimental
Browse files Browse the repository at this point in the history
Experimental
  • Loading branch information
xcir committed Jun 10, 2012
2 parents 228c181 + 0139e1e commit 8864917
Show file tree
Hide file tree
Showing 68 changed files with 2,737 additions and 1,053 deletions.
227 changes: 198 additions & 29 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ Varnish parse post data module
-------------------------------

:Author: Syohei Tanaka(@xcir)
:Date: 2012-06-03
:Version: 0.2
:Date: 2012-06-10
:Version: 0.4
:Manual section: 3

SYNOPSIS
Expand All @@ -23,52 +23,216 @@ DESCRIPTION
FUNCTIONS
============

parse
init
-------------

Prototype
::

parse(STRING targethead, BOOL setParam, STRING paramPrefix, BOOL parseMulti ,BOOL parseFile)
init()

Parameter

Return value
::

STRING targethead
store raw data to specified header.
if this param is null. is not set.
BOOL setParam
true = header is set to the data was parsed.
false = is not set.
STRING paramPrefix
prefix to use when header setting.
void

Description
initialize.

please write parsepost.init(); to 1st line in vcl_recv.

Example
::

import parsepost;
vcl_recv{
parsepost.init();
}

errcode
-------------

Prototype
::

errcode()

Parameter

Return value
::

int errorcode
(sucess) 2 unknown or none content-type.
(sucess) 1 parse complete.
(error) -1 less sess_workspace.(you try to increase the sess_workspace)
(error) -2 none content-length key.
(error) -3 readable data < content-length.

Description
get status code.

Example
::

import parsepost;
vcl_recv{
if(parsepost.init()<1){
BOOL parseMulti
true = parse to the multipart/form-data
false = no parse.
...
BOOL parseFile
true = parse to the file(multipart/form-data)
false = no parse.
}
}

XXX_header (XXX=post,get,cookie)
-----------------------------------

Prototype
::

post_header(STRING key)
get_header(STRING key)
cookie_header(STRING key)
Parameter
::

STRING key
data you want to get.

Return value
INT success = 1 ,failed < 1
STRING (NOT ESCAPED)
Description
get POST request(Only "application/x-www-form-urlencoded" "multipart/form-data")
get value.

Example
::

import parsepost;
//vcl
vcl_deliver{
set resp.http.hoge = parsepost.post_header("hoge");
}
//return
hoge: hogevalue

XXX_body (XXX=post,get,cookie)
-----------------------------------

Prototype
::

post_body()
get_body()
cookie_body()

Parameter

Return value
STRING (NOT ESCAPED)

Description
get (get,post,cookie) raw data.

this function is dangerous.
raw data is not escape.
if you want to use ,require a thorough understanding of risk.

Example
::

//vcl
vcl_deliver{
set resp.http.hoge = parsepost.post_body();
}
//return
hoge: hoge=hogevalue&mage=magevalue


XXX_read_keylist (XXX=post,get,cookie)
----------------------------------------

Prototype
::

post_read_keylist()
get_read_keylist()
cookie_read_keylist()

Parameter

Return value
STRING

Description
get (get,post,cookie) key name.

Example
::

if(parsepost.parse("x-raw",true,"p_",true,true) == 1){
std.log("raw: " + req.http.x-raw);
std.log("submitter: " + req.http.p_submitter);
//req
/?name1=a&name2=b
//vcl
vcl_deliver{
set resp.http.n1 = parsepost.get_read_keylist();
set resp.http.n2 = parsepost.get_read_keylist();
//nothing
set resp.http.n3 = parsepost.get_read_keylist();
}
//return
n1: name2
n2: name1

XXX_seek_reset (XXX=post,get,cookie)
----------------------------------------

Prototype
::

post_seek_reset()
get_seek_reset()
cookie_seek_reset()

Parameter

Return value
VOID

Description
to reset the seek index.

Example
::

//response
12 VCL_Log c raw: submitter=abcdef&submitter2=b
12 VCL_Log c submitter: abcdef
//req
/?name1=a&name2=b
//vcl
vcl_deliver{
set resp.http.n1 = parsepost.get_read_keylist();
set resp.http.n2 = parsepost.get_read_keylist();
parsepost.get_seek_reset();
set resp.http.n3 = parsepost.get_read_keylist();
set resp.http.n4 = parsepost.get_read_keylist();
//nothing
set resp.http.n5 = parsepost.get_read_keylist();
}
//return
n1: name2
n2: name1
n3: name2
n4: name1


INSTALLATION
Expand Down Expand Up @@ -111,7 +275,12 @@ Tested Version
HISTORY
===========

Version 0.4: add get keylist function.

Version 0.3: support GET,COOKIE, modify interface.

Version 0.2: rename module(postparse -> parsepost)

Version 0.1: add function parse

COPYRIGHT
Expand Down
Binary file added oldver/xcir-libvmod-parsepost-Ver0.2.zip
Binary file not shown.
84 changes: 84 additions & 0 deletions src/tests/cookie.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
<?php

$l = <<< EOT
query a b c d none amulti
a=b; "b"
a=b; b=cdef; c=あ "b" "cdef" "あ"
a=b=c=d; b=c "b=c=d" "c"
;;a=b;;b=c;;; "b" "c"
a=a; a=b "a,b"
a==b; "=b"
a=b "b"
;=;=;=
;=;=;== "="
a[]=a; b=c;a[]=b "c" "a,b"
EOT;

$base = <<< EOT
varnishtest "COOKIE"
server s1 {
rxreq
txresp
} -start
varnish v1 -vcl+backend {
import parsepost from "\${vmod_topbuild}/src/.libs/libvmod_parsepost.so";
sub vcl_recv {
parsepost.init();
}
sub vcl_deliver{
set resp.http.a = parsepost.cookie_header("a");
set resp.http.b = parsepost.cookie_header("b");
set resp.http.c = parsepost.cookie_header("c");
set resp.http.d = parsepost.cookie_header("d");
set resp.http.none = parsepost.cookie_header("");
set resp.http.amulti = parsepost.cookie_header("a[]");
set resp.http.raw = parsepost.cookie_body();
}
} -start
client c1 {
txreq -req GET -url "/" -hdr "Cookie: %query%"
rxresp
%pat%
expect resp.http.raw == "%query%"
}
client c1 -run
EOT;

$sl =explode("\n",$l);
// expect resp.http.a == "b"

$nsl=array();
foreach($sl as $v){
$nsl[]=explode("\t",$v);
}

$cnt=count($nsl);
$key =&$nsl[0];
$tc=array();
for($i = 1 ;$i<$cnt;$i++){
$val =&$nsl[$i];
$nc = count($val);

$ret="";

for($x = 1 ;$x<$nc;$x++){
if($val[$x]=="")continue;
$ret .= "\texpect resp.http.{$key[$x]} == {$val[$x]}\n";

}
$tc[]=str_replace("%pat%",$ret,str_replace("%query%",$val[0],$base));
}
$i=0;
foreach($tc as $v){
$i++;
$fn = sprintf('test_COOKIE_%05d.vtc', $i);
file_put_contents($fn,$v);
}

Loading

0 comments on commit 8864917

Please sign in to comment.