Changeset 1852 for trunk/tools/ws.htm


Ignore:
Timestamp:
Feb 23, 2007, 2:18:34 PM (18 years ago)
Author:
rvelices
Message:

Plugins:

  • display author and and author url (if present) on plugin admin page
  • uniformized versions/authors... for all plugins in svn
  • security fix (html escape name, version, uri, author... to avoid javascript injection which could automatically simulate click on Install)
  • added confirmation for install/uninstall plugins

Web services:

  • web service explorer now caches method details in order to avoid unnecessary web calls
  • web service explorer can now send parameters as arrays
  • web service explorer uses now prototype.js version 1.5
  • small improvements
  • added and use function bad_request (sends http status code 400)
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tools/ws.htm

    r1849 r1852  
    66
    77<script type="text/javascript">
    8 function setElementText(id, text)
    9 {
    10   if (!text) text="";
    11   var elt = document.getElementById(id);
    12   if (!elt) alert('setElementText '+id);
    13   elt.innerHTML = text;
    14 }
    158
    169function setVisibility(id, vis)
    1710{
    18   document.getElementById(id).style.visibility = vis;
    19 }
    20 
    21 function clearError()
    22 {
    23   setElementText("error", "");
     11  $(id).style.visibility = vis;
    2412}
    2513
     
    3826         }
    3927        }
    40         setElementText("error", s);
     28  $("error").update(s);
    4129}
    4230
    4331var gServiceUrl;
    44 var gCurrentMethodParams;
     32var gCachedMethods;
    4533
    4634Ajax.Responders.register({
     
    10189function pwgChangeUrl()
    10290{
    103   clearError();
     91  $("error").update("");
    10492  setVisibility("methodListWrapper", "hidden");
    105   setElementText("methodList", "");
     93  $("methodList").update("");
    10694  setVisibility("methodWrapper", "hidden");
     95  setVisibility("methodDetailWrapper", "hidden");
    10796
    10897  gServiceUrl = $F('ws_url');
    109   gCurrentMethodParams = null;
     98  gCachedMethods = new Hash();
    11099
    111100  try {
     
    131120                ml += '<li><a href="#" onclick="return pwgSelectMethod(this.innerHTML)">'+ result.methods[i]+'</a></li>';
    132121        }
    133         setElementText("methodList", ml);
     122        $("methodList").update(ml);
    134123        setVisibility("methodListWrapper", "visible");
    135124}
    136125
    137 function pwgSelectMethod(method)
    138 {
    139   clearError();
    140   setElementText("methodName", method);
     126function pwgSelectMethod(methodName)
     127{
     128  $("error").update("");
     129  $("methodName").update(methodName);
    141130  setVisibility("methodDetailWrapper", "hidden");
    142131  setVisibility("methodWrapper", "visible");
    143   gCurrentMethodParams = null;
    144 
    145   try {
    146 
    147                 var ajaxReq = new Ajax.Request(
    148                                 gServiceUrl,
    149                                 {method:'get', parameters:'format=json&method=reflection.getMethodDetails&methodName='+method,
    150                                  onSuccess: function (r) { onSuccess_getMethodDetails(r); }
    151                                 }
    152                         )
    153   }catch (e)
     132
     133  if ( gCachedMethods[methodName] )
     134    fillNewMethod( gCachedMethods[methodName] );
     135  else
    154136  {
    155     dumpError( e );
     137    try {
     138                var ajaxReq = new Ajax.Request(
     139                                gServiceUrl,
     140                                {method:'get', parameters:'format=json&method=reflection.getMethodDetails&methodName='+methodName,
     141                                 onSuccess: function (r) { onSuccess_getMethodDetails(r); }
     142                                }
     143                        )
     144    }catch (e)
     145    {
     146      dumpError( e );
     147    }
    156148  }
    157149  return false;
     
    161153{
    162154        var result = pwgGetJsonResult(transport);
     155  fillNewMethod( gCachedMethods[result.name] = $H(result) );
     156}
     157
     158function fillNewMethod(method)
     159{
    163160        var methodParamsElt = $("methodParams");
    164161        while (methodParamsElt.tBodies[0].rows.length)
    165162                methodParamsElt.tBodies[0].deleteRow(methodParamsElt.tBodies[0].rows.length-1);
    166163
    167         if (result.params)
    168   {
    169     gCurrentMethodParams = result.params;
    170     if (result.params.length>0)
    171           {
    172                 for (var i=0; i<result.params.length; i++)
     164        if (method.params && method.params.length>0)
     165        {
     166                for (var i=0; i<method.params.length; i++)
    173167                {
    174168                        var row = methodParamsElt.tBodies[0].insertRow(-1);
    175                         var isOptional = result.params[i].optional;
    176                         var defaultValue = result.params[i].defaultValue == null ? '' : result.params[i].defaultValue;
     169                        var isOptional = method.params[i].optional;
     170                        var acceptArray = method.params[i].acceptArray;
     171                        var defaultValue = method.params[i].defaultValue == null ? '' : method.params[i].defaultValue;
    177172 
    178                         row.insertCell(0).innerHTML = result.params[i].name;
    179                         row.insertCell(1).innerHTML = (isOptional ? 'optional':'required');
     173                        row.insertCell(0).innerHTML = method.params[i].name;
     174                        row.insertCell(1).innerHTML = '<span title="parameter is '+(isOptional ? 'optional':'required') +'">'+(isOptional ? '?':'*')+'</span>'
     175          + (method.params[i].acceptArray ? ' <span title="parameter can be an array; use | (pipe) character to split values">[ ]</span>':'');
    180176                        row.insertCell(2).innerHTML = '<input id="methodParameterSend_'+i+'" type="checkbox" '+(isOptional ? '':'checked="checked"')+'/>';
    181177                        row.insertCell(3).innerHTML = '<input id="methodParameterValue_'+i+'"" value="'+defaultValue+'" style="width:99%" onchange="$(\'methodParameterSend_'+i+'\').checked=true;"/>';
    182178                }
    183         }
    184         }
    185         setElementText("methodDescription", result.description);
     179        }
     180        $("methodDescription").update(method.description);
    186181        setVisibility("methodDetailWrapper", "visible");
    187182}
     
    189184function pwgInvokeMethod( newWindow )
    190185{
    191         var method = document.getElementById('methodName').innerHTML;
     186        var methodName = $('methodName').innerHTML;
     187        var method = gCachedMethods[methodName];
    192188
    193189  var reqUrl = gServiceUrl;
    194190  reqUrl += "?format="+$F('responseFormat');
    195191
    196   if (document.getElementById('requestFormat').value == 'get')
     192  if ($('requestFormat').value == 'get')
    197193  {
    198     reqUrl += "&method="+method;
    199     for ( var i=0; i<gCurrentMethodParams.length; i++)
     194    reqUrl += "&method="+methodName;
     195    for ( var i=0; i<method.params.length; i++)
    200196    {
    201       if (document.getElementById('methodParameterSend_'+i).checked)
    202         reqUrl += '&'+gCurrentMethodParams[i].name+'='+$F('methodParameterValue_'+i);
     197      if (! $('methodParameterSend_'+i).checked)
     198        continue;
     199
     200      if ( method.params[i].acceptArray &&  $F('methodParameterValue_'+i).split('|').length > 1 )
     201      {
     202        $F('methodParameterValue_'+i).split('|').each(
     203            function(v) {
     204              reqUrl += '&'+method.params[i].name+'[]='+v;
     205            }
     206          );
     207      }
     208      else
     209        reqUrl += '&'+method.params[i].name+'='+$F('methodParameterValue_'+i);
    203210    }
    204211    if ( !newWindow )
    205       document.getElementById("invokeFrame").src = reqUrl;
     212      $("invokeFrame").src = reqUrl;
    206213    else
    207214      window.open(reqUrl);
     
    209216  else
    210217  {
    211     var form = document.getElementById("invokeForm");
     218    var form = $("invokeForm");
    212219    form.action = reqUrl;
    213     var t = '<input type="hidden" name="'+'method'+'" value="'+method+'"/>';
    214     for ( var i=0; i<gCurrentMethodParams.length; i++)
     220    var t = '<input type="hidden" name="'+'method'+'" value="'+methodName+'"/>';
     221    for ( var i=0; i<method.params.length; i++)
    215222    {
    216       if (document.getElementById('methodParameterSend_'+i).checked)
    217         t += '<input type="hidden" name="'+gCurrentMethodParams[i].name+'" value="'+$F('methodParameterValue_'+i)+'"/>';
     223      if (! $('methodParameterSend_'+i).checked)
     224        continue;
     225
     226      if ( method.params[i].acceptArray &&  $F('methodParameterValue_'+i).split('|').length > 1 )
     227      {
     228        $F('methodParameterValue_'+i).split('|').each(
     229            function(v) {
     230              t += '<input type="hidden" name="'+method.params[i].name+'[]" value="'+v+'"/>';
     231            }
     232          );
     233      }
     234      else
     235        t += '<input type="hidden" name="'+method.params[i].name+'" value="'+$F('methodParameterValue_'+i)+'"/>';
    218236    }
    219237    form.innerHTML = t;
    220     if ( !newWindow )
    221       form.target = "invokeFrame";
    222     else
    223       form.target = "_blank";
     238    form.target = newWindow ? "_blank" : "invokeFrame";
    224239    form.submit();
    225240  }
     
    357372          <tr>
    358373            <td style="width:150px">Parameter</td>
    359             <td>Optional</td>
     374            <td>Extra</td>
    360375            <td>Send</td>
    361376            <td style="width:160px">Value</td>
Note: See TracChangeset for help on using the changeset viewer.