prompt: We are currently solving the following issue within our repository. Here is the issue text:
  --- BEGIN ISSUE ---
  Gzip Middleware content-length is incorrect
  The following exception is thrown when I use uvicorn to drive my starlette project. After control variates, I am sure this is caused by Gzip Middleware.
  
  ```
    File "C:\Users\AberS\Documents\Github\index.py\.venv\lib\site-packages\h11\_writers.py", line 102, in send_eom
      raise LocalProtocolError("Too little data for declared Content-Length") 
  h11._util.LocalProtocolError: Too little data for declared Content-Length
  ```
  
  
  --- END ISSUE ---
  
  Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
  --- BEGIN FILES ---
  Path: `starlette/middleware/base.py`
  Content:
  ```
  1 import typing
  2 
  3 import anyio
  4 
  5 from starlette.requests import Request
  6 from starlette.responses import Response, StreamingResponse
  7 from starlette.types import ASGIApp, Receive, Scope, Send
  8 
  9 RequestResponseEndpoint = typing.Callable[[Request], typing.Awaitable[Response]]
  10 DispatchFunction = typing.Callable[
  11     [Request, RequestResponseEndpoint], typing.Awaitable[Response]
  12 ]
  13 
  14 
  15 class BaseHTTPMiddleware:
  16     def __init__(
  17         self, app: ASGIApp, dispatch: typing.Optional[DispatchFunction] = None
  18     ) -> None:
  19         self.app = app
  20         self.dispatch_func = self.dispatch if dispatch is None else dispatch
  21 
  22     async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None:
  23         if scope["type"] != "http":
  24             await self.app(scope, receive, send)
  25             return
  26 
  27         async def call_next(request: Request) -> Response:
  28             app_exc: typing.Optional[Exception] = None
  29             send_stream, recv_stream = anyio.create_memory_object_stream()
  30 
  31             async def coro() -> None:
  32                 nonlocal app_exc
  33 
  34                 async with send_stream:
  35                     try:
  36                         await self.app(scope, request.receive, send_stream.send)
  37                     except Exception as exc:
  38                         app_exc = exc
  39 
  40             task_group.start_soon(coro)
  41 
  42             try:
  43                 message = await recv_stream.receive()
  44             except anyio.EndOfStream:
  45                 if app_exc is not None:
  46                     raise app_exc
  47                 raise RuntimeError("No response returned.")
  48 
  49             assert message["type"] == "http.response.start"
  50 
  51             async def body_stream() -> typing.AsyncGenerator[bytes, None]:
  52                 async with recv_stream:
  53                     async for message in recv_stream:
  54                         assert message["type"] == "http.response.body"
  55                         yield message.get("body", b"")
  56 
  57                 if app_exc is not None:
  58                     raise app_exc
  59 
  60             response = StreamingResponse(
  61                 status_code=message["status"], content=body_stream()
  62             )
  63             response.raw_headers = message["headers"]
  64             return response
  65 
  66         async with anyio.create_task_group() as task_group:
  67             request = Request(scope, receive=receive)
  68             response = await self.dispatch_func(request, call_next)
  69             await response(scope, receive, send)
  70             task_group.cancel_scope.cancel()
  71 
  72     async def dispatch(
  73         self, request: Request, call_next: RequestResponseEndpoint
  74     ) -> Response:
  75         raise NotImplementedError()  # pragma: no cover
  76
  ```
  --- END FILES ---
  
  Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.
  
  Here is an example:
  
  ```diff
  diff --git a/examples/server_async.py b/examples/server_async.py
  --- a/examples/server_async.py
  +++ b/examples/server_async.py
  @@ -313,4 +313,4 @@
   
   
   if __name__ == "__main__":
  -    asyncio.run(run_async_server("."), debug=True)
  +    asyncio.run(run_async_server(), debug=True)
  diff --git a/examples/server_sync.py b/examples/server_sync.py
  --- a/examples/server_sync.py
  +++ b/examples/server_sync.py
  @@ -313,5 +313,5 @@
   
   
   if __name__ == "__main__":
  -    server = run_sync_server(".")
  +    server = run_sync_server()
       server.shutdown()
  
  ```
  
golden_diff: diff --git a/starlette/middleware/base.py b/starlette/middleware/base.py
  --- a/starlette/middleware/base.py
  +++ b/starlette/middleware/base.py
  @@ -52,7 +52,11 @@
                   async with recv_stream:
                       async for message in recv_stream:
                           assert message["type"] == "http.response.body"
  -                        yield message.get("body", b"")
  +                        body = message.get("body", b"")
  +                        if body:
  +                            yield body
  +                        if not message.get("more_body", False):
  +                            break
   
                   if app_exc is not None:
                       raise app_exc
  
