# Buggy code
def add_link(
    self,
    target,
    rel,
    title=None,
    title_star=None,
    anchor=None,
    hreflang=None,
    type_hint=None,
):
    """
    Add a link header to the response.

    See also: https://tools.ietf.org/html/rfc5988

    Note:
        Calling this method repeatedly will cause each link to be
        appended to the Link header value, separated by commas.

    Note:
        So-called "link-extension" elements, as defined by RFC 5988,
        are not yet supported. See also Issue #288.

    Args:
        target (str): Target IRI for the resource identified by the
            link. Will be converted to a URI, if necessary, per
            RFC 3987, Section 3.1.
        rel (str): Relation type of the link, such as "next" or
            "bookmark". See also http://goo.gl/618GHr for a list
            of registered link relation types.

    Kwargs:
        title (str): Human-readable label for the destination of
            the link (default ``None``). If the title includes non-ASCII
            characters, you will need to use `title_star` instead, or
            provide both a US-ASCII version using `title` and a
            Unicode version using `title_star`.
        title_star (tuple of str): Localized title describing the
            destination of the link (default ``None``). The value must be a
            two-member tuple in the form of (*language-tag*, *text*),
            where *language-tag* is a standard language identifier as
            defined in RFC 5646, Section 2.1, and *text* is a Unicode
            string.

            Note:
                *language-tag* may be an empty string, in which case the
                client will assume the language from the general context
                of the current request.

            Note:
                *text* will always be encoded as UTF-8. If the string
                contains non-ASCII characters, it should be passed as
                a ``unicode`` type string (requires the 'u' prefix in
                Python 2).

        anchor (str): Override the context IRI with a different URI
            (default None). By default, the context IRI for the link is
            simply the IRI of the requested resource. The value
            provided may be a relative URI.
        hreflang (str or iterable): Either a single *language-tag*, or
            a ``list`` or ``tuple`` of such tags to provide a hint to the
            client as to the language of the result of following the link.
            A list of tags may be given in order to indicate to the
            client that the target resource is available in multiple
            languages.
        type_hint(str): Provides a hint as to the media type of the
            result of dereferencing the link (default ``None``). As noted
            in RFC 5988, this is only a hint and does not override the
            Content-Type header returned when the link is followed.

    """

    # PERF(kgriffs): Heuristic to detect possiblity of an extension
    # relation type, in which case it will be a URL that may contain
    # reserved characters. Otherwise, don't waste time running the
    # string through uri.encode
    #
    # Example values for rel:
    #
    #     "next"
    #     "http://example.com/ext-type"
    #     "https://example.com/ext-type"
    #     "alternate http://example.com/ext-type"
    #     "http://example.com/ext-type alternate"
    #
    if "//" in rel:
        if " " in rel:
            rel = '"' + " ".join([uri_encode(r) for r in rel.split()]) + '"'
        else:
            rel = '"' + uri_encode(rel) + '"'

    value = "<" + uri_encode(target) + ">; rel=" + rel

    if title is not None:
        value += '; title="' + title + '"'

    if title_star is not None:
        value += (
            "; title*=UTF-8'" + title_star[0] + "'" + uri_encode_value(title_star[1])
        )

    if type_hint is not None:
        value += '; type="' + type_hint + '"'

    if hreflang is not None:
        if isinstance(hreflang, STRING_TYPES):
            value += "; hreflang=" + hreflang
        else:
            value += "; "
            value += "; ".join(["hreflang=" + lang for lang in hreflang])

    if anchor is not None:
        value += '; anchor="' + uri_encode(anchor) + '"'

    _headers = self._headers
    if "link" in _headers:
        _headers["link"] += ", " + value
    else:
        _headers["link"] = value


# Traceback (TypeError)
Traceback (most recent call last):
File "/Users/kgriffs/Code/falcon/falcon/api.py", line 265, in __call__
start_response(resp.status, headers)
TypeError: http header value must be a string

