72 lines
2.0 KiB
Nix
72 lines
2.0 KiB
Nix
# A python-based fetchurl function, allowing the passage of custom headers.
|
|
# Just calls into `requests` under the hood.
|
|
{
|
|
pythonPackages, stdenv
|
|
}:
|
|
|
|
|
|
{ # URL to fetch.
|
|
url ? ""
|
|
|
|
, # Additional curl options needed for the download to succeed.
|
|
curlOpts ? ""
|
|
|
|
, # Name of the file. If empty, use the basename of `url' (or of the
|
|
# first element of `urls').
|
|
name ? ""
|
|
|
|
# Different ways of specifying the hash.
|
|
, outputHash ? ""
|
|
, outputHashAlgo ? ""
|
|
, md5 ? ""
|
|
, sha1 ? ""
|
|
, sha256 ? ""
|
|
|
|
, # Meta information, if any.
|
|
meta ? {}
|
|
|
|
# Headers to set, if any.
|
|
, headers ? {}
|
|
}:
|
|
|
|
let
|
|
inherit (stdenv.lib) flip mapAttrs' nameValuePair;
|
|
hasHash = (outputHash != "" && outputHashAlgo != "")
|
|
|| md5 != "" || sha1 != "" || sha256 != "";
|
|
|
|
# Create an attribute set translating each header name and value into
|
|
# the header name prefixed with __HTTP_HEADER. When the derivation is
|
|
# evaluated, the script will pick up these environment variables and use
|
|
# them to produce the actual headers.
|
|
headerValues = flip mapAttrs' headers (headerName: headerValue:
|
|
nameValuePair "__HTTP_HEADER_${headerName}" headerValue);
|
|
in
|
|
|
|
if !hasHash
|
|
then throw "You must specify the output hash for ${url}"
|
|
else
|
|
|
|
stdenv.mkDerivation ({
|
|
inherit url;
|
|
name = if name != "" then name else baseNameOf (toString url);
|
|
|
|
outputHashAlgo = if outputHashAlgo != "" then outputHashAlgo else
|
|
if sha256 != "" then "sha256" else if sha1 != "" then "sha1" else "md5";
|
|
outputHash = if outputHash != "" then outputHash else
|
|
if sha256 != "" then sha256 else if sha1 != "" then sha1 else md5;
|
|
|
|
# Only flat hashing, which is the normal mode if you're fetching a file.
|
|
outputHashMode = "flat";
|
|
|
|
# Doing the download on a remote machine just duplicates network
|
|
# traffic, so don't do that.
|
|
preferLocalBuild = true;
|
|
|
|
headerNames = builtins.attrNames headers;
|
|
|
|
buildInputs = with pythonPackages; [python requests2];
|
|
buildCommand = ''
|
|
python ${./fetch.py}
|
|
'';
|
|
} // headerValues)
|