Spaces:
Build error
Build error
| <html> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <title>Judge0 Dummy Client</title> | |
| <script src="https://code.jquery.com/jquery-3.1.1.min.js" integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8=" crossorigin="anonymous"></script> | |
| </head> | |
| <body style="padding: 0px 40px 40px 40px;"> | |
| <h1>Judge0 Dummy Client</h1> | |
| <p> | |
| Judge0 dummy client can be used to try and test features of Judge0. Data is not validated on client side. | |
| Client first creates new submission and then fetches submission status every <code>1500ms</code>. | |
| Client stops fetching submission status after recieving an error or when submission status is not <code>In Queue</code> or <code>Processing</code>. | |
| </p> | |
| <p> | |
| Note that you need to define <strong>API URL</strong>. This is the base url of some Judge0 host (e.g. <code>https://api.judge0.com</code>). | |
| Description of network errors can be found in console of your browser, so check that for more information. | |
| </p> | |
| <hr> | |
| <strong>API URL</strong>  | |
| <input type="url" name="apiUrl" size="31" placeholder="https://api.judge0.com"><br><br> | |
| <strong>AUTHENTICATION HEADER</strong>  | |
| <input type="text" name="authnHeader" size="31" placeholder="X-Auth-Token" value="X-Auth-Token"><br><br> | |
| <strong>AUTHENTICATION TOKEN</strong>  | |
| <input type="text" size="31" name="authnToken"><br><br> | |
| <strong>AUTHORIZATION HEADER</strong>  | |
| <input type="text" name="authzHeader" size="31" placeholder="X-Auth-User" value="X-Auth-User"><br><br> | |
| <strong>AUTHORIZATION TOKEN</strong>  | |
| <input type="text" size="31" name="authzToken"><br><br> | |
| <strong>Source Code</strong> | |
| <input type="checkbox" name="sourceCodeIsNull"><code>null</code><br> | |
| <textarea name="sourceCode" rows="10" cols="50"> | |
| #include <stdio.h> | |
| int main(void) { | |
| char name[10]; | |
| scanf("%s", name); | |
| printf("hello, %s\n", name); | |
| return 0; | |
| }</textarea><br><br> | |
| <strong>Language ID</strong>  | |
| <input type="text" name="languageId" value="50"> | |
| <input type="checkbox" name="languageIdIsNull"><code>null</code><br><br> | |
| <strong>Number Of Runs</strong>  | |
| <input type="text" name="numberOfRuns" value="1"> | |
| <input type="checkbox" name="numberOfRunsIsNull" checked><code>null</code><br><br> | |
| <strong>CPU Time Limit</strong>  | |
| <input type="text" name="cpuTimeLimit" value="5"> | |
| <input type="checkbox" name="cpuTimeLimitIsNull" checked><code>null</code><br><br> | |
| <strong>CPU Extra Time</strong>  | |
| <input type="text" name="cpuExtraTime" value="1"> | |
| <input type="checkbox" name="cpuExtraTimeIsNull" checked><code>null</code><br><br> | |
| <strong>Wall Time Limit</strong>  | |
| <input type="text" name="wallTimeLimit" value="10"> | |
| <input type="checkbox" name="wallTimeLimitIsNull" checked><code>null</code><br><br> | |
| <strong>Memory Limit</strong>  | |
| <input type="text" name="memoryLimit" value="128000"> | |
| <input type="checkbox" name="memoryLimitIsNull" checked><code>null</code><br><br> | |
| <strong>Stack Limit</strong>  | |
| <input type="text" name="stackLimit" value="64000"> | |
| <input type="checkbox" name="stackLimitIsNull" checked><code>null</code><br><br> | |
| <strong>Max Processes And Or Threads</strong>  | |
| <input type="text" name="maxProcessesAndOrThreads" value="60"> | |
| <input type="checkbox" name="maxProcessesAndOrThreadsIsNull" checked><code>null</code><br><br> | |
| <strong>Enable Per Process And Thread Time Limit</strong> | |
| <input type="radio" name="enablePerProcessAndThreadTimeLimit" value="true"> <code>true</code> | |
| <input type="radio" name="enablePerProcessAndThreadTimeLimit" value="false"> <code>false</code> | |
| <input type="radio" name="enablePerProcessAndThreadTimeLimit" value="null" checked> <code>null</code><br><br> | |
| <strong>Enable Per Process And Thread Memory Limit</strong> | |
| <input type="radio" name="enablePerProcessAndThreadMemoryLimit" value="true"> <code>true</code> | |
| <input type="radio" name="enablePerProcessAndThreadMemoryLimit" value="false"> <code>false</code> | |
| <input type="radio" name="enablePerProcessAndThreadMemoryLimit" value="null" checked> <code>null</code><br><br> | |
| <strong>Max File Size</strong>  | |
| <input type="text" name="maxFileSize" value="1024"> | |
| <input type="checkbox" name="maxFileSizeIsNull" checked><code>null</code><br><br> | |
| <strong>Enable Network</strong> | |
| <input type="radio" name="enableNetwork" value="true"> <code>true</code> | |
| <input type="radio" name="enableNetwork" value="false"> <code>false</code> | |
| <input type="radio" name="enableNetwork" value="null" checked> <code>null</code><br><br> | |
| <strong>Stdin</strong> | |
| <input type="checkbox" name="stdinIsNull"><code>null</code><br> | |
| <textarea name="stdin" rows="5" cols="25">Judge0</textarea><br><br> | |
| <strong>Expected Output</strong> | |
| <input type="checkbox" name="expectedOutputIsNull" checked><code>null</code><br> | |
| <textarea name="expectedOutput" rows="5" cols="25"></textarea><br><br> | |
| <strong>Fields</strong>  | |
| <input type="text" size="50" name="fields"><br><br> | |
| <input type="checkbox" name="waitResponse"> | |
| <strong>Wait for submission</strong><br><br> | |
| <input type="checkbox" name="base64EncodedRequest" checked> | |
| <strong>Send request with Base64 encoded data</strong><br><br> | |
| <input type="checkbox" name="base64EncodedResponse" checked> | |
| <strong>Accept response with Base64 encoded data</strong><br><br> | |
| <div id="panel" style="position: fixed; bottom: 0px; padding: 20px; background-color: #69DB7C; bottom: 20px; right: 20px; border: 1px solid #777"> | |
| <button type="button" id="run">Run</button> | |
| <button type="button" id="stop" disabled>Stop</button> | |
| <button type="button" id="clearLog">Clear Log</button> | |
| <button type="button" id="backToTop">Back To Top</button> | |
| </div> | |
| <hr> | |
| <h2>Request/Response Log</h2><br> | |
| <pre id="log"></pre> | |
| <script> | |
| var stopFetch = false; | |
| if (window.location.protocol !== "file:") { | |
| $("input[name=apiUrl]").attr('value', window.location.origin); | |
| } | |
| function createQueryParameters(type = "Request") { | |
| var parameters = []; | |
| if ($(`input[name=base64Encoded${type}]`).is(":checked")) { | |
| parameters.push("base64_encoded=true"); | |
| } else { | |
| parameters.push("base64_encoded=false"); | |
| } | |
| var fields = $("input[name=fields]").val(); | |
| if (fields.length != 0) { | |
| parameters.push(`fields=${fields}`); | |
| } | |
| var authnHeader = $("input[name=authnHeader]").val(); | |
| var authnToken = $("input[name=authnToken]").val(); | |
| if (authnToken.length != 0) { | |
| parameters.push(`${authnHeader}=${authnToken}`); | |
| } | |
| var authzHeader = $("input[name=authzHeader]").val(); | |
| var authzToken = $("input[name=authzToken]").val(); | |
| if (authzToken.length != 0) { | |
| parameters.push(`${authzHeader}=${authzToken}`); | |
| } | |
| if ($("input[name=waitResponse]").is(":checked")) { | |
| parameters.push("wait=true"); | |
| } | |
| if (parameters.length == 0) { | |
| return ""; | |
| } | |
| var queryParameters = "?"; | |
| for (var i = 0; i < parameters.length - 1; i++) { | |
| queryParameters += parameters[i] + "&"; | |
| } | |
| return queryParameters + parameters[parameters.length - 1]; | |
| } | |
| function resetButtons() { | |
| stopFetch = false; | |
| $("#run").removeAttr("disabled"); | |
| $("#stop").prop("disabled", true); | |
| $("#panel").css('background-color', '#69DB7C'); | |
| } | |
| function appendToLog(text) { | |
| $("#log").text($("#log").text() + text + "\n"); | |
| $('html, body').animate({ | |
| scrollTop: $("body")[0].scrollHeight | |
| }, 500); | |
| } | |
| function handleError(jqXHR, textStatus, errorThrown) { | |
| appendToLog(`[Response ${new Date().toLocaleString()}] ${jqXHR.status} ${jqXHR.statusText}\n${JSON.stringify(jqXHR, null, 4)}\n`); | |
| appendToLog(`[DONE ${new Date().toLocaleString()}]\n\n\n`); | |
| resetButtons(); | |
| } | |
| function fetchSubmission(apiUrl, token) { | |
| var queryParameters = createQueryParameters("Response"); | |
| appendToLog(`[Request ${new Date().toLocaleString()}] GET ${apiUrl}/submissions/${token}${queryParameters}`); | |
| $.ajax({ | |
| url: apiUrl + "/submissions/" + token + queryParameters, | |
| type: "GET", | |
| async: true, | |
| success: function(data, textStatus, jqXHR) { | |
| appendToLog(`[Response ${new Date().toLocaleString()}] ${jqXHR.status} ${jqXHR.statusText}\n${JSON.stringify(data, null, 4)}\n`); | |
| if ((data.status === undefined || data.status.id <= 2) && (data.status_id === undefined || data.status_id <= 2) && !stopFetch) { | |
| setTimeout(fetchSubmission.bind(null, apiUrl, token), 1500); | |
| } else if (!stopFetch) { | |
| appendToLog(`[DONE ${new Date().toLocaleString()}]\n\n\n`); | |
| resetButtons(); | |
| } else { | |
| appendToLog(`[STOPPED ${new Date().toLocaleString()}]\n\n\n`); | |
| resetButtons(); | |
| } | |
| }, | |
| error: handleError | |
| }); | |
| } | |
| $("#run").click(function() { | |
| $(this).prop("disabled", true); | |
| $("#stop").removeAttr("disabled"); | |
| $("#panel").css('background-color', '#FF8787'); | |
| var apiUrl = $("input[name=apiUrl]").val(); | |
| var sourceCode = $("textarea[name=sourceCode]").val(); | |
| var languageId = $("input[name=languageId]").val(); | |
| var numberOfRuns = $("input[name=numberOfRuns]").val(); | |
| var stdin = $("textarea[name=stdin]").val(); | |
| var expectedOutput = $("textarea[name=expectedOutput]").val(); | |
| var cpuTimeLimit = $("input[name=cpuTimeLimit]").val(); | |
| var cpuExtraTime = $("input[name=cpuExtraTime]").val(); | |
| var wallTimeLimit = $("input[name=wallTimeLimit]").val(); | |
| var memoryLimit = $("input[name=memoryLimit]").val(); | |
| var stackLimit = $("input[name=stackLimit]").val(); | |
| var maxProcessesAndOrThreads = $("input[name=maxProcessesAndOrThreads]").val(); | |
| var enablePerProcessAndThreadTimeLimit = $("input[name=enablePerProcessAndThreadTimeLimit]:checked").val() === "true"; | |
| var enablePerProcessAndThreadMemoryLimit = $("input[name=enablePerProcessAndThreadMemoryLimit]:checked").val() === "true"; | |
| var maxFileSize = $("input[name=maxFileSize]").val(); | |
| var enableNetwork = $("input[name=enableNetwork]:checked").val() === "true"; | |
| var wait = $("input[name=waitResponse]").is(":checked"); | |
| var queryParameters = createQueryParameters(); | |
| if ($("input[name=base64EncodedRequest]").is(":checked")) { | |
| sourceCode = btoa(sourceCode); | |
| stdin = btoa(stdin); | |
| expectedOutput = btoa(expectedOutput); | |
| } | |
| if ($("input[name=sourceCodeIsNull]").is(":checked")) { | |
| sourceCode = null; | |
| } | |
| if ($("input[name=languageIdIsNull]").is(":checked")) { | |
| languageId = null; | |
| } | |
| if ($("input[name=numberOfRunsIsNull]").is(":checked")) { | |
| numberOfRuns = null; | |
| } | |
| if ($("input[name=stdinIsNull]").is(":checked")) { | |
| stdin = null; | |
| } | |
| if ($("input[name=expectedOutputIsNull]").is(":checked")) { | |
| expectedOutput = null; | |
| } | |
| if ($("input[name=cpuTimeLimitIsNull]").is(":checked")) { | |
| cpuTimeLimit = null; | |
| } | |
| if ($("input[name=cpuExtraTimeIsNull]").is(":checked")) { | |
| cpuExtraTime = null; | |
| } | |
| if ($("input[name=wallTimeLimitIsNull]").is(":checked")) { | |
| wallTimeLimit = null; | |
| } | |
| if ($("input[name=memoryLimitIsNull]").is(":checked")) { | |
| memoryLimit = null; | |
| } | |
| if ($("input[name=stackLimitIsNull]").is(":checked")) { | |
| stackLimit = null; | |
| } | |
| if ($("input[name=maxProcessesAndOrThreadsIsNull]").is(":checked")) { | |
| maxProcessesAndOrThreads = null; | |
| } | |
| if ($("input[name=enablePerProcessAndThreadTimeLimit]:checked").val() === "null") { | |
| enablePerProcessAndThreadTimeLimit = null; | |
| } | |
| if ($("input[name=enablePerProcessAndThreadMemoryLimit]:checked").val() === "null") { | |
| enablePerProcessAndThreadMemoryLimit = null; | |
| } | |
| if ($("input[name=maxFileSizeIsNull]").is(":checked")) { | |
| maxFileSize = null; | |
| } | |
| if ($("input[name=enableNetwork]:checked").val() === "null") { | |
| enableNetwork = null; | |
| } | |
| var data = { | |
| source_code: sourceCode, | |
| language_id: languageId, | |
| number_of_runs: numberOfRuns, | |
| stdin: stdin, | |
| expected_output: expectedOutput, | |
| cpu_time_limit: cpuTimeLimit, | |
| cpu_extra_time: cpuExtraTime, | |
| wall_time_limit: wallTimeLimit, | |
| memory_limit: memoryLimit, | |
| stack_limit: stackLimit, | |
| max_processes_and_or_threads: maxProcessesAndOrThreads, | |
| enable_per_process_and_thread_time_limit: enablePerProcessAndThreadTimeLimit, | |
| enable_per_process_and_thread_memory_limit: enablePerProcessAndThreadMemoryLimit, | |
| max_file_size: maxFileSize, | |
| enable_network: enableNetwork | |
| }; | |
| appendToLog(`[Request ${new Date().toLocaleString()}] POST ${apiUrl}/submissions${queryParameters}\n${JSON.stringify(data, null, 4)}`); | |
| $.ajax({ | |
| url: apiUrl + "/submissions" + queryParameters, | |
| type: "POST", | |
| async: true, | |
| contentType: "application/json", | |
| data: JSON.stringify(data), | |
| success: function(data, textStatus, jqXHR) { | |
| appendToLog(`[Response ${new Date().toLocaleString()}] ${jqXHR.status} ${jqXHR.statusText}\n${JSON.stringify(data, null, 4)}\n`); | |
| if (!wait) { | |
| setTimeout(fetchSubmission.bind(null, apiUrl, data.token), 1500); | |
| } else { | |
| appendToLog(`[DONE ${new Date().toLocaleString()}]\n\n\n`); | |
| resetButtons(); | |
| } | |
| }, | |
| error: handleError | |
| }); | |
| }); | |
| $("#stop").click(function() { | |
| stopFetch = true; | |
| }); | |
| $("#clearLog").click(function() { | |
| $("#log").html(""); | |
| }); | |
| $("#backToTop").click(function() { | |
| $('html, body').animate({ | |
| scrollTop: 0 | |
| }, 50); | |
| }); | |
| </script> | |
| </body> | |
| </html> | |