[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]
<!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; CGI Callouts</title>
<a id="6." href="#"></a>
<a id="6.cgicallouts" href="#"></a>
<a id="cgicallouts" href="#"></a>
<h1 class="head chunk">WASD Scripting Environment</h1>
<h1 class="head"><span class="numb">6.</span><span class="text">CGI Callouts</span></h1>

<table class="TOC2table">
<tr><td><a href="scripting006.html#6.1.requestsandresponses"><span class="numb">6.1</span><span class="text">Requests and Responses</span></a>
<tr><td><a href="scripting006.html#6.2.codeexamples"><span class="numb">6.2</span><span class="text">Code Examples</span></a>
</table>
</div>

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

<p> During CGI or CGIplus processing (though not DECnet-based CGI) it is
possible to suspend  normal script  output to the client and for the script to
interact directly with the server, then resume output to the client.  This may
done more than once during processing.  During the <span class="high italic">callout</span> the script makes
a request of the server and receives a response.  These requests are to perform
some server function, such as the mapping of a path to a file specification, on
behalf of the script.  Naturally, this makes the script no longer portable, but
may be extrememly useful in some circumstances.

<p> It is this general callout mechanism that allows specific authentication agents
(<a class="link blank" target="_blank" href="../features/#authenticationandauthorization">Authentication and Authorization</a> in <a class="link blank" target="_blank" href="../features/#0.">WASD Features</a>)
to be  implemented as standard CGIplus scripts.

<p> The mechanism is quite simple.

<ol class="list">

<li class="item"> The script suspends normal output by writing a record containing a
unique <span class="high italic">escape</span> sequence.

<li class="item"> It then writes a record containing a formatted request.  The server
interprets the request, performs the action and returns a success or error
response.

<li class="item"> The script concludes the callout by writing a record containing a
unique <span class="high italic">end-of-text</span> sequence.

<li class="item"> The script reads the server's response and continues processing.  In
reality the response read could occur immediately after the request write (i.e.
before the concluding end-of-text sequence).

</ol>

<p> This is a basic callout.  Between the callout escape and end-of-text
sequences multiple request/responses transactions may be undertaken.

<a id="6.1" href="#"></a>
<a id="6.1.requestsandresponses" href="#"></a>
<a id="requestsandresponses" href="#"></a>
<h2 class="head"><span class="numb">6.1</span><span class="text">Requests and Responses</span></h2>

<p> The request record is plain text, comprising a request key-word
(case-insensitive), full-colon, and following optional white-space and
parameter(s).  It is designed not to be implementation language specific.

<p> The response record is also plain-text.  It begins with a three-digit
response code, with similar meanings and used for the same purpose as HTTP
response codes.  That is 200 is a success status, 500 a server error, 400 a
request error, etc.  Following the response code is white-space and the plain
text result or error message.  A response to any given callout request may be
suppressed by providing a request record with a leading <span class="high monosp">!</span> (exclamation
point) or <span class="high monosp">#</span> (hash symbol).

<ul class="list">

<li class="item"> <span class="high bold">AGENT-BEGIN:</span> <span class="high italic">&lt;string&gt;</span>

<p> WASD v12.0 and later agents require the agent to declare its role and
typically provide some information about itself.  An example callout is shown
below. 

<div class="blockof code">CgiLibCgiPlusCallout (&quot;!AGENT-BEGIN: %s (%s) usage:%d&quot;,
                      SoftwareId, CgiLibEnvironmentVersion(),
                      CgiPlusUsageCount);
</div>

<li class="item"> <span class="high bold">AGENT-END:</span> <span class="high italic">&lt;string&gt;</span>

<p> WASD v12.0 and later agents are required to declare process concluded, and
optionally to return any results to the calling code.

<div class="blockof code">CgiLibCgiPlusCallout (&quot;!AGENT-END:&quot;);
</div>

<div class="blockof code">CgiLibCgiPlusCallout (&quot;!AGENT-END: 418 %s&quot;, cptr);
</div>

<li class="item"> <span class="high bold">AUTH-FILE:</span> <span class="high italic">&lt;file specification&gt;</span>

<p> If the specialized /PROFILE capability is enabled 
(<a class="link blank" target="_blank" href="../features/#sysuafsecurityprofile">SYSUAF Security Profile</a> in <a class="link blank" target="_blank" href="../features/#0.">WASD Features</a>)
this can determine whether the specified file name is allowed access by the
request's username.

<li class="item"> <span class="high bold">BUFFER-BEGIN:</span> <span class="high italic">&lt;integer&gt;[k&verbar;M]</span>

