← Back to team overview

launchpad-reviewers team mailing list archive

[Merge] ~ilkeremrekoc/launchpad:upgrade-multipart into launchpad:master

 

İlker Emre Koç has proposed merging ~ilkeremrekoc/launchpad:upgrade-multipart into launchpad:master.

Commit message:
upgrade multipart from 0.2.4 to 1.2.1

Requested reviews:
  Launchpad code reviewers (launchpad-reviewers)

For more details, see:
https://code.launchpad.net/~ilkeremrekoc/launchpad/+git/launchpad/+merge/479445

- Upgraded multipart from 0.2.4 to 1.2.1
- Fixed broken http request formats of some doctests that the new multipart version rejects.

-- 
Your team Launchpad code reviewers is requested to review the proposed merge of ~ilkeremrekoc/launchpad:upgrade-multipart into launchpad:master.
diff --git a/lib/lp/blueprints/stories/blueprints/xx-productseries.rst b/lib/lp/blueprints/stories/blueprints/xx-productseries.rst
index d239261..6b66a77 100644
--- a/lib/lp/blueprints/stories/blueprints/xx-productseries.rst
+++ b/lib/lp/blueprints/stories/blueprints/xx-productseries.rst
@@ -48,30 +48,28 @@ so the targeting should NOT be automatically approved.
 
     >>> print(
     ...     http(
-    ...         r"""
-    ... POST /firefox/+spec/svg-support/+setproductseries HTTP/1.1
-    ... Authorization: Basic celso.providelo@xxxxxxxxxxxxx:test
-    ... Referer: https://launchpad.test/
-    ... Content-Type: multipart/form-data; boundary=---------------------------26999413214087432371486976730
-    ...
-    ... -----------------------------26999413214087432371486976730
-    ... Content-Disposition: form-data; name="field.productseries"
-    ...
-    ... 2
-    ... -----------------------------26999413214087432371486976730
-    ... Content-Disposition: form-data; name="field.productseries-empty-marker"
-    ...
-    ... 1
-    ... -----------------------------26999413214087432371486976730
-    ... Content-Disposition: form-data; name="field.whiteboard"
-    ...
-    ... would be great to have, but has high risk
-    ... -----------------------------26999413214087432371486976730
-    ... Content-Disposition: form-data; name="field.actions.continue"
-    ...
-    ... Continue
-    ... -----------------------------26999413214087432371486976730--
-    ... """
+    ...         "POST /firefox/+spec/svg-support/+setproductseries HTTP/1.1\r\n"
+    ...         + "Authorization: Basic celso.providelo@xxxxxxxxxxxxx:test\r\n"
+    ...         + "Referer: https://launchpad.test/\r\n";
+    ...         + "Content-Type: multipart/form-data; boundary=---------------------------26999413214087432371486976730\r\n"
+    ...         + "\r\n"
+    ...         + "-----------------------------26999413214087432371486976730\r\n"
+    ...         + 'Content-Disposition: form-data; name="field.productseries"\r\n'
+    ...         + "\r\n"
+    ...         + "2\r\n"
+    ...         + "-----------------------------26999413214087432371486976730\r\n"
+    ...         + 'Content-Disposition: form-data; name="field.productseries-empty-marker"\r\n'
+    ...         + "\r\n"
+    ...         + "1\r\n"
+    ...         + "-----------------------------26999413214087432371486976730\r\n"
+    ...         + 'Content-Disposition: form-data; name="field.whiteboard"\r\n'
+    ...         + "\r\n"
+    ...         + "would be great to have, but has high risk\r\n"
+    ...         + "-----------------------------26999413214087432371486976730\r\n"
+    ...         + 'Content-Disposition: form-data; name="field.actions.continue"\r\n'
+    ...         + "\r\n"
+    ...         + "Continue\r\n"
+    ...         + "-----------------------------26999413214087432371486976730--\r\n"
     ...     )
     ... )  # noqa
     HTTP/1.1 303 See Other
