On Mon, Oct 15, 2018 at 05:13:31PM +0100, Richard W.M. Jones wrote:
On Mon, Oct 15, 2018 at 06:43:10PM +0300, Nir Soffer wrote:
> On Mon, Oct 15, 2018 at 6:21 PM Richard W.M. Jones <rjones(a)redhat.com>
> wrote:
>
> > On Tue, Oct 09, 2018 at 02:28:10PM +0300, Nir Soffer wrote:
> > > > +# Create a background thread running a web server which is
> > > > +# simulating the imageio server.
> > > >
> > >
> > > This functionality should be separated from the fake SDK module, since
> > it is
> > > not part of the SDK, and may be replaced by real imageio server later.
> >
> > Well possibly, but it was very convenient to put it in the class here,
> > and this test is meant for running completely standalone without any
> > other service available.
> >
> > > > +class RequestHandler(BaseHTTPRequestHandler):
> > > >
> > >
> > > This request handler is using HTTP/1.0, and will close the connection
> > after
> > > every request. This is not a good implementation of the imageio server,
> > and
> > > also
> > > hides bugs in this code.
> > >
> > > Should be fixed by adding:
> > >
> > > protocol_version = "HTTP/1.1"
> >
> > I tried the attached patch, but for some reason it just hangs.
> >
>
> The issue is probably missing "content-length: 0" header in the
> response. If we don't close the connection and don't send
> content-length the client cannot do much but wait :-)
Ah yes, it was missing from the OPTIONS method.
The attached patch does work. What do you think?
Rich.
--
Richard Jones, Virtualization Group, Red Hat
http://people.redhat.com/~rjones
Read my programming and virtualization blog:
http://rwmj.wordpress.com
virt-builder quickly builds VMs from scratch
http://libguestfs.org/virt-builder.1.html
>From 6eb473a7e67de82bf08b97f2610ee3364071c741 Mon Sep 17 00:00:00
2001
From: "Richard W.M. Jones" <rjones(a)redhat.com>
Date: Mon, 15 Oct 2018 16:07:52 +0100
Subject: [PATCH] v2v: -o rhv-upload: Test using HTTP/1.1 protocol.
Fixes commit b54b58c44e3f1f54a05117c758eaa21d9f1085f0.
Thanks: Nir Soffer.
---
.../ovirtsdk4/__init__.py | 28 ++++++++++++++++---
1 file changed, 24 insertions(+), 4 deletions(-)
diff --git a/v2v/test-v2v-o-rhv-upload-module/ovirtsdk4/__init__.py
b/v2v/test-v2v-o-rhv-upload-module/ovirtsdk4/__init__.py
index b5f739471..84b9d56aa 100644
--- a/v2v/test-v2v-o-rhv-upload-module/ovirtsdk4/__init__.py
+++ b/v2v/test-v2v-o-rhv-upload-module/ovirtsdk4/__init__.py
@@ -116,24 +116,44 @@ from http.server import HTTPServer, BaseHTTPRequestHandler
import threading
class RequestHandler(BaseHTTPRequestHandler):
+ protocol_version = 'HTTP/1.1'
+
def do_OPTIONS(self):
- self.send_response(200)
- self.send_header("Content-type", "application/json;
charset=UTF-8")
- self.end_headers()
+ self.discard_request()
+
# Advertize only zero support.
- self.wfile.write(b'''{ "features": [ "zero" ]
}''')
+ content = b'''{ "features": [ "zero" ]
}'''
+ length = len(content)
+
+ self.send_response(200)
+ self.send_header("Content-type", "application/json;
charset=UTF-8")
+ self.send_header("Content-Length", length)
+ self.end_headers()
+ self.wfile.write(content)
# eg. zero request. Just ignore it.
def do_PATCH(self):
+ self.discard_request()
self.send_response(200)
+ self.send_header("Content-Length", "0")
self.end_headers()
# Flush request. Ignore it.
def do_PUT(self):
+ self.discard_request()
self.send_response(200)
+ self.send_header("Content-Length", "0")
self.end_headers()
+ def discard_request(self):
+ length = self.headers['Content-Length']
+ if length:
+ length = int(length)
+ content = self.rfile.read(length)
This commit went upstream:
https://github.com/libguestfs/libguestfs/commit/bfd9bee9fc7a91fdca0ca051d...
However it fails on RHEL 7.6 with:
Traceback (most recent call last):
File "/usr/lib64/python2.7/SocketServer.py", line 295, in
_handle_request_nobl
ock
self.process_request(request, client_address)
File "/usr/lib64/python2.7/SocketServer.py", line 321, in process_request
self.finish_request(request, client_address)
File "/usr/lib64/python2.7/SocketServer.py", line 334, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "/usr/lib64/python2.7/SocketServer.py", line 649, in __init__
self.handle()
File "/usr/lib64/python2.7/BaseHTTPServer.py", line 340, in handle
self.handle_one_request()
File "/usr/lib64/python2.7/BaseHTTPServer.py", line 328, in
handle_one_request
method()
File "/home/rjones/d/libguestfs-rhel-7.6-lp/v2v/test-v2v-o-rhv-upload-module/o
virtsdk4/__init__.py", line 123, in do_OPTIONS
self.discard_request()
File
"/home/rjones/d/libguestfs-rhel-7.6-lp/v2v/test-v2v-o-rhv-upload-module/ovirtsdk4/__init__.py",
line 150, in discard_request
length = self.headers['Content-Length']
File "/usr/lib64/python2.7/rfc822.py", line 388, in __getitem__
return self.dict[name.lower()]
KeyError: 'content-length'
I guess that Python won't let us do:
length = self.headers['Content-Length']
if length:
How about the attached fix?
Rich.
--
Richard Jones, Virtualization Group, Red Hat
http://people.redhat.com/~rjones
Read my programming and virtualization blog:
http://rwmj.wordpress.com
virt-df lists disk usage of guests without needing to install any
software inside the virtual machine. Supports Linux and Windows.
http://people.redhat.com/~rjones/virt-df/