=================================================================== RCS file: /home/cvs/OpenXM/src/kan96xx/Doc/httpd-rpc.sm1,v retrieving revision 1.3 retrieving revision 1.15 diff -u -p -r1.3 -r1.15 --- OpenXM/src/kan96xx/Doc/httpd-rpc.sm1 2002/10/24 02:48:59 1.3 +++ OpenXM/src/kan96xx/Doc/httpd-rpc.sm1 2010/02/08 01:08:39 1.15 @@ -1,23 +1,53 @@ -%% $OpenXM: OpenXM/src/kan96xx/Doc/httpd-rpc.sm1,v 1.2 2002/10/24 02:12:34 takayama Exp $ +%% $OpenXM: OpenXM/src/kan96xx/Doc/httpd-rpc.sm1,v 1.14 2009/02/22 17:30:03 ohara Exp $ %% http server by sm1. Used for RPC. Generic example. [(parse) (httpd.sm1) pushfile] extension pop + +/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.aaa [(GET /?) httpd.textarea.name] cat (array) dc 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.oxasir.timer 1 def %% 1 to use timer, but it accepts only one command + %% 0 not to use timer. It accepts programs. + +/httpd.title + (

OpenXM/Risa/Asir Online


) +def %%******* Put initialization codes for ox_asir here. /httpd.initialization - [ + [(if(1){) (XM_debug=0; ctrl("debug_window",0); Xm_noX=1;) ("Asirweb version 0.80. "+ " Risa/Asir oxasir version "+rtostr(version());) + (};) ] cat 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 oxNoX @@ -51,7 +81,7 @@ oxNoX 3] extension }{ %% On unix. - [(sleep 3 ; netscape http://) + [(sleep 3 ; firefox http://) [(sm1.socket) (gethostname) []] extension (:) httpd.port toString ( & ) ] cat system @@ -63,10 +93,10 @@ oxNoX } def -/httpd_action { +/httpd_action_rpc_only { [/in-httpd /ff /httpd.com /httpd.result /sss /sss.engine /sss.web /err - /oxserver.vname + /oxserver.vname /scheck ] pushVariables [ { @@ -88,6 +118,20 @@ oxNoX 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 @@ -151,8 +195,133 @@ oxNoX } 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 { /arg1 set [/in-metaCommand /msg /result /msg2 /nn @@ -178,6 +347,24 @@ oxNoX arg1 } def + [ + (Input example---factorization: fctr(x^3-1)) + (
) + [( + AsirManual (En) , )] cat + [( + AsirManual (Ja) )] cat + httpd.oxasir.timer { + (
It accepts only one command. The limit of CPU time is 30 seconds. + Do not put ; + (semi-colon) after the command. + ) + }{ } ifelse + (
) + [(You can also retrieve the result by GET /?) httpd.textarea.name (=) ( encoded_codes HTTP/1.0)] + (
) + ] cat /httpd.msg1 set + /send-page-usage { [/in-send-page-usage ] pushVariables [ @@ -186,10 +373,7 @@ oxNoX (Content-Type: text/html) sendln 0 sendln - (

Usage


) sendln - [(Ask by GET /?) httpd.textarea.name (=) ( encoded_codes HTTP/1.0)] cat - sendln - (
) sendln + httpd.title sendln [(getenv) (OXWEB_POST)] extension tag 0 eq { (
) sendln % use get }{ @@ -197,12 +381,16 @@ oxNoX } ifelse () sendln [()] cat sendln + ( rows=7 cols="80" wrap="soft">)] cat sendln (
) sendln - [$ Shutdown the server. , $ - ] cat sendln + httpd.msg1 sendln + + [$ Shutdown the oxserver (and restart it). $ + ] cat sendln + (

Powered by OpenXM and httpd on Kan/sm1

_) sendln 0 sendln [(flush)] extension ] pop @@ -219,16 +407,45 @@ oxNoX (HTTP/0.9 200 OK) sendln (Connection: close) sendln [(Content-length: ) result length toString ] cat sendln - (Content-Type: text/plain) sendln + (Content-Type: text/html) sendln + %(Content-Type: text/plain) sendln % It does not work on some browsers. 0 sendln + (
) sendln
    result sendln
+   (
) sendln 0 sendln [(flush)] extension ] pop popVariables } def +/send-page-refused { + /arg1 set + [/in-send-page-refused /reason] pushVariables + [ + /reason arg1 def + (HTTP/0.9 200 OK) sendln + (Connection: close) sendln + (Content-Type: text/html) sendln + 0 sendln + + (

Your request is refused.


) sendln + (Because your input contains the key word ) sendln + reason 0 get sendln + ( ) sendln + (

) sendln + (Your input is
) sendln + (
 ) sendln
+  reason 1 get sendln
+  (
) sendln + + 0 sendln + [(flush)] extension + ] pop + popVariables +} def + %% **** Overwrites the definition in httpd.sm1 /httpd_startserver { (httpd server accessible outside localhost.) message @@ -247,7 +464,7 @@ oxNoX } def %% ******* sample of cooked command -/cookedCommand { +/cookedCommand.simplest { /arg1 set [/in-cookedCommand /httpd.com] pushVariables [ @@ -258,3 +475,38 @@ oxNoX popVariables arg1 } 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 + [(shell) (eval_str) (ox_) (sm1_) + (m_start) (m_N_) (m_Inverse) (m_TexForm) %(m_) + (connect) (load) (bload) (bsave) + (end) (quit) (output) (bload27) (open) + (plot) (ctrl) (debug) (error) (port) (bind) (accept) + (draw) (peek) (poke) + (write_string_to_a_file) (_filter) + ] +def