Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
N
news
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Sartika Aritonang
news
Commits
57ec15b9
Commit
57ec15b9
authored
May 29, 2020
by
Sartika Aritonang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Upload New File
parent
78a46a1d
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
80 additions
and
0 deletions
+80
-0
filewrapper.py
...Lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py
+80
-0
No files found.
stbi/Lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py
0 → 100644
View file @
57ec15b9
from
io
import
BytesIO
class
CallbackFileWrapper
(
object
):
"""
Small wrapper around a fp object which will tee everything read into a
buffer, and when that file is closed it will execute a callback with the
contents of that buffer.
All attributes are proxied to the underlying file object.
This class uses members with a double underscore (__) leading prefix so as
not to accidentally shadow an attribute.
"""
def
__init__
(
self
,
fp
,
callback
):
self
.
__buf
=
BytesIO
()
self
.
__fp
=
fp
self
.
__callback
=
callback
def
__getattr__
(
self
,
name
):
# The vaguaries of garbage collection means that self.__fp is
# not always set. By using __getattribute__ and the private
# name[0] allows looking up the attribute value and raising an
# AttributeError when it doesn't exist. This stop thigns from
# infinitely recursing calls to getattr in the case where
# self.__fp hasn't been set.
#
# [0] https://docs.python.org/2/reference/expressions.html#atom-identifiers
fp
=
self
.
__getattribute__
(
"_CallbackFileWrapper__fp"
)
return
getattr
(
fp
,
name
)
def
__is_fp_closed
(
self
):
try
:
return
self
.
__fp
.
fp
is
None
except
AttributeError
:
pass
try
:
return
self
.
__fp
.
closed
except
AttributeError
:
pass
# We just don't cache it then.
# TODO: Add some logging here...
return
False
def
_close
(
self
):
if
self
.
__callback
:
self
.
__callback
(
self
.
__buf
.
getvalue
())
# We assign this to None here, because otherwise we can get into
# really tricky problems where the CPython interpreter dead locks
# because the callback is holding a reference to something which
# has a __del__ method. Setting this to None breaks the cycle
# and allows the garbage collector to do it's thing normally.
self
.
__callback
=
None
def
read
(
self
,
amt
=
None
):
data
=
self
.
__fp
.
read
(
amt
)
self
.
__buf
.
write
(
data
)
if
self
.
__is_fp_closed
():
self
.
_close
()
return
data
def
_safe_read
(
self
,
amt
):
data
=
self
.
__fp
.
_safe_read
(
amt
)
if
amt
==
2
and
data
==
b
"
\r\n
"
:
# urllib executes this read to toss the CRLF at the end
# of the chunk.
return
data
self
.
__buf
.
write
(
data
)
if
self
.
__is_fp_closed
():
self
.
_close
()
return
data
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