summary refs log tree commit diff
path: root/scripts/nix-http-export.cgi.in
blob: 19a505af1c50a02ac3f5216b89ef3e516e0070cf (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#! /bin/sh

export HOME=/tmp
export NIX_REMOTE=daemon

TMP_DIR="${TMP_DIR:-/tmp/nix-export}"

@coreutils@/mkdir -p "$TMP_DIR" || true
@coreutils@/chmod a+r "$TMP_DIR"

needed_path="?$QUERY_STRING"
needed_path="${needed_path#*[?&]needed_path=}"
needed_path="${needed_path%%&*}"
#needed_path="$(echo $needed_path  | ./unhttp)"
needed_path="${needed_path//%2B/+}"
needed_path="${needed_path//%3D/=}"

echo needed_path: "$needed_path" >&2

NIX_STORE="${NIX_STORE_DIR:-/nix/store}"

echo NIX_STORE: "${NIX_STORE}" >&2

full_path="${NIX_STORE}"/"$needed_path"

if [ "$needed_path" != "${needed_path%.drv}" ]; then
	echo "Status: 403 You should create the derivation file yourself"
	echo "Content-Type: text/plain"
	echo
	echo "Refusing to disclose derivation contents"
	exit
fi

if @bindir@/nix-store --check-validity "$full_path"; then
	if ! [ -e nix-export/"$needed_path".nar.gz ]; then
		@bindir@/nix-store --export "$full_path" | @gzip@ > "$TMP_DIR"/"$needed_path".nar.gz
		@coreutils@/ln -fs  "$TMP_DIR"/"$needed_path".nar.gz nix-export/"$needed_path".nar.gz 
	fi;
	echo "Status: 301 Moved"
	echo "Location: nix-export/"$needed_path".nar.gz"
	echo
else 
	echo "Status: 404 No such path found"
	echo "Content-Type: text/plain"
	echo
	echo "Path not found:"
	echo "$needed_path"
	echo "checked:"
	echo "$full_path"
fi