1
0
mirror of https://github.com/openSUSE/osc.git synced 2025-01-26 22:56:15 +01:00
github.com_openSUSE_osc/osc
Marcus Huewe c932f95d46 Support an arbitrary sized file in core.http_request
The old code only supports a file whose size is less then or equal
to INT_MAX (due to a reasonable(!) limit in M2Crypto). The actual
issue is in core.http_request which mmap(...)s the file, wraps it
into a memoryview/buffer and then passes the memoryview/buffer to
urlopen. Eventually, the whole memoryview/buffer is read into memory
(see m2_PyObject_GetBufferInt). If the file is too large (> INT_MAX),
m2_PyObject_GetBufferInt raises a ValueError (which is perfectly
fine!).
Reading a whole file into memory is completely insane. In order to
avoid this, we now simply pass a file-like object to urlopen (more
precisely, the file-like object is associated with the Request
instance that is passed to urlopen). The advantange is that the
file-like object is processed in chunks of 8192 bytes (see
http.client.HTTPConnection) (that is, only 8192 bytes are read into
memory (instead of the whole file)).

There are two pitfalls when passing a file-like object to urlopen:
* By default, a chunked Transfer-Encoding is applied. It seems that
  some servers (like api.o.o) do not like this (PUTing a file with
  a chunked Transfer-Encoding to api.o.o results in status 400). In
  order to avoid a chunked Transfer-Encoding, we explicitly set a
  Content-Length header (we also do this in the non-file case (just
  for the sake of completeness)).
* If the request fails with status 401, it is retried with an
  appropriate Authorization header. When retrying the request, the
  file's offset has to be repositioned to the beginning of the file
  (otherwise, a 0-length body is sent which most likely does not
  match the Content-Length header).

Note: core.http_request's "data" and "file" parameters are now mutually
exclusive because specifying both makes no sense (only one of them
is considered) and it simplifies the implementation a bit.

Fixes: #202 ("osc user authentification seems to be broken with last
commit")
Fixes: #304 ("osc ci - cannot handle more than 2 GB file uploads")
2021-04-10 22:14:25 +02:00
..
util Use os.getcwdb() instead of os.getcwd().encode() in util.cpio.CpioRead 2020-11-22 17:39:54 +01:00
__init__.py replace urlgrabber to enable python3 compatibility 2018-10-19 09:31:37 +02:00
.gitignore convert svn:ignore to gitignore 2009-12-03 19:19:53 +01:00
babysitter.py Ignore signal.SIGWINCH. 2020-08-27 16:56:36 +02:00
build.py remove "need root" autodetection 2021-03-25 09:06:48 +01:00
checker.py Resolve PEP8 issue W291 2014-08-12 15:01:16 +02:00
cmdln.py add regex for python3 missing arguments err 2020-05-18 19:46:22 +02:00
commandline.py Add "--force" option to the "osc add" command 2021-03-18 15:05:31 +01:00
conf.py Support an arbitrary sized file in core.http_request 2021-04-10 22:14:25 +02:00
core.py Support an arbitrary sized file in core.http_request 2021-04-10 22:14:25 +02:00
credentials.py fix list of backends for old python-keyring 2020-02-14 09:35:07 +01:00
fetch.py Fix a potential TypeError in CpioRead.copyin and CpioRead.copyin_file 2020-11-20 09:55:09 +01:00
grabber.py fix broken URLError handling in OscMirrorGroup.urlgrab() 2018-11-06 13:29:17 +01:00
meter.py Fix ZeroDivisionException in meter.PBTextMeter 2019-01-23 15:37:01 +01:00
OscConfigParser.py Rename SafeConfigParser to ConfigParser 2020-02-07 12:04:49 +01:00
oscerr.py Improve password handling 2019-08-29 16:11:17 +02:00
oscssl.py Use correct appname for trusted-certs store 2019-07-28 14:59:14 +02:00
oscsslexcp.py - remove shebang line to make rpmlint happy 2010-03-21 22:57:06 +01:00