@@ -101,30 +99,28 @@ OK, we will also pitch the e4x spec to the same series:
 
     >>> print(
     ...     http(
-    ...         r"""
-    ... POST /firefox/+spec/e4x/+setproductseries HTTP/1.1
-    ... Authorization: Basic celso.providelo@xxxxxxxxxxxxx:test
-    ... Referer: https://launchpad.test/
-    ... Content-Type: multipart/form-data; boundary=---------------------------26999413214087432371486976730
-    ...
-    ... -----------------------------26999413214087432371486976730
-    ... Content-Disposition: form-data; name="field.productseries"
-    ...
-    ... 2
-    ... -----------------------------26999413214087432371486976730
-    ... Content-Disposition: form-data; name="field.productseries-empty-marker"
-    ...
-    ... 1
-    ... -----------------------------26999413214087432371486976730
-    ... Content-Disposition: form-data; name="field.whiteboard"
-    ...
-    ... would be great to have, but has high risk
-    ... -----------------------------26999413214087432371486976730
-    ... Content-Disposition: form-data; name="field.actions.continue"
-    ...
-    ... Continue
-    ... -----------------------------26999413214087432371486976730--
-    ... """
+    ...         "POST /firefox/+spec/e4x/+setproductseries HTTP/1.1\r\n"
+    ...         + "Authorization: Basic celso.providelo@xxxxxxxxxxxxx:test\r\n"
+    ...         + "Referer: https://launchpad.test/\r\n";
+    ...         + "Content-Type: multipart/form-data; boundary=---------------------------26999413214087432371486976730\r\n"
+    ...         + "\r\n"
+    ...         + "-----------------------------26999413214087432371486976730\r\n"
+    ...         + 'Content-Disposition: form-data; name="field.productseries"\r\n'
+    ...         + "\r\n"
+    ...         + "2\r\n"
+    ...         + "-----------------------------26999413214087432371486976730\r\n"
+    ...         + 'Content-Disposition: form-data; name="field.productseries-empty-marker"\r\n'
+    ...         + "\r\n"
+    ...         + "1\r\n"
+    ...         + "-----------------------------26999413214087432371486976730\r\n"
+    ...         + 'Content-Disposition: form-data; name="field.whiteboard"\r\n'
+    ...         + "\r\n"
+    ...         + "would be great to have, but has high risk\r\n"
+    ...         + "-----------------------------26999413214087432371486976730\r\n"
+    ...         + 'Content-Disposition: form-data; name="field.actions.continue"\r\n'
+    ...         + "\r\n"
+    ...         + "Continue\r\n"
+    ...         + "-----------------------------26999413214087432371486976730--\r\n"
     ...     )
     ... )  # noqa
     HTTP/1.1 303 See Other
@@ -209,30 +205,28 @@ because we are an admin, then we will move it back.
 
     >>> print(
     ...     http(
-    ...         r"""
-    ... POST /firefox/+spec/svg-support/+setproductseries HTTP/1.1
-    ... Authorization: Basic Zm9vLmJhckBjYW5vbmljYWwuY29tOnRlc3Q=
-    ... Referer: https://launchpad.test/
-    ... Content-Type: multipart/form-data; boundary=---------------------------26999413214087432371486976730
-    ...
-    ... -----------------------------26999413214087432371486976730
-    ... Content-Disposition: form-data; name="field.productseries"
-    ...
-    ... 1
-    ... -----------------------------26999413214087432371486976730
-    ... Content-Disposition: form-data; name="field.productseries-empty-marker"
-    ...
-    ... 1
-    ... -----------------------------26999413214087432371486976730
-    ... Content-Disposition: form-data; name="field.whiteboard"
-    ...
-    ... would be great to have, but has high risk
-    ... -----------------------------26999413214087432371486976730
-    ... Content-Disposition: form-data; name="field.actions.continue"
-    ...
-    ... Continue
-    ... -----------------------------26999413214087432371486976730--
-    ... """
+    ...         "POST /firefox/+spec/svg-support/+setproductseries HTTP/1.1\r\n"
+    ...         + "Authorization: Basic Zm9vLmJhckBjYW5vbmljYWwuY29tOnRlc3Q=\r\n"
+    ...         + "Referer: https://launchpad.test/\r\n";
+    ...         + "Content-Type: multipart/form-data; boundary=---------------------------26999413214087432371486976730\r\n"
+    ...         + "\r\n"
+    ...         + "-----------------------------26999413214087432371486976730\r\n"
+    ...         + 'Content-Disposition: form-data; name="field.productseries"\r\n'
+    ...         + "\r\n"
+    ...         + "1\r\n"
+    ...         + "-----------------------------26999413214087432371486976730\r\n"
+    ...         + 'Content-Disposition: form-data; name="field.productseries-empty-marker"\r\n'
+    ...         + "\r\n"
+    ...         + "1\r\n"
+    ...         + "-----------------------------26999413214087432371486976730\r\n"
+    ...         + 'Content-Disposition: form-data; name="field.whiteboard"\r\n'
+    ...         + "\r\n"
+    ...         + "would be great to have, but has high risk\r\n"
+    ...         + "-----------------------------26999413214087432371486976730\r\n"
+    ...         + 'Content-Disposition: form-data; name="field.actions.continue"\r\n'
+    ...         + "\r\n"
+    ...         + "Continue\r\n"
+    ...         + "-----------------------------26999413214087432371486976730--\r\n"
     ...     )
     ... )  # noqa
     HTTP/1.1 303 See Other
