Sponsored Content
Full Discussion: Perl CGI
Operating Systems OS X (Apple) Perl CGI Post 302825489 by DGPickett on Monday 24th of June 2013 01:05:55 PM
Old 06-24-2013
What is a tag? You cgi-bin should contain only executables that process CGI. Often, a parallel directory holds images, maybe a parallel directory for non-html documents and the parent holds html. If the world gets crowded, subtrees to support categories can be added.

I wrote a pair of scripts as a shell tutorial of CGI:
Code:
$ pg mysrc/show_env mysrc/show_env_form|cat
::::::::::::::
mysrc/show_env
::::::::::::::
#!/bin/sh
echo 'HTTP/1.0 200 OK
Content-type: text/plain\r
\r
Environment of CGI:
'
set|cat -vt
if [ "$REQUEST_METHOD" = "POST" ]
then
 echo "
For POST, the first line of stdin:
"
 line|cat -vt
 echo
fi

::::::::::::::
mysrc/show_env_form
::::::::::::::
#!/bin/bash
# All scripts should begin with this interpreter file line one for exec()!
# They must have executable file permission, or exec() pipes them to sh!
# The #! line can have one arg, useful for things like sed, which needs a '-f'.
# The real, final line executed is:
#  /usr/bin/ksh <any_#!_line_arg> <script_file_name> <any_orig_cmd_line_args>
# Comments are our friends, as we, at least, are suppose to remember what we did
#  and fix it quickly when it breaks!
# Use of the ksh in Solaris allows access to the <() construct,
#  which allows the service to spin off several simultaneous child scripts
#  but collect their output from pipes sequentially.
# Of course, the child script may stall if it writes the pipe too soon,
#  but most UNIX appliations write their FILE * stdout
#  without prematurely flushing its large default buffer.
cat <(
# Begin first <() child script!
# echo out initial boilerplate (not varying) text
#  in single quotes for least shell expansion and to pass double quotes.
# CGI starts in the second line of http header out, so you can add http bits
#  like content type, length, encoding, cookies, language, etc.
# The blank line terminates the http and starts the content.
# The carriage returns are important to some browsers at the http level.
# Once you get to the content, it is all just white space.
# UNIX likes just a line feed, Apple likes just the carriage return, and
#  WinDOS likes both, just like the teletype, where one moved the paper feed
#  and the other the print head carriage, and
#  the carriage return is first because it was usually the larger, slower motion.
# HTML mostly ignores and hides white space, so make it easily readable.
# Sentences can be put on separate source lines for easy version control.
# A little indentation makes the tag control areas more obvious, and
#  will not slow things down appreciably.
# The title should be a full or abbreviated version of the first heading.
# The title is used to bookmark, so make it terse and globally relevant,
#  e.g., not "Home Page" but "David G. Pickett - Home Page".
# ISINDEX is a simple (crude) way to add form-like capability. This element
#  is deprecated under the strict HTML 4 specification and should not be used.
# Use of values that do not have embedded symbols and blanks
#  means no double-quoting of values is necessary
#  and no URLdecode is needed to get original values back.
echo 'HTTP/1.0 200 OK
Content-type: text/html
Expires: Tue, 20 Aug 1996 14:25:27 GMT
<HTML>
 <HEAD>
  <TITLE>Forms That Call show_env</TITLE>
  <META http-equiv="Expires" content="Tue, 20 Aug 1996 14:25:27 GMT">
  <ISINDEX PROMPT="ISINDEX PROMPT" HREF=show_env>
 </HEAD>
 <BODY>
  <H1>Forms That Call show_env to show how simple HTML and CGI work!</H1>
  <HR>
  <H2>Get (default action) form</H2>
  <FORM ACTION=show_env>
   <INPUT TYPE=HIDDEN NAME=name1 VALUE=value1>
   Name: <input type=text size=10 maxlength=40 name=nm value="Your Name"><br>
   Password: <input type="password" name="pw" value=1234><Br>
   <INPUT TYPE=checkbox checked NAME=name2 VALUE=value2a> value2a<BR>
   <INPUT TYPE=checkbox checked NAME=name2 VALUE=value2b> value2b<BR>
   <INPUT TYPE=checkbox checked NAME=name2 VALUE="value2c&name2_1=value_2c_1"> value2c&amp;name2_1=value_2c_1<BR>
   <input type="radio" name="shade" value="dark">Dark<BR>
   <input type="radio" name="shade" value="light" checked>Light<br>
   <select multiple name=music size=4>
    <option value="emo" selected>Emo</option>
    <option value="metal/rock" >Metal/Rock</option>
    <option value="hiphop" >Hip Hop</option>
    <option value="ska" >Ska</option>
    <option value="jazz" >Jazz</option>
    <option value="country" >Country</option>
    <option value="classical" >Classical</option>
    <option value="alternative" >Alternative</option>
    <option value="oldies" >Oldies</option>
    <option value="techno" >Techno</option>
   </select><br>
   <textarea rows=5 cols=20 name=cmts>
    Enter Comments Here
   </textarea><br>
   <INPUT TYPE=RESET> 
   <INPUT TYPE=SUBMIT NAME=name3a VALUE=Value3a>
   <INPUT TYPE=SUBMIT NAME=name3b VALUE=Value3b>
  </FORM>
  <HR>
  <H2>Get Hypertext ?name=value</H2>
  <A HREF="show_env?name4=value4&name5=value5">Click me!</A>
  <HR>
  <H2>Get Hypertext ?value</H2>
  <A HREF="show_env?value6">Click me!</A>
  <HR>
  <H2>POST Form</H2>
  <FORM ACTION=show_env METHOD=POST>
   <INPUT TYPE=HIDDEN NAME=name7 VALUE=value7>
   <INPUT TYPE=HIDDEN NAME=name8 VALUE=value8>
   <INPUT TYPE=checkbox checked NAME=name2 VALUE="value2c&name2_1=value_2c_1"> value2c&amp;name2_1=value_2c_1<BR>
   <INPUT TYPE=SUBMIT NAME=name9 VALUE=Value9>
  </FORM>
  <HR>
  GET is assumed to be a simple inquiry, and can be repeated gratuitously to keep the cache or history fresh without user permission.
  Use of an Expires: with a near or past value on an http line (or in a corrsponding http-equiv meta statement in the HEAD) can help force such refreshes.
  Both are illustrated above.<P>
  For POST, the browser assumes the submit changes the real world, and resists gratuitous additional posting of the request.
  However, sometimes POST is used to not show the values in the URL, for reasons of size, appearance, and some small security.<P>
  POST variables in the default URL-encode mode are presented on standard input, which is the http socket, not the URI which CGI puts into the environment.
  Popular browsers present them on a line that always has a carriage return and line feed (preceded by a carriage return), but a few do not, they expect you to read the Content-length bytes and stop, so they are not friendly to the shell and other line oriented tools.<P>
  POST in MIME multipart encoding allows you to have forms that upload file contents along with variables and the orignal file name, which may be a relative or absolute path.<P>
  POST allows you to have forms that email the variables using a mailto: action URL.
  While this is very minimalist (no http/web server required), it does not allow the user'"'"'s view of the page to change after submit, in confirmation of the submit, which is not user friendly.
  The submitting email activity either occurs quickly and entirely in the background, encourging duplicate submission, or triggers an email dialog that the user must complete correctly for the submission to occur, which is less robust and more effort.
  <HR>
  <H2>This Service</H2>
  <PRE>
'
# end first child script
) <(
# begin second child script (overkill as an example)
# To illustrate <PRE>, this service will present itself as readable text. 
# Use of <PRE> allows plain, fixed pitch fonts, does no folding,
#  and turns off space and linefeed presentation as a single space,
#  but still allows HTML tags, e.g., below, the comments are made bold.
# However, you have to make 4 critical metacharacters into metastrings.
sed '
        s/\&/\&amp;/g
        s/"/\&quot;/g
        s/</\&lt;/g
        s/>/\&gt;/g
        s/^#.*/<B>&<\/B>/
 ' $(whence $0)
# end second child script
) <(
# begin third child script
# Show CGI Environmental variables
echo '<HR>
<H2>Current CGI Environmental variables</H2>'
sh -c set|cat -vt|sed '
        s/\&/\&amp;/g
        s/"/\&quot;/g
        s/</\&lt;/g
        s/>/\&gt;/g
 '
echo '
   <HR>
   <H2>Show what this service sends out (Beware recursion confusion!)</H2>
'
if [ "$zOnce" = "" ]
then
 export zOnce=NO_RECURSION
# Except, of course, this, to avoid recursion
$0|cat -vt|sed '
        s/\&/\&amp;/g
        s/"/\&quot;/g
        s/</\&lt;/g
        s/>/\&gt;/g
 '
fi
# echo out final boilerplate like we did for starting boilerplate.
echo '
   <HR>
  </PRE>
 </BODY>
</HTML>
'
# end final child script
)

 

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Perl CGI.pm