verification_info: {"golden_diff": "diff --git a/starlette/middleware/base.py b/starlette/middleware/base.py\n--- a/starlette/middleware/base.py\n+++ b/starlette/middleware/base.py\n@@ -52,7 +52,11 @@\n                 async with recv_stream:\n                     async for message in recv_stream:\n                         assert message[\"type\"] == \"http.response.body\"\n-                        yield message.get(\"body\", b\"\")\n+                        body = message.get(\"body\", b\"\")\n+                        if body:\n+                            yield body\n+                        if not message.get(\"more_body\", False):\n+                            break\n \n                 if app_exc is not None:\n                     raise app_exc\n", "issue": "Gzip Middleware content-length is incorrect\nThe following exception is thrown when I use uvicorn to drive my starlette project. After control variates, I am sure this is caused by Gzip Middleware.\r\n\r\n```\r\n  File \"C:\\Users\\AberS\\Documents\\Github\\index.py\\.venv\\lib\\site-packages\\h11\\_writers.py\", line 102, in send_eom\r\n    raise LocalProtocolError(\"Too little data for declared Content-Length\") \r\nh11._util.LocalProtocolError: Too little data for declared Content-Length\r\n```\r\n\n", "before_files": [{"content": "import typing\n\nimport anyio\n\nfrom starlette.requests import Request\nfrom starlette.responses import Response, StreamingResponse\nfrom starlette.types import ASGIApp, Receive, Scope, Send\n\nRequestResponseEndpoint = typing.Callable[[Request], typing.Awaitable[Response]]\nDispatchFunction = typing.Callable[\n    [Request, RequestResponseEndpoint], typing.Awaitable[Response]\n]\n\n\nclass BaseHTTPMiddleware:\n    def __init__(\n        self, app: ASGIApp, dispatch: typing.Optional[DispatchFunction] = None\n    ) -> None:\n        self.app = app\n        self.dispatch_func = self.dispatch if dispatch is None else dispatch\n\n    async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None:\n        if scope[\"type\"] != \"http\":\n            await self.app(scope, receive, send)\n            return\n\n        async def call_next(request: Request) -> Response:\n            app_exc: typing.Optional[Exception] = None\n            send_stream, recv_stream = anyio.create_memory_object_stream()\n\n            async def coro() -> None:\n                nonlocal app_exc\n\n                async with send_stream:\n                    try:\n                        await self.app(scope, request.receive, send_stream.send)\n                    except Exception as exc:\n                        app_exc = exc\n\n            task_group.start_soon(coro)\n\n            try:\n                message = await recv_stream.receive()\n            except anyio.EndOfStream:\n                if app_exc is not None:\n                    raise app_exc\n                raise RuntimeError(\"No response returned.\")\n\n            assert message[\"type\"] == \"http.response.start\"\n\n            async def body_stream() -> typing.AsyncGenerator[bytes, None]:\n                async with recv_stream:\n                    async for message in recv_stream:\n                        assert message[\"type\"] == \"http.response.body\"\n                        yield message.get(\"body\", b\"\")\n\n                if app_exc is not None:\n                    raise app_exc\n\n            response = StreamingResponse(\n                status_code=message[\"status\"], content=body_stream()\n            )\n            response.raw_headers = message[\"headers\"]\n            return response\n\n        async with anyio.create_task_group() as task_group:\n            request = Request(scope, receive=receive)\n            response = await self.dispatch_func(request, call_next)\n            await response(scope, receive, send)\n            task_group.cancel_scope.cancel()\n\n    async def dispatch(\n        self, request: Request, call_next: RequestResponseEndpoint\n    ) -> Response:\n        raise NotImplementedError()  # pragma: no cover\n", "path": "starlette/middleware/base.py"}], "after_files": [{"content": "import typing\n\nimport anyio\n\nfrom starlette.requests import Request\nfrom starlette.responses import Response, StreamingResponse\nfrom starlette.types import ASGIApp, Receive, Scope, Send\n\nRequestResponseEndpoint = typing.Callable[[Request], typing.Awaitable[Response]]\nDispatchFunction = typing.Callable[\n    [Request, RequestResponseEndpoint], typing.Awaitable[Response]\n]\n\n\nclass BaseHTTPMiddleware:\n    def __init__(\n        self, app: ASGIApp, dispatch: typing.Optional[DispatchFunction] = None\n    ) -> None:\n        self.app = app\n        self.dispatch_func = self.dispatch if dispatch is None else dispatch\n\n    async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None:\n        if scope[\"type\"] != \"http\":\n            await self.app(scope, receive, send)\n            return\n\n        async def call_next(request: Request) -> Response:\n            app_exc: typing.Optional[Exception] = None\n            send_stream, recv_stream = anyio.create_memory_object_stream()\n\n            async def coro() -> None:\n                nonlocal app_exc\n\n                async with send_stream:\n                    try:\n                        await self.app(scope, request.receive, send_stream.send)\n                    except Exception as exc:\n                        app_exc = exc\n\n            task_group.start_soon(coro)\n\n            try:\n                message = await recv_stream.receive()\n            except anyio.EndOfStream:\n                if app_exc is not None:\n                    raise app_exc\n                raise RuntimeError(\"No response returned.\")\n\n            assert message[\"type\"] == \"http.response.start\"\n\n            async def body_stream() -> typing.AsyncGenerator[bytes, None]:\n                async with recv_stream:\n                    async for message in recv_stream:\n                        assert message[\"type\"] == \"http.response.body\"\n                        body = message.get(\"body\", b\"\")\n                        if body:\n                            yield body\n                        if not message.get(\"more_body\", False):\n                            break\n\n                if app_exc is not None:\n                    raise app_exc\n\n            response = StreamingResponse(\n                status_code=message[\"status\"], content=body_stream()\n            )\n            response.raw_headers = message[\"headers\"]\n            return response\n\n        async with anyio.create_task_group() as task_group:\n            request = Request(scope, receive=receive)\n            response = await self.dispatch_func(request, call_next)\n            await response(scope, receive, send)\n            task_group.cancel_scope.cancel()\n\n    async def dispatch(\n        self, request: Request, call_next: RequestResponseEndpoint\n    ) -> Response:\n        raise NotImplementedError()  # pragma: no cover\n", "path": "starlette/middleware/base.py"}]}