为什么我不能通过https上传大文件?

时间:2016-08-30 15:52:36

标签: python c ssl gevent

我正在尝试使用geventhttpclient通过https上传大文件。

我得到的追溯包括: 字符串长于2147483647字节

那是0x7fffffff BTW - 你可以存储在32位有符号整数中的最高数字。

狩猎“字符串长于。*字节”,我看到它在_ssl.c中。

虽然有点奇怪 - 我使用64位Linux Mint 17.3 - 我认为限制是2 ^ 63-1而不是2 ^ 31-1。

_ssl.c的相关部分似乎是:

  if (buf.len > INT_MAX) {
      PyErr_Format(PyExc_OverflowError,
                   "string longer than %d bytes", INT_MAX);
      goto error;
  }

我在C中写了一个小测试程序:

#include <stdio.h>
#include <limits.h>
#include <Python.h>

int main()
        {
        fprintf(stderr, "Size of int is %lu\n", sizeof(int));
        fprintf(stderr, "Size of size_t is %lu\n", sizeof(size_t));
        fprintf(stderr, "Size of ssize_t is %lu\n", sizeof(ssize_t));
        fprintf(stderr, "Size of void * is %lu\n", sizeof(void *));
        fprintf(stderr, "Size of long is %lu\n", sizeof(long));
        fprintf(stderr, "INT_MAX is %u\n", INT_MAX);
        fprintf(stderr, "size of Py_ssize_t is %lu\n", sizeof(Py_ssize_t));
        return 0;
        }

其中输出:

Size of int is 4
Size of size_t is 8
Size of ssize_t is 8
Size of void * is 8
Size of long is 8
INT_MAX is 2147483647
size of Py_ssize_t is 8

所以看起来我的INT_MAX很小(32位),即使我的Py_ssize_t很大(64位)。

然而:

$ /usr/local/cpython-2.7/bin/python
cmd output started 2016 Tue Aug 30 08:41:43 AM PDT
Python 2.7.11 (default, Jun 14 2016, 10:45:41)
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.maxint
9223372036854775807

我需要做什么才能让INT_MAX达到2 ^ 63-1?

我知道我可以使用生成器(http://docs.python-requests.org/en/latest/user/advanced/#chunk-encoded-requests)以块的形式上传文件,但如果可行,我宁愿一次性上传。

我自己使用--enable-shared和$ LDFLAGS编译了这个Python。

谢谢!

0 个答案:

没有答案