public function downloadMissingGeoIpDb()
    {
        $this->dieIfGeolocationAdminIsDisabled();
        Piwik::checkUserHasSuperUserAccess();
        if ($_SERVER["REQUEST_METHOD"] == "POST") {
            try {
                $this->checkTokenInUrl();

                Json::sendHeaderJSON();

                // based on the database type (provided by the 'key' query param) determine the
                // url & output file name
                $key = Common::getRequestVar('key', null, 'string');

                if ($this->isGeoIp2Enabled()) {
                    $url = GeoIP2AutoUpdater::getConfiguredUrl($key);
                    $ext = GeoIP2AutoUpdater::getGeoIPUrlExtension($url);
                    $filename = GeoIp2::$dbNames[$key][0] . '.' . $ext;
                    $outputPath = GeoIp2::getPathForGeoIpDatabase($filename);
                } else {
                    $url = GeoIPAutoUpdater::getConfiguredUrl($key);
                    $ext = GeoIPAutoUpdater::getGeoIPUrlExtension($url);
                    $filename = GeoIp::$dbNames[$key][0] . '.' . $ext;

                    if (substr($filename, 0, 15) == 'GeoLiteCity.dat') {
                        $filename = 'GeoIPCity.dat' . substr($filename, 15);
                    }
                    $outputPath = GeoIp::getPathForGeoIpDatabase($filename);
                }

                // download part of the file
                $result = Http::downloadChunk(
                    $url, $outputPath, Common::getRequestVar('continue', true, 'int'));

                // if the file is done
                if ($result['current_size'] >= $result['expected_file_size']) {
                    if ($this->isGeoIp2Enabled()) {
                        GeoIP2AutoUpdater::unzipDownloadedFile($outputPath, $key, $unlink = true);
                    } else {
                        GeoIPAutoUpdater::unzipDownloadedFile($outputPath, $unlink = true);
                    }

                    $info = $this->getNextMissingDbUrlInfo();
                    if ($info !== false) {
                        return json_encode($info);
                    }
                }

                return json_encode($result);
            } catch (Exception $ex) {
                return json_encode(array('error' => $ex->getMessage()));
            }
        }
    }