Apache httpd
Content generation
Generování obsahu

Lukáš Bařinka

© 2021

REV 2.10

TOC

Obsah

  1. External filters
  2. LAB: Filters
  3. CGI (Common Gateway Interface)
  4. LAB: CGI
  5. SSI (Server Side Includes)
  6. LAB: SSI
  7. Actions
  1. Externí filtry
  2. LAB: Filtry
  3. CGI (Common Gateway Interface)
  4. LAB: CGI
  5. SSI (Server Side Includes)
  6. LAB: SSI
  7. Akce

External filters

Externí filtry

mod_ext_filter module

Modul mod_ext_filter

  • Provides filtering using external program
  • Filter declaration
    
    									ExtFilterDefine lower-to-upper mode=output \
    									  intype=text/plain outtype=text/plain \
    									  cmd="/usr/bin/tr '[:lower:]' '[:upper:]'"
    								
    • intype attribute selects types of filtered files
    • outtype attribute is necessary in case the filter changes mime-type of filtered file
  • Filter usage
    
    									<Directory "/tmp/example">
    									  SetOutputFilter lower-to-upper
    									  AddType text/plain .txt
    									</Directory>
    								
  • Zajišťuje filtrování externím programem
  • Deklarace filtru
    
    									ExtFilterDefine lower-to-upper mode=output \
    									  intype=text/plain outtype=text/plain \
    									  cmd="/usr/bin/tr '[:lower:]' '[:upper:]'"
    								
    • Atribut intype slouží pro omezení filtrovaných souborů
    • Atribut outtype je nezbytné použít v případě, že filtr mění mime-typ souboru
  • Použití filtru
    
    									<Directory "/tmp/example">
    									  SetOutputFilter lower-to-upper
    									  AddType text/plain .txt
    									</Directory>
    								

LAB: External filter

LAB: Externí filtr

External output filter

Externí výstupní filtr

The goal is to configure output filter that will change response data using external command. It is important the external filter is able to read data from stdin and write data to stderr. The filter will process text files only.

Cílem je nakonfigurovat výstupní filtr, který bude upravovat odesílaná data pomocí externího programu. Je potřeba aby externí filtr četl data ze stdin a zapisoval na stderr. Zpracovávat bude pouze textové soubory.

  • Define external filter and setup its parameters
  • Register filter (use the filter)
  • Test the filter
  • Definovat externí filtr a jeho parametry
  • Zaregistrovat filtr (použít)
  • Otestovat funkčnost filtru

Tips

Tipy

  • Install tidy program to change/correct HTML files
    
    									apt install tidy
    								
  • All \ characters must be escaped ⇒ "/usr/bin/tr -d '\\n'"
  • Nainstalujte program tidy, který upravuje vzhled HTML souborů
    
    									apt install tidy
    								
  • Všechny \ musí být escapované ⇒ "/usr/bin/tr -d '\\n'"
  1. Define tr and tidy commands as an external filters using mod_ext_filter directives with following names:
    • TR, filter should remove all new-line characters (\n)
    • TIDY
  2. Register TR filter for all files with html extension in /var/www/main/filter directory
  3. Test the results E.g. display page source code in web browser or use curl
  4. Register TIDY filter for all files with html extension in /var/www/main/filter directory
  1. Zaregistrujte nástroje tr resp. tidy jako externí výstupní filtry pomocí direktiv mod_ext_filter pod názvy:
    • TR, filtr z textu smaže všechny znaky nový řádek tj. (\n)
    • TIDY
  2. V adresáři /var/www/main/filter zaregistrujte pro všechny soubory s příponou html filtr TR
  3. Výsledek ověřte Např. si zobrazte zdrojový kód stránky v prohlížeči nebo použijte curl
  4. V adresáři /var/www/main/filter zaregistrujte pro všechny soubory s příponou html filtr TIDY
  1. Test the results like in previous task
  2. Register both filters for files with html extension in /var/www/main/filter directory
  3. Test different filter order and compare the results
  1. Výsledek ověřte obdobně jako v předchozím příkladu
  2. V adresáři /var/www/main/filter zaregistrujte pro všechny soubory s příponou html oba filtry
  3. Vyzkoušejte obě kombinace pořadí, výsledky porovnejte

