[0001]
[0002]
[0003]
[0004]
[0005]
[0006]
[0007]
[0008]
[0009]
[0010]
[0011]
[0012]
[0013]
[0014]
[0015]
[0016]
[0017]
[0018]
[0019]
[0020]
[0021]
[0022]
[0023]
[0024]
[0025]
[0026]
[0027]
[0028]
[0029]
[0030]
[0031]
[0032]
[0033]
[0034]
[0035]
[0036]
[0037]
[0038]
[0039]
[0040]
[0041]
[0042]
[0043]
[0044]
[0045]
[0046]
[0047]
[0048]
[0049]
[0050]
[0051]
[0052]
[0053]
[0054]
[0055]
[0056]
[0057]
[0058]
[0059]
[0060]
[0061]
[0062]
[0063]
[0064]
[0065]
[0066]
[0067]
[0068]
[0069]
[0070]
[0071]
[0072]
[0073]
[0074]
[0075]
[0076]
[0077]
[0078]
[0079]
[0080]
[0081]
[0082]
[0083]
[0084]
[0085]
[0086]
[0087]
[0088]
[0089]
[0090]
[0091]
[0092]
[0093]
[0094]
[0095]
[0096]
[0097]
[0098]
[0099]
[0100]
[0101]
[0102]
[0103]
[0104]
[0105]
[0106]
[0107]
[0108]
[0109]
[0110]
[0111]
[0112]
[0113]
[0114]
[0115]
[0116]
[0117]
[0118]
[0119]
[0120]
[0121]
[0122]
[0123]
[0124]
[0125]
[0126]
[0127]
[0128]
[0129]
[0130]
[0131]
[0132]
[0133]
[0134]
[0135]
[0136]
[0137]
[0138]
[0139]
[0140]
[0141]
[0142]
[0143]
[0144]
[0145]
[0146]
[0147]
[0148]
[0149]
[0150]
[0151]
[0152]
[0153]
[0154]
[0155]
[0156]
[0157]
[0158]
[0159]
[0160]
[0161]
[0162]
[0163]
[0164]
[0165]
[0166]
[0167]
[0168]
[0169]
[0170]
[0171]
[0172]
[0173]
[0174]
[0175]
[0176]
[0177]
[0178]
[0179]
[0180]
[0181]
[0182]
[0183]
[0184]
[0185]
[0186]
[0187]
[0188]
[0189]
[0190]
[0191]
[0192]
[0193]
[0194]
[0195]
[0196]
[0197]
[0198]
[0199]
[0200]
[0201]
[0202]
[0203]
[0204]
[0205]
[0206]
[0207]
[0208]
[0209]
[0210]
[0211]
[0212]
[0213]
[0214]
[0215]
[0216]
[0217]
[0218]
[0219]
[0220]
[0221]
[0222]
[0223]
[0224]
[0225]
[0226]
[0227]
[0228]
[0229]
[0230]
[0231]
[0232]
[0233]
[0234]
[0235]
[0236]
[0237]
[0238]
[0239]
[0240]
[0241]
[0242]
[0243]
[0244]
[0245]
[0246]
[0247]
[0248]
[0249]
[0250]
[0251]
[0252]
[0253]
[0254]
[0255]
[0256]
[0257]
[0258]
[0259]
[0260]
[0261]
[0262]
[0263]
[0264]
[0265]
[0266]
[0267]
[0268]
[0269]
[0270]
[0271]
[0272]
[0273]
[0274]
[0275]
[0276]
[0277]
[0278]
[0279]
[0280]
[0281]
[0282]
[0283]
[0284]
[0285]
[0286]
[0287]
[0288]
[0289]
[0290]
[0291]
[0292]
[0293]
[0294]
[0295]
[0296]
[0297]
[0298]
[0299]
[0300]
[0301]
[0302]
[0303]
[0304]
[0305]
[0306]
[0307]
[0308]
[0309]
[0310]
[0311]
[0312]
[0313]
[0314]
[0315]
[0316]
[0317]
[0318]
[0319]
[0320]
[0321]
[0322]
[0323]
[0324]
[0325]
[0326]
[0327]
[0328]
[0329]
[0330]
[0331]
[0332]
[0333]
[0334]
[0335]
[0336]
[0337]
[0338]
[0339]
[0340]
[0341]
[0342]
[0343]
[0344]
[0345]
[0346]
[0347]
[0348]
[0349]
[0350]
[0351]
[0352]
[0353]
[0354]
[0355]
[0356]
[0357]
[0358]
[0359]
[0360]
[0361]
[0362]
[0363]
[0364]
[0365]
[0366]
[0367]
[0368]
[0369]
[0370]
[0371]
[0372]
[0373]
[0374]
[0375]
[0376]
[0377]
[0378]
[0379]
[0380]
[0381]
[0382]
[0383]
[0384]
[0385]
[0386]
[0387]
[0388]
[0389]
[0390]
[0391]
[0392]
[0393]
[0394]
[0395]
[0396]
[0397]
[0398]
[0399]
[0400]
[0401]
[0402]
[0403]
[0404]
[0405]
[0406]
[0407]
[0408]
[0409]
[0410]
[0411]
[0412]
[0413]
[0414]
[0415]
[0416]
[0417]
[0418]
[0419]
[0420]
[0421]
[0422]
[0423]
[0424]
[0425]
[0426]
[0427]
[0428]
[0429]
[0430]
[0431]
[0432]
[0433]
[0434]
[0435]
[0436]
[0437]
[0438]
[0439]
[0440]
[0441]
[0442]
[0443]
[0444]
[0445]
[0446]
[0447]
[0448]
[0449]
[0450]
[0451]
[0452]
[0453]
[0454]
[0455]
[0456]
[0457]
[0458]
[0459]
[0460]
[0461]
[0462]
[0463]
[0464]
[0465]
[0466]
[0467]
[0468]
[0469]
[0470]
[0471]
[0472]
[0473]
[0474]
[0475]
[0476]
[0477]
[0478]
[0479]
[0480]
[0481]
[0482]
[0483]
[0484]
[0485]
[0486]
[0487]
[0488]
[0489]
[0490]
[0491]
[0492]
[0493]
[0494]
[0495]
[0496]
[0497]
[0498]
[0499]
[0500]
[0501]
[0502]
[0503]
[0504]
[0505]
[0506]
[0507]
[0508]
[0509]
[0510]
[0511]
[0512]
[0513]
[0514]
[0515]
[0516]
[0517]
[0518]
[0519]
[0520]
[0521]
[0522]
[0523]
[0524]
[0525]
[0526]
[0527]
[0528]
[0529]
[0530]
[0531]
[0532]
[0533]
[0534]
[0535]
[0536]
[0537]
[0538]
[0539]
[0540]
[0541]
[0542]
[0543]
[0544]
[0545]
[0546]
[0547]
[0548]
[0549]
[0550]
[0551]
[0552]
[0553]
[0554]
[0555]
[0556]
[0557]
[0558]
[0559]
[0560]
[0561]
[0562]
[0563]
[0564]
[0565]
[0566]
[0567]
[0568]
[0569]
[0570]
[0571]
[0572]
[0573]
[0574]
[0575]
[0576]
[0577]
[0578]
[0579]
[0580]
[0581]
[0582]
[0583]
[0584]
[0585]
[0586]
[0587]
[0588]
[0589]
[0590]
[0591]
[0592]
[0593]
[0594]
[0595]
[0596]
[0597]
[0598]
[0599]
[0600]
[0601]
[0602]
[0603]
[0604]
[0605]
[0606]
[0607]
[0608]
[0609]
[0610]
[0611]
[0612]
[0613]
[0614]
[0615]
[0616]
[0617]
[0618]
[0619]
[0620]
[0621]
[0622]
[0623]
[0624]
[0625]
[0626]
[0627]
[0628]
[0629]
[0630]
[0631]
[0632]
[0633]
[0634]
[0635]
[0636]
[0637]
[0638]
[0639]
[0640]
[0641]
[0642]
[0643]
[0644]
[0645]
[0646]
[0647]
[0648]
[0649]
[0650]
[0651]
[0652]
[0653]
[0654]
[0655]
[0656]
[0657]
[0658]
[0659]
[0660]
<!DOCTYPE html>
<!-- WASDOC AXP-2.0.0 (CGILIB AXP-1.9.9) -->
<!-- wasDOC Copyright (C) 2019,2020 Mark G.Daniel - Apache-2.0 licenced -->
<!--  3-NOV-2021 02:57 -->
<noscript>NOTE: SOME FUNCTIONALITY EMPLOYS JAVASCRIPT</noscript>
<div id="erreport1" style="display:none;"></div>
<script>
function errorReport(string) {
   for (var cnt = 1; cnt <= 2; cnt++) {
      var err = document.getElementById('erreport'+cnt);
      err.style.display = 'block';
      err.innerHTML += string;
   }
}
</script>
<style type="text/css">
html { font-family: arial, verdana, sans-serif; font-size:12pt; margin:1em; }
h1 { font-size:124%; font-style:bold;
     margin-top:1em; margin-bottom:0.5em; }