my box is FreeBSD4.3 and I use Perl 5.0005_03. Here is the CGI script. test.cgi ...... if ($query->action eq 'detail') { ...... print $query->hidden('action', 'modify'); ...... } I found that the result of test.cgi?action=detail is not what I expected. the script does not... (4 Replies)
Discussion started by: tonyt
4 Replies

2. Shell Programming and Scripting

Learning CGI using Perl

hi everyone, i am learning CGI using Perl, but i am having problem to compile and run the scripts. the thing is that, when i want to compile my scripts i have to get connected to the internet and have to upload the scripts to a server and then only i can compile and run my scripts. so, can... (2 Replies)
Discussion started by: shifan
2 Replies

3. Shell Programming and Scripting

checkbox_group => CGI, Perl

Hi, In my cgi script(written in Perl using cgi.pm) i have a checkbox and i want all the items to be checked. Here is what i use: checkbox_group(-name=>'studenten_in_groep', -values=>\@member_keys, -defaults=>\@member_keys, -labels=>\%temp_members, -columns=>2), But no boxes are checked...... (18 Replies)
Discussion started by: tine
18 Replies

4. Shell Programming and Scripting

Perl CGI Query

Hi All, This is quite a high level question so I appologise as if it sounds a bit woolly! I'm running a script via apache's cgi-bin that calls another Perl script (from a browser): http://192.168.000.000/cgi-bin/run_script.pl?SCRIPT=test.pl&text=RANDOM+TEXT&INPUT1=444444444444 This... (4 Replies)
Discussion started by: pondlife
4 Replies