@@ -255,30 +249,28 @@ And lets put it back:
 
     >>> print(
     ...     http(
-    ...         r"""
-    ... POST /firefox/+spec/svg-support/+setproductseries HTTP/1.1
-    ... Authorization: Basic Zm9vLmJhckBjYW5vbmljYWwuY29tOnRlc3Q=
-    ... Referer: https://launchpad.test/
-    ... Content-Type: multipart/form-data; boundary=---------------------------26999413214087432371486976730
-    ...
-    ... -----------------------------26999413214087432371486976730
-    ... Content-Disposition: form-data; name="field.productseries"
-    ...
-    ... 2
-    ... -----------------------------26999413214087432371486976730
-    ... Content-Disposition: form-data; name="field.productseries-empty-marker"
-    ...
-    ... 1
-    ... -----------------------------26999413214087432371486976730
-    ... Content-Disposition: form-data; name="field.whiteboard"
-    ...
-    ... would be great to have, but has high risk
-    ... -----------------------------26999413214087432371486976730
-    ... Content-Disposition: form-data; name="field.actions.continue"
-    ...
-    ... Continue
-    ... -----------------------------26999413214087432371486976730--
-    ... """
+    ...         "POST /firefox/+spec/svg-support/+setproductseries HTTP/1.1\r\n"
+    ...         + "Authorization: Basic Zm9vLmJhckBjYW5vbmljYWwuY29tOnRlc3Q=\r\n"
+    ...         + "Referer: https://launchpad.test/\r\n";
+    ...         + "Content-Type: multipart/form-data; boundary=---------------------------26999413214087432371486976730\r\n"
+    ...         + "\r\n"
+    ...         + "-----------------------------26999413214087432371486976730\r\n"
+    ...         + 'Content-Disposition: form-data; name="field.productseries"\r\n'
+    ...         + "\r\n"
+    ...         + "2\r\n"
+    ...         + "-----------------------------26999413214087432371486976730\r\n"
+    ...         + 'Content-Disposition: form-data; name="field.productseries-empty-marker"\r\n'
+    ...         + "\r\n"
+    ...         + "1\r\n"
+    ...         + "-----------------------------26999413214087432371486976730\r\n"
+    ...         + 'Content-Disposition: form-data; name="field.whiteboard"\r\n'
+    ...         + "\r\n"
+    ...         + "would be great to have, but has high risk\r\n"
+    ...         + "-----------------------------26999413214087432371486976730\r\n"
+    ...         + 'Content-Disposition: form-data; name="field.actions.continue"\r\n'
+    ...         + "\r\n"
+    ...         + "Continue\r\n"
+    ...         + "-----------------------------26999413214087432371486976730--\r\n"
     ...     )
     ... )  # noqa
     HTTP/1.1 303 See Other
diff --git a/lib/lp/bugs/stories/bugs/xx-bugtask-assignee-widget.rst b/lib/lp/bugs/stories/bugs/xx-bugtask-assignee-widget.rst
index 99d759d..2492f18 100644
--- a/lib/lp/bugs/stories/bugs/xx-bugtask-assignee-widget.rst
+++ b/lib/lp/bugs/stories/bugs/xx-bugtask-assignee-widget.rst
@@ -20,62 +20,60 @@ button:
 
     >>> print(
     ...     http(
-    ...         rb"""
-    ... POST /ubuntu/+source/mozilla-firefox/+bug/1/+editstatus HTTP/1.1
-    ... Authorization: Basic Zm9vLmJhckBjYW5vbmljYWwuY29tOnRlc3Q=
-    ... Referer: https://launchpad.test/
-    ... Content-Type: multipart/form-data; boundary=---------------------------19759086281403130373932339922
-    ...
-    ... -----------------------------19759086281403130373932339922
-    ... Content-Disposition: form-data; name="ubuntu_mozilla-firefox.status"
-    ...
-    ... Confirmed
-    ... -----------------------------19759086281403130373932339922
-    ... Content-Disposition: form-data; name="ubuntu_mozilla-firefox.status-empty-marker"
-    ...
-    ... 1
-    ... -----------------------------19759086281403130373932339922
-    ... Content-Disposition: form-data; name="ubuntu_mozilla-firefox.importance"
-    ...
-    ... Low
-    ... -----------------------------19759086281403130373932339922
-    ... Content-Disposition: form-data; name="ubuntu_mozilla-firefox.importance-empty-marker"
-    ...
-    ... 1
-    ... -----------------------------19759086281403130373932339922
-    ... Content-Disposition: form-data; name="ubuntu_mozilla-firefox.milestone"
-    ...
-    ...
-    ... -----------------------------19759086281403130373932339922
-    ... Content-Disposition: form-data; name="ubuntu_mozilla-firefox.milestone-empty-marker"
-    ...
-    ... 1
-    ... -----------------------------19759086281403130373932339922
-    ... Content-Disposition: form-data; name="ubuntu_mozilla-firefox.sourcepackagename"
-    ...
-    ... mozilla-firefox
-    ... -----------------------------19759086281403130373932339922
-    ... Content-Disposition: form-data; name="ubuntu_mozilla-firefox.assignee.option"
-    ...
-    ... ubuntu_mozilla-firefox.assignee.assign_to_me
-    ... -----------------------------19759086281403130373932339922
-    ... Content-Disposition: form-data; name="ubuntu_mozilla-firefox.assignee"
-    ...
-    ...
-    ... -----------------------------19759086281403130373932339922
-    ... Content-Disposition: form-data; name="ubuntu_mozilla-firefox.bugwatch"
-    ...
-    ...
-    ... -----------------------------19759086281403130373932339922
-    ... Content-Disposition: form-data; name="ubuntu_mozilla-firefox.bugwatch-empty-marker"
-    ...
-    ... 1
-    ... -----------------------------19759086281403130373932339922
-    ... Content-Disposition: form-data; name="ubuntu_mozilla-firefox.actions.save"
-    ...
-    ... Save Changes
-    ... -----------------------------19759086281403130373932339922--
-    ... """
+    ...         "POST /ubuntu/+source/mozilla-firefox/+bug/1/+editstatus HTTP/1.1\r\n"
+    ...         + "Authorization: Basic Zm9vLmJhckBjYW5vbmljYWwuY29tOnRlc3Q=\r\n"
+    ...         + "Referer: https://launchpad.test/\r\n";
+    ...         + "Content-Type: multipart/form-data; boundary=---------------------------19759086281403130373932339922\r\n"
+    ...         + "\r\n"
+    ...         + "-----------------------------19759086281403130373932339922\r\n"
+    ...         + 'Content-Disposition: form-data; name="ubuntu_mozilla-firefox.status"\r\n'
+    ...         + "\r\n"
+    ...         + "Confirmed\r\n"
+    ...         + "-----------------------------19759086281403130373932339922\r\n"
+    ...         + 'Content-Disposition: form-data; name="ubuntu_mozilla-firefox.status-empty-marker"\r\n'
+    ...         + "\r\n"
+    ...         + "1\r\n"
+    ...         + "-----------------------------19759086281403130373932339922\r\n"
+    ...         + 'Content-Disposition: form-data; name="ubuntu_mozilla-firefox.importance"\r\n'
+    ...         + "\r\n"
+    ...         + "Low\r\n"
+    ...         + "-----------------------------19759086281403130373932339922\r\n"
+    ...         + 'Content-Disposition: form-data; name="ubuntu_mozilla-firefox.importance-empty-marker"\r\n'
+    ...         + "\r\n"
+    ...         + "1\r\n"
+    ...         + "-----------------------------19759086281403130373932339922\r\n"
+    ...         + 'Content-Disposition: form-data; name="ubuntu_mozilla-firefox.milestone"\r\n'
+    ...         + "\r\n"
+    ...         + "\r\n"
+    ...         + "-----------------------------19759086281403130373932339922\r\n"
+    ...         + 'Content-Disposition: form-data; name="ubuntu_mozilla-firefox.milestone-empty-marker"\r\n'
+    ...         + "\r\n"
+    ...         + "1\r\n"
+    ...         + "-----------------------------19759086281403130373932339922\r\n"
+    ...         + 'Content-Disposition: form-data; name="ubuntu_mozilla-firefox.sourcepackagename"\r\n'
+    ...         + "\r\n"
+    ...         + "mozilla-firefox\r\n"
+    ...         + "-----------------------------19759086281403130373932339922\r\n"
+    ...         + 'Content-Disposition: form-data; name="ubuntu_mozilla-firefox.assignee.option"\r\n'
+    ...         + "\r\n"
+    ...         + "ubuntu_mozilla-firefox.assignee.assign_to_me\r\n"
+    ...         + "-----------------------------19759086281403130373932339922\r\n"
+    ...         + 'Content-Disposition: form-data; name="ubuntu_mozilla-firefox.assignee"\r\n'
+    ...         + "\r\n"
+    ...         + "\r\n"
+    ...         + "-----------------------------19759086281403130373932339922\r\n"
+    ...         + 'Content-Disposition: form-data; name="ubuntu_mozilla-firefox.bugwatch"\r\n'
+    ...         + "\r\n"
+    ...         + "\r\n"
+    ...         + "-----------------------------19759086281403130373932339922\r\n"
+    ...         + 'Content-Disposition: form-data; name="ubuntu_mozilla-firefox.bugwatch-empty-marker"\r\n'
+    ...         + "\r\n"
+    ...         + "1\r\n"
+    ...         + "-----------------------------19759086281403130373932339922\r\n"
+    ...         + 'Content-Disposition: form-data; name="ubuntu_mozilla-firefox.actions.save"\r\n'
+    ...         + "\r\n"
+    ...         + "Save Changes\r\n"
+    ...         + "-----------------------------19759086281403130373932339922--\r\n"
     ...     )
     ... )  # noqa
     HTTP/1.1 303 See Other
@@ -101,63 +99,61 @@ But, you can also assign the task to another person, of course:
 
     >>> print(
     ...     http(
-    ...         rb"""
-    ... POST /ubuntu/+source/mozilla-firefox/+bug/1/+editstatus HTTP/1.1
-    ... Authorization: Basic Zm9vLmJhckBjYW5vbmljYWwuY29tOnRlc3Q=
-    ... Referer: https://launchpad.test/
-    ... Content-Length: 1999
-    ... Content-Type: multipart/form-data; boundary=---------------------------19759086281403130373932339922
-    ...
-    ... -----------------------------19759086281403130373932339922
-    ... Content-Disposition: form-data; name="ubuntu_mozilla-firefox.status"
-    ...
-    ... Confirmed
-    ... -----------------------------19759086281403130373932339922
-    ... Content-Disposition: form-data; name="ubuntu_mozilla-firefox.status-empty-marker"
-    ...
-    ... 1
-    ... -----------------------------19759086281403130373932339922
-    ... Content-Disposition: form-data; name="ubuntu_mozilla-firefox.importance"
-    ...
-    ... Low
-    ... -----------------------------19759086281403130373932339922
-    ... Content-Disposition: form-data; name="ubuntu_mozilla-firefox.importance-empty-marker"
-    ...
-    ... 1
-    ... -----------------------------19759086281403130373932339922
-    ... Content-Disposition: form-data; name="ubuntu_mozilla-firefox.milestone"
-    ...
-    ...
-    ... -----------------------------19759086281403130373932339922
-    ... Content-Disposition: form-data; name="ubuntu_mozilla-firefox.milestone-empty-marker"
-    ...
-    ... 1
-    ... -----------------------------19759086281403130373932339922
-    ... Content-Disposition: form-data; name="ubuntu_mozilla-firefox.sourcepackagename"
-    ...
-    ... mozilla-firefox
-    ... -----------------------------19759086281403130373932339922
-    ... Content-Disposition: form-data; name="ubuntu_mozilla-firefox.assignee.option"
-    ...
-    ... ubuntu_mozilla-firefox.assignee.assign_to
-    ... -----------------------------19759086281403130373932339922
-    ... Content-Disposition: form-data; name="ubuntu_mozilla-firefox.assignee"
-    ...
-    ... name12
-    ... -----------------------------19759086281403130373932339922
-    ... Content-Disposition: form-data; name="ubuntu_mozilla-firefox.bugwatch"
-    ...
-    ...
-    ... -----------------------------19759086281403130373932339922
-    ... Content-Disposition: form-data; name="ubuntu_mozilla-firefox.bugwatch-empty-marker"
-    ...
-    ... 1
-    ... -----------------------------19759086281403130373932339922
-    ... Content-Disposition: form-data; name="ubuntu_mozilla-firefox.actions.save"
-    ...
-    ... Save Changes
-    ... -----------------------------19759086281403130373932339922--
-    ... """
+    ...         "POST /ubuntu/+source/mozilla-firefox/+bug/1/+editstatus HTTP/1.1\r\n"
+    ...         + "Authorization: Basic Zm9vLmJhckBjYW5vbmljYWwuY29tOnRlc3Q=\r\n"
+    ...         + "Referer: https://launchpad.test/\r\n";
+    ...         + "Content-Length: 1999\r\n"
+    ...         + "Content-Type: multipart/form-data; boundary=---------------------------19759086281403130373932339922\r\n"
+    ...         + "\r\n"
+    ...         + "-----------------------------19759086281403130373932339922\r\n"
+    ...         + 'Content-Disposition: form-data; name="ubuntu_mozilla-firefox.status"\r\n'
+    ...         + "\r\n"
+    ...         + "Confirmed\r\n"
+    ...         + "-----------------------------19759086281403130373932339922\r\n"
+    ...         + 'Content-Disposition: form-data; name="ubuntu_mozilla-firefox.status-empty-marker"\r\n'
+    ...         + "\r\n"
+    ...         + "1\r\n"
+    ...         + "-----------------------------19759086281403130373932339922\r\n"
+    ...         + 'Content-Disposition: form-data; name="ubuntu_mozilla-firefox.importance"\r\n'
+    ...         + "\r\n"
+    ...         + "Low\r\n"
+    ...         + "-----------------------------19759086281403130373932339922\r\n"
+    ...         + 'Content-Disposition: form-data; name="ubuntu_mozilla-firefox.importance-empty-marker"\r\n'
+    ...         + "\r\n"
+    ...         + "1\r\n"
+    ...         + "-----------------------------19759086281403130373932339922\r\n"
+    ...         + 'Content-Disposition: form-data; name="ubuntu_mozilla-firefox.milestone"\r\n'
+    ...         + "\r\n"
+    ...         + "\r\n"
+    ...         + "-----------------------------19759086281403130373932339922\r\n"
+    ...         + 'Content-Disposition: form-data; name="ubuntu_mozilla-firefox.milestone-empty-marker"\r\n'
+    ...         + "\r\n"
+    ...         + "1\r\n"
+    ...         + "-----------------------------19759086281403130373932339922\r\n"
+    ...         + 'Content-Disposition: form-data; name="ubuntu_mozilla-firefox.sourcepackagename"\r\n'
+    ...         + "\r\n"
+    ...         + "mozilla-firefox\r\n"
+    ...         + "-----------------------------19759086281403130373932339922\r\n"
+    ...         + 'Content-Disposition: form-data; name="ubuntu_mozilla-firefox.assignee.option"\r\n'
+    ...         + "\r\n"
+    ...         + "ubuntu_mozilla-firefox.assignee.assign_to\r\n"
+    ...         + "-----------------------------19759086281403130373932339922\r\n"
+    ...         + 'Content-Disposition: form-data; name="ubuntu_mozilla-firefox.assignee"\r\n'
+    ...         + "\r\n"
+    ...         + "name12\r\n"
+    ...         + "-----------------------------19759086281403130373932339922\r\n"
+    ...         + 'Content-Disposition: form-data; name="ubuntu_mozilla-firefox.bugwatch"\r\n'
+    ...         + "\r\n"
+    ...         + "\r\n"
+    ...         + "-----------------------------19759086281403130373932339922\r\n"
+    ...         + 'Content-Disposition: form-data; name="ubuntu_mozilla-firefox.bugwatch-empty-marker"\r\n'
+    ...         + "\r\n"
+    ...         + "1\r\n"
+    ...         + "-----------------------------19759086281403130373932339922\r\n"
+    ...         + 'Content-Disposition: form-data; name="ubuntu_mozilla-firefox.actions.save"\r\n'
+    ...         + "\r\n"
+    ...         + "Save Changes\r\n"
+    ...         + "-----------------------------19759086281403130373932339922--\r\n"
     ...     )
     ... )  # noqa
     HTTP/1.1 303 See Other
@@ -183,63 +179,61 @@ Lastly, the widget also allows you to simply assign the task to nobody
 
     >>> print(
     ...     http(
-    ...         rb"""
-    ... POST /ubuntu/+source/mozilla-firefox/+bug/1/+editstatus HTTP/1.1
-    ... Authorization: Basic Zm9vLmJhckBjYW5vbmljYWwuY29tOnRlc3Q=
-    ... Referer: https://launchpad.test/
-    ... Content-Length: 1999
-    ... Content-Type: multipart/form-data; boundary=---------------------------19759086281403130373932339922
-    ...
-    ... -----------------------------19759086281403130373932339922
-    ... Content-Disposition: form-data; name="ubuntu_mozilla-firefox.status"
-    ...
-    ... Confirmed
-    ... -----------------------------19759086281403130373932339922
-    ... Content-Disposition: form-data; name="ubuntu_mozilla-firefox.status-empty-marker"
-    ...
-    ... 1
-    ... -----------------------------19759086281403130373932339922
-    ... Content-Disposition: form-data; name="ubuntu_mozilla-firefox.importance"
-    ...
-    ... Low
-    ... -----------------------------19759086281403130373932339922
-    ... Content-Disposition: form-data; name="ubuntu_mozilla-firefox.importance-empty-marker"
-    ...
-    ... 1
-    ... -----------------------------19759086281403130373932339922
-    ... Content-Disposition: form-data; name="ubuntu_mozilla-firefox.milestone"
-    ...
-    ...
-    ... -----------------------------19759086281403130373932339922
-    ... Content-Disposition: form-data; name="ubuntu_mozilla-firefox.milestone-empty-marker"
-    ...
-    ... 1
-    ... -----------------------------19759086281403130373932339922
-    ... Content-Disposition: form-data; name="ubuntu_mozilla-firefox.sourcepackagename"
-    ...
-    ... mozilla-firefox
-    ... -----------------------------19759086281403130373932339922
-    ... Content-Disposition: form-data; name="ubuntu_mozilla-firefox.assignee.option"
-    ...
-    ... ubuntu_mozilla-firefox.assignee.assign_to_nobody
-    ... -----------------------------19759086281403130373932339922
-    ... Content-Disposition: form-data; name="ubuntu_mozilla-firefox.assignee"
-    ...
-    ...
-    ... -----------------------------19759086281403130373932339922
-    ... Content-Disposition: form-data; name="ubuntu_mozilla-firefox.bugwatch"
-    ...
-    ...
-    ... -----------------------------19759086281403130373932339922
-    ... Content-Disposition: form-data; name="ubuntu_mozilla-firefox.bugwatch-empty-marker"
-    ...
-    ... 1
-    ... -----------------------------19759086281403130373932339922
-    ... Content-Disposition: form-data; name="ubuntu_mozilla-firefox.actions.save"
-    ...
-    ... Save Changes
-    ... -----------------------------19759086281403130373932339922--
-    ... """
+    ...         "POST /ubuntu/+source/mozilla-firefox/+bug/1/+editstatus HTTP/1.1\r\n"
+    ...         + "Authorization: Basic Zm9vLmJhckBjYW5vbmljYWwuY29tOnRlc3Q=\r\n"
+    ...         + "Referer: https://launchpad.test/\r\n";
+    ...         + "Content-Length: 1999\r\n"
+    ...         + "Content-Type: multipart/form-data; boundary=---------------------------19759086281403130373932339922\r\n"
+    ...         + "\r\n"
+    ...         + "-----------------------------19759086281403130373932339922\r\n"
+    ...         + 'Content-Disposition: form-data; name="ubuntu_mozilla-firefox.status"\r\n'
+    ...         + "\r\n"
+    ...         + "Confirmed\r\n"
+    ...         + "-----------------------------19759086281403130373932339922\r\n"
+    ...         + 'Content-Disposition: form-data; name="ubuntu_mozilla-firefox.status-empty-marker"\r\n'
+    ...         + "\r\n"
+    ...         + "1\r\n"
+    ...         + "-----------------------------19759086281403130373932339922\r\n"
+    ...         + 'Content-Disposition: form-data; name="ubuntu_mozilla-firefox.importance"\r\n'
+    ...         + "\r\n"
+    ...         + "Low\r\n"
+    ...         + "-----------------------------19759086281403130373932339922\r\n"
+    ...         + 'Content-Disposition: form-data; name="ubuntu_mozilla-firefox.importance-empty-marker"\r\n'
+    ...         + "\r\n"
+    ...         + "1\r\n"
+    ...         + "-----------------------------19759086281403130373932339922\r\n"
+    ...         + 'Content-Disposition: form-data; name="ubuntu_mozilla-firefox.milestone"\r\n'
+    ...         + "\r\n"
+    ...         + "\r\n"
+    ...         + "-----------------------------19759086281403130373932339922\r\n"
+    ...         + 'Content-Disposition: form-data; name="ubuntu_mozilla-firefox.milestone-empty-marker"\r\n'
+    ...         + "\r\n"
+    ...         + "1\r\n"
+    ...         + "-----------------------------19759086281403130373932339922\r\n"
+    ...         + 'Content-Disposition: form-data; name="ubuntu_mozilla-firefox.sourcepackagename"\r\n'
+    ...         + "\r\n"
+    ...         + "mozilla-firefox\r\n"
+    ...         + "-----------------------------19759086281403130373932339922\r\n"
+    ...         + 'Content-Disposition: form-data; name="ubuntu_mozilla-firefox.assignee.option"\r\n'
+    ...         + "\r\n"
+    ...         + "ubuntu_mozilla-firefox.assignee.assign_to_nobody\r\n"
+    ...         + "-----------------------------19759086281403130373932339922\r\n"
+    ...         + 'Content-Disposition: form-data; name="ubuntu_mozilla-firefox.assignee"\r\n'
+    ...         + "\r\n"
+    ...         + "\r\n"
+    ...         + "-----------------------------19759086281403130373932339922\r\n"
+    ...         + 'Content-Disposition: form-data; name="ubuntu_mozilla-firefox.bugwatch"\r\n'
+    ...         + "\r\n"
+    ...         + "\r\n"
+    ...         + "-----------------------------19759086281403130373932339922\r\n"
+    ...         + 'Content-Disposition: form-data; name="ubuntu_mozilla-firefox.bugwatch-empty-marker"\r\n'
+    ...         + "\r\n"
+    ...         + "1\r\n"
+    ...         + "-----------------------------19759086281403130373932339922\r\n"
+    ...         + 'Content-Disposition: form-data; name="ubuntu_mozilla-firefox.actions.save"\r\n'
+    ...         + "\r\n"
+    ...         + "Save Changes\r\n"
+    ...         + "-----------------------------19759086281403130373932339922--\r\n"
     ...     )
     ... )  # noqa
     HTTP/1.1 303 See Other
diff --git a/lib/lp/bugs/stories/guided-filebug/xx-filebug-attachments.rst b/lib/lp/bugs/stories/guided-filebug/xx-filebug-attachments.rst
index d1afe24..c4f1795 100644
--- a/lib/lp/bugs/stories/guided-filebug/xx-filebug-attachments.rst
+++ b/lib/lp/bugs/stories/guided-filebug/xx-filebug-attachments.rst
@@ -66,51 +66,49 @@ treat all empty-equivalent values equally.
 
     >>> print(
     ...     http(
-    ...         rb"""
-    ... POST /firefox/+filebug HTTP/1.1
-    ... Authorization: Basic test@xxxxxxxxxxxxx:test
-    ... Referer: https://launchpad.test/
-    ... Content-Type: multipart/form-data; boundary=---------------------------2051078912280543729816242321
-    ...
-    ... -----------------------------2051078912280543729816242321
-    ... Content-Disposition: form-data; name="field.title"
-    ...
-    ... A title of some description
-    ... -----------------------------2051078912280543729816242321
-    ... Content-Disposition: form-data; name="field.tags"
-    ...
-    ...
-    ... -----------------------------2051078912280543729816242321
-    ... Content-Disposition: form-data; name="field.comment"
-    ...
-    ... A description, which explains things.
-    ... -----------------------------2051078912280543729816242321
-    ... Content-Disposition: form-data; name="field.filecontent.used"
-    ...
-    ...
-    ... -----------------------------2051078912280543729816242321
-    ... Content-Disposition: form-data; name="field.filecontent"; filename=""
-    ... Content-Type: application/octet-stream
-    ...
-    ...
-    ... -----------------------------2051078912280543729816242321
-    ... Content-Disposition: form-data; name="field.patch.used"
-    ...
-    ...
-    ... -----------------------------2051078912280543729816242321
-    ... Content-Disposition: form-data; name="field.attachment_description"
-    ...
-    ...
-    ... -----------------------------2051078912280543729816242321
-    ... Content-Disposition: form-data; name="field.security_related.used"
-    ...
-    ...
-    ... -----------------------------2051078912280543729816242321
-    ... Content-Disposition: form-data; name="field.actions.submit_bug"
-    ...
-    ... Submit Bug Report
-    ... -----------------------------2051078912280543729816242321--
-    ... """
+    ...         "POST /firefox/+filebug HTTP/1.1\r\n"
+    ...         + "Authorization: Basic test@xxxxxxxxxxxxx:test\r\n"
+    ...         + "Referer: https://launchpad.test/\r\n";
+    ...         + "Content-Type: multipart/form-data; boundary=---------------------------2051078912280543729816242321\r\n"
+    ...         + "\r\n"
+    ...         + "-----------------------------2051078912280543729816242321\r\n"
+    ...         + 'Content-Disposition: form-data; name="field.title"\r\n'
+    ...         + "\r\n"
+    ...         + "A title of some description\r\n"
+    ...         + "-----------------------------2051078912280543729816242321\r\n"
+    ...         + 'Content-Disposition: form-data; name="field.tags"\r\n'
+    ...         + "\r\n"
+    ...         + "\r\n"
+    ...         + "-----------------------------2051078912280543729816242321\r\n"
+    ...         + 'Content-Disposition: form-data; name="field.comment"\r\n'
+    ...         + "\r\n"
+    ...         + "A description, which explains things.\r\n"
+    ...         + "-----------------------------2051078912280543729816242321\r\n"
+    ...         + 'Content-Disposition: form-data; name="field.filecontent.used"\r\n'
+    ...         + "\r\n"
+    ...         + "\r\n"
+    ...         + "-----------------------------2051078912280543729816242321\r\n"
+    ...         + 'Content-Disposition: form-data; name="field.filecontent"; filename=""\r\n'
+    ...         + "Content-Type: application/octet-stream\r\n"
+    ...         + "\r\n"
+    ...         + "\r\n"
+    ...         + "-----------------------------2051078912280543729816242321\r\n"
+    ...         + 'Content-Disposition: form-data; name="field.patch.used"\r\n'
+    ...         + "\r\n"
+    ...         + "\r\n"
+    ...         + "-----------------------------2051078912280543729816242321\r\n"
+    ...         + 'Content-Disposition: form-data; name="field.attachment_description"\r\n'
+    ...         + "\r\n"
+    ...         + "\r\n"
+    ...         + "-----------------------------2051078912280543729816242321\r\n"
+    ...         + 'Content-Disposition: form-data; name="field.security_related.used"\r\n'
+    ...         + "\r\n"
+    ...         + "\r\n"
+    ...         + "-----------------------------2051078912280543729816242321\r\n"
+    ...         + 'Content-Disposition: form-data; name="field.actions.submit_bug"\r\n'
+    ...         + "\r\n"
+    ...         + "Submit Bug Report\r\n"
+    ...         + "-----------------------------2051078912280543729816242321--\r\n"
     ...     )
     ... )  # noqa
     HTTP/1.1 303 See Other...
diff --git a/lib/lp/registry/stories/productseries/xx-productseries-review.rst b/lib/lp/registry/stories/productseries/xx-productseries-review.rst
index 93d6c12..d147ed2 100644
--- a/lib/lp/registry/stories/productseries/xx-productseries-review.rst
+++ b/lib/lp/registry/stories/productseries/xx-productseries-review.rst
@@ -2,26 +2,24 @@ Foo Bar changes the productseries named 'failedbranch' from the product a52dec
 to bazaar. Also changes the name of the productseries to 'newname'.
     >>> print(
     ...     http(
-    ...         r"""
-    ... POST /a52dec/failedbranch/+review HTTP/1.1
-    ... Authorization: Basic Zm9vLmJhckBjYW5vbmljYWwuY29tOnRlc3Q=
-    ... Referer: https://launchpad.test/
-    ... Content-Type: multipart/form-data; boundary=---------------------------10572808480422220968425074
-    ...
-    ... -----------------------------10572808480422220968425074
-    ... Content-Disposition: form-data; name="field.product"
-    ...
-    ... bazaar
-    ... -----------------------------10572808480422220968425074
-    ... Content-Disposition: form-data; name="field.name"
-    ...
-    ... newname
-    ... -----------------------------10572808480422220968425074
-    ... Content-Disposition: form-data; name="field.actions.change"
-    ...
-    ... Change
-    ... -----------------------------10572808480422220968425074--
-    ... """
+    ...         "POST /a52dec/failedbranch/+review HTTP/1.1\r\n"
+    ...         + "Authorization: Basic Zm9vLmJhckBjYW5vbmljYWwuY29tOnRlc3Q=\r\n"
+    ...         + "Referer: https://launchpad.test/\r\n";
+    ...         + "Content-Type: multipart/form-data; boundary=---------------------------10572808480422220968425074\r\n"
+    ...         + "\r\n"
+    ...         + "-----------------------------10572808480422220968425074\r\n"
+    ...         + 'Content-Disposition: form-data; name="field.product"\r\n'
+    ...         + "\r\n"
+    ...         + "bazaar\r\n"
+    ...         + "-----------------------------10572808480422220968425074\r\n"
+    ...         + 'Content-Disposition: form-data; name="field.name"\r\n'
+    ...         + "\r\n"
+    ...         + "newname\r\n"
+    ...         + "-----------------------------10572808480422220968425074\r\n"
+    ...         + 'Content-Disposition: form-data; name="field.actions.change"\r\n'
+    ...         + "\r\n"
+    ...         + "Change\r\n"
+    ...         + "-----------------------------10572808480422220968425074--\r\n"
     ...     )
     ... )  # noqa
     HTTP/1.1 303 See Other
diff --git a/requirements/launchpad.txt b/requirements/launchpad.txt
index c140468..084ed7b 100644
--- a/requirements/launchpad.txt
+++ b/requirements/launchpad.txt
@@ -94,7 +94,7 @@ mistune==0.8.3
 monotonic==1.5
 more-itertools==10.5.0
 msgpack==1.0.2
-multipart==0.2.4
+multipart==1.2.1
 netaddr==0.7.19
 netifaces==0.11.0
 oauth==1.0

Follow ups