Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
7781ddf0
Commit
7781ddf0
authored
Aug 25, 2013
by
R David Murray
Browse files
Options
Browse Files
Download
Plain Diff
Merge #16611: BaseCookie now parses 'secure' and 'httponly' flags.
parents
20725363
b92e104d
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
61 additions
and
11 deletions
+61
-11
Lib/http/cookies.py
Lib/http/cookies.py
+19
-10
Lib/test/test_http_cookies.py
Lib/test/test_http_cookies.py
+39
-1
Misc/NEWS
Misc/NEWS
+3
-0
No files found.
Lib/http/cookies.py
View file @
7781ddf0
...
...
@@ -338,6 +338,8 @@ class Morsel(dict):
"version"
:
"Version"
,
}
_flags
=
{
'secure'
,
'httponly'
}
def
__init__
(
self
):
# Set defaults
self
.
key
=
self
.
value
=
self
.
coded_value
=
None
...
...
@@ -435,15 +437,18 @@ _CookiePattern = re.compile(r"""
(?P<key> # Start of group 'key'
""" + _LegalCharsPatt + r"""+? # Any word of at least one letter
) # End of group 'key'
\
s*=
\s* # Equal Sign
(?P<val> # Start of group 'val'
"
(
?
:[
^
\\
"]|
\
\
.)*"
# Any doublequoted string
|
# or
( # Optional group: there may not be a value.
\
s*=
\s* # Equal Sign
(?P<val> # Start of group 'val'
"
(
?
:[
^
\\
"]|
\
\
.)*"
# Any doublequoted string
|
# or
\
w
{
3
},
\
s
[
\
w
\
d
\
s
-
]{
9
,
11
}
\
s
[
\
d
:]{
8
}
\
sGMT
# Special case for "expires" attr
|
# or
""" + _LegalCharsPatt + r"""
*
# Any word or empty string
)
# End of group 'val'
\
s
*
;
?
# Probably ending in a semi-colon
|
# or
""" + _LegalCharsPatt + r"""
*
# Any word or empty string
)
# End of group 'val'
)
?
# End of optional value group
\
s
*
# Any number of spaces.
(
\
s
+|
;
|
$
)
# Ending either at space, semicolon, or EOS.
""", re.ASCII) # May be removed if safe.
...
...
@@ -549,8 +554,12 @@ class BaseCookie(dict):
M
[
key
[
1
:]]
=
value
elif
key
.
lower
()
in
Morsel
.
_reserved
:
if
M
:
M
[
key
]
=
_unquote
(
value
)
else
:
if
value
is
None
:
if
key
.
lower
()
in
Morsel
.
_flags
:
M
[
key
]
=
True
else
:
M
[
key
]
=
_unquote
(
value
)
elif
value
is
not
None
:
rval
,
cval
=
self
.
value_decode
(
value
)
self
.
__set
(
key
,
rval
,
cval
)
M
=
self
[
key
]
...
...
Lib/test/test_http_cookies.py
View file @
7781ddf0
...
...
@@ -109,13 +109,51 @@ class CookieTests(unittest.TestCase):
self
.
assertEqual
(
C
.
output
(),
'Set-Cookie: Customer="WILE_E_COYOTE"; Max-Age=10'
)
# others
def
test_set_secure_httponly_attrs
(
self
):
C
=
cookies
.
SimpleCookie
(
'Customer="WILE_E_COYOTE"'
)
C
[
'Customer'
][
'secure'
]
=
True
C
[
'Customer'
][
'httponly'
]
=
True
self
.
assertEqual
(
C
.
output
(),
'Set-Cookie: Customer="WILE_E_COYOTE"; httponly; secure'
)
def
test_secure_httponly_false_if_not_present
(
self
):
C
=
cookies
.
SimpleCookie
()
C
.
load
(
'eggs=scrambled; Path=/bacon'
)
self
.
assertFalse
(
C
[
'eggs'
][
'httponly'
])
self
.
assertFalse
(
C
[
'eggs'
][
'secure'
])
def
test_secure_httponly_true_if_present
(
self
):
# Issue 16611
C
=
cookies
.
SimpleCookie
()
C
.
load
(
'eggs=scrambled; httponly; secure; Path=/bacon'
)
self
.
assertTrue
(
C
[
'eggs'
][
'httponly'
])
self
.
assertTrue
(
C
[
'eggs'
][
'secure'
])
def
test_secure_httponly_true_if_have_value
(
self
):
# This isn't really valid, but demonstrates what the current code
# is expected to do in this case.
C
=
cookies
.
SimpleCookie
()
C
.
load
(
'eggs=scrambled; httponly=foo; secure=bar; Path=/bacon'
)
self
.
assertTrue
(
C
[
'eggs'
][
'httponly'
])
self
.
assertTrue
(
C
[
'eggs'
][
'secure'
])
# Here is what it actually does; don't depend on this behavior. These
# checks are testing backward compatibility for issue 16611.
self
.
assertEqual
(
C
[
'eggs'
][
'httponly'
],
'foo'
)
self
.
assertEqual
(
C
[
'eggs'
][
'secure'
],
'bar'
)
def
test_bad_attrs
(
self
):
# issue 16611: make sure we don't break backward compatibility.
C
=
cookies
.
SimpleCookie
()
C
.
load
(
'cookie=with; invalid; version; second=cookie;'
)
self
.
assertEqual
(
C
.
output
(),
'Set-Cookie: cookie=with
\
r
\
n
Set-Cookie: second=cookie'
)
def
test_extra_spaces
(
self
):
C
=
cookies
.
SimpleCookie
()
C
.
load
(
'eggs = scrambled ; secure ; path = bar ; foo=foo '
)
self
.
assertEqual
(
C
.
output
(),
'Set-Cookie: eggs=scrambled; Path=bar; secure
\
r
\
n
Set-Cookie: foo=foo'
)
def
test_quoted_meta
(
self
):
# Try cookie with quoted meta-data
C
=
cookies
.
SimpleCookie
()
...
...
Misc/NEWS
View file @
7781ddf0
...
...
@@ -40,6 +40,9 @@ Core and Builtins
Library
-------
- Issue #16611: http.cookie now correctly parses the '
secure
' and '
httponly
'
cookie flags.
- Issue #11973: Fix a problem in kevent. The flags and fflags fields are now
properly handled as unsigned.
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment