For those playing along at home, here’s what I did to make it work (obviously,
I ran uwsgi and send.py in separate windows). It’s pretty down-and-dirty, but I
think it shows the concepts in play.
[spierce@memory chunked]$ cat app1.py
import uwsgi
def application(e, sr):
while True:
msg = uwsgi.chunked_read(0)
if msg:
print msg
if not msg:
sr('200 OK', [] )
return []
[spierce@memory chunked]$ cat send.py
import socket
import sys
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
(addr, port) = sys.argv[1].split(':')
s.connect((addr, int(port)))
s.send("POST /send HTTP/1.1\r\n")
s.send("Transfer-Encoding: chunked\r\n\r\n")
try:
while True:
msg = raw_input("msg >> ")
s.send("%X\r\n%s\r\n" % (len(msg), msg))
except EOFError:
s.send("0\r\n\r\n")
print
[spierce@memory chunked]$ python send.py 127.0.0.1:2000
msg >> foo
msg >> bar
msg >> ^D
[spierce@memory chunked]$ uwsgi --wsgi-file app1.py --http-socket 127.0.0.1:2000
*** Starting uWSGI 1.9.13 (64bit) on [Wed Jun 26 14:23:57 2013] ***
compiled with version: 4.4.7 20120313 (Red Hat 4.4.7-3) on 25 June 2013 16:37:29
os: Linux-2.6.32-279.2.1.el6.x86_64 #1 SMP Fri Jul 20 01:55:29 UTC 2012
nodename: memory.verifyle.local
machine: x86_64
clock source: unix
pcre jit disabled
detected number of CPU cores: 2
current working directory: /home/spierce/chunked
detected binary path: /usr/sbin/uwsgi
*** WARNING: you are running uWSGI without its master process manager ***
your processes number limit is 1024
your memory page size is 4096 bytes
detected max file descriptor number: 1024
lock engine: pthread robust mutexes
uwsgi socket 0 bound to TCP address 127.0.0.1:2000 fd 3
Python version: 2.6.6 (r266:84292, Feb 22 2013, 00:00:18) [GCC 4.4.7 20120313
(Red Hat 4.4.7-3)]
*** Python threads support is disabled. You can enable it with --enable-threads
***
Python main interpreter initialized at 0xf55c00
initialized Perl 5.10.1 main interpreter at 0xfe2230
your server socket listen backlog is limited to 100 connections
your mercy for graceful operations on workers is 60 seconds
mapped 72768 bytes (71 KB) for 1 cores
*** Operational MODE: single process ***
WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0xf55c00 pid:
15783 (default app)
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI worker 1 (and the only) (pid: 15783, cores: 1)
foo
bar
[pid: 15783|app: 0|req: 1/1] 127.0.0.1 () {20 vars in 230 bytes} [Wed Jun 26
14:24:00 2013] POST /send => generated 0 bytes in 2114 msecs (HTTP/1.1 200) 0
headers in 19 bytes (1 switches on core 0)
Steve
From: [email protected] [mailto:[email protected]] On
Behalf Of C Anthony Risinger
Sent: Wednesday, June 26, 2013 12:39 PM
To: uWSGI developers and users list
Subject: Re: [uWSGI] chunked input api
On Jun 26, 2013 12:40 PM, "Stephen Pierce"
<[email protected]<mailto:[email protected]>> wrote:
>
> Nice work, Roberto! I was thinking of doing something very similar because I
> need to accept an HTTP POST request with Transfer-Encoding: chunked. I was
> also thinking I might have to resort to Twisted (bleh). Imagine my surprise
> when I found out that you already did it!
>
> So, I've been trying to get these new functions working, but I'm having
> problems. I'm running my proof-of-concept app on port 2000, and I connect to
> it using a modified version of your send application. I got annoyed with the
> EOFError exception. :-)
>
> When I connect, I can see from my sniffer that the sending application
> appears to be doing its job. Each input line is sent as a chunk, and I get
> TCP-ACK back for each one. However, the web application just sits until the
> timeout, then gives me the timeout exception.
>
> What am I doing wrong?
>
> Steve
>
> [spierce@memory chunked]$ cat send.py
> import socket
> import sys
>
> s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>
> (addr, port) = sys.argv[1].split(':')
> s.connect((addr, int(port)))
>
> s.send("POST /send HTTP/1.1\r\n")
> s.send("Transfer-Encoding: chunked\r\n\r\n")
>
> try:
> while True:
> msg = raw_input("msg >> ")
> s.send("%X\r\n%s\r\n" % (len(msg), msg))
> except EOFError:
> print
> pass
>
> Here's the application:
>
> [spierce@memory chunked]$ cat app1.py
> import uwsgi
> def application(e, sr):
> while True:
> msg = uwsgi.chunked_read(10)
> if msg: print "core %d" % e['uwsgi.core'], msg
>
> Here's how I start it:
>
> [spierce@memory chunked]$ uwsgi --wsgi-file app1.py --http
> 127.0.0.1:2000<http://127.0.0.1:2000>
> *** Starting uWSGI 1.9.13 (64bit) on [Wed Jun 26 10:29:27 2013] ***
> compiled with version: 4.4.7 20120313 (Red Hat 4.4.7-3) on 25 June 2013
> 16:37:29
> os: Linux-2.6.32-279.2.1.el6.x86_64 #1 SMP Fri Jul 20 01:55:29 UTC 2012
> nodename: memory.verifyle.local
> machine: x86_64
> clock source: unix
> pcre jit disabled
> detected number of CPU cores: 2
> current working directory: /home/spierce/chunked
> detected binary path: /usr/sbin/uwsgi
> *** WARNING: you are running uWSGI without its master process manager ***
> your processes number limit is 1024
> your memory page size is 4096 bytes
> detected max file descriptor number: 1024
> lock engine: pthread robust mutexes
> uWSGI http bound on 127.0.0.1:2000<http://127.0.0.1:2000> fd 4
> spawned uWSGI http 1 (pid: 15559)
> uwsgi socket 0 bound to TCP address 127.0.0.1:50095<http://127.0.0.1:50095>
> (port auto-assigned) fd 3
> Python version: 2.6.6 (r266:84292, Feb 22 2013, 00:00:18) [GCC 4.4.7
> 20120313 (Red Hat 4.4.7-3)]
> *** Python threads support is disabled. You can enable it with
> --enable-threads ***
> Python main interpreter initialized at 0x1e3fd00
> initialized Perl 5.10.1 main interpreter at 0x1ecc330
> your server socket listen backlog is limited to 100 connections
> your mercy for graceful operations on workers is 60 seconds
> mapped 72768 bytes (71 KB) for 1 cores
> *** Operational MODE: single process ***
> WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0x1e3fd00 pid:
> 15558 (default app)
> *** uWSGI is running in multiple interpreter mode ***
> spawned uWSGI worker 1 (and the only) (pid: 15558, cores: 1)
>
> Here's the error:
>
> Traceback (most recent call last):
> File "app1.py", line 4, in application
> msg = uwsgi.chunked_read(10)
> IOError: unable to receive chunked part
> [pid: 15558|app: 0|req: 1/1] 127.0.0.1 () {24 vars in 270 bytes} [Wed Jun 26
> 10:29:30 2013] POST /send => generated 0 bytes in 4360 msecs (HTTP/1.1 500) 0
> headers in 0 bytes (0 switches on core 0)
Try --http-socket instead, or add --http-raw-body...
I believe the implicit http server spawned by --http is buffering.
C Anthony [mobile]
_______________________________________________
uWSGI mailing list
[email protected]
http://lists.unbit.it/cgi-bin/mailman/listinfo/uwsgi