Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/xcir/libvmod-parsereq
This project is deprecated
https://github.com/xcir/libvmod-parsereq
Last synced: 18 days ago
JSON representation
This project is deprecated
- Host: GitHub
- URL: https://github.com/xcir/libvmod-parsereq
- Owner: xcir
- License: other
- Created: 2012-06-03T05:02:18.000Z (over 12 years ago)
- Default Branch: master
- Last Pushed: 2017-08-20T13:05:32.000Z (about 7 years ago)
- Last Synced: 2024-05-20T04:11:38.974Z (6 months ago)
- Language: C
- Homepage:
- Size: 138 KB
- Stars: 26
- Watchers: 3
- Forks: 8
- Open Issues: 5
-
Metadata Files:
- Readme: README.rst
- License: COPYING
Awesome Lists containing this project
README
===================
vmod_parsereq
===================-------------------------
Varnish parse data module
-------------------------:Author: Syohei Tanaka(@xcir)
:Date: 2013-06-25
:Version: 0.12
:Manual section: 3SYNOPSIS
===========import parsereq;
NOTICE
==================
This project is deprecated.
New project is https://github.com/xcir/libvmod-parseformDESCRIPTION
==============SUPPORT DATA TYPES
===================* POST
* GET
* COOKIE
* REQ(req.http.*)
* AUTO(auto type using for in subroutine only, that is called by iterate function.)ATTENTION
============Don't use "vcl.use" and "vcl.discard" on VCL with the vmod loaded. This will cause the a segfault.
FUNCTIONS
============init
-------------Prototype
::init()
Parameter
Return value
::void
Description
initialize.
Make sure to call parsereq.init() in vcl_recv before using
any other function.Example
::import parsereq;
vcl_recv{
parsereq.init();
}setopt
-------------Prototype
::setopt(enum {enable_post_lookup})
Option
::enable_post_lookup (EXPERIMENTAL)
Enable to "CACHE" for POST request. very dangerous.
This option modify to
Backend request method set to "POST".
Enable send body.
Content-Length is set to POST size.Return value
::void
Description
Set option.Example
::import parsereq;
vcl_recv{
parsereq.init();
}errcode
-------------Prototype
::errcode()
Parameter
Return value
::int errorcode
(sucess) 2 Unknown or missing content-type.
(sucess) 1 Parse complete.
(error) -1 Out of session workspace. Try to increase sess_workspace
(error) -2 No content-length key.
(error) -3 Readable data < content-length.
Description
Get status code.Example
::import parsereq;
vcl_recv{
if(parsereq.errcode()<1){
...
}
}param/post_header/get_header/cookie_header
--------------------------------------------Prototype
::post_header(STRING key) (LEGACY)
get_header(STRING key) (LEGACY)
cookie_header(STRING key) (LEGACY)
param(enum {post, get, cookie, req, auto}, STRING key)
Parameter
::STRING key
Desired key value
Return value
STRING (not escaped)
Description
Get value.Example
::vcl_deliver{
set resp.http.hoge = parsereq.param(post, "hoge");
}
//return
hoge: hogevaluebody/post_body/get_body/cookie_body
--------------------------------------Prototype
::post_body() (LEGACY)
get_body() (LEGACY)
cookie_body() (LEGACY)
body(enum {post, get, cookie})Parameter
Return value
STRING (NOT ESCAPED)Description
Get (get,post,cookie) raw data.
This function is dangerous. The raw data is not escaped.
Usage of this require a thorough understanding of the risks
involved.Example
:://vcl
vcl_deliver{
set resp.http.hoge = parsereq.body(post);
}
//return
hoge: hoge=hogevalue&mage=magevaluenext_key/post_read_keylist/get_read_keylist/cookie_read_keylist
-----------------------------------------------------------------Prototype
::post_read_keylist() (LEGACY)
get_read_keylist() (LEGACY)
cookie_read_keylist() (LEGACY)
next_key(enum {post, get, cookie, req, auto})Parameter
Return value
STRINGDescription
get (get,post,cookie) key name.Example
:://req
/?name1=a&name2=b
//vcl
vcl_deliver{
set resp.http.n1 = parsereq.next_key(get);
set resp.http.n2 = parsereq.next_key(get);
//nothing
set resp.http.n3 = parsereq.next_key(get);
}
//return
n1: name2
n2: name1reset_offset/post_seek_reset/get_seek_reset/cookie_seek_reset
--------------------------------------------------------------Prototype
::post_seek_reset() (LEGACY)
get_seek_reset() (LEGACY)
cookie_seek_reset() (LEGACY)
reset_offset(enum {post, get, cookie, req, auto})Parameter
Return value
VOIDDescription
Reset the seek index.Example
:://req
/?name1=a&name2=b
//vcl
vcl_deliver{
set resp.http.n1 = parsereq.next_key(get);
set resp.http.n2 = parsereq.next_key(get);
parsereq.reset_offset(get);
set resp.http.n3 = parsereq.next_key(get);
set resp.http.n4 = parsereq.next_key(get);
//nothing
set resp.http.n5 = parsereq.next_key(get);
}
//return
n1: name2
n2: name1
n3: name2
n4: name1size
------------------------------------------------Prototype
::size(enum {post, get, cookie, req, auto}, STRING key)
Parameter
::STRING key
Desired key value
Return value
INTDescription
Get the size of value.Example
:://req
/?name1=a&name2=bbb
//vcl
vcl_deliver{
set resp.http.n1 = parsereq.size(get, "name1");
set resp.http.n2 = parsereq.size(get, "name2");
//nothing
set resp.http.na = parsereq.size(get, "name99");
}
//return
n1: 1
n2: 3
na: 0current_key
-----------------------------------------------------------Prototype
::current_key(enum {post, get, cookie, req, auto})
Parameter
Return value
STRINGDescription
Get current key-name of the offset.Example
:://req
/?name1=a&name2=bbb
//vcl
vcl_deliver{
set resp.http.t1 = ">>" + parsereq.current_key(get);
parsereq.next_offset(get);
set resp.http.t2 = ">>" + parsereq.current_key(get);
parsereq.next_offset(get);
set resp.http.t3 = ">>" + parsereq.current_key(get);
parsereq.next_offset(get);
set resp.http.t4 = ">>" + parsereq.current_key(get);
}
//return
t1: >>
t2: >>name2
t3: >>name1
t4: >>name1
next_offset
-------------------------------------------------------------Prototype
::next_offset(enum {post, get, cookie, req, auto})
Parameter
Return value
VOIDDescription
Change to the next key.
If next key isn't exist, will not change.Example
:://req
/?name1=a&name2=bbb
//vcl
vcl_deliver{
set resp.http.t1 = ">>" + parsereq.current_key(get);
parsereq.next_offset(get);
set resp.http.t2 = ">>" + parsereq.current_key(get);
parsereq.next_offset(get);
set resp.http.t3 = ">>" + parsereq.current_key(get);
parsereq.next_offset(get);
set resp.http.t4 = ">>" + parsereq.current_key(get);
}
//return
t1: >>
t2: >>name2
t3: >>name1
t4: >>name1iterate(EXPERIMENTAL)
----------------------------------------------------------------Prototype
::iterate(enum {post, get, cookie, req}, STRING)
Parameter
STRING subroutine pointerReturn value
BOOLDescription
Count all elements in parameter for iterate the subroutine.
This function is subject to change without notice.Example
:://req
/?name1=a&name2=bbb
//vcl
sub iterate {
set req.http.hoge = req.http.hoge + parsereq.current_key(auto) + ":";
set req.http.hoge = req.http.hoge + parsereq.param(auto, parsereq.current_key(auto)) + " ";
}
sub vcl_recv {
parsereq.init();
if(1 == 0){
call iterate;
}
set req.http.hoge= "";
C{
if(Vmod_Func_parsereq.iterate(sp, "get", (const char*)VGC_function_iterate)) return(1);
}C}
sub vcl_deliver{
set resp.http.t1 = req.http.hoge;
}
//return
t1: name2:bbb name1:a
INSTALLATION
==================Installation requires a Varnish source tree.
Usage::
./autogen.sh
./configure VARNISHSRC=DIR [VMODDIR=DIR]`VARNISHSRC` is the directory of the Varnish source tree for which to
compile your vmod. Both the `VARNISHSRC` and `VARNISHSRC/include`
will be added to the include search paths for your module.Optionally you can also set the vmod install directory by adding
`VMODDIR=DIR` (defaults to the pkg-config discovered directory from your
Varnish installation).Make targets:
* make - builds the vmod
* make install - installs your vmod in `VMODDIR`
* make check - runs the unit tests in ``src/tests/*.vtc``Trouble shooting
=================You could try to increase the sess_workspace and http_req_size
parameters and stack size(ulimit -s).Tested Version
===============* 3.0.1(x86_64)
* 3.0.2(x86_64)
* 3.0.2-streaming(x86_64)
* 3.0.3(x86, x86_64)
* 3.0.4(x86_64)HISTORY
===========Version 0.12: Support POST request cache(issue #7 thanks nshahzad). 3.0.4 support(issue #8)
Version 0.11: Support REQ data type.(req.http.*) And AUTO data type.
Version 0.10: Add: param, size, body, next_key, next_offset, current_key, iterate, reset_offset
Version 0.9: Bug fix: always segfault on x86. And sometimes segfault on x86_64. [issue #5 Thanks comotion]
Version 0.8: Support unknown content-type.(post_body only) [issue #3 Thanks c0ze]
Version 0.7: Bug fix: forgot to care binary. [issue #4 Thanks dnewhall]
Version 0.6: Bug fix: when you vcl reloaded, hook method be off.
Version 0.5: Rename module(parsepost -> parsereq)
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
=============This document is licensed under the same license as the
libvmod-rewrite project. See LICENSE for details.* Copyright (c) 2012 Syohei Tanaka(@xcir)
File layout and configuration based on libvmod-example
* Copyright (c) 2011 Varnish Software AS
parse method based on VFW( https://github.com/scarpellini/VFW )
url encode method based on http://d.hatena.ne.jp/hibinotatsuya/20091128/1259404695