I'm trying to write a very simple HTTP client/server program where the
client uploads a file via PUT using pycurl, and the server accepts the
file, "POpen"s a program, sends back "HELLO" to the client, then
displays "good morning".
The problem is when the "POpen"ed C++ program (test1.cpp below) waits
for some user input (via "getline()"; same thing happens with gets(),
fgets()). In this case, the "good morning" message stills get printed
on the server side, but the client doesn't get back "HELLO."
If the server program is terminated (by pressing ctrl-c), or a long
time (a few minutes?) passes, the client receives the "HELLO".
If the "POpen" program does not wait for user input (test2.cpp below),
the client immediately receives HELLO as expected.
Could this have anything to do with the getline() somehow blocking the
server response, even though it is POpened as a separate thread? How
can I solve this problem?
George.
**
server.py on server
**
#!/usr/bin/python
from subprocess import Popen, PIPE, STDOUT
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
class Handler(BaseHTTPRequestHandler):
# HTTP Server Methods
--
def do_PUT(self):
#print self.headers
length = int(self.headers.getheader('Content-Length'))
print 'Received PUT command, file length %d' % length
raw = self.rfile.read(length)
serverObj = Popen('./test1', stdin=PIPE, stdout=PIPE,
stderr=STDOUT)# Try replace test1 with test2
while True:
line = serverObj.stdout.readline()
print line,
if line.startswith('TYPE SOMETHING'):
break
self.wfile.write('HELLO!!!')
print 'good morning'
server = HTTPServer(('', 58621), Handler)
server.serve_forever()
**
test1.cpp on server:
**
#include
using namespace std;
int main()
{
char string[256];
cout << "This is a test program" << endl;
cout << "TYPE SOMETHING" << endl;
cin.getline (string,256);
return 0;
}
**
test2.cpp on server:
**
#include
using namespace std;
int main()
{
cout << "This is a test program" << endl;
cout << "TYPE SOMETHING" << endl;
return 0;
}
**
client.py on client:
**
#!/usr/bin/python
import os, sys
import pycurl
url = 'xxx'
class textBuffer:
def __init__(self):
self.contents = ''
def write(self, buf):
self.contents = self.contents+buf
# Initialize rawFileUploader, which uploads raw file and requests s2t
rawFileUploader = pycurl.Curl()
rawFileUploader.setopt(pycurl.URL, url)
rawFileUploader.setopt(pycurl.UPLOAD, 1)
while 1:
filename = raw_input('Enter filename (CTRL-C to quit)>')
rawFile = open(filename,'rb')
text = textBuffer()
rawFileUploader.setopt(pycurl.READDATA, rawFile)
rawFileUploader.setopt(pycurl.WRITEFUNCTION, text.write)
rawFileUploader.setopt(pycurl.INFILESIZE, os.path.getsize(filename))
rawFileUploader.perform()
rawFile.close()
print text.contents
rawFileUploader.close()
--
http://mail.python.org/mailman/listinfo/python-list