Shashank Shekher
Shashank Shekher

Reputation: 897

How to read an HTTP header value in a CGI Bash script

I have a CGI Bash script hw.sh located on a server running Nginx. The script is called with the following command:

curl -s -D - -H "range: bytes=1-8" -H "Connection: close" -X GET http://server_ip/cgi-bin/hw.sh?path=/some/path/to/data/ 

I need to fetch the value of the range request header within hw.sh. Please help me to figure out how can it be achieved.

Upvotes: 2

Views: 3396

Answers (1)

Ruslan Osmanov
Ruslan Osmanov

Reputation: 21502

HTTP headers are usually passed to CGI programs as environment variables. But it is not always the case.

Generally, the way you access the header values in a CGI program depends on how the Web server processes the headers. The headers may be modified, or even removed. For example, in an Nginx configuration, it is possible to pass the value of the range header via custom FastCGI parameter:

fastcgi_param RANGE $http_range;

It this case it is likely that the environment variable will be called RANGE, but it eventually depends on implementation of the protocol driver. The headers may be even dropped due to the server configuration. For example, the following Apache 2 configuration drops the range header when there are more than 5 ranges:

SetEnvIf Range (,.*?){5,} bad-range=1
RequestHeader unset Range env=bad-range

Thus, it is generally impossible to predict the name of the environment variable, and even whether it will be available in the CGI program.

However, if the header is available in the script, it will be available via an environment variable. You can find the exact name by examining the output of the env command.

The following should work with the default settings for Apache2:

#!/bin/bash -
printf '%s\n\n' 'Content-type: text/html'
printf '>>> %s <<< \n' "$HTTP_RANGE"
exit 0

Sample Output

'http://apache-test.local/cgi-bin/test.sh?sdfdsf' 
HTTP/1.1 200 OK
Date: Thu, 10 Nov 2016 08:17:23 GMT
Server: Apache
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html

>>> bytes=1-8 <<< 

Upvotes: 3

Related Questions