# Buggy code
def _get_json_content_from_openml_api(url, error_message, raise_if_error, data_home):
    """
    Loads json data from the openml api

    Parameters
    ----------
    url : str
        The URL to load from. Should be an official OpenML endpoint

    error_message : str or None
        The error message to raise if an acceptable OpenML error is thrown
        (acceptable error is, e.g., data id not found. Other errors, like 404's
        will throw the native error message)

    raise_if_error : bool
        Whether to raise an error if OpenML returns an acceptable error (e.g.,
        date not found). If this argument is set to False, a None is returned
        in case of acceptable errors. Note that all other errors (e.g., 404)
        will still be raised as normal.

    data_home : str or None
        Location to cache the response. None if no cache is required.

    Returns
    -------
    json_data : json or None
        the json result from the OpenML server if the call was successful;
        None otherwise iff raise_if_error was set to False and the error was
        ``acceptable``
    """
    data_found = True
    try:
        response = _open_openml_url(url, data_home)
    except HTTPError as error:
        # 412 is an OpenML specific error code, indicating a generic error
        # (e.g., data not found)
        if error.code == 412:
            data_found = False
        else:
            raise error
    if not data_found:
        # not in except for nicer traceback
        if raise_if_error:
            raise ValueError(error_message)
        else:
            return None
    json_data = json.loads(response.read().decode("utf-8"))
    response.close()
    return json_data


# Traceback (OSError)
In [1]: from sklearn.datasets import fetch_openml
In [2]: fetch_openml('mnist_784', version=1, return_X_y=True)
---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)
<ipython-input-2-0c2a4453f0a2> in <module>
----> 1 fetch_openml('mnist_784', version=1, return_X_y=True)

~/src/scikit-learn/sklearn/datasets/openml.py in fetch_openml(name, version, data_id, data_home, target_column, cache, return_X_y)
490                 "specify a numeric data_id or a name, not "
491                 "both.".format(data_id, name))
--> 492         data_info = _get_data_info_by_name(name, version, data_home)
493         data_id = data_info['did']
494     elif data_id is not None:

~/src/scikit-learn/sklearn/datasets/openml.py in _get_data_info_by_name(name, version, data_home)
285     url = (_SEARCH_NAME + "/data_version/{}").format(name, version)
286     json_data = _get_json_content_from_openml_api(url, None, False,
--> 287                                                   data_home)
288     if json_data is None:
289         # we can do this in 1 function call if OpenML does not require the

~/src/scikit-learn/sklearn/datasets/openml.py in _get_json_content_from_openml_api(url, error_message, raise_if_error, data_home)
143         else:
144             return None
--> 145     json_data = json.loads(response.read().decode("utf-8"))
146     response.close()
147     return json_data

~/.miniconda3/envs/sklearn-dev/lib/python3.7/gzip.py in read(self, size)
274             import errno
275             raise OSError(errno.EBADF, "read() on write-only GzipFile object")
--> 276         return self._buffer.read(size)
277
278     def read1(self, size=-1):

~/.miniconda3/envs/sklearn-dev/lib/python3.7/gzip.py in read(self, size)
461                 # jump to the next member, if there is one.
462                 self._init_read()
--> 463                 if not self._read_gzip_header():
464                     self._size = self._pos
465                     return b""

~/.miniconda3/envs/sklearn-dev/lib/python3.7/gzip.py in _read_gzip_header(self)
409
410         if magic != b'\037\213':
--> 411             raise OSError('Not a gzipped file (%r)' % magic)
412
413         (method, flag,

OSError: Not a gzipped file (b'{"')

# Fixed code
def _get_json_content_from_openml_api(url, error_message, raise_if_error, data_home):
    """
    Loads json data from the openml api

    Parameters
    ----------
    url : str
        The URL to load from. Should be an official OpenML endpoint

    error_message : str or None
        The error message to raise if an acceptable OpenML error is thrown
        (acceptable error is, e.g., data id not found. Other errors, like 404's
        will throw the native error message)

    raise_if_error : bool
        Whether to raise an error if OpenML returns an acceptable error (e.g.,
        date not found). If this argument is set to False, a None is returned
        in case of acceptable errors. Note that all other errors (e.g., 404)
        will still be raised as normal.

    data_home : str or None
        Location to cache the response. None if no cache is required.

    Returns
    -------
    json_data : json or None
        the json result from the OpenML server if the call was successful;
        None otherwise iff raise_if_error was set to False and the error was
        ``acceptable``
    """

    @_retry_with_clean_cache(url, data_home)
    def _load_json():
        with closing(_open_openml_url(url, data_home)) as response:
            return json.loads(response.read().decode("utf-8"))

    try:
        return _load_json()
    except HTTPError as error:
        # 412 is an OpenML specific error code, indicating a generic error
        # (e.g., data not found)
        if error.code != 412:
            raise error

    # 412 error, not in except for nicer traceback
    if raise_if_error:
        raise ValueError(error_message)
    return None