JAVASCRIPT   22

api.js

Guest on 19th July 2021 04:42:06 PM

  1. function normalizeHTTPHeader (str) {
  2.   // Capitalize HTTP headers for display.
  3.   return (str.charAt(0).toUpperCase() + str.substring(1))
  4.     .replace(/-(.)/g, function ($1) { return $1.toUpperCase() })
  5.     .replace(/(Www)/g, function ($1) { return 'WWW' })
  6.     .replace(/(Xss)/g, function ($1) { return 'XSS' })
  7.     .replace(/(Md5)/g, function ($1) { return 'MD5' })
  8. }
  9.  
  10. var responseDisplay = 'data'
  11. const coreapi = window.coreapi
  12. const schema = window.schema
  13.  
  14. // Language Control
  15. $('#language-control li').click(function (event) {
  16.     event.preventDefault();
  17.     const languageMenuItem = $(this).find('a');
  18.     var language = languageMenuItem.data("language")
  19.  
  20.     var languageControls = $(this).closest('ul').find('li');
  21.     languageControls.find('a').not('[data-language="' + language +'"]').parent().removeClass("active")
  22.     languageControls.find('a').filter('[data-language="' + language +'"]').parent().addClass("active")
  23.  
  24.     $('#selected-language').text(language)
  25.  
  26.     var codeBlocks = $('pre.highlight')
  27.     codeBlocks.not('[data-language="' + language +'"]').addClass("hide")
  28.     codeBlocks.filter('[data-language="' + language +'"]').removeClass("hide")
  29. })
  30.  
  31. function formEntries (form) {
  32.   // Polyfill for new FormData(form).entries()
  33.   var formData = new FormData(form)
  34.   if (formData.entries !== undefined) {
  35.     return formData.entries()
  36.   }
  37.  
  38.   var entries = []
  39.  
  40.   for (var {name, type, value, files, checked, selectedOptions} of Array.from(form.elements)) {
  41.     if (!name) {
  42.       continue
  43.     }
  44.  
  45.     if (type === 'file') {
  46.       for (var file of files) {
  47.         entries.push([name, file])
  48.       }
  49.     } else if (type === 'select-multiple' || type === 'select-one') {
  50.       for (var elm of Array.from(selectedOptions)) {
  51.         entries.push([name, elm.value])
  52.       }
  53.     } else if (type === 'checkbox') {
  54.       if (checked) {
  55.         entries.push([name, value])
  56.       }
  57.     } else {
  58.       entries.push([name, value])
  59.     }
  60.   }
  61.   return entries
  62. }
  63.  
  64. // API Explorer
  65. $('form.api-interaction').submit(function(event) {
  66.     event.preventDefault();
  67.  
  68.     const form = $(this).closest("form");
  69.     const key = form.data("key");
  70.     var params = {};
  71.  
  72.     const entries = formEntries(form.get()[0]);
  73.     for (var [paramKey, paramValue] of entries) {
  74.         var elem = form.find("[name=" + paramKey + "]")
  75.         var dataType = elem.data('type') || 'string'
  76.  
  77.         if (dataType === 'integer' && paramValue) {
  78.             var value = parseInt(paramValue)
  79.             if (!isNaN(value)) {
  80.               params[paramKey] = value
  81.             }
  82.         } else if (dataType === 'number' && paramValue) {
  83.             var value = parseFloat(paramValue)
  84.             if (!isNaN(value)) {
  85.               params[paramKey] = value
  86.             }
  87.         } else if (dataType === 'boolean' && paramValue) {
  88.             var value = {
  89.                 'true': true,
  90.                 'false': false
  91.             }[paramValue.toLowerCase()]
  92.             if (value !== undefined) {
  93.               params[paramKey]
  94.             }
  95.         } else if (dataType === 'array' && paramValue) {
  96.             try {
  97.               params[paramKey] = JSON.parse(paramValue)
  98.             } catch (err) {
  99.               // Ignore malformed JSON
  100.             }
  101.         } else if (dataType === 'object' && paramValue) {
  102.             try {
  103.               params[paramKey] = JSON.parse(paramValue)
  104.             } catch (err) {
  105.               // Ignore malformed JSON
  106.             }
  107.         } else if (dataType === 'string' && paramValue) {
  108.             params[paramKey] = paramValue
  109.         }
  110.     }
  111.  
  112.     form.find(":checkbox").each(function( index ) {
  113.         // Handle unselected checkboxes
  114.         var name = $(this).attr("name");
  115.         if (!params.hasOwnProperty(name)) {
  116.             params[name] = false
  117.         }
  118.     })
  119.  
  120.     function requestCallback(request) {
  121.         // Fill in the "GET /foo/" display.
  122.         var parser = document.createElement('a');
  123.         parser.href = request.url;
  124.         const method = request.options.method
  125.         const path = parser.pathname + parser.hash + parser.search
  126.  
  127.         form.find(".request-method").text(method)
  128.         form.find(".request-url").text(path)
  129.     }
  130.  
  131.     function responseCallback(response, responseText) {
  132.         // Display the 'Data'/'Raw' control.
  133.         form.closest(".modal-content").find(".toggle-view").removeClass("hide")
  134.  
  135.         // Fill in the "200 OK" display.
  136.         form.find(".response-status-code").removeClass("label-success").removeClass("label-danger")
  137.         if (response.ok) {
  138.             form.find(".response-status-code").addClass("label-success")
  139.         } else {
  140.             form.find(".response-status-code").addClass("label-danger")
  141.         }
  142.         form.find(".response-status-code").text(response.status)
  143.         form.find(".meta").removeClass("hide")
  144.  
  145.         // Fill in the Raw HTTP response display.
  146.         var panelText = 'HTTP/1.1 ' + response.status + ' ' + response.statusText + '\n';
  147.         response.headers.forEach(function(header, key) {
  148.             panelText += normalizeHTTPHeader(key) + ': ' + header + '\n'
  149.         })
  150.         if (responseText) {
  151.             panelText += '\n' + responseText
  152.         }
  153.         form.find(".response-raw-response").text(panelText)
  154.     }
  155.  
  156.     // Instantiate a client to make the outgoing request.
  157.     var options = {
  158.         requestCallback: requestCallback,
  159.         responseCallback: responseCallback,
  160.     }
  161.  
  162.     // Setup authentication options.
  163.     if (window.auth && window.auth.type === 'token') {
  164.       // Header authentication
  165.       options.auth = new coreapi.auth.TokenAuthentication({
  166.         prefix: window.auth.scheme,
  167.         token: window.auth.token
  168.       })
  169.     } else if (window.auth && window.auth.type === 'basic') {
  170.       // Basic authentication
  171.       options.auth = new coreapi.auth.BasicAuthentication({
  172.         username: window.auth.username,
  173.         password: window.auth.password
  174.       })
  175.     } else if (window.auth && window.auth.type === 'session') {
  176.       // Session authentication
  177.       options.auth = new coreapi.auth.SessionAuthentication({
  178.         csrfCookieName: 'csrftoken',
  179.         csrfHeaderName: 'X-CSRFToken'
  180.       })
  181.     }
  182.  
  183.     const client = new coreapi.Client(options)
  184.  
  185.     client.action(schema, key, params).then(function (data) {
  186.         var response = JSON.stringify(data, null, 2);
  187.         form.find(".request-awaiting").addClass("hide")
  188.         form.find(".response-raw").addClass("hide")
  189.         form.find(".response-data").addClass("hide")
  190.         form.find(".response-data").text('')
  191.         form.find(".response-data").jsonView(response)
  192.  
  193.         if (responseDisplay === 'data') {
  194.             form.find(".response-data").removeClass("hide")
  195.         } else {
  196.             form.find(".response-raw").removeClass("hide")
  197.         }
  198.     }).catch(function (error) {
  199.         var response = JSON.stringify(error.content, null, 2);
  200.         form.find(".request-awaiting").addClass("hide")
  201.         form.find(".response-raw").addClass("hide")
  202.         form.find(".response-data").addClass("hide")
  203.         form.find(".response-data").text('')
  204.         form.find(".response-data").jsonView(response)
  205.  
  206.         if (responseDisplay === 'data') {
  207.             form.find(".response-data").removeClass("hide")
  208.         } else {
  209.             form.find(".response-raw").removeClass("hide")
  210.         }
  211.     })
  212. });
  213.  
  214. // 'Data'/'Raw' control
  215. $('.toggle-view button').click(function() {
  216.     responseDisplay = $(this).data("display-toggle");
  217.     $(this).removeClass("btn-default").addClass('btn-info').siblings().removeClass('btn-info');
  218.     if (responseDisplay === 'raw') {
  219.         $(this).closest(".modal-content").find(".response-raw").removeClass("hide");
  220.         $(this).closest(".modal-content").find(".response-data").addClass("hide");
  221.     } else {
  222.         $(this).closest(".modal-content").find(".response-data").removeClass("hide");
  223.         $(this).closest(".modal-content").find(".response-raw").addClass("hide");
  224.     }
  225. });
  226.  
  227. // Authentication: none
  228. $('#auth-control').find("[data-auth='none']").click(function (event) {
  229.     event.preventDefault();
  230.     window.auth = null;
  231.     $('#selected-authentication').text('none');
  232.     $('#auth-control').children().removeClass('active');
  233.     $('#auth-control').find("[data-auth='none']").addClass('active');
  234. })
  235.  
  236. // Authentication: token
  237. $('form.authentication-token-form').submit(function(event) {
  238.     event.preventDefault();
  239.     const form = $(this).closest("form");
  240.     const scheme = form.find('input#scheme').val();
  241.     const token = form.find('input#token').val();
  242.     window.auth = {
  243.         'type': 'token',
  244.         'scheme': scheme,
  245.         'token': token
  246.     };
  247.     $('#selected-authentication').text('token');
  248.     $('#auth-control').children().removeClass('active');
  249.     $('#auth-control').find("[data-auth='token']").addClass('active');
  250.     $('#auth_token_modal').modal('hide');
  251. });
  252.  
  253. // Authentication: basic
  254. $('form.authentication-basic-form').submit(function(event) {
  255.     event.preventDefault();
  256.     const form = $(this).closest("form");
  257.     const username = form.find('input#username').val();
  258.     const password = form.find('input#password').val();
  259.     window.auth = {
  260.         'type': 'basic',
  261.         'username': username,
  262.         'password': password
  263.     };
  264.     $('#selected-authentication').text('basic');
  265.     $('#auth-control').children().removeClass('active');
  266.     $('#auth-control').find("[data-auth='basic']").addClass('active');
  267.     $('#auth_basic_modal').modal('hide');
  268. });
  269.  
  270. // Authentication: session
  271. $('form.authentication-session-form').submit(function(event) {
  272.     event.preventDefault();
  273.     window.auth = {
  274.         'type': 'session',
  275.     };
  276.     $('#selected-authentication').text('session');
  277.     $('#auth-control').children().removeClass('active');
  278.     $('#auth-control').find("[data-auth='session']").addClass('active');
  279.     $('#auth_session_modal').modal('hide');
  280. });

Raw Paste


Login or Register to edit or fork this paste. It's free.