include::../description.adoc[]

include::../how-to-fix-it.adoc[]

=== Code examples

==== Noncompliant code example

[source,python,diff-id=1,diff-type=noncompliant]
----
from http.server import BaseHTTPRequestHandler
from urllib.parse import urlparse, parse_qs

class ReqHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        parsed = urlparse(self.path)
        params = parse_qs(parsed.query)
        self.send_response(200)
        self.send_header("Content-Type", params.get('accept')[0]) # Noncompliant
        self.end_headers()
        self.wfile.write(bytes("Hello World!", "utf-8"))
----

==== Compliant solution

[source,python,diff-id=1,diff-type=compliant]
----
from http.server import BaseHTTPRequestHandler
from urllib.parse import urlparse, parse_qs, quote

class ReqHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        parsed = urlparse(self.path)
        params = parse_qs(parsed.query)
        self.send_response(200)
        self.send_header("Content-Type", quote(params.get('accept')[0])) # Compliant
        self.end_headers()
        self.wfile.write(bytes("Hello World!", "utf-8"))
----

=== How does this work?

By applying a URL encoding to an untrusted header value, the application ensures that all special characters are properly escaped before they are added to the HTTP response. Especially `\r` (Carriage Return) and `\n` (Line Feed) characters will be encoded to `%0D` and `%OA` and won't be able to alter the HTTP response's semantics.

//=== Pitfalls

//=== Going the extra mile


//== Resources

include::../see.adoc[]

//=== Documentation
//=== Articles & blog posts
//=== Conference presentations
//=== Standards
//=== External coding guidelines
//=== Benchmarks


ifdef::env-github,rspecator-view[]

'''
== Implementation Specification
(visible only on this page)

=== Message

Change this code to not set an HTTP response header based on a user-controlled
value.

=== Highlighting

Highlight the tainted argument in the sink parameters.

endif::env-github,rspecator-view[]