<p> Create a temporary global section to act as a memory buffer shared between a
script process and the server.  The default is <span class="high bold">M</span>egabytes.  See
<a class="link" href="scripting002.html#2.2.3.bulkcontentoutput">2.2.3 Bulk Content Output</a> for a description of the purpose and use of all the
BUFFER-.. callouts.

<li class="item"> <span class="high bold">BUFFER-END:</span>

<p> Dispose of the shared memory buffer created by callout BUFFER-BEGIN.

<li class="item"> <span class="high bold">BUFFER-WRITE:</span> <span class="high italic">&lt;integer&gt;</span>

<p> Instruct the server to write &lt;integer&gt; bytes from the shared
memory buffer to the client.

<li class="item"> <span class="high bold">CGI:</span> <span class="high italic">string</span>

<p> Specialised callout allowing an access agent, lookup agent or meta agent to
insert, modify or delete a CGI variable for a request.  These agents are
currently only <span class="high bold">proof-of-concept</span>.  See sources in

<p class="indent"> <a class="link blank monosp" target="_blank" href="/wasd_root/src/agent/*.*">WASD_ROOT:[SRC.AGENT]</a>

<li class="item"> <span class="high bold">CGIPLUS:</span> <span class="high italic">string</span>

<p> This callout is used to indicate to the server that a CGIplus script can
process the CGI variables in &quot;struct&quot; mode.  By default each CGI variable is
transfered to a CGIplus script one &quot;record&quot; at a time.  In &quot;struct&quot; mode all
variables are transfered in a single, binary I/O which must the be parsed by
the the script.  It is of course a much more efficient method for CGIplus
(<a class="link" href="scripting003.html#3.1.structmodecgiplus">&lsquo;Struct-Mode CGIplus&rsquo; in 3.1 CGIplus Programming</a>).

<li class="item"> <span class="high bold">CSP:</span> <span class="high italic">&lt;string&gt;</span> <br>
<span class="high bold">CSPRO:</span> <span class="high italic">&lt;string&gt;</span> 

<p> Provide Content Security Policy (CSP) configuration(s) from a script.

<p> See <a class="link blank" target="_blank" href="../config/#contentsecuritypolicycsp">Content Security Policy (CSP)</a> in <a class="link blank" target="_blank" href="../config/#0.">WASD Configuration</a>.

<li class="item"> <span class="high bold">DICT:</span> <span class="high italic">string</span>

<p> Specialised callout allowing an access agent, lookup agent or meta agent to
insert, modify or delete a dictionary entry.  These agents are currently only
<span class="high bold">proof-of-concept</span>.  See sources in

<p class="indent"> <a class="link blank monosp" target="_blank" href="/wasd_root/src/agent/*.*">WASD_ROOT:[SRC.AGENT]</a>

<li class="item"> <span class="high bold">GATEWAY-BEGIN:</span> <span class="high italic">&lt;integer&gt;</span>

<p> When using the raw TCP/IP socket for output (<a class="link" href="scripting011.html#11.rawtcpipsocket">11. Raw TCP/IP Socket</a>)
this callout is used to notify the server that  the script will be using the
gateway device and the HTTP status code (e.g. 200, 302, 404, etc.)

<li class="item"> <span class="high bold">GATEWAY-CCL:</span> <span class="high italic">&lt;integer&gt;</span>

<p> When using the raw TCP/IP socket for output (<a class="link" href="scripting011.html#11.rawtcpipsocket">11. Raw TCP/IP Socket</a>)
this can be used to change the BG: device carriage-control.  A value of 1
enables a &lt;CR&gt;&lt;LF&gt; with each record (the default), while 0 disables
it.  This is analagous to the APACHE&dollar;SET_CCL utility.

<li class="item"> <span class="high bold">GATEWAY-END:</span> <span class="high italic">&lt;integer&gt;</span>

<p> When using the raw TCP/IP socket for output (<a class="link" href="scripting011.html#11.rawtcpipsocket">11. Raw TCP/IP Socket</a>)
this callout is used to notify the server of  the quantity of data transfered
directly to the client by the script.

<li class="item"> <span class="high bold">LIFETIME:</span> <span class="high italic">&lt;integer&gt;</span>

<p> Sets/resets a scripting process' lifetime which may be expressed as an
integer number of minutes or in the format <span class="high italic">hh:mm:ss</span>.  For instance, use to
give frequently used  CGIplus scripts an extended lifetime before being rundown
by the server (override the [DclCgiPlusLifeTime] configuration parameter). 
Specifying &quot;none&quot; (or -1) gives it an <span class="high italic">infinite</span> lifetime, zero resets to
default.

