public void run() {
			// create a DavDirListing
			DirListing ddl = new DavDirListing();
			SynchronousLogicalStreamConnection con = null;
			HTTPHeaders headers = null;
			String replyline = null;
			HTTPReplyLine hrl = null;
			HTTPHeaderReader hhr = null;
			HTTPResponseBodyReader rbr = null;

			//D.out ("|-- Runnable running for " + d.getPath());
			
			try {
				con = TcpHTTPConnectionPool.acquireOrCreateConnection(hostname, port, 30*1000);

				headers = new HTTPHeaders();
				headers.setHeader("Depth", "1");
				new HTTPRequestWriter(con, hostname + ":" + port,
						HTTPVerb.PROPFIND, d.getPath(), headers).write();

				replyline = con.readLine();
				hrl = new HTTPReplyLine(replyline);
				// System.out.println(hrl.getVersion().toString());
				// System.out.println(hrl.getNr());
				// System.out.println(hrl.getMsg());
				hhr = new HTTPHeaderReader();
				hhr.read(con);

				// check for http 200
				if (!hrl.isOK())
					throw new Exception("HTTP " + hrl.getNr() + ": \""
							+ hrl.getMsg() + "\"");

				rbr = HTTPResponseBodyReaderFactory.createReader(con, hrl, hhr
						.getHeaders());

				InputStream is = Channels.newInputStream(rbr
						.asReadableByteChannel());

				Document doc = DOMUtils.documentFromInputStream(is);

				if (doc != null)
					parseResponseXmlTree(doc, ddl);
				else
					throw new Exception ("Could not fetch Dirlisting");
				

				// everything went fine, we can send the connection back to the
				// pool
				if (con.isConnected() && rbr.hasFinished() && !rbr.hasAborted())
					TcpHTTPConnectionPool.releaseConnection(con);
				else
					TcpHTTPConnectionPool.abortConnection(con);

				ddl.setError(null);
			} catch (Exception e) {
				// e.printStackTrace();
				ddl.setError(e.toString());
				e.printStackTrace();
				ddl.clear();
				
				try {
				TcpHTTPConnectionPool.abortConnection(con);
				} catch (Exception f) {
					f.printStackTrace();
				}
			} finally {
				// deliver to the cache
				dirListingReceiver.fetchDone(d, ddl);
			}
		}