h2 { font-size:120%; font-style:bold;
     margin-top:1.1em; margin-bottom:0.4em; }
h3 { font-size:116%; font-style:bold;
     margin-top:1.0em; margin-bottom:0.3em; }
h4 { font-size:112%; font-style:bold;
     margin-top:1.1em; margin-bottom:0.3em; }
h5 { font-size:112%; font-style:bold; 
     margin-top:1.1em; margin-bottom:0.3em; }
h6 { font-size:112%; font-style:bold; padding:0; margin:0; }

h1 .text { text-decoration:underline; }
h1 .numb { padding-right:0.8em; }
h1 .numb:empty { display:none; padding-right:0; }
h2 .numb { padding-right:0.8em; }
h2 .numb:empty { display:none; padding-right:0; }
h3 .numb { padding-right:0.8em; }
h3 .numb:empty { display:none; padding-right:0; }
h4 .numb { padding-right:0.8em; }
h4 .numb:empty { display:none; padding-right:0; }
h5 .numb { display:none; padding-right:0; }
h6 .numb { display:none; padding-right:0; }

kbd { font-family:monospace; }

noscript { font-size:1.2em; }

p { line-height:1.1em; margin-top:1em; margin-bottom:1em; }

.chunk { font-size:130%; text-decoration:underline; }
.head {}
.high {}
.bold { font-weight:bold; }
.center { text-align:center; }
.italic { font-style:italic; }
.left { text-align:left; }
.nowrap { white-space:nowrap; }
.prewrap { white-space:pre; }
.right { text-align:right; }
.strike { text-decoration:line-through; }
.under { text-decoration:underline; }

