We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Incorrect requirements.txt formatting in poetry export 
The `requirements.txt` format needs to put a space in front of the semicolon that specifies the package and the pyversion and platform constraints.  Right now, without the space, the semicolon will be interpreted as part of a URL.  See this issue in `packaging`:
https://github.com/pypa/packaging/issues/456

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `poetry/utils/exporter.py`
Content:
```
1 import urllib.parse
2 
3 from pathlib import Path
4 from typing import Optional
5 from typing import Sequence
6 from typing import Union
7 
8 from cleo.io.io import IO
9 
10 from poetry.core.packages.utils.utils import path_to_url
11 from poetry.poetry import Poetry
12 from poetry.utils._compat import decode
13 
14 
15 class Exporter:
16     """
17     Exporter class to export a lock file to alternative formats.
18     """
19 
20     FORMAT_REQUIREMENTS_TXT = "requirements.txt"
21     #: The names of the supported export formats.
22     ACCEPTED_FORMATS = (FORMAT_REQUIREMENTS_TXT,)
23     ALLOWED_HASH_ALGORITHMS = ("sha256", "sha384", "sha512")
24 
25     def __init__(self, poetry: Poetry) -> None:
26         self._poetry = poetry
27 
28     def export(
29         self,
30         fmt: str,
31         cwd: Path,
32         output: Union[IO, str],
33         with_hashes: bool = True,
34         dev: bool = False,
35         extras: Optional[Union[bool, Sequence[str]]] = None,
36         with_credentials: bool = False,
37     ) -> None:
38         if fmt not in self.ACCEPTED_FORMATS:
39             raise ValueError(f"Invalid export format: {fmt}")
40 
41         getattr(self, "_export_{}".format(fmt.replace(".", "_")))(
42             cwd,
43             output,
44             with_hashes=with_hashes,
45             dev=dev,
46             extras=extras,
47             with_credentials=with_credentials,
48         )
49 
50     def _export_requirements_txt(
51         self,
52         cwd: Path,
53         output: Union[IO, str],
54         with_hashes: bool = True,
55         dev: bool = False,
56         extras: Optional[Union[bool, Sequence[str]]] = None,
57         with_credentials: bool = False,
58     ) -> None:
59         indexes = set()
60         content = ""
61         dependency_lines = set()
62 
63         for dependency_package in self._poetry.locker.get_project_dependency_packages(
64             project_requires=self._poetry.package.all_requires, dev=dev, extras=extras
65         ):
66             line = ""
67 
68             dependency = dependency_package.dependency
69             package = dependency_package.package
70 
71             if package.develop:
72                 line += "-e "
73 
74             requirement = dependency.to_pep_508(with_extras=False)
75             is_direct_local_reference = (
76                 dependency.is_file() or dependency.is_directory()
77             )
78             is_direct_remote_reference = dependency.is_vcs() or dependency.is_url()
79 
80             if is_direct_remote_reference:
81                 line = requirement
82             elif is_direct_local_reference:
83                 dependency_uri = path_to_url(dependency.source_url)
84                 line = f"{dependency.name} @ {dependency_uri}"
85             else:
86                 line = f"{package.name}=={package.version}"
87 
88             if not is_direct_remote_reference:
89                 if ";" in requirement:
90                     markers = requirement.split(";", 1)[1].strip()
91                     if markers:
92                         line += f"; {markers}"
93 
94             if (
95                 not is_direct_remote_reference
96                 and not is_direct_local_reference
97                 and package.source_url
98             ):
99                 indexes.add(package.source_url)
100 
101             if package.files and with_hashes:
102                 hashes = []
103                 for f in package.files:
104                     h = f["hash"]
105                     algorithm = "sha256"
106                     if ":" in h:
107                         algorithm, h = h.split(":")
108 
109                         if algorithm not in self.ALLOWED_HASH_ALGORITHMS:
110                             continue
111 
112                     hashes.append(f"{algorithm}:{h}")
113 
114                 if hashes:
115                     line += " \\\n"
116                     for i, h in enumerate(hashes):
117                         line += "    --hash={}{}".format(
118                             h, " \\\n" if i < len(hashes) - 1 else ""
119                         )
120             dependency_lines.add(line)
121 
122         content += "\n".join(sorted(dependency_lines))
123         content += "\n"
124 
125         if indexes:
126             # If we have extra indexes, we add them to the beginning of the output
127             indexes_header = ""
128             for index in sorted(indexes):
129                 repositories = [
130                     r
131                     for r in self._poetry.pool.repositories
132                     if r.url == index.rstrip("/")
133                 ]
134                 if not repositories:
135                     continue
136                 repository = repositories[0]
137                 if (
138                     self._poetry.pool.has_default()
139                     and repository is self._poetry.pool.repositories[0]
140                 ):
141                     url = (
142                         repository.authenticated_url
143                         if with_credentials
144                         else repository.url
145                     )
146                     indexes_header = f"--index-url {url}\n"
147                     continue
148 
149                 url = (
150                     repository.authenticated_url if with_credentials else repository.url
151                 )
152                 parsed_url = urllib.parse.urlsplit(url)
153                 if parsed_url.scheme == "http":
154                     indexes_header += f"--trusted-host {parsed_url.netloc}\n"
155                 indexes_header += f"--extra-index-url {url}\n"
156 
157             content = indexes_header + "\n" + content
158 
159         self._output(content, cwd, output)
160 
161     def _output(self, content: str, cwd: Path, output: Union[IO, str]) -> None:
162         decoded = decode(content)
163         try:
164             output.write(decoded)
165         except AttributeError:
166             filepath = cwd / output
167             with filepath.open("w", encoding="utf-8") as f:
168                 f.write(decoded)
169
```
--- 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()

