var req = new ActiveXObject ("MSXML2.ServerXMLHTTP");

var uri = WScript.Arguments(0);
var user = null;
var pwd = null;

if (WScript.Arguments.length > 1) {
  user = WScript.Arguments(1);
}

if (WScript.Arguments.length > 2) {
	pwd = WScript.Arguments(2);
}


function dumpResponse(r) {
  WScript.Echo(r.status);
  WScript.Echo(r.getAllResponseHeaders());
  WScript.Echo(r.responseText);
}

// delete target just in case
WScript.Echo("DELETE " + uri);
req.open("DELETE", uri, false, user, pwd);
req.send();
dumpResponse(req);

// create collection
WScript.Echo("MKCOL " + uri);
req.open("MKCOL", uri, false, user, pwd);
req.send();
if ((req.status < 200 || req.status >= 300) && req.status != 405) {
  WScript.Echo("unexpected status upon MKCOL:" + req.status + " " + req.responseText);
  WScript.Quit(2);
}
dumpResponse(req);

// put content
WScript.Echo("PUT " + uri + "/a");
req.open("PUT", uri + "/a", false, user, pwd);
req.send("foobar");
if (req.status < 200 || req.status >= 300) {
  WScript.Echo("unexpected status upon PUT: " + req.status + " " + req.responseText);
  WScript.Quit(2);
}
dumpResponse(req);

WScript.Echo("LOCK " + uri);
req.open("LOCK", uri, false, user, pwd);
req.setRequestHeader("Depth", "infinity");
req.setRequestHeader("Timeout", "Second-60");
req.send("<D:lockinfo xmlns:D='DAV:'><D:lockscope><D:exclusive/></D:lockscope><D:locktype><D:write/></D:locktype></D:lockinfo>");
dumpResponse(req);

var locktoken = null;

try {
  locktoken = req.getResponseHeader("lock-token");
}
catch (x) {}

if (locktoken == null || locktoken == "") {
  WScript.Echo("server did not return lock token, trying response body");
  WScript.Echo(req.responseText);
  req.responseXML.setProperty("SelectionLanguage", "XPath");
  locktoken = req.responseXML.selectSingleNode("//*[local-name()='href']").text;
}
else {
  locktoken = locktoken.substring(1, locktoken.length - 1);
}

if (req.status == 200 || req.status == 201) {
  WScript.Echo("locktoken: " + locktoken);
}
else {
  WScript.Echo("resource not locked, status: " + req.status + " " + req.responseText);
  WScript.Quit(2);
}

// attempt LOCK refresh on indirectly locked resource /a with tag list on parent
WScript.Echo("LOCK refresh " + uri + "/a tagged-list on /");
req.open("LOCK", uri + "/a", false, user, pwd);
req.setRequestHeader("If", "<" + uri + "> (<" + locktoken + ">)");
req.send();
dumpResponse(req);

// attempt LOCK refresh on indirectly locked resource /a
WScript.Echo("LOCK refresh " + uri + "/a no-tag list");
req.open("LOCK", uri + "/a", false, user, pwd);
req.setRequestHeader("If", "(<" + locktoken + ">)");
req.send();
dumpResponse(req);

// attempt LOCK refresh on indirectly locked resource /a
WScript.Echo("LOCK refresh " + uri + "/a tagged-list on /a");
req.open("LOCK", uri + "/a", false, user, pwd);
req.setRequestHeader("If", "<" + uri + "/a> (<" + locktoken + ">)");
req.send();
dumpResponse(req);


