[BACK]Return to httpd-rpc.sm1 CVS log [TXT][DIR] Up to [local] / OpenXM / src / kan96xx / Doc

Annotation of OpenXM/src/kan96xx/Doc/httpd-rpc.sm1, Revision 1.12

1.12    ! takayama    1: %% $OpenXM: OpenXM/src/kan96xx/Doc/httpd-rpc.sm1,v 1.11 2002/11/04 05:40:40 takayama Exp $
1.1       takayama    2: %% http server by sm1. Used for RPC.  Generic example.
                      3:
                      4: [(parse) (httpd.sm1) pushfile] extension pop
1.12    ! takayama    5:
        !             6: /httpd_action {
        !             7:    httpd_action_allow_file_transfer
        !             8:         %% If OXWEB_HTTPD_ROOT is set, file transfer will be allowed.
        !             9:         %% Example:  export OXWEB_HTTPD_ROOT=/usr/local/www/data/
        !            10:         %% Do not forget the last /
        !            11: %  httpd_action_rpc_only    %% old
        !            12: } def
1.10      takayama   13: %% keyword for rpc
1.1       takayama   14: /httpd.textarea.name (rpc) def
                     15: /httpd.textarea.name.aaa
                     16:   [(GET /?) httpd.textarea.name] cat (array) dc
                     17: def
1.10      takayama   18:
                     19: [(getenv) (OXWEB_PORT)] extension tag 0 eq {
                     20:   (Default httpd port : ) messagen
                     21:   /httpd.port 8090 def
                     22: } {
                     23:   /httpd.port [(getenv) (OXWEB_PORT)] extension .. (integer) dc def
                     24: } ifelse
                     25: (httpd.port = ) messagen httpd.port message
                     26:
1.1       takayama   27: /httpd.serial 0 def
                     28:
1.7       takayama   29: /httpd.oxasir.timer 1 def  %% 1 to use timer, but it accepts only one command
                     30:                            %% 0 not to use timer. It accepts programs.
                     31:
1.11      takayama   32: /httpd.title
                     33:   (<H1><font color="green">OpenXM/Risa/Asir Online</font></H2><br>)
                     34: def
1.2       takayama   35: %%******* Put initialization codes for ox_asir here.
                     36: /httpd.initialization
1.8       takayama   37:  [(if(1){)
1.2       takayama   38:   (XM_debug=0; ctrl("debug_window",0); Xm_noX=1;)
                     39:   ("Asirweb version 0.80. "+
                     40:    " Risa/Asir oxasir version "+rtostr(version());)
1.8       takayama   41:   (};)
1.2       takayama   42:  ] cat
                     43: def
1.1       takayama   44:
1.7       takayama   45: /httpd.asirman
                     46:  ("http://www.math.sci.kobe-u.ac.jp/OpenXM/1.2.1/doc/asir2000/html-eg/man_toc.html")
                     47: def
                     48: /httpd.asirman.ja
                     49:  ("http://www.math.sci.kobe-u.ac.jp/OpenXM/1.2.1/doc/asir2000/html-jp/man_toc.html")
                     50: def