Filter chain

Řetězení filtrů


							ExtFilterDefine SUM mode=output \
							  cmd="/usr/bin/awk '{ data[$1]+=$10; c[$1]++ } \
							    END { for (ip in data) print ip,c[ip],data[ip] }'"

							ExtFilterDefine SORT mode=output \
							  cmd="/usr/bin/sort -k2rn"

							SetOutputFilter SUM;SORT
						

There is no possibility to use a pipe in external filter “cmd1 | cmd2” (it is not a shell).
⇒ The chain of filter is a way in that case

V externím filtru nelze použít rouru “cmd1 | cmd2” (není to shell).
⇒ Je potřeba zřetězit jednotlivé filtry.

CGI (Common Gateway Interface)

CGI modules

CGI moduly

  • Execution of CGI scripts Using an internal mechanism or an external CGI daemon
    (with socket communication)
    • mod_cgi = Process-based MPM (prefork) Uses an internal mechanism to create new proccesses
    • mod_cgid = Thread-based MPM (worker/event) Forking a process with multiple threads is expensive operation Uses an external CGI daemon to create new processes Apache - CGI daemon communication uses Unix socket
  • The same configuration except additional ScriptSock directive
  • Moduly zajišťující běh skriptů
    • mod_cgi = Procesové zpracování požadavků (prefork) Používá interní mechanizmus vytváření procesů
    • mod_cgid = Vláknové zpracování požadavků (worker/event) Replikace procesů s více vlákny je nákladná operace Používá externího daemona pro vytváření nových procesů Komunikaci s externím daemonem zajišťuje socket
  • Oba moduly mají stejnou konfiguraci až na ScriptSock direktivu

Basic configuration

Základní konfigurace

  • ScriptAlias directive
  • Defines webspace/directory to process requested files like CGI scripts
  • To use mod_cgid module
    
    									LoadModule cgid_module libexec/mod_cgid.so
    									ScriptSock /var/run/cgisock
    								
  • Direktiva ScriptAlias
  • Určuje cíle/adresáře, které se budou zpracovávat jako CGI skripty
  • Základní konfigurace (mod_cgid)
    
    									LoadModule cgid_module modules/mod_cgid.so
    									ScriptSock /var/run/cgisock
    								

Mime-type: application/x-httpd-cgi For backward compatibility (deprecated)

Mime-type: application/x-httpd-cgi Pro zpětnou kompatibilitu (deprecated)

CGI configuration

CGI konfigurace

  • Configuration for a webspace (URL) Nastavení pro web space (URL)
    
    									ScriptAlias /cgi-bin/ /www/cgi-bin/
    									<Directory /www/cgi-bin/>
    									  …
    									</Directory>
    								
    
    									ScriptAliasMatch "^~([a-z0-9]+)/cgi-bin/(.*)" "/home/$1/www/cgi-bin/$2"
    								
  • Configuration for a filesystem (directory) Nastavení pro filesystem (adresář)
    
    									<DirectoryMatch "/home/[a-z0-9]+/www/cgi-bin">
    									  Options +ExecCGI
    									  AddHandler cgi-script .cgi .sh …
    									</Directory>
    								

CGI operation

Činnost CGI

  • CGI script/program generates output Server response to client
  • It is necessary to create proper response header
    
    									Content-Type: text/html
    								
  • CGI script/program must be (readable and) executable for user running web server
  • CGI skript/program generuje výstup Odpověď klientovi
  • Je nutné vygenerovat vhodnou hlavičku odpovědi
    
    									Content-Type: text/html
    								
  • Program (skript) musí být (čitelný a) spustitelný uživatelem, pod kterým běží server

Request data

Data od uživatele

  • Environment variables
  • Standard input (stdin) in case of POST request REQUEST_METHOD – method of client request CONTENT_LENGTH – length of stdin in bytes
  • Input data are "URL encoded" Decoding is needed
  • Proměnné prostředí
  • Standardní vstup (stdin) při použití metody POST REQUEST_METHOD – metoda požadavku CONTENT_LENGTH – délka stdin v bajtech
  • Vstupní data jsou „URL encoded“ Nutno provést dekódování

CGI pitfalls

Možné problémy s CGI