```

diff --git a/poetry/utils/exporter.py b/poetry/utils/exporter.py
--- a/poetry/utils/exporter.py
+++ b/poetry/utils/exporter.py
@@ -89,7 +89,7 @@
                 if ";" in requirement:
                     markers = requirement.split(";", 1)[1].strip()
                     if markers:
-                        line += f"; {markers}"
+                        line += f" ; {markers}"
 
             if (
                 not is_direct_remote_reference

{"golden_diff": "diff --git a/poetry/utils/exporter.py b/poetry/utils/exporter.py\n--- a/poetry/utils/exporter.py\n+++ b/poetry/utils/exporter.py\n@@ -89,7 +89,7 @@\n                 if \";\" in requirement:\n                     markers = requirement.split(\";\", 1)[1].strip()\n                     if markers:\n-                        line += f\"; {markers}\"\n+                        line += f\" ; {markers}\"\n \n             if (\n                 not is_direct_remote_reference\n", "issue": "Incorrect requirements.txt formatting in poetry export \nThe `requirements.txt` format needs to put a space in front of the semicolon that specifies the package and the pyversion and platform constraints.  Right now, without the space, the semicolon will be interpreted as part of a URL.  See this issue in `packaging`:\r\nhttps://github.com/pypa/packaging/issues/456\n", "before_files": [{"content": "import urllib.parse\n\nfrom pathlib import Path\nfrom typing import Optional\nfrom typing import Sequence\nfrom typing import Union\n\nfrom cleo.io.io import IO\n\nfrom poetry.core.packages.utils.utils import path_to_url\nfrom poetry.poetry import Poetry\nfrom poetry.utils._compat import decode\n\n\nclass Exporter:\n    \"\"\"\n    Exporter class to export a lock file to alternative formats.\n    \"\"\"\n\n    FORMAT_REQUIREMENTS_TXT = \"requirements.txt\"\n    #: The names of the supported export formats.\n    ACCEPTED_FORMATS = (FORMAT_REQUIREMENTS_TXT,)\n    ALLOWED_HASH_ALGORITHMS = (\"sha256\", \"sha384\", \"sha512\")\n\n    def __init__(self, poetry: Poetry) -> None:\n        self._poetry = poetry\n\n    def export(\n        self,\n        fmt: str,\n        cwd: Path,\n        output: Union[IO, str],\n        with_hashes: bool = True,\n        dev: bool = False,\n        extras: Optional[Union[bool, Sequence[str]]] = None,\n        with_credentials: bool = False,\n    ) -> None:\n        if fmt not in self.ACCEPTED_FORMATS:\n            raise ValueError(f\"Invalid export format: {fmt}\")\n\n        getattr(self, \"_export_{}\".format(fmt.replace(\".\", \"_\")))(\n            cwd,\n            output,\n            with_hashes=with_hashes,\n            dev=dev,\n            extras=extras,\n            with_credentials=with_credentials,\n        )\n\n    def _export_requirements_txt(\n        self,\n        cwd: Path,\n        output: Union[IO, str],\n        with_hashes: bool = True,\n        dev: bool = False,\n        extras: Optional[Union[bool, Sequence[str]]] = None,\n        with_credentials: bool = False,\n    ) -> None:\n        indexes = set()\n        content = \"\"\n        dependency_lines = set()\n\n        for dependency_package in self._poetry.locker.get_project_dependency_packages(\n            project_requires=self._poetry.package.all_requires, dev=dev, extras=extras\n        ):\n            line = \"\"\n\n            dependency = dependency_package.dependency\n            package = dependency_package.package\n\n            if package.develop:\n                line += \"-e \"\n\n            requirement = dependency.to_pep_508(with_extras=False)\n            is_direct_local_reference = (\n                dependency.is_file() or dependency.is_directory()\n            )\n            is_direct_remote_reference = dependency.is_vcs() or dependency.is_url()\n\n            if is_direct_remote_reference:\n                line = requirement\n            elif is_direct_local_reference:\n                dependency_uri = path_to_url(dependency.source_url)\n                line = f\"{dependency.name} @ {dependency_uri}\"\n            else:\n                line = f\"{package.name}=={package.version}\"\n\n            if not is_direct_remote_reference:\n                if \";\" in requirement:\n                    markers = requirement.split(\";\", 1)[1].strip()\n                    if markers:\n                        line += f\"; {markers}\"\n\n            if (\n                not is_direct_remote_reference\n                and not is_direct_local_reference\n                and package.source_url\n            ):\n                indexes.add(package.source_url)\n\n            if package.files and with_hashes:\n                hashes = []\n                for f in package.files:\n                    h = f[\"hash\"]\n                    algorithm = \"sha256\"\n                    if \":\" in h:\n                        algorithm, h = h.split(\":\")\n\n                        if algorithm not in self.ALLOWED_HASH_ALGORITHMS:\n                            continue\n\n                    hashes.append(f\"{algorithm}:{h}\")\n\n                if hashes:\n                    line += \" \\\\\\n\"\n                    for i, h in enumerate(hashes):\n                        line += \"    --hash={}{}\".format(\n                            h, \" \\\\\\n\" if i < len(hashes) - 1 else \"\"\n                        )\n            dependency_lines.add(line)\n\n        content += \"\\n\".join(sorted(dependency_lines))\n        content += \"\\n\"\n\n        if indexes:\n            # If we have extra indexes, we add them to the beginning of the output\n            indexes_header = \"\"\n            for index in sorted(indexes):\n                repositories = [\n                    r\n                    for r in self._poetry.pool.repositories\n                    if r.url == index.rstrip(\"/\")\n                ]\n                if not repositories:\n                    continue\n                repository = repositories[0]\n                if (\n                    self._poetry.pool.has_default()\n                    and repository is self._poetry.pool.repositories[0]\n                ):\n                    url = (\n                        repository.authenticated_url\n                        if with_credentials\n                        else repository.url\n                    )\n                    indexes_header = f\"--index-url {url}\\n\"\n                    continue\n\n                url = (\n                    repository.authenticated_url if with_credentials else repository.url\n                )\n                parsed_url = urllib.parse.urlsplit(url)\n                if parsed_url.scheme == \"http\":\n                    indexes_header += f\"--trusted-host {parsed_url.netloc}\\n\"\n                indexes_header += f\"--extra-index-url {url}\\n\"\n\n            content = indexes_header + \"\\n\" + content\n\n        self._output(content, cwd, output)\n\n    def _output(self, content: str, cwd: Path, output: Union[IO, str]) -> None:\n        decoded = decode(content)\n        try:\n            output.write(decoded)\n        except AttributeError:\n            filepath = cwd / output\n            with filepath.open(\"w\", encoding=\"utf-8\") as f:\n                f.write(decoded)\n", "path": "poetry/utils/exporter.py"}], "after_files": [{"content": "import urllib.parse\n\nfrom pathlib import Path\nfrom typing import Optional\nfrom typing import Sequence\nfrom typing import Union\n\nfrom cleo.io.io import IO\n\nfrom poetry.core.packages.utils.utils import path_to_url\nfrom poetry.poetry import Poetry\nfrom poetry.utils._compat import decode\n\n\nclass Exporter:\n    \"\"\"\n    Exporter class to export a lock file to alternative formats.\n    \"\"\"\n\n    FORMAT_REQUIREMENTS_TXT = \"requirements.txt\"\n    #: The names of the supported export formats.\n    ACCEPTED_FORMATS = (FORMAT_REQUIREMENTS_TXT,)\n    ALLOWED_HASH_ALGORITHMS = (\"sha256\", \"sha384\", \"sha512\")\n\n    def __init__(self, poetry: Poetry) -> None:\n        self._poetry = poetry\n\n    def export(\n        self,\n        fmt: str,\n        cwd: Path,\n        output: Union[IO, str],\n        with_hashes: bool = True,\n        dev: bool = False,\n        extras: Optional[Union[bool, Sequence[str]]] = None,\n        with_credentials: bool = False,\n    ) -> None:\n        if fmt not in self.ACCEPTED_FORMATS:\n            raise ValueError(f\"Invalid export format: {fmt}\")\n\n        getattr(self, \"_export_{}\".format(fmt.replace(\".\", \"_\")))(\n            cwd,\n            output,\n            with_hashes=with_hashes,\n            dev=dev,\n            extras=extras,\n            with_credentials=with_credentials,\n        )\n\n    def _export_requirements_txt(\n        self,\n        cwd: Path,\n        output: Union[IO, str],\n        with_hashes: bool = True,\n        dev: bool = False,\n        extras: Optional[Union[bool, Sequence[str]]] = None,\n        with_credentials: bool = False,\n    ) -> None:\n        indexes = set()\n        content = \"\"\n        dependency_lines = set()\n\n        for dependency_package in self._poetry.locker.get_project_dependency_packages(\n            project_requires=self._poetry.package.all_requires, dev=dev, extras=extras\n        ):\n            line = \"\"\n\n            dependency = dependency_package.dependency\n            package = dependency_package.package\n\n            if package.develop:\n                line += \"-e \"\n\n            requirement = dependency.to_pep_508(with_extras=False)\n            is_direct_local_reference = (\n                dependency.is_file() or dependency.is_directory()\n            )\n            is_direct_remote_reference = dependency.is_vcs() or dependency.is_url()\n\n            if is_direct_remote_reference:\n                line = requirement\n            elif is_direct_local_reference:\n                dependency_uri = path_to_url(dependency.source_url)\n                line = f\"{dependency.name} @ {dependency_uri}\"\n            else:\n                line = f\"{package.name}=={package.version}\"\n\n            if not is_direct_remote_reference:\n                if \";\" in requirement:\n                    markers = requirement.split(\";\", 1)[1].strip()\n                    if markers:\n                        line += f\" ; {markers}\"\n\n            if (\n                not is_direct_remote_reference\n                and not is_direct_local_reference\n                and package.source_url\n            ):\n                indexes.add(package.source_url)\n\n            if package.files and with_hashes:\n                hashes = []\n                for f in package.files:\n                    h = f[\"hash\"]\n                    algorithm = \"sha256\"\n                    if \":\" in h:\n                        algorithm, h = h.split(\":\")\n\n                        if algorithm not in self.ALLOWED_HASH_ALGORITHMS:\n                            continue\n\n                    hashes.append(f\"{algorithm}:{h}\")\n\n                if hashes:\n                    line += \" \\\\\\n\"\n                    for i, h in enumerate(hashes):\n                        line += \"    --hash={}{}\".format(\n                            h, \" \\\\\\n\" if i < len(hashes) - 1 else \"\"\n                        )\n            dependency_lines.add(line)\n\n        content += \"\\n\".join(sorted(dependency_lines))\n        content += \"\\n\"\n\n        if indexes:\n            # If we have extra indexes, we add them to the beginning of the output\n            indexes_header = \"\"\n            for index in sorted(indexes):\n                repositories = [\n                    r\n                    for r in self._poetry.pool.repositories\n                    if r.url == index.rstrip(\"/\")\n                ]\n                if not repositories:\n                    continue\n                repository = repositories[0]\n                if (\n                    self._poetry.pool.has_default()\n                    and repository is self._poetry.pool.repositories[0]\n                ):\n                    url = (\n                        repository.authenticated_url\n                        if with_credentials\n                        else repository.url\n                    )\n                    indexes_header = f\"--index-url {url}\\n\"\n                    continue\n\n                url = (\n                    repository.authenticated_url if with_credentials else repository.url\n                )\n                parsed_url = urllib.parse.urlsplit(url)\n                if parsed_url.scheme == \"http\":\n                    indexes_header += f\"--trusted-host {parsed_url.netloc}\\n\"\n                indexes_header += f\"--extra-index-url {url}\\n\"\n\n            content = indexes_header + \"\\n\" + content\n\n        self._output(content, cwd, output)\n\n    def _output(self, content: str, cwd: Path, output: Union[IO, str]) -> None:\n        decoded = decode(content)\n        try:\n            output.write(decoded)\n        except AttributeError:\n            filepath = cwd / output\n            with filepath.open(\"w\", encoding=\"utf-8\") as f:\n                f.write(decoded)\n", "path": "poetry/utils/exporter.py"}]}