.backlight { background-color:#f2f2f2; }
.display0 { display:none; }

img { max-width:100%; }
.imglink { }

.link { }
.blank { }

.list { margin-bottom:1em; }
.list li { margin-top:0.5em; }
.list0 li { margin-top:0; }
.item {}

.tabl { border-collapse:collapse; text-align:left; margin:0.4em 2em 0.5em 2em; }
.tabu { border-collapse:collapse; text-align:right; margin:0.4em 2em 0.5em 2em; }

.tabr { vertical-align:top; }
.tabh { padding:0.2em 0 0 2em; margin:0; }
.tabd { padding:0.1em 0 0 2em; margin:0; }
.tabh:first-of-type, td:first-of-type { padding-left:0; }

.tabu .tabh,
.tabu .tabd { border:1px solid gray; padding:0.2em 0.3em 0.2em 0.3em; }
.tab0 { border:none; visibility:hidden; max-width:1em; 
        white-space:nowrap; overflow:hidden; }

.tabauto { margin-left:auto; margin-right:auto; }

.tabr:empty { height:0.2em; }
.tabu .tabh:empty, .tabu .tabd:empty { border:none; visibility:hidden; }

.error { font-size:110%; color:black; background-color:yellow;
         font-family:sans-serif; font-weight:bold; font-style:normal;
         width:95%; border:solid 1px gray; padding:0.5em 1em 0.5em 1em; }
.error::before { content:'\026a0\00a0'; }
.image { }
.page { width:98%; border:1px dashed gray; margin:1.5em 0 1.8em 0; }
.epage { width:98%; border:1px dashed black; margin:1.5em 0 1.8em 0; }
.monosp { font-family:monospace; }
.ppage { display:none; }
.simple { list-style-type:none; }
.valtop { vertical-align:top; }
.valmid { vertical-align:middle; }
.valbot { vertical-align:bottom; }

.code { border-style:solid; border-width:0 0 0 1px; padding-left:1em;
        font-family:monospace; white-space:pre; }
.block { }
.blockof { margin:0.4em 2em 0.5em 2em; }
.example { border-style:dashed; border-width:0 0 0 1px; padding-left:1em;
           margin-top:0.5em; margin-bottom:0.5em; white-space:pre; }
.indent { margin-left:2em; margin-right:2em; }
.noindent { margin-left:0; margin-right:0; }
.inblock { display:inline-block; }
.mono { white-space:pre; font-family:monospace; }
.note { margin:0.4em 2em 0.5em 2em; page-break-inside:avoid; }
.note h5 { margin-top:0 }
.note_hr { width:80%; border:1px solid gray; }
.prop { padding-left:1em; margin-top:0.5em; margin-bottom:0.5em; }
.quote { border-style:dashed; border-width:0 0 0 1px; padding-left:1em;
         margin-top:0.5em; margin-bottom:0.5em; }
.this { display:none; }

a:link,a:visited { color:black; text-decoration:none; }
a:hover,a:active { text-decoration:underline; }
a:focus { outline:0; } 

:target:before { content:''; display:block; height:0.1em; margin:-0.1em; }
a.link:link, a.link:visited,a.link:active 
{ color:midnightBlue; text-decoration:underline; text-decoration-style:solid; }

.TOC1cols1 { width:80%; max-width:80%; }
.TOC1cols2 { column-count:2; width:80%; max-width:80%; }
.TOC1cols3 { column-count:3; max-width:90%; max-width:90%; }
.TOC1cols4 { column-count:4; max-width:100%; max-width:100%; }
.TOC1table { margin-left:2em; white-space:nowrap; break-inside:auto; }
.TOC1table tr { vertical-align:top; text-align:left; break-inside:avoid; break-after:auto; }
.TOC1table td+td { padding:0 0 0 0.5em; }
.TOC1table .numb { width:3em; max-width:3em; }
.TOC1table .sepr { width:5em; max-width:6em; overflow:hidden; }
.TOC1table .majr { font-weight:bold; }
.TOC1table .text { white-space:normal; }

/* These are due to Firefox (at least <= 76) recalcitrant multi-column handling.
   Web search "Split table into css columns, issue in Firefox" (stackoverflow).
   "Good grief, Charlie Brown!" */
 
.TOC1cols2 table,
.TOC1cols2 tbody,
.TOC1cols2 tr,
.TOC1cols3 table,
.TOC1cols3 tbody,
.TOC1cols3 tr,
.TOC1cols4 table,
.TOC1cols4 tbody,
.TOC1cols4 tr { display:block; padding:0; }

.TOC2cols1 { width:60%; max-width:60%; }
.TOC2cols2 { column-count:2; width:70%; max-width:70%; }
.TOC2cols3 { column-count:3; width:80%; max-width:80%; }
.TOC2cols4 { column-count:4; width:90%; max-width:90%; }
.TOC2table { margin-left:2em; white-space:nowrap; break-inside:auto; }
.TOC2table tr { vertical-align:top; text-align:left; break-inside:avoid; break-after:auto; }
.TOC2table .numb { font-weight:bold; padding-right:0.5em; }
.TOC2table .text { width:100%; white-space:normal; }

/* see "recalcitrant" above */
.TOC2cols2 table,
.TOC2cols2 tbody,
.TOC2cols2 tr,
.TOC2cols3 table,
.TOC2cols3 tbody,
.TOC2cols3 tr,
.TOC2cols4 table,
.TOC2cols4 tbody,
.TOC2cols4 tr { display:block; padding:0; }

.NAVtable { margin:0.1em 0 0 2em; }
.NAVtable td { font-size:110%; font-weight:bold; padding:0; margin:0; }
.NAVtable a { padding:0 0.5em 0 0.5em; text-decoration:none; }

.IDXcols1 { width:80%; max-width:80%; }
.IDXcols2 { column-count:2; width:90%; max-width:90%; }
.IDXcols3 { column-count:3; width:95%; max-width:95%;  }
.IDXcols4 { column-count:4; width:100%; max-width:100%;  }
.IDXtable { margin:1em 0 1em 2em; white-space:nowrap; break-inside:auto; }
.IDXtable tr { vertical-align:top; text-align:left; break-inside:avoid; break-after:auto; }
.IDXtable .alpha { font-weight:bold; min-width:2em; }
.IDXtable .text  { width:100%; white-space:normal; }
.IDXtable .para:before { content:'\00b6\00a0'; }

/* see "recalcitrant" above */
.IDXcols2 table,
.IDXcols2 tbody,
.IDXcols2 tr,
.IDXcols3 table,
.IDXcols3 tbody,
.IDXcols3 tr,
.IDXcols4 table,
.IDXcols4 tbody,
.IDXcols4 tr { display:block; padding:0; }

.insight { background-color:cyan; font-family:monospace;
           padding:0 0.2em 0 0.2em; margin:0 0.2em 0 0.2em;
           font-size:100%; font-style:normal; font-weight:normal;
           text-decoration:none; }

.wasdoc { font-family: "Lucida Console", Monaco, monospace; 
          letter-spacing:-0.07em; }

@media screen { .blank::after { content:"\2924"; } 
                .print { display:none; }
}

@media print {
   table { page-break-inside:avoid; }
   .noprint { display:none; }
   .page { border:none; page-break-after: always; }
   .epage { display:none; }
   .ppage { page-break-after:always; }
   .NAVtable { display:none; }
   .NAVprint { display:block!important; }
}

@page { margin:2cm 1cm 2cm 1cm;  }
</style>
<!-- source:0000_SCRIPTING.WASDOC -->

<style type="text/css">._smiley::after { font-size:150%; vertical-align:middle; content:'\263a' }</style>
<style type="text/css">._frowny::after { font-size:150%; vertical-align:middle; content:'\2639' }</style>

<a id="0." href="#"></a>
<title>WASD Scripting Environment &ndash; Other Environments</title>
<a id="9." href="#"></a>
<a id="9.otherenvironments" href="#"></a>
<a id="otherenvironments" href="#"></a>
<h1 class="head chunk">WASD Scripting Environment</h1>
<h1 class="head"><span class="numb">9.</span><span class="text">Other Environments</span></h1>

<div class="TOC2cols2">
<table class="TOC2table">
<tr><td><a href="scripting009.html#9.1.java"><span class="numb">9.1</span><span class="text">Java</span></a>
<tr><td><a href="scripting009.html#9.1.1.cgiplusonly"><span class="numb">9.1.1</span><span class="text">CGIplus Only</span></a>
<tr><td><a href="scripting009.html#9.1.2.requirements"><span class="numb">9.1.2</span><span class="text">Requirements</span></a>
<tr><td><a href="scripting009.html#9.1.3.carriagecontrol"><span class="numb">9.1.3</span><span class="text">Carriage Control</span></a>
<tr><td><a href="scripting009.html#9.2.perl"><span class="numb">9.2</span><span class="text">Perl</span></a>
<tr><td><a href="scripting009.html#9.2.1.activatingperl"><span class="numb">9.2.1</span><span class="text">Activating Perl</span></a>
<tr><td><a href="scripting009.html#9.2.2.cgienvironment"><span class="numb">9.2.2</span><span class="text">CGI Environment</span></a>
<tr><td><a href="scripting009.html#9.2.3.postedrequests"><span class="numb">9.2.3</span><span class="text">POSTed Requests</span></a>
<tr><td><a href="scripting009.html#9.2.4.reducinglatency"><span class="numb">9.2.4</span><span class="text">Reducing Latency</span></a>
<tr><td><a href="scripting009.html#9.2.4.1.cgiplus"><span class="numb">9.2.4.1</span><span class="text">CGIplus</span></a>
<tr><td><a href="scripting009.html#9.2.4.2.runtimeenvironment"><span class="numb">9.2.4.2</span><span class="text">Run-Time Environment</span></a>
<tr><td><a href="scripting009.html#9.2.5.requirements"><span class="numb">9.2.5</span><span class="text">Requirements</span></a>
</table>
</div>

<table class="NAVtable NAVprint"><tr>
<td><a href="javascript:window.history.back();">&#8617;&#xFE0E;</a>
<td><a href="scripting008.html#8.">&#8598;&#xFE0E;</a>
<td><a href="scripting000.html#0.">&#8593;&#xFE0E;</a>
<td><a href="scripting010.html#10.">&#8600;&#xFE0E;</a>
<td><a href="javascript:window.history.forward();">&#8618;&#xFE0E;</a>
</table>

<p> WASD supports a number of scripting engines.

<ul class="list simple list0">
<li class="item"> Java
<li class="item"> Perl
<li class="item"> PHP
<li class="item"> Python
</ul>

<p> Earlier releases of the WASD package included some of these in the basic
package.  Due to the growing number, greater complexity of the environments,
and increasing version dependencies, these environments will be distributed
independently of the main WASD package.  Current releases may be found at the
main WASD download site

<p class="indent"> <a class="link blank monosp" target="_blank" href="https://wasd.vsm.com.au/wasd/">https://wasd.vsm.com.au/wasd/</a>

<p> Pages generated by scripting environments can optionally be cached by the
server.  For a certain class of script output this can offer reduced response
latency and system impact.  See <a class="link" href="scripting001.html#1.4.cachingscriptoutput">1.4 Caching Script Output</a>.

<a id="9.1" href="#"></a>
<a id="9.1.java" href="#"></a>
<a id="java" href="#"></a>
<h2 class="head"><span class="numb">9.1</span><span class="text">Java</span></h2>

<p> Java classes may be used to perform CGI/CGIplus scripting with WASD.  This
<span class="high bold">is not</span> Java Server Pages, Tomcat, or anything of the like.  The Java refered
to here is a small, self-contained Java environment that may used with WASD
&quot;out-of-the-box&quot;.  All you need is java installed on your VMS system.  These
may be designed as standard CGI scripts (with the inevitable latency of the
class loading) or as CGIplus scripts (with the attendant benefit of lower
latency).

<p> WASD provides a class to allow a relatively simple interface to the CGI
environment for both GET and POST method scripts. This and a collection of
demonstration scripts may be found in the
<a class="link blank monosp" target="_blank" href="/wasd_root/src/java/">WASD_ROOT:[SRC.JAVA]</a> directory.

<p> As the Java environment is constantly under development, both as a
platform-independent environment and on the VMS platform in particular, it is
possible that the latest VMS Java kit may not integrate well with the WASD Java
environment.  Of course every effort will be made to keep the WASD Java
environment current.

<a id="9.1.1" href="#"></a>
<a id="9.1.1.cgiplusonly" href="#"></a>
<a id="cgiplusonly" href="#"></a>
<h3 class="head"><span class="numb">9.1.1</span><span class="text">CGIplus Only</span></h3>

<p> Java CGI/CGIplus scripts must always be mapped and executed using the
CGIplus path, however some can behave as standard CGI scripts, exiting after
responding to the request, while others can persist, responding to multiple
requests (<a class="link" href="scripting003.html#3.cgiplus">3. CGIplus</a>). The CGIplus path is always necessary as Java does
not have direct access to a process' general environment, the traditional way
of passing CGI variables, so the WASD implementation uses the CGIplus data
stream to provide CGI information. 

<a id="9.1.2" href="#"></a>
<a id="9.1.2.requirements" href="#"></a>
<a id="requirements" href="#"></a>
<h3 class="head"><span class="numb">9.1.2</span><span class="text">Requirements</span></h3>

<p> Ensure the Java class file type is mapped to the Java run-time in the
WASD_CONFIG_GLOBAL configuration file.

<div class="blockof code">[DclScriptRunTime]
.CLASS  @CGI-BIN:[000000]JAVA.COM
</div>

<p> The following content types are configured, also in WASD_CONFIG_GLOBAL. 

<div class="blockof code">[AddType]
.CLASS  application/octet-stream  -  Java class
.JAVA  text/plain  -  Java source
.JAR  application/octet-stream  -  Java archive
.PROPERTIES  text/plain  -  Java properties
</div>

<p> Class files should be copied to the [CGI-BIN] directory (where all
architecture neutral script files should be located).

<a id="9.1.3" href="#"></a>
<a id="9.1.3.carriagecontrol" href="#"></a>
<a id="carriagecontrol" href="#"></a>
<h3 class="head"><span class="numb">9.1.3</span><span class="text">Carriage Control</span></h3>

<p> Getting carriage-control to make sense is often a challenge.
System.out.print() only expresses carriage-control embedded in the string.
System.out.println() the same but then issues an independent linefeed (the
newline of the <span class="high italic">ln</span>) which appears to WASD as an empty record. Choose your
poison (and antidote).  Using the &quot;Script-Control: X-stream-mode&quot;,
&quot;Script-Control: X-record-mode&quot; or &quot;Script-Control: X-record0-mode&quot; can assist
WASD interpreting the output.  See <a class="link" href="scripting002.html#2.cgi">2. CGI</a>.

<a id="9.2" href="#"></a>
<a id="9.2.perl" href="#"></a>
<a id="perl" href="#"></a>
<h2 class="head"><span class="numb">9.2</span><span class="text">Perl</span></h2>

<p> WASD supports Perl scripting in the CGI, CGIplus and RTE environments. 
Generally no source changes are required to use standard CGI Perl scripts!
Information in this section pertains specifically to VMS Perl 5.6 and
following.  Earlier versions may have some limitations. VMS Perl 5.6 is a
relatively complete Perl implementation and standard distributions contain
some VMS-specific functionality.  In particular the VMS::DCLsym and VMS::Stdio
can make life simpler for the VMS perl developer.

<p> Users of VMS Perl are directed to &quot;Perl on VMS&quot; at
<a class="link blank monosp" target="_blank" href="http://www.sidhe.org/vmsperl/">http://www.sidhe.org/vmsperl/</a>
providing access to the latest release of Perl for VMS.

<div class="note">
<a id="9.2.0.0.1" href="#"></a>
<a id="9.2.pleasenote" href="#"></a>
<a id="pleasenote" href="#"></a>
<h5 class="head center"><span class="text">Please Note</span></h5>
<hr class="note_hr">
The author is very much the Perl novice and this chapter  probably reflects
that.  Additional material and improved code always gratefully received.
<hr class="note_hr">
</div>

<a id="9.2.1" href="#"></a>
<a id="9.2.1.activatingperl" href="#"></a>
<a id="activatingperl" href="#"></a>
<h3 class="head"><span class="numb">9.2.1</span><span class="text">Activating Perl</span></h3>

<p> There are a number of ways to activate a Perl script under VMS.  Any of
these may be used with the WASD server.  If the script file is accessible via
the <span class="high italic">exec</span> or <span class="high italic">script</span> rules of the WASD_CONFIG_MAP configuration
file it can be activated by the server.  The simplest example is to place the
scripts somewhere in the CGI-BIN:[000000] path and execute via /cgi-bin/,
although in common with other scripts it may be located anywhere a rule
provides a path to access it (<a class="link" href="scripting001.html#1.6.scriptmapping">1.6 Script Mapping</a>).

<a id="9.2.1.0.1" href="#"></a>
<a id="9.2.1.directly" href="#"></a>
<a id="directly" href="#"></a>
<h5 class="head"><span class="text">Directly</span></h5>

<p> When Perl is available from the command-line, either as a DCLTABLES defined
verb, a DCL&dollar;PATH available verb, or as a <span class="high italic">foreign</span> verb.  The script (the file
containg the Perl source) is provided to the Perl interpreter as a parameter to
the Perl verb.

<div class="blockof code">&dollar; PERL <span class="high italic">perl-script-file-name</span>
</div>

<a id="9.2.1.0.2" href="#"></a>
<a id="9.2.1.dclprocedurewrapped" href="#"></a>
<a id="dclprocedurewrapped" href="#"></a>
<h5 class="head"><span class="text">DCL Procedure Wrapped</span></h5>

<p> If DCL pre-processing, or some other specific environment needs to be set
up, the activation of the Perl script can be placed inside a DCL <span class="high italic">wrapper</span>
procedure.  This is often used to allow the transparent activation of Perl
scripts via the DCL&dollar;PATH mechanism.

<div class="blockof code">&dollar; PERL = &quot;&dollar;PERL_ROOT:[000000]PERL.EXE&quot;
&dollar; DEFINE /USER PERL_ENV_TABLES CLISYM_GLOBAL,LNM&dollar;PROCESS
&dollar; PERL <span class="high italic">perl-script-file-name</span>
</div>

<a id="9.2.1.0.3" href="#"></a>
<a id="9.2.1.dclprocedureembedded" href="#"></a>
<a id="dclprocedureembedded" href="#"></a>
<h5 class="head"><span class="text">DCL Procedure Embedded</span></h5>

<p> The Perl source is embedded as in-line data within a DCL procedure.

<div class="blockof code">&dollar; DEFINE /USER PERL_ENV_TABLES CLISYM_GLOBAL,LNM&dollar;PROCESS
&dollar; PERL
&dollar; DECK /DOLLARS=&quot;__END__&quot;
# start of Perl script
print &quot;Hello \&quot;&dollar;ENV{'WWW_REMOTE_HOST'}\&quot;\n&quot;;
__END__
</div>

<a id="9.2.2" href="#"></a>
<a id="9.2.2.cgienvironment" href="#"></a>
<a id="cgienvironment" href="#"></a>
<h3 class="head"><span class="numb">9.2.2</span><span class="text">CGI Environment</span></h3>

<p> Due to changes in environment handling sometime between versions 5.0 and
5.6 it was impossible to access DCL symbols via the %ENV hash, making CGI-based
scripts impossible to use under VMS Web servers without modification.  Version
5.6 addresses this issue by providing a versatile mechanism for controlling
where the environment variables are manipulated.  The logical name
PERL_ENV_TABLES specifies this location, or if defined as a search list, the
locations.

<table class="tabl">
<tr class="tabr under">
<th class="tabh">Name
<th class="tabh">Location
<tr class="tabr">
<tr class="tabr">
<td class="tabd">CRTL_ENV
<td class="tabd">C run-time environment array (i.e. getenv())
<tr class="tabr">
<td class="tabd">CLISYM_LOCAL
<td class="tabd">get DCL symbols, set local
<tr class="tabr">
<td class="tabd">CLISYM_GLOBAL
<td class="tabd">get DCL symbols, set global
<tr class="tabr">
<td class="tabd"><span class="high italic">logical name table</span>
<td class="tabd">any logical name table, including LNM&dollar;FILE_DEV
</table>

<p> For WASD Perl scripting it is recommended that this be defined as
CLISYM_GLOBAL,LNM&dollar;PROCESS.  The CLISYM_GLOBAL allows access to the CGI variable
environment, and LNM&dollar;PROCESS to significant logical name definitions for the
subprocess (e.g. HTTP&dollar;INPUT and callout sequences).  This can be done on a
system-wide basis (i.e. for all Perl scripting) using

<div class="blockof code">&dollar; DEFINE /SYSTEM PERL_ENV_TABLES CLISYM_GLOBAL,LNM&dollar;PROCESS
</div>

during system startup, or by defining a user-mode logical in a DCL procedure
<span class="high italic">wrapper</span> immediately before activating the Perl interpreter (as show in the
examples in this section).

<div class="note">
<a id="9.2.2.0.1" href="#"></a>
<a id="9.2.2.neversubstitute" href="#"></a>
<a id="neversubstitute" href="#"></a>
<h5 class="head center"><span class="text">NEVER substitute...</span></h5>
<hr class="note_hr"> ...the content of CGI variables directly into the code
stream using interpreters that will allows this (e.g. DCL, Perl).  You run a
very real risk of having unintended content maliciously change the intended
function of the code. Always pre-process the content of the variable first,
ensuring there has been nothing inserted that could subvert the intended
purpose. There are a number of security-related Perl scripting issues.  It is
suggested the reader consult one of the many Perl-CGI documents/books
available.
<hr class="note_hr">
</div>

<a id="9.2.3" href="#"></a>
<a id="9.2.3.postedrequests" href="#"></a>
<a id="postedrequests" href="#"></a>
<h3 class="head"><span class="numb">9.2.3</span><span class="text">POSTed Requests</span></h3>

<p> Requests using the POST method contain all the content in the body of the
request.  In particular, requests generated via HTML &lt;form&gt; contructs do not
deliver the form data via the request query string, it is provided in a
URL-form-encoded body.  This requires some explicit processing to recover the
form elements.  A number of Perl CGI modules exist to ease this chore,
including the most popular CGI.pm.  All of these should work in the VMS
environment, and of course then with WASD.

<p> For POSTed requests it is necessary for the script to have access to the
request body.  In Unix environments this is available via the &lt;stdin&gt; stream,
and under Perl via STDIN, &lt;&gt;, etc.  This equates to SYS&dollar;INPUT under VMS.

<p> With WASD, when activating the .PL script file directly via a
[DclScriptRunTime] entry (i.e. without a DCL procedure wrapper) STDIN is
directly available without further issues.

<p> If the script has a DCL wrapper procedure the DCL CLI has control of the
SYS&dollar;INPUT stream and it becomes  necessary to temporarily redirect this for the
duration of the script.  WASD provides the HTTP&dollar;INPUT process-level logical
name to identify the script body stream (along with WWW_IN and APACHE&dollar;INPUT
names for easing script portability).  The redirection is simply done, as shown
in the following example.

<div class="blockof code">&dollar; DEFINE /USER PERL_ENV_TABLES CLISYM_GLOBAL,LNM&dollar;PROCESS
&dollar; DEFINE /USER SYS&dollar;INPUT HTTP&dollar;INPUT
&dollar; PERL <span class="high italic">perl-script-file-name</span>
</div>

<p> If the script is embedded in a DCL procedure the DCL CLI is using SYS&dollar;INPUT
to provide the script source to the Perl interpreter and so is completely
unavailable for use.  The request body is still available to the script however
but must be explicitly read from HTTP&dollar;INPUT.  This example provides the basics.

<div class="blockof code">&dollar; DEFINE /USER PERL_ENV_TABLES CLISYM_GLOBAL,LNM&dollar;PROCESS
&dollar; PERL
&dollar; DECK /DOLLARS=&quot;__END__&quot;
# start of Perl script
print &quot;HTTP method is \&quot;&dollar;ENV{'WWW_REQUEST_METHOD'}\&quot;\n&quot;;
# read POSTed body stream
open (HTTPIN, &dollar;ENV{&quot;HTTP\&dollar;INPUT&quot;})
   or die &quot;Could not open &dollar;ENV{'HTTP\&dollar;INPUT'}\n&quot;;
while (&lt;HTTPIN&gt;)
{
  chop;  # remove trailing newline
  print &quot;&lt;HTTPIN&gt; &verbar;&dollar;_&verbar;\n&quot;;
}
__END__
</div>

<a id="9.2.4" href="#"></a>
<a id="9.2.4.reducinglatency" href="#"></a>
<a id="reducinglatency" href="#"></a>
<h3 class="head"><span class="numb">9.2.4</span><span class="text">Reducing Latency</span></h3>

<p> Perl is an interpreter, meaning scripts are provided and activated as source
form, the interpreter processing the program &quot;on-the-fly&quot;. Perl actually
translates the entire script into an intermediate form before beginning
execution.  This has the advantage of discovering and reporting syntax errors
before beginning any actual processing, and also improves the final run-time
performance.

<p> While having Perl an interpreter eases development and portability it does
incur a performance penalty, particularly in activation latency, due to both
interpreter image activation, and script  and associated Perl module
preprocessing.  With standard CGI, where each request processed is handled as
an autonomous activation, this becomes quite noticable and can have significant
system impact.

<p> WASD provides two solutions for this and other persistent scripting issues. 
Both of these require the supplementary Perl package available from the WASD
download page.  Both are briefly described below.

<a id="9.2.4.1" href="#"></a>
<a id="9.2.4.1.cgiplus" href="#"></a>
<a id="cgiplus" href="#"></a>
<h4 class="head"><span class="numb">9.2.4.1</span><span class="text">CGIplus</span></h4>

<p> CGIplus substantially eliminates the overhead associated with CGI processing
by allowing the subprocess and any associated image/application to continue
executing between uses (<a class="link" href="scripting003.html#3.cgiplus">3. CGIplus</a>).  The good news is, CGIplus is
relatively simple to support, even using Perl.  The great news is, <span class="high bold">CGIplus
can reduce latency and improve performance by some twenty-fold!!</span>

<p> With CGIplus the Perl script remains active for the life of the subprocess. 
That is it persists!  Read the general philosphy and implementation details in
the above reference.  Note that it is still substantially CGI!  The notable
differences are two.  CGI variables are obtained by reading a stream, not using
the %ENV hash.  The end-of-script is indicated by writing a special byte
sequence (detected and used by the server).  Of course the request body is
still available via the usual stream.

<p> Using the basic principles described in the CGIplus Chapter a Perl CGIplus
script would be relatively simple to build from scratch.  To assist in
deploying CGIplus Perl scripting a CGIplus.pm Perl module has been provided as
part of the supplementary package. 

<a id="9.2.4.2" href="#"></a>
<a id="9.2.4.2.runtimeenvironment" href="#"></a>
<a id="runtimeenvironment" href="#"></a>
<h4 class="head"><span class="numb">9.2.4.2</span><span class="text">Run-Time Environment</span></h4>

<p> A Run-Time Environment (RTE) is almost identical to CGIplus.  It allows an
environment to persist between requests, substantially improving response
latency and reducing system impact (<a class="link" href="scripting004.html#4.runtimeenvironments">4. Run-Time Environments</a>). There is a
significant difference between  RTE and CGIplus scripts.  With CGIplus the
script itself persists between uses, retaining all of its state.  With an RTE
the script does not persist or retain state, only the RTE itself.

<p> The WASD RTE Perl interpreter contains an embedded Perl engine and an
associated Perl module that allows multiple scripts to be activated,
preprocessed once and remain loaded <span class="high italic">read-to-run</span>.  This eliminates the
overhead associated with activating the interpreter and Perl script with each
request.  This mechanism parallels the Apache <span class="high italic">perl_mod</span> module and works on
substantially unmodified CGI scripts.  <span class="high bold">The test-bench indicates an
improvement of some twenty-five fold!</span>

<a id="9.2.5" href="#"></a>
<a id="9.2.5.requirements" href="#"></a>
<a id="requirements" href="#"></a>
<h3 class="head"><span class="numb">9.2.5</span><span class="text">Requirements</span></h3>

<p> These are the configuration requirements for using the basic CGI Perl.

<ul class="list">

<li class="item"> WASD_CONFIG_GLOBAL configuration file.

<div class="blockof code">[DclScriptRunTime]
.PL PERL
.CGI PERL
</div>

<li class="item"> The following content types are configured, also in WASD_CONFIG_GLOBAL. 

<div class="blockof code">[AddType]
.PL  text/plain  -  Perl source
.POD  text/plain  -  Perl documentation
.CGI  text/plain  -  Perl source
</div>

</ul>
<!-- source:1000_REDACT.WASDOC -->

<table class="NAVtable NAVprint"><tr>
<td><a href="javascript:window.history.back();">&#8617;&#xFE0E;</a>
<td><a href="scripting008.html#8.">&#8598;&#xFE0E;</a>
<td><a href="scripting000.html#0.">&#8593;&#xFE0E;</a>
<td><a href="scripting010.html#10.">&#8600;&#xFE0E;</a>
<td><a href="javascript:window.history.forward();">&#8618;&#xFE0E;</a>
</table>