1.1       takayama   51:
                     52: [(parse) (oxasir.sm1) pushfile] extension
                     53: oxNoX
                     54: (oxasir.started) boundp {
                     55: } {
                     56:   %% Initialize oxasir.
                     57:   [(x^2-1) (x)] fctr pop
                     58:   oxasir.ccc oxmathcap
                     59:   oxasir.ccc oxsetmathcap
1.2       takayama   60:   oxasir.ccc httpd.initialization oxexecutestring ;
                     61:   (Initialization returns ...: ) messagen
                     62:   oxasir.ccc oxpopcmo message ;
1.1       takayama   63: } ifelse
                     64:
                     65: /webrpc  {
                     66:  [/rrr ] pushVariables
                     67:  [
                     68:   [(oxGenPass)] extension . (integer) dc  /rrr set
                     69:
                     70:   [(ostype)] extension 0 get
                     71:    (windows) eq {
                     72:      %% On windows.
                     73:       [(forkExec)
                     74:        [
                     75:          ox.win.start.0 aload pop
                     76:          (iexplore)   %% Starting internet explorer (TM).
1.3       takayama   77:          [(http://) [(sm1.socket) (gethostname) []] extension
                     78:           (:) httpd.port toString] cat
1.1       takayama   79:        ]
                     80:        [  ]
                     81:       3] extension
                     82:    }{
                     83:       %% On unix.
1.3       takayama   84:       [(sleep 3 ; netscape http://)
                     85:                  [(sm1.socket) (gethostname) []] extension
                     86:                 (:) httpd.port toString ( & ) ] cat
1.1       takayama   87:       system
                     88:    } ifelse
                     89:
                     90:    httpd ;
                     91:   ] pop
                     92:   popVariables
                     93: } def
                     94:
                     95:
1.12    ! takayama   96: /httpd_action_rpc_only {
1.1       takayama   97:   [/in-httpd /ff /httpd.com /httpd.result /sss
                     98:    /sss.engine /sss.web /err
1.4       takayama   99:    /oxserver.vname /scheck
1.1       takayama  100:   ] pushVariables
                    101:   [
                    102:   {
                    103:        [(sm1.socket) (select) [httpd.server.fd 0 get -1]] extension
                    104:        %%     wait for ever
                    105:         [(sm1.socket) (readHTTP) [httpd.server.fd 0 get ]] extension /ff set
1.2       takayama  106:         ff tag 0 eq {
                    107:            (connection is closed.) message exit
1.1       takayama  108:         }
                    109:         {
                    110:           (------------  start ----------------------) message
                    111:              ff message
                    112:           (-----------------------------------------) message
                    113:              ff removeGET webstringToAscii /httpd.com set
                    114:              [(httpd.com=) httpd.com] cat message
                    115:           (------------  end ----------------------) message
                    116:           (   ) message
1.2       takayama  117:
1.1       takayama  118:           httpd.com metaCommand {
                    119:             httpd.textarea.valid {
                    120:
1.4       takayama  121:               %%% Security check
                    122:               [(regionMatches) httpd.com
                    123:                httpd.refusedCommands] extension /scheck set
                    124:               scheck 0 get -1 eq {
                    125:               }{
                    126:                 httpd.refusedCommands scheck 2 get get message
                    127:                 (Command is refused.) message
                    128:                 [
                    129:                  httpd.refusedCommands scheck 2 get get
                    130:                  httpd.com
                    131:                 ]
                    132:                  send-page-refused exit
                    133:               } ifelse
                    134:
1.1       takayama  135:               %%%  Executing command, here.
                    136:               oxasir.ccc
                    137:               httpd.com cookedCommand
                    138:               oxexecutestring ;
                    139:
                    140:             }{
                    141:               send-page-usage  exit
                    142:             } ifelse
                    143:
                    144:             [(oxReq) oxasir.ccc SM_dupErrors ] extension pop
                    145:
                    146:             [(oxReq) oxasir.ccc SM_popCMO ] extension pop
                    147:             [(oxReq) oxasir.ccc SM_popString ] extension pop
                    148:
                    149:             [(flush)] extension pop
                    150:             %% Select inputs for interruption.
                    151:             %% Wait by the spin lock.
                    152:             {
                    153:               [(oxMultiSelect) [oxasir.ccc] 1] extension 1 get 0 get
                    154:               /sss.engine set
                    155:               [(sm1.socket) (mselect)
                    156:                 [[httpd.server.fd 0 get] 1]
                    157:               ] extension 0 get /sss.web set
                    158:               /sss [sss.engine sss.web] def
                    159:               sss.engine { exit } { } ifelse
                    160:               sss.web    { exit } { } ifelse
                    161:             } loop
                    162:             sss message
                    163:
                    164:             sss 0 get {
                    165:                 [(oxGet) oxasir.ccc] extension  /err          set
                    166:                 [(oxGet) oxasir.ccc] extension  /httpd.result set
                    167:             } {
                    168:                 oxasir.ccc oxreset
                    169:                 oxasir.ccc ("computation is interrupted.";) oxexecutestring ;
                    170:                 oxasir.ccc oxpopstring
                    171:                 /httpd.result set
                    172:                 exit
                    173:             } ifelse
                    174:             (------------- result -------------) message
                    175:             httpd.result message
                    176:             (----------------------------------) message
                    177:             (  ) message
1.2       takayama  178:
                    179:             (----------- error -------------) message
1.1       takayama  180:             err message
1.2       takayama  181:             (-------------------------------) message
1.1       takayama  182:             err [ ] eq  {
                    183:             } {
                    184:               oxasir.ccc cleanErrors
                    185:               [httpd.result 10 (string) dc err toString] cat
                    186:               /httpd.result set
                    187:             } ifelse
                    188:
                    189:             httpd.result send-page-result  exit  %% exit the loop LOOP-A
                    190:           } { exit } ifelse  %% metaCommand
                    191:         } ifelse
                    192:   } loop  %% LOOP-A
                    193:   ] pop
                    194:   popVariables
                    195: } def
                    196:
                    197:
1.12    ! takayama  198: /httpd_action_allow_file_transfer {
        !           199:   [/in-httpd /ff /httpd.com /httpd.result /sss
        !           200:    /sss.engine /sss.web /err
        !           201:    /oxserver.vname /scheck /ff2
        !           202:   ] pushVariables
        !           203:   [
        !           204:    (httpd_action_allow_file_transfer: ) message
        !           205:   {
        !           206:        [(sm1.socket) (select) [httpd.server.fd 0 get -1]] extension
        !           207:        %%     wait for ever
        !           208:         [(sm1.socket) (readHTTP) [httpd.server.fd 0 get ]] extension /ff set
        !           209:         ff tag 0 eq {
        !           210:            (connection is closed.) message exit
        !           211:         }
        !           212:         {
        !           213:           (------------  start ----------------------) message
        !           214:              ff message
        !           215:           (-----------------------------------------) message
        !           216:              ff httpd.parse /ff2 set
        !           217:              ff2 message
        !           218:              /httpd.textarea.valid 0 def /httpd.com ( ) def
        !           219:              ff2 0 get (GET-file) eq {
        !           220:                 ff2 length 1 eq httpd.root tag 0 eq {
        !           221:                   send-page-usage
        !           222:                   exit
        !           223:                 } {  } ifelse
        !           224:                 ff2 httpd_sendfile exit
        !           225:              } {  } ifelse
        !           226:              ff2 0 get (GET) eq ff2 0 get (POST) eq or {
        !           227:               ff2 1 get tag 6 eq
        !           228:               ff2 1 get length 2 eq and
        !           229:               {  % list
        !           230:                 ff2 1 get 0 get httpd.textarea.name eq {
        !           231:                   /httpd.textarea.valid 1 def
        !           232:                   /httpd.com ff2 1 get 1 get def
        !           233:                 }{ } ifelse
        !           234:                 ff2 1 get 0 get (msg) eq { %% meta command
        !           235:                   /httpd.textarea.valid 0 def
        !           236:                   /httpd.com ff2 1 get 1 get def
        !           237:                 }{ } ifelse
        !           238:               } { } ifelse
        !           239:              }{  } ifelse
        !           240:              %% ff removeGET webstringToAscii /httpd.com set
        !           241:              [(httpd.com=) httpd.com] cat message
        !           242:           (------------  end ----------------------) message
        !           243:           (   ) message
        !           244:
        !           245:           httpd.com metaCommand {
        !           246:             httpd.textarea.valid {
        !           247:
        !           248:               %%% Security check
        !           249:               [(regionMatches) httpd.com
        !           250:                httpd.refusedCommands] extension /scheck set
        !           251:               scheck 0 get -1 eq {
        !           252:               }{
        !           253:                 httpd.refusedCommands scheck 2 get get message
        !           254:                 (Command is refused.) message
        !           255:                 [
        !           256:                  httpd.refusedCommands scheck 2 get get
        !           257:                  httpd.com
        !           258:                 ]
        !           259:                  send-page-refused exit
        !           260:               } ifelse
        !           261:
        !           262:               %%%  Executing command, here.
        !           263:               oxasir.ccc
        !           264:               httpd.com cookedCommand
        !           265:               oxexecutestring ;
        !           266:
        !           267:             }{
        !           268:               send-page-usage  exit
        !           269:             } ifelse
        !           270:
        !           271:             [(oxReq) oxasir.ccc SM_dupErrors ] extension pop
        !           272:
        !           273:             [(oxReq) oxasir.ccc SM_popCMO ] extension pop
        !           274:             [(oxReq) oxasir.ccc SM_popString ] extension pop
        !           275:
        !           276:             [(flush)] extension pop
        !           277:             %% Select inputs for interruption.
        !           278:             %% Wait by the spin lock.
        !           279:             {
        !           280:               [(oxMultiSelect) [oxasir.ccc] 1] extension 1 get 0 get
        !           281:               /sss.engine set
        !           282:               [(sm1.socket) (mselect)
        !           283:                 [[httpd.server.fd 0 get] 1]
        !           284:               ] extension 0 get /sss.web set
        !           285:               /sss [sss.engine sss.web] def
        !           286:               sss.engine { exit } { } ifelse
        !           287:               sss.web    { exit } { } ifelse
        !           288:             } loop
        !           289:             sss message
        !           290:
        !           291:             sss 0 get {
        !           292:                 [(oxGet) oxasir.ccc] extension  /err          set
        !           293:                 [(oxGet) oxasir.ccc] extension  /httpd.result set
        !           294:             } {
        !           295:                 oxasir.ccc oxreset
        !           296:                 oxasir.ccc ("computation is interrupted.";) oxexecutestring ;
        !           297:                 oxasir.ccc oxpopstring
        !           298:                 /httpd.result set
        !           299:                 exit
        !           300:             } ifelse
        !           301:             (------------- result -------------) message
        !           302:             httpd.result message
        !           303:             (----------------------------------) message
        !           304:             (  ) message
        !           305:
        !           306:             (----------- error -------------) message
        !           307:             err message
        !           308:             (-------------------------------) message
        !           309:             err [ ] eq  {
        !           310:             } {
        !           311:               oxasir.ccc cleanErrors
        !           312:               [httpd.result 10 (string) dc err toString] cat
        !           313:               /httpd.result set
        !           314:             } ifelse
        !           315:
        !           316:             httpd.result send-page-result  exit  %% exit the loop LOOP-A
        !           317:           } { exit } ifelse  %% metaCommand
        !           318:         } ifelse
        !           319:   } loop  %% LOOP-A
        !           320:   ] pop
        !           321:   popVariables
        !           322: } def
1.1       takayama  323:
                    324:
                    325: /metaCommand {
                    326:   /arg1 set
                    327:   [/in-metaCommand /msg /result /msg2 /nn
                    328:    /err /fn
                    329:   ] pushVariables
                    330:   [
                    331:     /msg arg1 def
                    332:     /result 1 def
                    333:     msg (httpdAsirMeta quit) eq {
                    334:        oxasir.ccc oxshutdown
                    335:        send-page-bye
                    336:        quit
                    337:        /result 0 def
                    338:     } { } ifelse
                    339:     msg (httpdAsirMeta interrupt) eq {
                    340:        oxasir.ccc oxreset
                    341:        (Interrupted! <br>) send-page-3
                    342:        /result 0 def
                    343:     } { } ifelse
                    344:     /arg1 result def
                    345:   ] pop
                    346:   popVariables
                    347:   arg1
                    348: } def
                    349:
1.11      takayama  350:  [
                    351:   (Input example---factorization:<font color="blue"> fctr(x^3-1)</font>)
                    352:   (<br>)
                    353:   [(<font color="blue">
                    354:     <a href=) httpd.asirman ( > AsirManual (En) </a> </font>, )] cat
                    355:   [(<font color="blue">
                    356:     <a href=) httpd.asirman.ja ( > AsirManual (Ja) </a> </font>)] cat
                    357:    httpd.oxasir.timer {
                    358:     (<br> It accepts only one command. The limit of CPU time is 30 seconds.
                    359:           <font color="red"> Do not put <font color="blue"> ; </font>
                    360:                              (semi-colon) after the command.
                    361:           </font>)
                    362:    }{ } ifelse
                    363:    (<br>)
                    364:   [(You can also retrieve the result by GET /?) httpd.textarea.name (=) ( encoded_codes  HTTP/1.0)]
                    365:    (<br>)
                    366:  ] cat /httpd.msg1 set
                    367:
1.1       takayama  368: /send-page-usage {
                    369:   [/in-send-page-usage ] pushVariables
                    370:   [
                    371:    (HTTP/0.9 200 OK) sendln
                    372:    (Connection: close) sendln
                    373:    (Content-Type: text/html) sendln
                    374:    0 sendln
                    375:
1.11      takayama  376:   httpd.title sendln
1.1       takayama  377:   [(getenv) (OXWEB_POST)] extension tag 0 eq {
                    378:     (<FORM NAME="myFORM">) sendln  % use get
                    379:   }{
                    380:     (<FORM NAME="myFORM" METHOD="POST">) sendln
                    381:   } ifelse
                    382:    (<INPUT TYPE=submit VALUE="submit">) sendln
                    383:    [(<textarea name=) httpd.textarea.name
1.8       takayama  384:     ( rows=7 cols="80" wrap="soft"></textarea>)] cat sendln
1.1       takayama  385:    (</FORM>) sendln
1.7       takayama  386:
1.11      takayama  387:    httpd.msg1 sendln
                    388:
1.9       takayama  389:    [$<a href="http://$ [(sm1.socket) (gethostname) []] extension
                    390:     $:$ httpd.port toString
1.7       takayama  391:     $/?msg=httpdAsirMeta+quit"> Shutdown the oxserver (and restart it). </a>$
1.1       takayama  392:    ] cat sendln
1.7       takayama  393:    (<h3 align="right"><font color="gree">Powered by OpenXM and httpd on Kan/sm1 </font> </h3>_) sendln
1.1       takayama  394:    0 sendln
                    395:    [(flush)] extension
                    396:   ] pop
                    397:   popVariables
                    398: } def
                    399:
                    400:
                    401:
                    402: /send-page-result {
                    403:   /arg1 set
                    404:   [/in-send-page-result /result] pushVariables
                    405:   [
                    406:    /result arg1 def
                    407:    (HTTP/0.9 200 OK) sendln
                    408:    (Connection: close) sendln
1.3       takayama  409:    [(Content-length: ) result length toString ] cat sendln
1.11      takayama  410:    (Content-Type: text/html) sendln
                    411:    %(Content-Type: text/plain) sendln  % It does not work on some browsers.
1.1       takayama  412:    0 sendln
                    413:
1.11      takayama  414:    (<html> <body> <pre>) sendln
1.1       takayama  415:    result sendln
1.11      takayama  416:    (</pre> </body> </html>) sendln
1.1       takayama  417:    0 sendln
                    418:    [(flush)] extension
                    419:   ] pop
                    420:   popVariables
                    421: } def
                    422:
1.4       takayama  423: /send-page-refused {
                    424:   /arg1 set
                    425:   [/in-send-page-refused /reason] pushVariables
                    426:   [
                    427:    /reason arg1 def
                    428:    (HTTP/0.9 200 OK) sendln
                    429:    (Connection: close) sendln
                    430:    (Content-Type: text/html) sendln
                    431:    0 sendln
                    432:
                    433:   (<H2> Your request is refused. </H2> <br> ) sendln
                    434:   (Because your input contains the key word <font color="red">) sendln
                    435:   reason 0 get sendln
                    436:   ( </font> ) sendln
                    437:   (<br> <br>) sendln
                    438:   (Your input is <br> ) sendln
                    439:   (<pre> ) sendln
                    440:   reason 1 get sendln
                    441:   (</pre> ) sendln
                    442:
                    443:    0 sendln
                    444:    [(flush)] extension
                    445:   ] pop
                    446:   popVariables
                    447: } def
                    448:
1.2       takayama  449: %% **** Overwrites the definition in httpd.sm1
                    450: /httpd_startserver {
                    451:    (httpd server accessible outside localhost.) message
                    452:    %%  get the hostname of this machine.
                    453:    [(sm1.socket) (open) [httpd.port
                    454:                          [(sm1.socket) (gethostname) [ ] ]extension ] ]
                    455:     extension
                    456:    /httpd.server.fdAndPort set
                    457:    (sm1.socket.open returns  ) messagen httpd.server.fdAndPort message
                    458:    [(sm1.socket) (accept) [httpd.server.fdAndPort 0 get]] extension
                    459:    /httpd.server.fd set
                    460:    (connected.) message
                    461:    (sm1.socket.accept returns <httpd.server.fd> ) messagen
                    462:    httpd.server.fd message
                    463:
                    464: } def
1.1       takayama  465:
                    466: %% ******* sample of cooked command
1.7       takayama  467: /cookedCommand.simplest {
1.1       takayama  468:   /arg1 set
                    469:   [/in-cookedCommand /httpd.com] pushVariables
                    470:   [
                    471:     /httpd.com arg1 def
                    472:     [(if (1) {)  httpd.com  (; };)] cat
                    473:     /arg1 set
1.7       takayama  474:   ] pop
                    475:   popVariables
                    476:   arg1
                    477: } def
                    478: /cookedCommand {
                    479:   /arg1 set
                    480:   [/in-cookedCommand /httpd.com /fff] pushVariables
                    481:   [
                    482:     /httpd.com arg1 def
                    483:     httpd.oxasir.timer not {
                    484:       [(if (1) {)  httpd.com  (; };)] cat
                    485:       /fff set
                    486:     }{
                    487: %%  It does not work.
                    488: %%      [$timer(30,eval_str("$
                    489: %%          (if (1) {)  httpd.com  (; };)
                    490: %%       $"),"Computation is aborted with the resource limit ( 30 seconds)");$
                    491: %%      ] cat
                    492:      [$timer(30,$   httpd.com
                    493:         $,"Computation is aborted with the resource limit ( 30 seconds) or there was a syntax error.");$
                    494:      ] cat
                    495:       /fff set
                    496:     } ifelse
                    497:     (cooked command is ) messagen fff message
                    498:     /arg1 fff def
1.1       takayama  499:   ] pop
                    500:   popVariables
                    501:   arg1
                    502: } def
1.4       takayama  503: /httpd.refusedCommands
1.8       takayama  504:    [(shell) (eval_str) (ox_) (sm1_)
                    505:     (m_start) (m_N_) (m_Inverse) (m_TexForm) %(m_)
1.5       takayama  506:     (connect) (load)  (bload) (bsave)
                    507:     (end) (quit) (output) (bload27) (open)
                    508:     (plot) (ctrl) (debug) (error) (port) (bind) (accept)
1.6       takayama  509:     (draw)  (peek) (poke)
1.4       takayama  510:    ]
                    511: def

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>