<li class="item"> <span class="high bold">MAP-FILE:</span> <span class="high italic">&lt;file specification&gt;</span>

<p> Map the supplied file specification to its URL-style path equivalent, and
against the server's mapping rule.  This does not check the file name is legal
RMS syntax.

<li class="item"> <span class="high bold">MAP-PATH:</span> <span class="high italic">&lt;URL-style path&gt;</span>

<p> Map the supplied URL-style path against the server's rule database into a
VMS file specification.  Note that this does not verify the file name legaility
or that the file actually exists.

<li class="item"> <span class="high bold">NOOP:</span>

<p> No operation.  Just return a success response.

<li class="item"> <span class="high bold">NOTICED:</span> <span class="high italic">&lt;string&gt;</span>

<p> Place the supplied string into the server process log.  Used to report
incidental processing or other errors.

<li class="item"> <span class="high bold">OPCOM:</span> <span class="high italic">&lt;string&gt;</span>

<p> Send the supplied string to OPCOM.

<li class="item"> <span class="high bold">REDACT:</span>

<p> See <a class="link" href="scripting010.html#10.requestredaction">10. Request Redaction</a>.

<li class="item"> <span class="high bold">REDACT-SIZE:</span>

<p> See <a class="link" href="scripting010.html#10.requestredaction">10. Request Redaction</a>.

<li class="item"> <span class="high bold">SCRIPT-CONTROL:</span>

<p> Equivalent to the script issuing a &quot;Script-Control:&quot; response header field
(although of course some script control directives will not apply after header
generation).

<li class="item"> <span class="high bold">TIMEOUT-BIT-BUCKET:</span> <span class="high italic">&lt;integer&gt;</span>

<p> Specifies the period for which a script continues to execute if the client
disconnects.  Overrides the WASD_CONFIG_GLOBAL [DclBitBucketTimeout] confiuration
directive.

<li class="item"> <span class="high bold">TIMEOUT-OUTPUT:</span> <span class="high italic">&lt;integer&gt;</span>

<p> Sets/resets a script request lifetime (in minutes, overrides the
[TimeoutOutput] configuration parameter).  Specifying &quot;none&quot; (or -1) gives it
an <span class="high italic">infinite</span> lifetime, zero resets to default.

<li class="item"> <span class="high bold">TIMEOUT-NOPROGRESS:</span> <span class="high italic">&lt;integer&gt;</span>

<p> Sets/resets a script request no-progress (in minutes, overrides the
[TimeoutNoProgress] configuration parameter).  The <span class="high italic">no-progress</span> period is the
maximum number of seconds that there may be no output from the script before it
is aborted.  Specifying &quot;none&quot; (or -1) gives it an <span class="high italic">infinite</span> lifetime, zero
resets to default.

</ul>

<a id="6.2" href="#"></a>
<a id="6.2.codeexamples" href="#"></a>
<a id="codeexamples" href="#"></a>
<h2 class="head"><span class="numb">6.2</span><span class="text">Code Examples</span></h2>

<p> The record-oriented callout sequences and request/response makes
implementation quite straight-forward.  The following C language and DCL
procedure code fragments illustrate the basics.

<div class="blockof code">/* C language */
CgiPlusIn = fopen (&quot;CGIPLUSIN:&quot;, &quot;r&quot;);
printf (&quot;%s\nMAP-FILE: %s\n%s\n&quot;,
        getenv(&quot;CGIPLUSESC&quot;), FileNamePtr, getenv(&quot;CGIPLUSEOT&quot;));
fgets (CalloutResponse, sizeof(CalloutResponse), CgiPlusIn);

&dollar;! DCL procedure
&dollar; open /read CgiPlusIn CGIPLUSIN
&dollar; write sys&dollar;output f&dollar;trnlnm(&quot;CGIPLUSESC&quot;)
&dollar; write sys&dollar;output &quot;MAP-PATH: &quot; + PathPtr
&dollar; read CgiPlusIn Response
&dollar;!(no need to read a response for this next request, it's suppressed)
&dollar; write sys&dollar;output &quot;#TIMEOUT-OUTPUT:10&quot;
&dollar; write sys&dollar;output f&dollar;trnlnm(&quot;CGIPLUSEOT&quot;)
</div>

<p> Also see working examples in
<a class="link blank monosp" target="_blank" href="/wasd_root/src/CGIplus/*callout*.*">WASD_ROOT:[SRC.CGIPLUS]</a>
<!-- source:0700_ISAPI.WASDOC -->

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