===================================================================
RCS file: /home/cvs/OpenXM/src/kan96xx/Doc/httpd-rpc.sm1,v
retrieving revision 1.1
retrieving revision 1.13
diff -u -p -r1.1 -r1.13
--- OpenXM/src/kan96xx/Doc/httpd-rpc.sm1 2002/10/23 13:38:50 1.1
+++ OpenXM/src/kan96xx/Doc/httpd-rpc.sm1 2002/12/04 00:02:10 1.13
@@ -1,17 +1,54 @@
-%% $OpenXM$
+%% $OpenXM: OpenXM/src/kan96xx/Doc/httpd-rpc.sm1,v 1.12 2002/11/10 07:00:03 takayama 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.image.name (kobeuniv2.jpg) 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-eg/man_toc.html")
+def
+/httpd.asirman.ja
+ ("http://www.math.sci.kobe-u.ac.jp/OpenXM/1.2.1/doc/asir2000/html-jp/man_toc.html")
+def
+
[(parse) (oxasir.sm1) pushfile] extension
oxNoX
(oxasir.started) boundp {
@@ -20,6 +57,9 @@ oxNoX
[(x^2-1) (x)] fctr pop
oxasir.ccc oxmathcap
oxasir.ccc oxsetmathcap
+ oxasir.ccc httpd.initialization oxexecutestring ;
+ (Initialization returns ...: ) messagen
+ oxasir.ccc oxpopcmo message ;
} ifelse
/webrpc {
@@ -34,13 +74,16 @@ oxNoX
[
ox.win.start.0 aload pop
(iexplore) %% Starting internet explorer (TM).
- [(http://localhost:) httpd.port toString] cat
+ [(http://) [(sm1.socket) (gethostname) []] extension
+ (:) httpd.port toString] cat
]
[ ]
3] extension
}{
%% On unix.
- [(sleep 3 ; netscape http://localhost:) httpd.port toString ( & ) ] cat
+ [(sleep 3 ; netscape http://)
+ [(sm1.socket) (gethostname) []] extension
+ (:) httpd.port toString ( & ) ] cat
system
} ifelse
@@ -50,18 +93,18 @@ 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
[
{
[(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 length 0 eq {
- (connection is closed.) message
+ ff tag 0 eq {
+ (connection is closed.) message exit
}
{
(------------ start ----------------------) message
@@ -71,12 +114,24 @@ oxNoX
[(httpd.com=) httpd.com] cat message
(------------ end ----------------------) message
( ) message
- httpd.serial 0 eq {
- /httpd.com httpd.initialization def
- } { } ifelse
+
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
@@ -120,8 +175,10 @@ oxNoX
httpd.result message
(----------------------------------) message
( ) message
-
+
+ (----------- error -------------) message
err message
+ (-------------------------------) message
err [ ] eq {
} {
oxasir.ccc cleanErrors
@@ -138,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
@@ -165,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
[
@@ -173,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
- [$ 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
@@ -205,27 +406,65 @@ oxNoX
/result arg1 def
(HTTP/0.9 200 OK) sendln
(Connection: close) sendln
+ [(Content-length: ) result length toString ] cat 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
-%%******* Put initialization codes for ox_asir here.
-/httpd.initialization
- [
- (XM_debug=0; ctrl("debug_window",0); Xm_noX=1;)
- ("Asirweb version 0.80. "+
- " Risa/Asir oxasir version "+rtostr(version());)
- ] cat
-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
+ %% get the hostname of this machine.
+ [(sm1.socket) (open) [httpd.port
+ [(sm1.socket) (gethostname) [ ] ]extension ] ]
+ extension
+ /httpd.server.fdAndPort set
+ (sm1.socket.open returns ) messagen httpd.server.fdAndPort message
+ [(sm1.socket) (accept) [httpd.server.fdAndPort 0 get]] extension
+ /httpd.server.fd set
+ (connected.) message
+ (sm1.socket.accept returns ) messagen
+ httpd.server.fd message
+
+} def
+
%% ******* sample of cooked command
-/cookedCommand {
+/cookedCommand.simplest {
/arg1 set
[/in-cookedCommand /httpd.com] pushVariables
[
@@ -236,3 +475,38 @@ def
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