packages feed

nixfromnpm-0.10.1: nix-libs/nodeLib/fetchUrlWithHeaders.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)