The CGI output is displayed, but the look in web browser is incorrect
CGI operates properly but the output is misinterpreted by web browser – Is there a correct Content-Type?
The CGI source code is displayed instead of CGI result or the message "POST Method Not Allowed" is present
Bad Apache configuration for CGI scripts
V prohlížeči je vidět výstup CGI programu, ale nemá správný vzhled
CGI program funguje, ale prohlížeč data špatně interpretuje – Je správně nastaven Content-Type?
Zobrazuje se zdrojový kód CGI programu a nebo zpráva "POST Method Not Allowed"
Chybná konfigurace Apache pro zpracování CGI programů
The "Forbidden" error message is displayed
Insufficient filesystem permissions (mainly (read)/execution permission is missing for other users than the author) – Check file permissions and see an error log
The "Internal Server Error" message is displayed
See the log error messages for "Premature end of script headers" – Check whether the CGI script produces response header and body separated by an empty line
Zobrazuje se chyba "Forbidden"
Nedostatečná práva na souborovém systému (typicky pro ostatní uživatele, než je autor) – Zkontrolujte práva a error log
Zobrazuje se chyba "Internal Server Error"
Nejspíš je v logu uvedena chyba "Premature end of script headers" – Zkontrolujte, jestli program správně generuje hlavičku odpovědi oddělenou prázdným řádkem od těla

Debugging

Ladění

  • The debugging ability is limited
  • Log file configuration
    
    									ScriptLog path/to/log/file
    								
  • Length of logged data (POST, PUT)
    
    									ScriptLogLength bytes
    									ScriptLogBuffer bytes
    								
  • Možnosti ladění jsou velmi omezené
  • Nastavení logovacího souboru
    
    									ScriptLog cesta/k/log/souboru
    								
  • Nastavení délky protokolovaných dat (POST, PUT)
    
    									ScriptLogLength bytes
    									ScriptLogBuffer bytes
    								

Logging

Logování

  • Information written to log file:
    • Always
      
      											%% [time] request-line
      											%% HTTP-status CGI-script-filename
      										
    • When unable to execute CGI script
      
      											%%error
      											error-message
      										
    • In case of error
      
      											%request
      											HTTP request headers
      											POST / PUT input (when present)
      											%response
      											HTTP response headers
      											%stdout
      											CGI standard output
      											%stderr
      											CGI standard error output
      										
  • Only the last error is logged
  • Only header syntax is checked, not header content
  • Do logovacího souboru se vypisuje:
    • Vždy
      
      											%% [time] request-line
      											%% HTTP-status CGI-script-filename
      										
    • Pokud se CGI nepodařilo spustit
      
      											%%error
      											error-message
      										
    • V případě chyby
      
      											%request
      											HTTP hlavičky požadavku
      											POST / PUT vstup (pokud existuje)
      											%response
      											HTTP hlavičky výstupu
      											%stdout
      											CGI standardní výstup
      											%stderr
      											CGI standardní chybový výstup
      										
  • Vypisuje se pouze poslední chyba
  • V hlavičkách se kontroluje pouze syntaxe a nikoliv obsah

Environment variables

Proměnné prostředí

List of environment variables Environment of CGI script (example)

Zjištění nastavení prostředí běhu CGI skriptu


							#!/bin/bash
							echo "Content-type: text/plain"
							echo
							/usr/bin/env
						

							DOCUMENT_ROOT /var/www/localhost/htdocs
							PATH /bin:/sbin:/usr/bin:/usr/sbin:/usr/local/sbin…
							PWD /var/www/modules/cgi-bin
							SCRIPT_FILENAME /var/www/modules/cgi-bin/df.sh
							REQUEST_URI /modules/cgi-bin/df.sh?dir=/tmp
							SCRIPT_NAME /modules/cgi-bin/df.sh
							REQUEST_METHOD POST
							CONTENT_LENGTH 328
							QUERY_STRING dir=/tmp
							SERVER_NAME ewait
							SERVER_ADDR 147.32.80.97
							REMOTE_ADDR 147.32.80.98
						

LAB: CGI

Simple CGI script

Jednoduchý CGI skript

The goal is to configure web server to execute CGI scripts. Simple script listing environment is a part of this task. It will helps you to write more meaningful scripts later.