# Fixed code
def add_link(
    self,
    target,
    rel,
    title=None,
    title_star=None,
    anchor=None,
    hreflang=None,
    type_hint=None,
):
    """
    Add a link header to the response.

    See also: https://tools.ietf.org/html/rfc5988

    Note:
        Calling this method repeatedly will cause each link to be
        appended to the Link header value, separated by commas.

    Note:
        So-called "link-extension" elements, as defined by RFC 5988,
        are not yet supported. See also Issue #288.

    Args:
        target (str): Target IRI for the resource identified by the
            link. Will be converted to a URI, if necessary, per
            RFC 3987, Section 3.1.
        rel (str): Relation type of the link, such as "next" or
            "bookmark". See also http://goo.gl/618GHr for a list
            of registered link relation types.

    Kwargs:
        title (str): Human-readable label for the destination of
            the link (default ``None``). If the title includes non-ASCII
            characters, you will need to use `title_star` instead, or
            provide both a US-ASCII version using `title` and a
            Unicode version using `title_star`.
        title_star (tuple of str): Localized title describing the
            destination of the link (default ``None``). The value must be a
            two-member tuple in the form of (*language-tag*, *text*),
            where *language-tag* is a standard language identifier as
            defined in RFC 5646, Section 2.1, and *text* is a Unicode
            string.

            Note:
                *language-tag* may be an empty string, in which case the
                client will assume the language from the general context
                of the current request.

            Note:
                *text* will always be encoded as UTF-8. If the string
                contains non-ASCII characters, it should be passed as
                a ``unicode`` type string (requires the 'u' prefix in
                Python 2).

        anchor (str): Override the context IRI with a different URI
            (default None). By default, the context IRI for the link is
            simply the IRI of the requested resource. The value
            provided may be a relative URI.
        hreflang (str or iterable): Either a single *language-tag*, or
            a ``list`` or ``tuple`` of such tags to provide a hint to the
            client as to the language of the result of following the link.
            A list of tags may be given in order to indicate to the
            client that the target resource is available in multiple
            languages.
        type_hint(str): Provides a hint as to the media type of the
            result of dereferencing the link (default ``None``). As noted
            in RFC 5988, this is only a hint and does not override the
            Content-Type header returned when the link is followed.

    """

    # PERF(kgriffs): Heuristic to detect possiblity of an extension
    # relation type, in which case it will be a URL that may contain
    # reserved characters. Otherwise, don't waste time running the
    # string through uri.encode
    #
    # Example values for rel:
    #
    #     "next"
    #     "http://example.com/ext-type"
    #     "https://example.com/ext-type"
    #     "alternate http://example.com/ext-type"
    #     "http://example.com/ext-type alternate"
    #
    if "//" in rel:
        if " " in rel:
            rel = '"' + " ".join([uri_encode(r) for r in rel.split()]) + '"'
        else:
            rel = '"' + uri_encode(rel) + '"'

    value = "<" + uri_encode(target) + ">; rel=" + rel

    if title is not None:
        value += '; title="' + title + '"'

    if title_star is not None:
        value += (
            "; title*=UTF-8'" + title_star[0] + "'" + uri_encode_value(title_star[1])
        )

    if type_hint is not None:
        value += '; type="' + type_hint + '"'

    if hreflang is not None:
        if isinstance(hreflang, STRING_TYPES):
            value += "; hreflang=" + hreflang
        else:
            value += "; "
            value += "; ".join(["hreflang=" + lang for lang in hreflang])

    if anchor is not None:
        value += '; anchor="' + uri_encode(anchor) + '"'

    if PY2:
        # NOTE(kgriffs): uwsgi fails with a TypeError if any header
        # is not a str, so do the conversion here. It's actually
        # faster to not do an isinstance check. str() will encode
        # to US-ASCII.
        value = str(value)

    _headers = self._headers
    if "link" in _headers:
        _headers["link"] += ", " + value
    else:
        _headers["link"] = value