File: [local] / OpenXM / src / kan96xx / Doc / cgi.sm1 (download)
Revision 1.8, Mon Nov 22 12:30:32 2004 UTC (19 years, 10 months ago) by takayama
Branch: MAIN
Changes since 1.7: +11 -1
lines
Added a code to check HTTP/1.1 200 OK.
|
% $OpenXM: OpenXM/src/kan96xx/Doc/cgi.sm1,v 1.8 2004/11/22 12:30:32 takayama Exp $
% OpenXM/src/polymake/cgi/cgi-polymake.sh
% is a shell script to call sm1/polymake as a CGI script.
% Override as /doPolymake {doPolymake.OoHG} def if you need.
/cgi.verbose 0 def
[(plugin-cgi)
[(Key words: )
( cgiUrlEncodingToKeyValuePair)
( cgiKeyValuePairToHttpString)
( cgiKeyValuePairToUrlEncodingString)
( cgiStringToUrlEncoding)
( cgiUrlEncodedStringToObj)
( cgiHttpToKeyValuePair)
]] putUsages
% A sample code
% (OpenXM) cgiQueryGoogle --> it does not work well.
/cgiQueryGoogle {
/key set
[[(URL),(/search)],
[(hl),(ja)],
[(ie),(UTF-8)],
[(q),key]] /kv set
[(cgiKeyValuePairToUrlEncodingString) kv] extension /sss set
[(GET ) , sss , ( HTTP/0.9) , nl , nl ] cat /sss2 set
[(sm1.socket) (connect) [80 (www.google.co.jp)]] extension 0 get /goo set
[(sm1.socket) (write) [goo sss2]] extension
goo readHTTP0 /pp set
pp message
[(sm1.socket) (close) [goo]] extension
[(cgiHttpToKeyValuePair) pp] extension /pp2 set
} def
% A sample
% (www.math.kobe-u.ac.jp) cgiGetIndex
/cgiGetIndex {
/url set
[[(URL),(/index.html)]
] /kv set
[(cgiKeyValuePairToUrlEncodingString) kv] extension /sss set
[(GET ) , sss , ( HTTP/0.9) , nl , nl ] cat /sss2 set
sss2 message
[(sm1.socket) (connect) [80 url]] extension 0 get /goo set
[(sm1.socket) (write) [goo sss2]] extension
goo readHTTP0 /pp set
pp message
[(sm1.socket) (close) [goo]] extension
[(cgiHttpToKeyValuePair) pp] extension /pp2 set
} def
[(readHTTP0)
[(fd readHTTP0 result-str)
(Read data from fd until the connection is closed.)
(Example:)
$[(sm1.socket) (connect) [80 (www.math.kobe-u.ac.jp)]] extension $
$ 0 get /goo set $
$goo readHTTP0 /pp set pp message$
$[(sm1.socket) (close) [goo]] extension $
]] putUsages
/readHTTP0 {
/arg1 set
[/fd /sss /pp /pp2 /nn] pushVariables
[
/fd arg1 def
/sss [ ] def
{
[(sm1.socket) (select) [fd -1]] extension {
} { (select error) error } ifelse
[(sm1.socket) (read) [fd]] extension /pp set
pp length 0 eq { exit } { } ifelse
sss pp append /sss set
} loop
sss cat /arg1 set
] pop
popVariables
arg1
} def
% ----------------------- server side -----------------------
% command filename action
/cgiPolymake.polymakeName (polymake) def
%/cgiPolymake.polymakeName (polymake_dummy) def
%/cgiPolymake.polymakeName (hoge) def
[(cgiPolymake)
[(Make sm1 to a polymake server based on CGI/OoHG)
$ sm1 -q -s "[(parse) (cgi.sm1) pushfile] extension cgiPolymake quit " $
]] putUsages
% Server-side-script
% oxMessageBody=action input-data-for-polymake
% sm1 -q -s "[(parse) (cgi.sm1) pushfile] extension cgiPolymake quit "
% env QUERY_STRING="t?oxMessageBody=FACETS+POINTS+1+0+0%0A" sm1 -q -s "[(parse) (cgi.sm1) pushfile] extension cgiPolymake quit "
/cgiPolymake {
{
[(getenv) (QUERY_STRING)] extension /cgi.query_string set
cgi.query_string isString {
cgi.query_string length 0 eq {
cgiPolymake.errorMessage message exit
} { } ifelse
}
{
cgiPolymake.errorMessage message exit
} ifelse
cgi.body.http0 message
cgi.query_string cgiPolymake.0
cgi.body cgiReplyInHttp0 /cgi.body.http set
cgi.body.http message
exit
} loop
[(flush)] extension
} def
/cgiPolymake.errorMessage
[ (Content-Type: text/html) nl
nl
(<html><body>) nl
(Input <br> action polymake-data <br> ) nl
(Example: <pre> ) nl
(FACETS POINTS) nl
(1 0 0 ) nl
(1 1 0 ) nl
(1 0 1 ) nl
(</pre>) nl
(<form>) nl
(<input type=submit>) nl
(<textarea name="oxMessageBody") nl
( rows=10 cols="80" wrap="soft"></textarea>) nl
(</form>) nl
(</body></html>) nl
] cat
def
/cgi.body.http0
(Content-Type: text/plain)
def
/cgiPolymake.0 {
/arg1 set
[/sss /kv /comm /i /acti0 /pError] pushVariables
[
/sss arg1 def
% Step 1. analyze the query string in URL encoding.
[(cgiUrlEncodingToKeyValuePair) sss] extension /kv set
kv (oxMessageBody) getNode /comm set
% [nl nl] cat message sss message kv message % for debug.
% Step 2. Extract action part and file part for polymake.
comm (array) dc /comm set
/i 0 def
[
0 1, comm length 1 sub {
/i set
comm,i,get 33 lt {
exit
} { comm,i,get } ifelse
} for
] /acti0 set
acti0 { (string) dc } map cat /acti0 set
/cgi.body comm def
0 1 i {
cgi.body rest /cgi.body set
} for
cgi.body { (string) dc } map cat /cgi.body set
% Step 3. Calling polymake
% acti0 cgi.body
/pError [ ] def
% cgi.body --> oxsVarToFile(), value is not a string object ...
% [(polymake) (stringInOut://cgi.body) acti0] addStdoutStderr
% It is not a bug; .body is removed from the variable name.
/cgi_body cgi.body def
[cgiPolymake.polymakeName (stringInOut://cgi_body.poly) acti0] addStdoutStderr
oxshell pop
pError [@@@stdout @@@stderr] append /pError set
/cgi.body cgi_body def
] pop
popVariables
} def
/cgi.test0 {
[[(URL) (hoge)]
[(oxMessageBody)
[(FACETS )
(POINTS) nl
(1 0 0) nl
(1 1 0) nl
(1 0 1) nl
(1 1 1) nl ] cat
]] /ff set
[(cgiKeyValuePairToUrlEncodingString) ff] extension /ff1 set
ff1 message
ff1 cgiPolymake.0
cgi.body message
} def
/cgiReplyInHttp0 {
/arg1 set
[/ss /sskv] pushVariables
[
/ss arg1 def
[[(Content-Body) ss]
% [(Content-Type) (text/plain)]
[(oxshell-stdout) [(cgiStringToUrlEncoding) @@@stdout] extension]
[(oxshell-stderr) [(cgiStringToUrlEncoding) @@@stderr] extension]
] /sskv set
[(cgiKeyValuePairToHttpString) sskv] extension /arg1 set
] pop
arg1
} def
% ------------ client side script ---------------
/cgiQueryPolymake.hostname (polymake.math.kobe-u.ac.jp) def
/cgiQueryPolymake.cginame (/cgi-bin/cgi-polymake.sh) def
/cgiQueryPolymake {
/arg2 set /arg1 set
[/saction /sfile /ff /ff1 /sss2 /goo /pp /pp2] pushVariables
[
/saction arg1 def /sfile arg2 def
% step1. Generate query in URL encoding.
[[(URL) [(http://) cgiQueryPolymake.hostname cgiQueryPolymake.cginame] cat]
% full URL necessary for virtual host of apache.
[(oxMessageBody)
[saction ( )
sfile nl ] cat
]] /ff set
[(cgiKeyValuePairToUrlEncodingString) ff] extension /ff1 set
[(GET ) , ff1 , ( HTTP/0.9) , nl , nl ] cat /sss2 set
% step 2. Call the server and get the response in pp
[(sm1.socket) (connect)
[80 cgiQueryPolymake.hostname]] extension 0 get /goo set
[(sm1.socket) (write) [goo sss2]] extension
goo readHTTP0 /pp set
% For the case of error.
[(regexec) (200 OK) [pp]] extension length 0 eq {
(sss2=) message
sss2 message
(pp=) message
pp message
(cgi.sm1: there seems to be an error in the HTTP connection.)
} { } ifelse
cgi.verbose { pp message } { } ifelse
[(sm1.socket) (close) [goo]] extension
[(cgiHttpToKeyValuePair) pp] extension /pp2 set
% step 3. Analyze the response.
[pp2 (Content-Body) getNode
pp2 (oxshell-stdout) getNode
pp2 (oxshell-stderr) getNode
] /arg1 set
] pop
popVariables
arg1
} def
% Overrides doPolymake
%/doPolymake { doPolymake.OoHG } def
%/polymake.start { polymake.start.OoHG } def
[(doPolymake.OoHG)
[(It first looks for local polymake. If there is, it calls the local polymake.)
(If not, it calls http://polymake.math.kobe-u.ac.jp/cgi-bin/cgi-polymake.sh)
(to make a computation in polymake.)
(See doPolymake for the syntax. doPolymake.OoHG may overrides doPolymake.)
]] putUsages
/doPolymake.OoHG {
/arg1 set
[/in-doPolymake.OoHG /pAction /pData /pNative /ptree
/pResult /pError
] pushVariables
[
arg1 0 get /pAction set
arg1 1 get /pData set
polymake.start
/pError [ ] def
%% step 1: polymake tfb ===> polymake native data
@@@polymake.k0.ccc ( polymake=Object; ) oxexecutestring
@@@polymake.k0.ccc ( QuoteMode(1); ) oxexecutestring
@@@polymake.k0.ccc [pData ( ;)] cat oxexecutestring
@@@polymake.k0.ccc oxpopcmo /ptree set
@@@polymake.k0.ccc ( QuoteMode(0); ) oxexecutestring
[(treeToPolymake) ptree] extension /pNative set
%% step 2: calling the polymake
% [(which) (polymake)] oxshell tag 0 eq
1 % always call web service
{
% cgi-polymake
(Trying web service.) message
pAction pNative cgiQueryPolymake /doPolymake.OoHG.result set
[(regexec) (Not Found) [doPolymake.OoHG.result 0 get ]]
extension length 0 eq not {
doPolymake.OoHG.result message
(The polymake cgi seems to be out of service.) error
} { } ifelse
doPolymake.OoHG.result 0 get /pNative set
pError doPolymake.OoHG.result rest append /pError set
} {
% local polymake
[(polymake) (stringInOut://pNative.poly) pAction] addStdoutStderr
oxshell pop
pError [@@@stdout @@@stderr] append /pError set
} ifelse
%% step 3: polymake native data to polymake tfb
[(polymake2tfb) (<) (stringIn://pNative) (>) (stringOut://pResult)
(2>) (stringOut://@@@stderr)] oxshell pop
pError [@@@stderr] append /pError set
%% step 4: get also tree style data.
@@@polymake.k0.ccc ( polymake=Object; ) oxexecutestring
@@@polymake.k0.ccc ( QuoteMode(1); ) oxexecutestring
@@@polymake.k0.ccc [pResult ( ;)] cat oxexecutestring
@@@polymake.k0.ccc oxpopcmo /ptree set
@@@polymake.k0.ccc ( QuoteMode(0); ) oxexecutestring
[pResult ptree pError] /arg1 set
] pop
popVariables
arg1
} def
/polymake.start.OoHG {
(ox.k0.loaded) boundp { }
{ [(parse) (ox.sm1) pushfile] extension
/@@@polymake.k0.ccc [ ] def
} ifelse
@@@polymake.k0.ccc [ ] eq {
k0connectr /@@@polymake.k0.ccc oxk0.ccc def /oxk0.ccc [ ] def
@@@polymake.k0.ccc oxsetmathcap @@@polymake.k0.ccc oxmathcap
} { } ifelse
@@@polymake.k0.ccc 0 get (closed) eq {
k0connectr /@@@polymake.k0.ccc oxk0.ccc def /oxk0.ccc [ ] def
@@@polymake.k0.ccc oxsetmathcap @@@polymake.k0.ccc oxmathcap
} { } ifelse
[(which) (polymake2tfb)] oxshell tag 0 eq {
(polymake2tfb is not installed in this system.) error
} { } ifelse
} def