Cílem je nakonfigurovat spouštění CGI skriptů webovým serverem. Součástí je napsání jednoduchého skriptu, který vypíše informace o systému.

  • Enable CGI scripts processing
  • Create simple script to list environment variables
  • Create simple script to display disk free space
  • Povolit zpracování CGI
  • Napsat jednoduchý pro zobrazení prostředí
  • Napsat jednoduchý skript ke zjištění místa na FS

Tips

Tipy

  • It is important to check the loading of mod_cgid module
  • Request headers are available inside HTTP_… variables
    
    									curl -H "Foo-bar: baz" …
    								
    Is in variable
    
    									HTTP_FOO_BAR=baz
    								
  • The "query-string" is optional part of URL
    • URL: …?foo=bar&baz
    • Variable:
      
      											QUERY_STRING="foo=bar&baz"
      										
  • Je potřeba zkontrolovat načítání modulu pro CGI (mod_cgid)
  • Hlavičky požadavku jsou v proměnných HTTP_…
    
    									curl -H "Foo-bar: baz" …
    								
    Je v proměnné
    
    									HTTP_FOO_BAR=baz
    								
  • Součástí adresy může být „query-string“
    • v URL: …?foo=bar&baz
    • v proměnných:
      
      											QUERY_STRING="foo=bar&baz"
      										
  1. Enable CGI scripts in /var/www/cgi-bin directory and map that directory into webspace
  2. Try to configure that using both variants
    • ScriptAlias
    • Handler cgi-script Beware of CGI file extension configuration
  3. Create simple CGI script to display all environment variables E.g. as a shell script
  4. Create simple CGI script to display free and used space on chosen filesystem
  1. Povolte zpracování CGI skriptů v adresáři /var/www/cgi-bin a namapujte tento adresář do webspace
  2. Vyzkoušejte si obě možné varianty
    • ScriptAlias
    • Handler cgi-script Pozor na nastavení přípony CGI skriptu
  3. Napište jednoduchý CGI skript, který zobrazí všechny proměnné prostředí Např. jako shell skript
  4. Napište jednoduchý CGI skript, který zobrazí obsazené místo na zvoleném FS

SSI (Server Side Includes)

mod_include module

Modul mod_include

  • Includes generated content into response output
    • Suitable to include small chunks of data
    • Not suitable when the most of a page is generated
  • To enable SSI
    
    									Options +IncludesNoExec
    									Options +Includes
    								
    +Include SSI including external command execution
  • Defines output filter INCLUDES to search for and process SSI commands
  • Vkládá dynamicky generovaný obsah do výstupu
    • Vhodné pro vkládání menších kusů dat
    • Není vhodné pokud je většina stránky generována dynamicky
  • Povolení SSI
    
    									Options +IncludesNoExec
    									Options +Includes
    								
    +Include je SSI včetně vykonávání externích příkazů
  • Výstupní filtr INCLUDES pro hledání a zpracování SSI příkazů

SSI configuration

SSI konfigurace

  • Based on requested file MIME type According to filename extension
    
    									<IfModule mime_module>
    									  AddType text/html .shtml
    									  AddOutputFilter INCLUDES .shtml
    									</IfModule>
    								
  • XBitHack directive usage for directory
    • SSI enabled for files with execution permission
    • No need to rename files
      
      											XBitHack On
      										
  • All files processing
    
    									SetOutputFilter INCLUDES
    								
  • Podle MIME typu V závislosti na příponě souboru
    
    									<IfModule mime_module>
    									  AddType text/html .shtml
    									  AddOutputFilter INCLUDES .shtml
    									</IfModule>
    								
  • Použití direktivy XBitHack v adresáři
    • Zpracování SSI provedeno u souborů s nastaveným právem execute
    • Bez nutnosti přejmenování souborů
      
      											XBitHack On
      										
  • Zpracování všech souborů
    
    									SetOutputFilter INCLUDES
    								

Syntax