5. Web Development

problem with exporting vairable from one perl cgi to another perl cgi script while redirecting.

Can anyone tell me how to export a variable from one perl CGI script to another perl cgi script when using a redirect. Upon running the login.pl the user is prompted to enter user name and password. Upon entering the correct credentials (admin/admin) the user is redirected to welcome page. My... (3 Replies)
Discussion started by: Arun_Linux
3 Replies

6. Shell Programming and Scripting

CGI in Perl

Hi, Am unfamiliar with using CGI modules in Perl. Though i checked in few sites about CGI , i dint get a clear idea. Can anyone please explain me the purpose of these statements, it ll be very helpful to me #!/usr/bin/perl use CGI qw/:standard/; use Storable; use Data::Dumper; my... (1 Reply)
Discussion started by: irudayaraj
1 Replies

7. Shell Programming and Scripting

Perl cgi pages out of cgi-bin folder in WINDOWS

Hi team, I have a typical problem with cgi pages in apache webserver in WINDOWS I am able to execute(display) the pages that are saved in cgi-bin folder. But I am not able to execute the pages stored in htdocs or other folder other than cgi-bin folder. Could anyone please let me know how... (1 Reply)
Discussion started by: scriptscript
1 Replies

8. Shell Programming and Scripting

Perl CGI : unable to download the excel sheet from perl cgi page

Hi All, I have written an cgi perl script that displays an image(Excel image) and when clicked on that Image I need to download a excel sheet. I made sure that excel sheet exists in the folder with the given name but still I am not able to download the sheet. print "<center><table... (2 Replies)
Discussion started by: scriptscript
2 Replies

9. Shell Programming and Scripting

CGI Perl : while loop in CGI perl

Hi Team, I am trying to connect to database(succeeded ) and print the records on the browser using while loop. But the elements of array are not displayed instead while loop is displayed directly. Instead of the below I can embed html statements in print but I am looking for the below style as I... (1 Reply)
Discussion started by: scriptscript
1 Replies

10. UNIX for Dummies Questions & Answers

PERL-CGI learning

Hello All, I am actually learning PERL and more interested to learn CGI script too. Can any suggest a forum or weblink which is more helpful for a dummy CGI developer. Thanks (6 Replies)
Discussion started by: posix
6 Replies
All times are GMT -4. The time now is 10:46 PM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy