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
7c9b61b1
Commit
7c9b61b1
authored
May 26, 2008
by
Georg Brandl
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Remove _FooCookieJar modules and merge their content into http.cookiejar.
parent
f4a41231
Changes
3
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
295 additions
and
320 deletions
+295
-320
Lib/_LWPCookieJar.py
Lib/_LWPCookieJar.py
+0
-169
Lib/_MozillaCookieJar.py
Lib/_MozillaCookieJar.py
+0
-149
Lib/http/cookiejar.py
Lib/http/cookiejar.py
+295
-2
No files found.
Lib/_LWPCookieJar.py
deleted
100644 → 0
View file @
f4a41231
"""Load / save to libwww-perl (LWP) format files.
Actually, the format is slightly extended from that used by LWP's
(libwww-perl's) HTTP::Cookies, to avoid losing some RFC 2965 information
not recorded by LWP.
It uses the version string "2.0", though really there isn't an LWP Cookies
2.0 format. This indicates that there is extra information in here
(domain_dot and # port_spec) while still being compatible with
libwww-perl, I hope.
"""
import
time
,
re
from
http.cookiejar
import
(
_warn_unhandled_exception
,
FileCookieJar
,
LoadError
,
Cookie
,
MISSING_FILENAME_TEXT
,
join_header_words
,
split_header_words
,
iso2time
,
time2isoz
)
def
lwp_cookie_str
(
cookie
):
"""Return string representation of Cookie in an the LWP cookie file format.
Actually, the format is extended a bit -- see module docstring.
"""
h
=
[(
cookie
.
name
,
cookie
.
value
),
(
"path"
,
cookie
.
path
),
(
"domain"
,
cookie
.
domain
)]
if
cookie
.
port
is
not
None
:
h
.
append
((
"port"
,
cookie
.
port
))
if
cookie
.
path_specified
:
h
.
append
((
"path_spec"
,
None
))
if
cookie
.
port_specified
:
h
.
append
((
"port_spec"
,
None
))
if
cookie
.
domain_initial_dot
:
h
.
append
((
"domain_dot"
,
None
))
if
cookie
.
secure
:
h
.
append
((
"secure"
,
None
))
if
cookie
.
expires
:
h
.
append
((
"expires"
,
time2isoz
(
float
(
cookie
.
expires
))))
if
cookie
.
discard
:
h
.
append
((
"discard"
,
None
))
if
cookie
.
comment
:
h
.
append
((
"comment"
,
cookie
.
comment
))
if
cookie
.
comment_url
:
h
.
append
((
"commenturl"
,
cookie
.
comment_url
))
keys
=
sorted
(
cookie
.
_rest
.
keys
())
for
k
in
keys
:
h
.
append
((
k
,
str
(
cookie
.
_rest
[
k
])))
h
.
append
((
"version"
,
str
(
cookie
.
version
)))
return
join_header_words
([
h
])
class
LWPCookieJar
(
FileCookieJar
):
"""
The LWPCookieJar saves a sequence of"Set-Cookie3" lines.
"Set-Cookie3" is the format used by the libwww-perl libary, not known
to be compatible with any browser, but which is easy to read and
doesn't lose information about RFC 2965 cookies.
Additional methods
as_lwp_str(ignore_discard=True, ignore_expired=True)
"""
def
as_lwp_str
(
self
,
ignore_discard
=
True
,
ignore_expires
=
True
):
"""Return cookies as a string of "
\
n
"-separated "Set-Cookie3" headers.
ignore_discard and ignore_expires: see docstring for FileCookieJar.save
"""
now
=
time
.
time
()
r
=
[]
for
cookie
in
self
:
if
not
ignore_discard
and
cookie
.
discard
:
continue
if
not
ignore_expires
and
cookie
.
is_expired
(
now
):
continue
r
.
append
(
"Set-Cookie3: %s"
%
lwp_cookie_str
(
cookie
))
return
"
\
n
"
.
join
(
r
+
[
""
])
def
save
(
self
,
filename
=
None
,
ignore_discard
=
False
,
ignore_expires
=
False
):
if
filename
is
None
:
if
self
.
filename
is
not
None
:
filename
=
self
.
filename
else
:
raise
ValueError
(
MISSING_FILENAME_TEXT
)
f
=
open
(
filename
,
"w"
)
try
:
# There really isn't an LWP Cookies 2.0 format, but this indicates
# that there is extra information in here (domain_dot and
# port_spec) while still being compatible with libwww-perl, I hope.
f
.
write
(
"#LWP-Cookies-2.0
\
n
"
)
f
.
write
(
self
.
as_lwp_str
(
ignore_discard
,
ignore_expires
))
finally
:
f
.
close
()
def
_really_load
(
self
,
f
,
filename
,
ignore_discard
,
ignore_expires
):
magic
=
f
.
readline
()
if
not
re
.
search
(
self
.
magic_re
,
magic
):
msg
=
(
"%r does not look like a Set-Cookie3 (LWP) format "
"file"
%
filename
)
raise
LoadError
(
msg
)
now
=
time
.
time
()
header
=
"Set-Cookie3:"
boolean_attrs
=
(
"port_spec"
,
"path_spec"
,
"domain_dot"
,
"secure"
,
"discard"
)
value_attrs
=
(
"version"
,
"port"
,
"path"
,
"domain"
,
"expires"
,
"comment"
,
"commenturl"
)
try
:
while
1
:
line
=
f
.
readline
()
if
line
==
""
:
break
if
not
line
.
startswith
(
header
):
continue
line
=
line
[
len
(
header
):].
strip
()
for
data
in
split_header_words
([
line
]):
name
,
value
=
data
[
0
]
standard
=
{}
rest
=
{}
for
k
in
boolean_attrs
:
standard
[
k
]
=
False
for
k
,
v
in
data
[
1
:]:
if
k
is
not
None
:
lc
=
k
.
lower
()
else
:
lc
=
None
# don't lose case distinction for unknown fields
if
(
lc
in
value_attrs
)
or
(
lc
in
boolean_attrs
):
k
=
lc
if
k
in
boolean_attrs
:
if
v
is
None
:
v
=
True
standard
[
k
]
=
v
elif
k
in
value_attrs
:
standard
[
k
]
=
v
else
:
rest
[
k
]
=
v
h
=
standard
.
get
expires
=
h
(
"expires"
)
discard
=
h
(
"discard"
)
if
expires
is
not
None
:
expires
=
iso2time
(
expires
)
if
expires
is
None
:
discard
=
True
domain
=
h
(
"domain"
)
domain_specified
=
domain
.
startswith
(
"."
)
c
=
Cookie
(
h
(
"version"
),
name
,
value
,
h
(
"port"
),
h
(
"port_spec"
),
domain
,
domain_specified
,
h
(
"domain_dot"
),
h
(
"path"
),
h
(
"path_spec"
),
h
(
"secure"
),
expires
,
discard
,
h
(
"comment"
),
h
(
"commenturl"
),
rest
)
if
not
ignore_discard
and
c
.
discard
:
continue
if
not
ignore_expires
and
c
.
is_expired
(
now
):
continue
self
.
set_cookie
(
c
)
except
IOError
:
raise
except
Exception
:
_warn_unhandled_exception
()
raise
LoadError
(
"invalid Set-Cookie3 format file %r: %r"
%
(
filename
,
line
))
Lib/_MozillaCookieJar.py
deleted
100644 → 0
View file @
f4a41231
"""Mozilla / Netscape cookie loading / saving."""
import
re
,
time
from
http.cookiejar
import
(
_warn_unhandled_exception
,
FileCookieJar
,
LoadError
,
Cookie
,
MISSING_FILENAME_TEXT
)
class
MozillaCookieJar
(
FileCookieJar
):
"""
WARNING: you may want to backup your browser's cookies file if you use
this class to save cookies. I *think* it works, but there have been
bugs in the past!
This class differs from CookieJar only in the format it uses to save and
load cookies to and from a file. This class uses the Mozilla/Netscape
`cookies.txt' format. lynx uses this file format, too.
Don't expect cookies saved while the browser is running to be noticed by
the browser (in fact, Mozilla on unix will overwrite your saved cookies if
you change them on disk while it's running; on Windows, you probably can't
save at all while the browser is running).
Note that the Mozilla/Netscape format will downgrade RFC2965 cookies to
Netscape cookies on saving.
In particular, the cookie version and port number information is lost,
together with information about whether or not Path, Port and Discard were
specified by the Set-Cookie2 (or Set-Cookie) header, and whether or not the
domain as set in the HTTP header started with a dot (yes, I'm aware some
domains in Netscape files start with a dot and some don't -- trust me, you
really don't want to know any more about this).
Note that though Mozilla and Netscape use the same format, they use
slightly different headers. The class saves cookies using the Netscape
header by default (Mozilla can cope with that).
"""
magic_re
=
"#( Netscape)? HTTP Cookie File"
header
=
"""
\
# Netscape HTTP Cookie File
# http://www.netscape.com/newsref/std/cookie_spec.html
# This is a generated file! Do not edit.
"""
def
_really_load
(
self
,
f
,
filename
,
ignore_discard
,
ignore_expires
):
now
=
time
.
time
()
magic
=
f
.
readline
()
if
not
re
.
search
(
self
.
magic_re
,
magic
):
f
.
close
()
raise
LoadError
(
"%r does not look like a Netscape format cookies file"
%
filename
)
try
:
while
1
:
line
=
f
.
readline
()
if
line
==
""
:
break
# last field may be absent, so keep any trailing tab
if
line
.
endswith
(
"
\
n
"
):
line
=
line
[:
-
1
]
# skip comments and blank lines XXX what is $ for?
if
(
line
.
strip
().
startswith
((
"#"
,
"$"
))
or
line
.
strip
()
==
""
):
continue
domain
,
domain_specified
,
path
,
secure
,
expires
,
name
,
value
=
\
line
.
split
(
"
\
t
"
)
secure
=
(
secure
==
"TRUE"
)
domain_specified
=
(
domain_specified
==
"TRUE"
)
if
name
==
""
:
# cookies.txt regards 'Set-Cookie: foo' as a cookie
# with no name, whereas http.cookiejar regards it as a
# cookie with no value.
name
=
value
value
=
None
initial_dot
=
domain
.
startswith
(
"."
)
assert
domain_specified
==
initial_dot
discard
=
False
if
expires
==
""
:
expires
=
None
discard
=
True
# assume path_specified is false
c
=
Cookie
(
0
,
name
,
value
,
None
,
False
,
domain
,
domain_specified
,
initial_dot
,
path
,
False
,
secure
,
expires
,
discard
,
None
,
None
,
{})
if
not
ignore_discard
and
c
.
discard
:
continue
if
not
ignore_expires
and
c
.
is_expired
(
now
):
continue
self
.
set_cookie
(
c
)
except
IOError
:
raise
except
Exception
:
_warn_unhandled_exception
()
raise
LoadError
(
"invalid Netscape format cookies file %r: %r"
%
(
filename
,
line
))
def
save
(
self
,
filename
=
None
,
ignore_discard
=
False
,
ignore_expires
=
False
):
if
filename
is
None
:
if
self
.
filename
is
not
None
:
filename
=
self
.
filename
else
:
raise
ValueError
(
MISSING_FILENAME_TEXT
)
f
=
open
(
filename
,
"w"
)
try
:
f
.
write
(
self
.
header
)
now
=
time
.
time
()
for
cookie
in
self
:
if
not
ignore_discard
and
cookie
.
discard
:
continue
if
not
ignore_expires
and
cookie
.
is_expired
(
now
):
continue
if
cookie
.
secure
:
secure
=
"TRUE"
else
:
secure
=
"FALSE"
if
cookie
.
domain
.
startswith
(
"."
):
initial_dot
=
"TRUE"
else
:
initial_dot
=
"FALSE"
if
cookie
.
expires
is
not
None
:
expires
=
str
(
cookie
.
expires
)
else
:
expires
=
""
if
cookie
.
value
is
None
:
# cookies.txt regards 'Set-Cookie: foo' as a cookie
# with no name, whereas http.cookiejar regards it as a
# cookie with no value.
name
=
""
value
=
cookie
.
name
else
:
name
=
cookie
.
name
value
=
cookie
.
value
f
.
write
(
"
\
t
"
.
join
([
cookie
.
domain
,
initial_dot
,
cookie
.
path
,
secure
,
expires
,
name
,
value
])
+
"
\
n
"
)
finally
:
f
.
close
()
Lib/http/cookiejar.py
View file @
7c9b61b1
This diff is collapsed.
Click to expand it.
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