Syntaxe

  • Syntax based on HTML comments
    
    									<!--#element attribute=value attribute=value … -->
    								
    There must be no space between <!-- and #element!
  • Elements
    config sets output formats
    echo prints out variable content
    exec executes external command
    fsize prints out file size
    flastmodprints out last modification date of file
    include includes file content
    printenvprints out environment (all env. variables)
    set sets variable value
  • Zápis pomocí HTML komentářů
    
    									<!--#element attribute=value attribute=value … -->
    								
    Mezi <!-- a #element nesmí být mezera!
  • Elementy
    confignastavuje výstupní formáty
    echo vypisuje obsah proměnných
    exec spouští externí program
    fsize vypisuje velikost souboru
    flastmodvypisuje datum poslední modifikace souboru
    include vkládá obsah souboru
    printenvvypisuje obsah prostředí (všech proměnných)
    set nastavuje hodnotu proměnné

Include

  • 
    									include file="..." | virtual="..."
    								
    • file File in current sub/directory, absolute path or .. can't be used
    • virtual Web space address of a document
  • PATH_INFO usage must be enabled
    
    									AcceptPathInfo On|Default
    								
    REQUEST_URI will not change, only PATH_INFO will change
  • 
    									include file="..." | virtual="..."
    								
    • file Soubor ve stejném pod/adresáři, nelze použít absolutní cestu nebo ..
    • virtual Dokument s adresou ve webspace serveru
  • Musí být povoleno použití PATH_INFO
    
    									AcceptPathInfo On|Default
    								
    Požadavku se nezmění REQUEST_URI, jenom PATH_INFO

Usage of virtual option can lead to unexpected results E.g. request processing repetition. An action (Action - see later) may be called recursively because of the constant REQUEST_URI variable value during request processing when all files (e.g. .ssi, .s/html, .sh) are in one directory and mod_actions is configured.

Použití virtual může vést k nečekanému výsledku Např. k opakovanému zpracování požadavku. Když budou všechny soubory
(např .ssi, .s/html, .sh) v jednom adresáři a bude nastaven mod_actions, může dojít k rekurzivnímu volání akce (Action) díky stále stejné REQUEST_URI !

SSI example

Ukázka SSI


							<pre>
							<!--#exec cmd="ls" -->
							</pre>
						

							<!--#config timefmt="%D" -->
							This file was modified: <!--#echo var="LAST_MODIFIED" -->
						

							<!--#include virtual="/footer.html" -->
						

Variables

Proměnné

  • DATE_LOCAL
  • DOCUMENT_NAME (including pathname)
  • DOCUMENT_URI
  • LAST_MODIFIED

							<!--#set var="modified" value="$LAST_MODIFIED" -->
						

Compound commands

Programové konstrukce

  • Branching
    
    									
    									
    									
    									
    								
  • Logical expressions
    • str
    • str1 = str2, str1 == str2, str1 != str2 /str2/ represents RE Subexpressions in RE are
      available using $1 .. $9
    • str1 < str2, str1 <= str2, str1 > str2, str1 >= str2
    • ( condition ), ! condition
    • condition1 && condition2, condition1 || condition2
  • Větvení kódu
    
    									
    									
    									
    									
    								
  • Logické výrazy
    • str
    • str1 = str2, str1 == str2, str1 != str2 /str2/ představuje RE Podvýrazy v RE jsou dostupné v proměnných $1 .. $9
    • str1 < str2, str1 <= str2, str1 > str2, str1 >= str2
    • ( podmínka ), ! podmínka
    • podmínka1 && podmínka2, podmínka1 || podmínka2

LAB: SSI

Server Side Includes

The goal is to configure SSI when a requested source is served. That can be useful to include header/footer to content, or to generate file timestamp, and other simple cases.

Cílem je použít dynamické vkládání obsahu do poskytovaného zdroje. To se může hodit v jednoduchých příkladech vkládání hlavičky/patičky do obsahu nebo generování časových značek apod.

  • Create a document suitable for SSI
  • Insert some SSI tags into that file
  • Configure SSI for relevant directory
  • Measure server performance using ab command
  • Vytvořit dokument pro vkládání obsahu
  • Vložit do něj SSI značky
  • Nakonfigurovat použití SSI pro příslušný adresář
  • Změřit výkon serveru pomocí aplikace ab

Tips

Tipy

  • SSI Variable setting/usage and command execution example Příklady nastavení a použití proměnné a volání příkazu
    
    									<!--#config timefmt="%R, %B %d, %Y" -->
    									<!--#flastmod file=$DOCUMENT_NAME -->
    									<!--#exec cmd="/bin/date" -->
    								
  1. Create two documents with SSI tags that will contain current date/time
  2. Use DATE_LOCAL variable And set time format using timefmt variable
  3. Use external command date to achieve the same result
  4. Configure INCLUDES output filter for created documents
  5. Compare server performance in both cases E.g. using ab command
  1. Vytvořte dva dokumenty s SSI, jehož obsahem bude aktuální čas
  2. Pomocí proměnné DATE_LOCAL A nastavením formátu času pomocí timefmt
  3. Pomocí vykonání externího programu date
  4. Nastavte použití výstupního filtru INCLUDES pro vytvořený dokument
  5. Porovnejte obě řešení z pohledu výkonu Např. nástrojem ab

Troubleshooting

Watch ErrorLog during configuration attempts

Je dobré průběžně sledovat ErrorLog

  • AH00082: an unknown filter was not added: INCLUDES Load module mod_include e.g. using
    
    									a2enmod include
    								
  • AH01374: mod_include: Options +Includes (or IncludesNoExec) wasn't set,
    INCLUDES filter removed: /ssi/index.html
    Enable SSI for chosen directory
    
    									<Directory …>
    										  Options +Includes
    										  …
    									</Directory>
    								
  • AH00082: an unknown filter was not added: INCLUDES Načíst modul mod_include např. pomocí
    
    									a2enmod include
    								
  • AH01374: mod_include: Options +Includes (or IncludesNoExec) wasn't set,
    INCLUDES filter removed: /ssi/index.html
    Povolit SSI pro daný adresář
    
    									<Directory …>
    										  Options +Includes
    										  …
    									</Directory>
    								

Actions

Akce

mod_actions module

Modul mod_actions

Provides CGI execution of (another) configured script instead of requested file or method

Umožňuje podle MIME typu požadovaného souboru nebo metody vykonat zvolený (jiný) CGI skript místo požadovaného souboru

Difference between filter, cgi script and action script

Actions terms

Požadavky na actions

  • Configured CGI script must be inside ScriptAlias directory and act like standard CGI script
    
    									LoadModule actions_module modules/mod_actions.so
    
    									<Directory "…">
    									  # Text files wrapped inside special header and footer
    									  Action text/plain "/actions/txt.sh" virtual
    									</Directory>
    								
  • The virtual flag specifies whether the requested file must exist or not If virtual flag is not specified and requested file does not exist, the response status is 404 Not Found If virtual flag is specified, the action script is executed and has to deal with requested file existence by itself
  • Vyžaduje, aby zvolený CGI skript byl v adresáři, na který vede ScriptAlias a měl všechny vlastnosti CGI skriptu
    
    									LoadModule actions_module modules/mod_actions.so
    
    									<Directory "…">
    									  # textové soubory dostanou spec. hlavičku a patičku
    									  Action text/plain "/actions/txt.sh" virtual
    									</Directory>
    								
  • Slovo virtual určuje, zda soubor musí existovat Pokud není uvedeno a soubor neexistuje, dostaneme 404 Not Found Pokud je uvedeno, skript se vykoná a s existencí/neexistencí souboru se musí vyrovnat sám

Action script example

