<!DOCTYPE HTML>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
  <title>HTTP method test</title>
  <style type="text/css" media="screen">
    body {background:#eee; margin:0%; padding:0%; padding-top:0%; padding-left:1%}
    .cform {margin:0%; padding:0%; padding-top:0%; padding-left:2%;}
    h3 {margin:0%; padding:0%; padding-top:0%; padding-left:0%;}
    td {vertical-align:top; text-align:left;}
  </style>
  <script type="text/javascript"><![CDATA[

    function getParams() {
      var result = {};
      var kvPairs = location.search.slice(1).split('&');

      kvPairs.forEach(
        function(kvPair) {
          kvPair = kvPair.split('=');
          result[kvPair[0]] = kvPair[1] || '';
        }
      );

      return result;
    }

    function noBody() {
      document.getElementById("body_none").checked = true;
    }

    function load() {
      var params = getParams();
      var method = params["method"];
      if (!method) {
        method = "GET";
      }
      var path = params["path"];
      if (!path) {
        path = "";
      }

      var elem = document.getElementById('h1');
      elem.innerHTML = "HTTP method test page";

      document.getElementById("proto_http").checked = (window.location.protocol != "https:");
      document.getElementById("proto_https").checked = (window.location.protocol == "https:");
      document.getElementById("server").value = location.host;
      document.getElementById("resource").value = path;

      setRadioValue("method", method);
      noBody();
    }

    function setRadioValue(elmname, value) {
      var elms = document.getElementsByName(elmname);
      var len = elms.length;
      var ret = false;

      for (var i=0; i<len; i++) {
        elms[i].checked = (elms[i].value == value);
        ret |= elms[i].checked;
      }
      return ret;
    }

    function getRadioValue(elmname) {

      var elms = document.getElementsByName(elmname);
      var len = elms.length;
      var ret = "";

      for (var i=0; i<len; i++) {
        if (elms[i].checked) {
          ret = elms[i].value;
        }
      }
      return ret;
    }

    function sendreq() {
      var proto = getRadioValue("protocol");
      var host = document.getElementById("server").value;
      var res = document.getElementById("resource").value;
      var addr = proto + "://" + host + "/" + res;
      var meth = getRadioValue("method");
      var body = getRadioValue("body");

      xmlhttp = new XMLHttpRequest();
      if (!xmlhttp) {
        alert("XMLHttpRequest not available");
        window.history.back();
      }

      xmlhttp.open(meth,addr,true);

      if (body == '*') {
        body = null;
      } else {
        if (body == '**') {
          var body_bytes = document.getElementById("body_bytes").value;
          body_bytes = parseInt(Number(body_bytes) || 0) || 0;
          body = "";
          for (var i=0; i<body_bytes; i++) {
            var ascii = Math.floor((Math.random() * 94) + 32);
            body = body + String.fromCharCode(ascii);
          }
        }
        xmlhttp.setRequestHeader("Content-Length", body.length);
      }

      xmlhttp.onreadystatechange = function()
      {
          var laddr = addr;
          var lmeth = meth;
          var blen = "";
          if (body) {
            blen = "\nWith " + body.length + " bytes body data";
          }

          if (xmlhttp.readyState == 4)
          {
              alert(lmeth + " " + laddr + blen + "\n\nResponse: " + xmlhttp.status + "\n\n" + xmlhttp.responseText);
          }
      }

      xmlhttp.send(body);

    }

  ]]></script>

</head>
<body onload="load()">

<h1 id='h1'>Fatal error: Javascript not available!</h1>

<h2>Test parameters</h2>
<form lass="cform">

<h3>Protocol</h3>
<input id="proto_http" type="radio" name="protocol" value="http" /> http <br />
<input id="proto_https" type="radio" name="protocol" value="https" /> https

<h3>Server/Host</h3>
<input id="server" type="text" name="server" value="" />

<h3>Resource</h3>
<input id="resource" type="text" name="resource" value="" />

<h3>Method</h3>
<!-- http://www.restpatterns.org/HTTP_Methods -->
<!-- http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html -->
<table style="border-spacing:15px 0px;">
  <tr>
    <td><a href="http://tools.ietf.org/html/rfc7231#section-4.2.1">Save Methods</a></td>
    <td>"Unsave" <a href="http://tools.ietf.org/html/rfc7231#section-4.2.2">Idempotent Methods</a></td>
    <td>Non-Idempotent Methods</td>
    <td>Special</td>
  </tr>
  <tr>
    <td>
<input id="method_opt" type="radio" name="method" value="OPTIONS" onclick="noBody()" /> OPTIONS <br />
<input id="method_get" type="radio" name="method" value="GET" onclick="noBody()" /> GET <br />
<input id="method_hea" type="radio" name="method" value="HEAD" onclick="noBody()" /> HEAD <br />
<input id="method_tra" type="radio" name="method" value="TRACE" /> TRACE <br />
<input id="method_pro" type="radio" name="method" value="PROPFIND" /> PROPFIND <br />
    </td>
    <td>
<input id="method_put" type="radio" name="method" value="PUT" /> PUT <br />
<input id="method_del" type="radio" name="method" value="DELETE" /> DELETE <br />
<input id="method_cop" type="radio" name="method" value="COPY" /> COPY <br />
<input id="method_cop" type="radio" name="method" value="MOVE" /> MOVE <br />
<input id="method_ppa" type="radio" name="method" value="PROPPATCH" /> PROPPATCH <br />
<input id="method_unl" type="radio" name="method" value="UNLOCK" /> UNLOCK <br />
    </td>
    <td>
<input id="method_pos" type="radio" name="method" value="POST" /> POST <br />
<input id="method_pat" type="radio" name="method" value="PATCH" /> PATCH <br />
<input id="method_mkc" type="radio" name="method" value="MKCOL" /> MKCOL <br />
<input id="method_loc" type="radio" name="method" value="LOCK" /> LOCK <br />
    </td>
    <td>
<input id="method_con" type="radio" name="method" value="CONNECT" /> CONNECT <br />
<input id="method_userdef" type="radio" name="method" value="INVALID" /> <input id="method_name" type="text" name="method_name" value="INVALID" oninput="var elem = document.getElementById('method_userdef'); elem.checked = true; elem.value=value" /> <br />
    </td>
  </tr>
</table>

<h3>Body data</h3>
<input id="body_none" type="radio" name="body" value="*" /> No body data <br />
<input id="body_10" type="radio" name="body" value="1234567890" /> 10 Bytes ("1234567890") <br />
<input id="body_rnd" type="radio" name="body" value="**" /> <input id="body_bytes" type="number" name="body_bytes" value="100" min="0" step="0" max="999999999" oninput="document.getElementById('body_rnd').checked = true" /> Bytes random data <br />

<h3>Submit</h3>
<input id="send" type="button" onclick="sendreq()" value="Send request" />

</form>

</body></html>
