version 1.5, 2002/10/24 07:45:03 |
version 1.17, 2013/03/07 02:10:32 |
|
|
%% $OpenXM: OpenXM/src/kan96xx/Doc/httpd-rpc.sm1,v 1.4 2002/10/24 05:42:00 takayama Exp $ |
%% $OpenXM: OpenXM/src/kan96xx/Doc/httpd-rpc.sm1,v 1.16 2012/12/23 02:33:16 takayama Exp $ |
%% http server by sm1. Used for RPC. Generic example. |
%% http server by sm1. Used for RPC. Generic example. |
|
|
[(parse) (httpd.sm1) pushfile] extension pop |
[(parse) (httpd.sm1) pushfile] extension pop |
|
/httpd.textmode 1 def %% It does not work on some browsers. |
|
|
|
/httpd_action { |
|
httpd_action_allow_file_transfer |
|
%% If OXWEB_HTTPD_ROOT is set, file transfer will be allowed. |
|
%% Example: export OXWEB_HTTPD_ROOT=/usr/local/www/data/ |
|
%% Do not forget the last / |
|
% httpd_action_rpc_only %% old |
|
} def |
|
%% keyword for rpc |
/httpd.textarea.name (rpc) def |
/httpd.textarea.name (rpc) def |
/httpd.textarea.name.aaa |
/httpd.textarea.name.aaa |
[(GET /?) httpd.textarea.name] cat (array) dc |
[(GET /?) httpd.textarea.name] cat (array) dc |
def |
def |
/httpd.port 8090 def |
|
|
[(getenv) (OXWEB_PORT)] extension tag 0 eq { |
|
(Default httpd port : ) messagen |
|
/httpd.port 8090 def |
|
} { |
|
/httpd.port [(getenv) (OXWEB_PORT)] extension .. (integer) dc def |
|
} ifelse |
|
(httpd.port = ) messagen httpd.port message |
|
|
/httpd.serial 0 def |
/httpd.serial 0 def |
|
|
|
/httpd.oxasir.timer 1 def %% 1 to use timer, but it accepts only one command |
|
%% 0 not to use timer. It accepts programs. |
|
|
|
/httpd.title |
|
(<H1><font color="green">OpenXM/Risa/Asir Online</font></H2><br>) |
|
def |
%%******* Put initialization codes for ox_asir here. |
%%******* Put initialization codes for ox_asir here. |
/httpd.initialization |
/httpd.initialization |
[ |
[(if(1){) |
(XM_debug=0; ctrl("debug_window",0); Xm_noX=1;) |
(XM_debug=0; ctrl("debug_window",0); Xm_noX=1;) |
("Asirweb version 0.80. "+ |
("Asirweb version 0.80. "+ |
" Risa/Asir oxasir version "+rtostr(version());) |
" Risa/Asir oxasir version "+rtostr(version());) |
|
(};) |
] cat |
] cat |
def |
def |
|
|
|
/httpd.asirman |
|
("http://www.math.sci.kobe-u.ac.jp/OpenXM/1.2.1/doc/asir2000/html-en/man_toc.html") |
|
def |
|
/httpd.asirman.ja |
|
("http://www.math.sci.kobe-u.ac.jp/OpenXM/1.2.1/doc/asir2000/html-ja/man_toc.html") |
|
def |
|
|
[(parse) (oxasir.sm1) pushfile] extension |
[(parse) (oxasir.sm1) pushfile] extension |
oxNoX |
oxNoX |
|
|
3] extension |
3] extension |
}{ |
}{ |
%% On unix. |
%% On unix. |
[(sleep 3 ; netscape http://) |
[(ostype)] extension 1 get (mac) eq { |
|
/webrpc.browser (open) def |
|
} { /webrpc.browser (firefox) def } ifelse |
|
[(sleep 3 ; ) webrpc.browser ( http://) |
[(sm1.socket) (gethostname) []] extension |
[(sm1.socket) (gethostname) []] extension |
(:) httpd.port toString ( & ) ] cat |
(:) httpd.port toString ( & ) ] cat |
system |
system |
|
|
} def |
} def |
|
|
|
|
/httpd_action { |
/httpd_action_rpc_only { |
[/in-httpd /ff /httpd.com /httpd.result /sss |
[/in-httpd /ff /httpd.com /httpd.result /sss |
/sss.engine /sss.web /err |
/sss.engine /sss.web /err |
/oxserver.vname /scheck |
/oxserver.vname /scheck |
|
|
} def |
} def |
|
|
|
|
|
/httpd_action_allow_file_transfer { |
|
[/in-httpd /ff /httpd.com /httpd.result /sss |
|
/sss.engine /sss.web /err |
|
/oxserver.vname /scheck /ff2 |
|
] pushVariables |
|
[ |
|
(httpd_action_allow_file_transfer: ) message |
|
{ |
|
[(sm1.socket) (select) [httpd.server.fd 0 get -1]] extension |
|
%% wait for ever |
|
[(sm1.socket) (readHTTP) [httpd.server.fd 0 get ]] extension /ff set |
|
ff tag 0 eq { |
|
(connection is closed.) message exit |
|
} |
|
{ |
|
(------------ start ----------------------) message |
|
ff message |
|
(-----------------------------------------) message |
|
ff httpd.parse /ff2 set |
|
ff2 message |
|
/httpd.textarea.valid 0 def /httpd.com ( ) def |
|
ff2 0 get (GET-file) eq { |
|
ff2 length 1 eq httpd.root tag 0 eq { |
|
send-page-usage |
|
exit |
|
} { } ifelse |
|
ff2 httpd_sendfile exit |
|
} { } ifelse |
|
ff2 0 get (GET) eq ff2 0 get (POST) eq or { |
|
ff2 1 get tag 6 eq |
|
ff2 1 get length 2 eq and |
|
{ % list |
|
ff2 1 get 0 get httpd.textarea.name eq { |
|
/httpd.textarea.valid 1 def |
|
/httpd.com ff2 1 get 1 get def |
|
}{ } ifelse |
|
ff2 1 get 0 get (msg) eq { %% meta command |
|
/httpd.textarea.valid 0 def |
|
/httpd.com ff2 1 get 1 get def |
|
}{ } ifelse |
|
} { } ifelse |
|
}{ } ifelse |
|
%% ff removeGET webstringToAscii /httpd.com set |
|
[(httpd.com=) httpd.com] cat message |
|
(------------ end ----------------------) message |
|
( ) message |
|
|
|
httpd.com metaCommand { |
|
httpd.textarea.valid { |
|
|
|
%%% Security check |
|
[(regionMatches) httpd.com |
|
httpd.refusedCommands] extension /scheck set |
|
scheck 0 get -1 eq { |
|
}{ |
|
httpd.refusedCommands scheck 2 get get message |
|
(Command is refused.) message |
|
[ |
|
httpd.refusedCommands scheck 2 get get |
|
httpd.com |
|
] |
|
send-page-refused exit |
|
} ifelse |
|
|
|
%%% Executing command, here. |
|
oxasir.ccc |
|
httpd.com cookedCommand |
|
oxexecutestring ; |
|
|
|
}{ |
|
send-page-usage exit |
|
} ifelse |
|
|
|
[(oxReq) oxasir.ccc SM_dupErrors ] extension pop |
|
|
|
[(oxReq) oxasir.ccc SM_popCMO ] extension pop |
|
[(oxReq) oxasir.ccc SM_popString ] extension pop |
|
|
|
[(flush)] extension pop |
|
%% Select inputs for interruption. |
|
%% Wait by the spin lock. |
|
{ |
|
[(oxMultiSelect) [oxasir.ccc] 1] extension 1 get 0 get |
|
/sss.engine set |
|
[(sm1.socket) (mselect) |
|
[[httpd.server.fd 0 get] 1] |
|
] extension 0 get /sss.web set |
|
/sss [sss.engine sss.web] def |
|
sss.engine { exit } { } ifelse |
|
sss.web { exit } { } ifelse |
|
} loop |
|
sss message |
|
|
|
sss 0 get { |
|
[(oxGet) oxasir.ccc] extension /err set |
|
[(oxGet) oxasir.ccc] extension /httpd.result set |
|
} { |
|
oxasir.ccc oxreset |
|
oxasir.ccc ("computation is interrupted.";) oxexecutestring ; |
|
oxasir.ccc oxpopstring |
|
/httpd.result set |
|
exit |
|
} ifelse |
|
(------------- result -------------) message |
|
httpd.result message |
|
(----------------------------------) message |
|
( ) message |
|
|
|
(----------- error -------------) message |
|
err message |
|
(-------------------------------) message |
|
err [ ] eq { |
|
} { |
|
oxasir.ccc cleanErrors |
|
[httpd.result 10 (string) dc err toString] cat |
|
/httpd.result set |
|
} ifelse |
|
|
|
httpd.result send-page-result exit %% exit the loop LOOP-A |
|
} { exit } ifelse %% metaCommand |
|
} ifelse |
|
} loop %% LOOP-A |
|
] pop |
|
popVariables |
|
} def |
|
|
|
|
/metaCommand { |
/metaCommand { |
/arg1 set |
/arg1 set |
[/in-metaCommand /msg /result /msg2 /nn |
[/in-metaCommand /msg /result /msg2 /nn |
|
|
arg1 |
arg1 |
} def |
} def |
|
|
|
[ |
|
(Input example---factorization:<font color="blue"> fctr(x^3-1)</font>) |
|
(<br>) |
|
[(<font color="blue"> |
|
<a href=) httpd.asirman ( > AsirManual (En) </a> </font>, )] cat |
|
[(<font color="blue"> |
|
<a href=) httpd.asirman.ja ( > AsirManual (Ja) </a> </font>)] cat |
|
httpd.oxasir.timer { |
|
(<br> It accepts only one command. The limit of CPU time is 30 seconds. |
|
<font color="red"> Do not put <font color="blue"> ; </font> |
|
(semi-colon) after the command. |
|
</font>) |
|
}{ } ifelse |
|
(<br>) |
|
[(You can also retrieve the result by GET /?) httpd.textarea.name (=) ( encoded_codes HTTP/1.0)] |
|
(<br>) |
|
] cat /httpd.msg1 set |
|
|
/send-page-usage { |
/send-page-usage { |
[/in-send-page-usage ] pushVariables |
[/in-send-page-usage ] pushVariables |
[ |
[ |
|
|
(Content-Type: text/html) sendln |
(Content-Type: text/html) sendln |
0 sendln |
0 sendln |
|
|
(<H1> Usage </H2> <br> ) sendln |
httpd.title sendln |
[(Ask by GET /?) httpd.textarea.name (=) ( encoded_codes HTTP/1.0)] cat |
|
sendln |
|
(<br>) sendln |
|
[(getenv) (OXWEB_POST)] extension tag 0 eq { |
[(getenv) (OXWEB_POST)] extension tag 0 eq { |
(<FORM NAME="myFORM">) sendln % use get |
(<FORM NAME="myFORM">) sendln % use get |
}{ |
}{ |
|
|
} ifelse |
} ifelse |
(<INPUT TYPE=submit VALUE="submit">) sendln |
(<INPUT TYPE=submit VALUE="submit">) sendln |
[(<textarea name=) httpd.textarea.name |
[(<textarea name=) httpd.textarea.name |
( rows=10 cols="80" wrap="soft"></textarea>)] cat sendln |
( rows=7 cols="80" wrap="soft"></textarea>)] cat sendln |
(</FORM>) sendln |
(</FORM>) sendln |
[$<a href="http://localhost:$ httpd.port toString |
|
$/?msg=httpdAsirMeta+quit"> Shutdown the server. </a>, $ |
|
] cat sendln |
|
|
|
|
httpd.msg1 sendln |
|
|
|
[$<a href="http://$ [(sm1.socket) (gethostname) []] extension |
|
$:$ httpd.port toString |
|
$/?msg=httpdAsirMeta+quit"> Shutdown the oxserver (and restart it). </a>$ |
|
] cat sendln |
|
(<h3 align="right"><font color="gree">Powered by OpenXM and httpd on Kan/sm1 </font> </h3>_) sendln |
0 sendln |
0 sendln |
[(flush)] extension |
[(flush)] extension |
] pop |
] pop |
|
|
|
|
/send-page-result { |
/send-page-result { |
/arg1 set |
/arg1 set |
[/in-send-page-result /result] pushVariables |
[/in-send-page-result /result /hlen /msg1 /msg2] pushVariables |
[ |
[ |
/result arg1 def |
/result arg1 def |
|
/msg1 (<html> <body> <pre>) def |
|
/msg2 (</pre> </body> </html>) def |
|
httpd.textmode { 0 /hlen set } |
|
{ msg1 length msg2 length add 3 add /hlen set } ifelse |
(HTTP/0.9 200 OK) sendln |
(HTTP/0.9 200 OK) sendln |
(Connection: close) sendln |
(Connection: close) sendln |
[(Content-length: ) result length toString ] cat sendln |
[(Content-length: ) result length hlen add toString ] cat sendln |
(Content-Type: text/plain) sendln |
httpd.textmode |
|
{ (Content-Type: text/plain) sendln } % It does not work on some browsers. |
|
{ (Content-Type: text/html) sendln } ifelse |
0 sendln |
0 sendln |
|
|
|
httpd.textmode { } { msg1 sendln } ifelse |
result sendln |
result sendln |
|
httpd.textmode { } { msg2 sendln } ifelse |
0 sendln |
0 sendln |
[(flush)] extension |
[(flush)] extension |
] pop |
] pop |
|
|
} def |
} def |
|
|
%% ******* sample of cooked command |
%% ******* sample of cooked command |
/cookedCommand { |
/cookedCommand.simplest { |
/arg1 set |
/arg1 set |
[/in-cookedCommand /httpd.com] pushVariables |
[/in-cookedCommand /httpd.com] pushVariables |
[ |
[ |
|
|
popVariables |
popVariables |
arg1 |
arg1 |
} def |
} def |
|
/cookedCommand { |
|
/arg1 set |
|
[/in-cookedCommand /httpd.com /fff] pushVariables |
|
[ |
|
/httpd.com arg1 def |
|
httpd.oxasir.timer not { |
|
[(if (1) {) httpd.com (; };)] cat |
|
/fff set |
|
}{ |
|
%% It does not work. |
|
%% [$timer(30,eval_str("$ |
|
%% (if (1) {) httpd.com (; };) |
|
%% $"),"Computation is aborted with the resource limit ( 30 seconds)");$ |
|
%% ] cat |
|
[$timer(30,$ httpd.com |
|
$,"Computation is aborted with the resource limit ( 30 seconds) or there was a syntax error.");$ |
|
] cat |
|
/fff set |
|
} ifelse |
|
(cooked command is ) messagen fff message |
|
/arg1 fff def |
|
] pop |
|
popVariables |
|
arg1 |
|
} def |
/httpd.refusedCommands |
/httpd.refusedCommands |
[(shell) (eval_str) (ox_) (sm1_) (m_) |
[(shell) (eval_str) (ox_) (sm1_) |
|
(m_start) (m_N_) (m_Inverse) (m_TexForm) %(m_) |
(connect) (load) (bload) (bsave) |
(connect) (load) (bload) (bsave) |
(end) (quit) (output) (bload27) (open) |
(end) (quit) (output) (bload27) (open) |
(plot) (ctrl) (debug) (error) (port) (bind) (accept) |
(plot) (ctrl) (debug) (error) (port) (bind) (accept) |
(draw) |
(draw) (peek) (poke) |
|
(write_string_to_a_file) (_filter) |
] |
] |
def |
def |