Příklad Action skriptu


							#!/bin/bash
							echo "Content-Type: text/html"
							echo
							echo "<h1>File: ${REDIRECT_URL}</h1><hr>"
							if [ "$REQUEST_METHOD" == "POST" ]; then
							  QUERY_STRING="$QUERY_STRING&$( head -c $CONTENT_LENGTH )"
							  QUERY_STRING=${QUERY_STRING#&}
							fi
							if [ ! -f "${PATH_TRANSLATED}" ]; then
							  echo "File does not exist."
							elif [ $( echo "${QUERY_STRING}" | tr '&' '\n'| grep  "^full=" | tail -1 ) == "full=yes" ]; then
							  echo '<pre>'
							  cat "${PATH_TRANSLATED}"
							  echo "$QUERY_STRING</pre><hr>"
							  echo "<a href='${REDIRECT_URL}'>Display first 10 lines</a>"
							  echo '<form action="#" method="POST"><input type="submit" name="full" value="no">
							        <input type="hidden" name="foo" value="bar"></form><hr>'
							else
							  echo "<pre>"
							  head "${PATH_TRANSLATED}"
							  echo "$QUERY_STRING</pre><hr>"
							  echo "<a href='${REDIRECT_URL}?full=yes'>Display full content</a>"
							  echo '<form action="#" method="POST"><input type="submit" name="full" value="yes">
							        <input type="hidden" name="foo" value="bar"></form><hr>'
							fi
							stat "${PATH_TRANSLATED}" | egrep "Modify:"
						

							#!/bin/bash
							echo "Content-Type: text/html"
							echo
							echo "<h1>Soubor: ${REDIRECT_URL}</h1><hr>"
							if [ "$REQUEST_METHOD" == "POST" ]; then
							  QUERY_STRING="$QUERY_STRING&$( head -c $CONTENT_LENGTH )"
							  QUERY_STRING=${QUERY_STRING#&}
							fi
							if [ ! -f "${PATH_TRANSLATED}" ]; then
							  echo "Soubor neexistuje."
							elif [ $( echo "${QUERY_STRING}" | tr '&' '\n'| grep  "^full=" | tail -1 ) == "full=yes" ]; then
							  echo '<pre>'
							  cat "${PATH_TRANSLATED}"
							  echo "$QUERY_STRING</pre><hr>"
							  echo "<a href='${REDIRECT_URL}'>zobrazit pouze ukazku (10 radek)</a>"
							  echo '<form action="#" method="POST"><input type="submit" name="full" value="no">
							        <input type="hidden" name="foo" value="bar"></form><hr>'
							else
							  echo "<pre>"
							  head "${PATH_TRANSLATED}"
							  echo "$QUERY_STRING</pre><hr>"
							  echo "<a href='${REDIRECT_URL}?full=yes'>zobrazit cely soubor</a>"
							  echo '<form action="#" method="POST"><input type="submit" name="full" value="yes">
							        <input type="hidden" name="foo" value="bar"></form><hr>'
							fi
							stat "${PATH_TRANSLATED}" | egrep "Modify:"
						

Action script for a method example

Příklad Action skriptu pro metodu


							#!/bin/bash
							echo "Content-Type: text/plain"
							echo
							head -c "$CONTENT_LENGTH" > "/var/www/main/upload/$REDIRECT_URL"
							echo "File $REDIRECT_URL uploaded"
						

							Script PUT /cgi-bin/upload
						

							curl -i -X PUT --data-binary @/etc/passwd URL...txt
						

LAB: Actions

LAB: Akce

Action script

Skript pro akci

The goal is to create CGI script that will be executed according to request for another resource. The will be executed no matter of requested file existence. That can be useful in many cases.

Cílem je vytvořit skript, který bude spouštěn na základě požadavků bez ohledu na existenci požadovaného zdroje. To se může hodit…

  • Create script listing environment and incoming data
  • Configure that script as an action
  • Test whether the script is executed by any request
  • React to non-existence of requested file
  • Vytvořit skript, který se vypíše prostředí a příchozí data
  • Nakonfigurovat spuštění tohoto skriptu jako akci
  • Otestovat spuštění akce při příchodu požadavku
  • Ošetřit ve skriptu neexistenci požadovaného souboru
  1. Create script that will be executed when requested document has text/plain mime-type
  2. List environment variables by that script and incoming (request) data
  3. React (inside the script) if the requested file is missing
  1. Vytvořte skript, který se bude spouštět při požadavku na dokument s mime-typem text/plain
  2. Ve skriptu vypište proměnné prostředí a data, která přišla s požadavkem
  3. Uvnitř skriptu ošetřete existenci/neexistenci požadovaného souboru

Tips

Tipy


							#!/bin/bash
							[ -f "$PATH_TRANSLATED" ] || echo "Status: 404 Not Found"
							echo "Content-Type: text/plain"
							echo
							set -x  #stderr to errorlog
							/usr/bin/env
							if [ "$REQUEST_METHOD" = POST ]; then
							  echo POST DATA
							  head -c "$CONTENT_LENGTH"
							  echo
							fi
							[ -f "$PATH_TRANSLATED" ] && cat "$PATH_TRANSLATED"
						

							curl -i --data="a=b" URL...txt

							curl -i --data-binary @/etc/passwd URL...txt