[BUG] Empty query params are discarded · Issue #894 · Azure/azure-functions-python-worker (original) (raw)

Investigative information

Repro steps

Provide the steps required to reproduce the problem:
  1. Create simple function:
    __init__.py
    import azure.functions
    def main(req: azure.functions.HttpRequest):
    return str(req.params)
    function.json
    {
    "scriptFile": "init.py",
    "bindings": [
    {
    "authLevel": "anonymous",
    "type": "httpTrigger",
    "direction": "in",
    "name": "req",
    "methods": [
    "get",
    "post"
    ]
    },
    {
    "type": "http",
    "direction": "out",
    "name": "$return"
    }
    ]
    }
  2. Access function URL with query params ?paramwithvalue=foo&paramwithoutvalue
  3. {"paramwithvalue": "foo"} is returned

Expected behavior

I would expect the HttpRequest.params to contain all query params, defaulting to either a value of None or an empty string:

{ "paramwithvalue": "foo", "paramwithoutvalue": "" }

Actual behavior

The query parameter is silently discarded:

{ "paramwithvalue": "foo" }

Known workarounds

The query param can be retrieved via urllib.parse.parse_qs from the HttpRequest.urlobject:

__init__.py

from urllib.parse import parse_qs, urlparse

import azure.functions

def main(req: azure.functions.HttpRequest): return str(parse_qs(urlparse(req.url).query, keep_blank_values=True))

This will return the full set of params:

"{'paramwithvalue': ['foo'], 'paramwithoutvalue': ['']}"

Contents of the requirements.txt file:

This seems to be an underlying issue in the protobuf implementation and was already fixed in Azure/azure-functions-language-worker-protobuf#49