JSON::ParserError in Lti::LaunchesController#show

767: unexpected token at '<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <title>Action Controller: Exception caught</title> <style> body { background-color: #FAFAFA; color: #333; margin: 0px; } body, p, ol, ul, td { font-family: helvetica, verdana, arial, sans-serif; font-size: 13px; line-height: 18px; } pre { font-size: 11px; white-space: pre-wrap; } pre.box { border: 1px solid #EEE; padding: 10px; margin: 0px; width: 958px; } header { color: #F0F0F0; background: #C52F24; padding: 0.5em 1.5em; } h1 { margin: 0.2em 0; line-height: 1.1em; font-size: 2em; } h2 { color: #C52F24; line-height: 25px; } .details { border: 1px solid #D0D0D0; border-radius: 4px; margin: 1em 0px; display: block; width: 978px; } .summary { padding: 8px 15px; border-bottom: 1px solid #D0D0D0; display: block; } .details pre { margin: 5px; border: none; } #container { box-sizing: border-box; width: 100%; padding: 0 1.5em; } .source * { margin: 0px; padding: 0px; } .source { border: 1px solid #D9D9D9; background: #ECECEC; width: 978px; } .source pre { padding: 10px 0px; border: none; } .source .data { font-size: 80%; overflow: auto; background-color: #FFF; } .info { padding: 0.5em; } .source .data .line_numbers { background-color: #ECECEC; color: #AAA; padding: 1em .5em; border-right: 1px solid #DDD; text-align: right; } .line { padding-left: 10px; white-space: pre; } .line:hover { background-color: #F6F6F6; } .line.active { background-color: #FFCCCC; } .hidden { display: none; } a { color: #980905; } a:visited { color: #666; } a.trace-frames { color: #666; } a:hover { color: #C52F24; } a.trace-frames.selected { color: #C52F24 } </style> <script> var toggle = function(id) { var s = document.getElementById(id).style; s.display = s.display == 'none' ? 'block' : 'none'; return false; } var show = function(id) { document.getElementById(id).style.display = 'block'; } var hide = function(id) { document.getElementById(id).style.display = 'none'; } var toggleTrace = function() { return toggle('blame_trace'); } var toggleSessionDump = function() { return toggle('session_dump'); } var toggleEnvDump = function() { return toggle('env_dump'); } </script> </head> <body> <header> <h1> OpenSSL::PKey::RSAError in AccessTokensController#create </h1> </header> <div id="container"> <h2>Neither PUB key nor PRIV key: header too long</h2> <div class="source " id="frame-source-0"> <div class="info"> Extracted source (around line <strong>#55</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>53</span> <span>54</span> <span>55</span> <span>56</span> <span>57</span> </pre> </td> <td width="100%"> <pre> <div class="line"> # we don&#39;t have the private key, so read public key directly </div><div class="line"> def openssl_tool_public_key </div><div class="line active"> OpenSSL::PKey::RSA.new(tool_public_key) </div><div class="line"> end </div><div class="line">end </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-1"> <div class="info"> Extracted source (around line <strong>#55</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>53</span> <span>54</span> <span>55</span> <span>56</span> <span>57</span> </pre> </td> <td width="100%"> <pre> <div class="line"> # we don&#39;t have the private key, so read public key directly </div><div class="line"> def openssl_tool_public_key </div><div class="line active"> OpenSSL::PKey::RSA.new(tool_public_key) </div><div class="line"> end </div><div class="line">end </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-2"> <div class="info"> Extracted source (around line <strong>#55</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>53</span> <span>54</span> <span>55</span> <span>56</span> <span>57</span> </pre> </td> <td width="100%"> <pre> <div class="line"> # we don&#39;t have the private key, so read public key directly </div><div class="line"> def openssl_tool_public_key </div><div class="line active"> OpenSSL::PKey::RSA.new(tool_public_key) </div><div class="line"> end </div><div class="line">end </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-3"> <div class="info"> Extracted source (around line <strong>#20</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>18</span> <span>19</span> <span>20</span> <span>21</span> <span>22</span> <span>23</span> </pre> </td> <td width="100%"> <pre> <div class="line"> def tool_public_key </div><div class="line"> if @platform.tool_keyset_url.blank? </div><div class="line active"> @platform.openssl_tool_public_key </div><div class="line"> else </div><div class="line"> decoded_header = Jwt::Header.new(@tool_jwt).call </div><div class="line"> kid = decoded_header[&#39;kid&#39;] </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-4"> <div class="info"> Extracted source (around line <strong>#12</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>10</span> <span>11</span> <span>12</span> <span>13</span> <span>14</span> <span>15</span> </pre> </td> <td width="100%"> <pre> <div class="line"> </div><div class="line"> def call </div><div class="line active"> rsa_public = tool_public_key </div><div class="line"> </div><div class="line"> # decode JWT </div><div class="line"> Jwt::Decode.new(@tool_jwt, rsa_public).call </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-5"> <div class="info"> Extracted source (around line <strong>#41</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>39</span> <span>40</span> <span>41</span> <span>42</span> <span>43</span> <span>44</span> </pre> </td> <td width="100%"> <pre> <div class="line"> # may be others we should rescue from, we&#39;ll see </div><div class="line"> def decode_client_assertion </div><div class="line active"> @payload = LtiPlatform::DecodeToolJwt.new(@platform, @params[:client_assertion]).call.first </div><div class="line"> validate_client_assertion </div><div class="line"> rescue JWT::ExpiredSignature </div><div class="line"> @error = &#39;Expired token&#39; </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-6"> <div class="info"> Extracted source (around line <strong>#20</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>18</span> <span>19</span> <span>20</span> <span>21</span> <span>22</span> <span>23</span> </pre> </td> <td width="100%"> <pre> <div class="line"> incorrect_grant_type &amp;&amp; return unless @params[:grant_type] == &#39;client_credentials&#39; </div><div class="line"> incorrect_client_assertion_type &amp;&amp; return unless @params[:client_assertion_type] == &#39;urn:ietf:params:oauth:client-assertion-type:jwt-bearer&#39; </div><div class="line active"> decode_client_assertion </div><div class="line"> generate_token unless @error </div><div class="line"> # TODO: will want to validate scopes eventually </div><div class="line"> @scope = @params[:scope] </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-7"> <div class="info"> Extracted source (around line <strong>#13</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>11</span> <span>12</span> <span>13</span> <span>14</span> <span>15</span> <span>16</span> </pre> </td> <td width="100%"> <pre> <div class="line"> @error = nil </div><div class="line"> @access_token = nil </div><div class="line active"> valid_request? </div><div class="line"> end </div><div class="line"> </div><div class="line"> def valid_request? </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-8"> <div class="info"> Extracted source (around line <strong>#8</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>6</span> <span>7</span> <span>8</span> <span>9</span> <span>10</span> <span>11</span> </pre> </td> <td width="100%"> <pre> <div class="line"> # POST /platform/access_tokens.json </div><div class="line"> def create </div><div class="line active"> @token = LtiPlatform::GenerateAccessToken.new(@platform, access_token_params) </div><div class="line"> </div><div class="line"> respond_to do |format| </div><div class="line"> unless @token.error </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-9"> <div class="info"> Extracted source (around line <strong>#8</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>6</span> <span>7</span> <span>8</span> <span>9</span> <span>10</span> <span>11</span> </pre> </td> <td width="100%"> <pre> <div class="line"> # POST /platform/access_tokens.json </div><div class="line"> def create </div><div class="line active"> @token = LtiPlatform::GenerateAccessToken.new(@platform, access_token_params) </div><div class="line"> </div><div class="line"> respond_to do |format| </div><div class="line"> unless @token.error </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-10"> <div class="info"> Extracted source (around line <strong>#6</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>4</span> <span>5</span> <span>6</span> <span>7</span> <span>8</span> <span>9</span> </pre> </td> <td width="100%"> <pre> <div class="line"> module BasicImplicitRender # :nodoc: </div><div class="line"> def send_action(method, *args) </div><div class="line active"> super.tap { default_render unless performed? } </div><div class="line"> end </div><div class="line"> </div><div class="line"> def default_render(*args) </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-11"> <div class="info"> Extracted source (around line <strong>#194</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>192</span> <span>193</span> <span>194</span> <span>195</span> <span>196</span> <span>197</span> </pre> </td> <td width="100%"> <pre> <div class="line"> # which is *not* necessarily the same as the action name. </div><div class="line"> def process_action(method_name, *args) </div><div class="line active"> send_action(method_name, *args) </div><div class="line"> end </div><div class="line"> </div><div class="line"> # Actually call the method associated with the action. Override </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-12"> <div class="info"> Extracted source (around line <strong>#30</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>28</span> <span>29</span> <span>30</span> <span>31</span> <span>32</span> <span>33</span> </pre> </td> <td width="100%"> <pre> <div class="line"> def process_action(*) #:nodoc: </div><div class="line"> self.formats = request.formats.map(&amp;:ref).compact </div><div class="line active"> super </div><div class="line"> end </div><div class="line"> </div><div class="line"> # Check for double render errors and set the content_type after rendering. </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-13"> <div class="info"> Extracted source (around line <strong>#42</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>40</span> <span>41</span> <span>42</span> <span>43</span> <span>44</span> <span>45</span> </pre> </td> <td width="100%"> <pre> <div class="line"> def process_action(*args) </div><div class="line"> run_callbacks(:process_action) do </div><div class="line active"> super </div><div class="line"> end </div><div class="line"> end </div><div class="line"> </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-14"> <div class="info"> Extracted source (around line <strong>#132</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>130</span> <span>131</span> <span>132</span> <span>133</span> <span>134</span> <span>135</span> </pre> </td> <td width="100%"> <pre> <div class="line"> if next_sequence.final? </div><div class="line"> next_sequence.invoke_before(env) </div><div class="line active"> env.value = !env.halted &amp;&amp; (!block_given? || yield) </div><div class="line"> next_sequence.invoke_after(env) </div><div class="line"> env.value </div><div class="line"> else </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-15"> <div class="info"> Extracted source (around line <strong>#41</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>39</span> <span>40</span> <span>41</span> <span>42</span> <span>43</span> <span>44</span> </pre> </td> <td width="100%"> <pre> <div class="line"> # &lt;tt&gt;process_action&lt;/tt&gt; callbacks around the normal behavior. </div><div class="line"> def process_action(*args) </div><div class="line active"> run_callbacks(:process_action) do </div><div class="line"> super </div><div class="line"> end </div><div class="line"> end </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-16"> <div class="info"> Extracted source (around line <strong>#22</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>20</span> <span>21</span> <span>22</span> <span>23</span> <span>24</span> <span>25</span> </pre> </td> <td width="100%"> <pre> <div class="line"> private </div><div class="line"> def process_action(*args) </div><div class="line active"> super </div><div class="line"> rescue Exception =&gt; exception </div><div class="line"> request.env[&quot;action_dispatch.show_detailed_exceptions&quot;] ||= show_detailed_exceptions? </div><div class="line"> rescue_with_handler(exception) || raise </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-17"> <div class="info"> Extracted source (around line <strong>#34</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>32</span> <span>33</span> <span>34</span> <span>35</span> <span>36</span> <span>37</span> </pre> </td> <td width="100%"> <pre> <div class="line"> ActiveSupport::Notifications.instrument(&quot;process_action.action_controller&quot;, raw_payload) do |payload| </div><div class="line"> begin </div><div class="line active"> result = super </div><div class="line"> payload[:status] = response.status </div><div class="line"> result </div><div class="line"> ensure </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-18"> <div class="info"> Extracted source (around line <strong>#168</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>166</span> <span>167</span> <span>168</span> <span>169</span> <span>170</span> <span>171</span> </pre> </td> <td width="100%"> <pre> <div class="line"> def instrument(name, payload = {}) </div><div class="line"> if notifier.listening?(name) </div><div class="line active"> instrumenter.instrument(name, payload) { yield payload if block_given? } </div><div class="line"> else </div><div class="line"> yield payload if block_given? </div><div class="line"> end </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-19"> <div class="info"> Extracted source (around line <strong>#23</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>21</span> <span>22</span> <span>23</span> <span>24</span> <span>25</span> <span>26</span> </pre> </td> <td width="100%"> <pre> <div class="line"> listeners_state = start name, payload </div><div class="line"> begin </div><div class="line active"> yield payload </div><div class="line"> rescue Exception =&gt; e </div><div class="line"> payload[:exception] = [e.class.name, e.message] </div><div class="line"> payload[:exception_object] = e </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-20"> <div class="info"> Extracted source (around line <strong>#168</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>166</span> <span>167</span> <span>168</span> <span>169</span> <span>170</span> <span>171</span> </pre> </td> <td width="100%"> <pre> <div class="line"> def instrument(name, payload = {}) </div><div class="line"> if notifier.listening?(name) </div><div class="line active"> instrumenter.instrument(name, payload) { yield payload if block_given? } </div><div class="line"> else </div><div class="line"> yield payload if block_given? </div><div class="line"> end </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-21"> <div class="info"> Extracted source (around line <strong>#32</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>30</span> <span>31</span> <span>32</span> <span>33</span> <span>34</span> <span>35</span> </pre> </td> <td width="100%"> <pre> <div class="line"> ActiveSupport::Notifications.instrument(&quot;start_processing.action_controller&quot;, raw_payload.dup) </div><div class="line"> </div><div class="line active"> ActiveSupport::Notifications.instrument(&quot;process_action.action_controller&quot;, raw_payload) do |payload| </div><div class="line"> begin </div><div class="line"> result = super </div><div class="line"> payload[:status] = response.status </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-22"> <div class="info"> Extracted source (around line <strong>#256</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>254</span> <span>255</span> <span>256</span> <span>257</span> <span>258</span> <span>259</span> </pre> </td> <td width="100%"> <pre> <div class="line"> request.filtered_parameters.merge! wrapped_filtered_hash </div><div class="line"> end </div><div class="line active"> super </div><div class="line"> end </div><div class="line"> </div><div class="line"> private </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-23"> <div class="info"> Extracted source (around line <strong>#24</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>22</span> <span>23</span> <span>24</span> <span>25</span> <span>26</span> <span>27</span> </pre> </td> <td width="100%"> <pre> <div class="line"> # and it won&#39;t be cleaned up by the method below. </div><div class="line"> ActiveRecord::LogSubscriber.reset_runtime </div><div class="line active"> super </div><div class="line"> end </div><div class="line"> </div><div class="line"> def cleanup_view_runtime </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-24"> <div class="info"> Extracted source (around line <strong>#134</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>132</span> <span>133</span> <span>134</span> <span>135</span> <span>136</span> <span>137</span> </pre> </td> <td width="100%"> <pre> <div class="line"> @_response_body = nil </div><div class="line"> </div><div class="line active"> process_action(action_name, *args) </div><div class="line"> end </div><div class="line"> </div><div class="line"> # Delegates to the class&#39; ::controller_path </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-25"> <div class="info"> Extracted source (around line <strong>#32</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>30</span> <span>31</span> <span>32</span> <span>33</span> <span>34</span> <span>35</span> </pre> </td> <td width="100%"> <pre> <div class="line"> def process(*) #:nodoc: </div><div class="line"> old_config, I18n.config = I18n.config, I18nProxy.new(I18n.config, lookup_context) </div><div class="line active"> super </div><div class="line"> ensure </div><div class="line"> I18n.config = old_config </div><div class="line"> end </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-26"> <div class="info"> Extracted source (around line <strong>#191</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>189</span> <span>190</span> <span>191</span> <span>192</span> <span>193</span> <span>194</span> </pre> </td> <td width="100%"> <pre> <div class="line"> set_request!(request) </div><div class="line"> set_response!(response) </div><div class="line active"> process(name) </div><div class="line"> request.commit_flash </div><div class="line"> to_a </div><div class="line"> end </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-27"> <div class="info"> Extracted source (around line <strong>#252</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>250</span> <span>251</span> <span>252</span> <span>253</span> <span>254</span> <span>255</span> </pre> </td> <td width="100%"> <pre> <div class="line"> middleware_stack.build(name) { |env| new.dispatch(name, req, res) }.call req.env </div><div class="line"> else </div><div class="line active"> new.dispatch(name, req, res) </div><div class="line"> end </div><div class="line"> end </div><div class="line"> end </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-28"> <div class="info"> Extracted source (around line <strong>#52</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>50</span> <span>51</span> <span>52</span> <span>53</span> <span>54</span> <span>55</span> </pre> </td> <td width="100%"> <pre> <div class="line"> </div><div class="line"> def dispatch(controller, action, req, res) </div><div class="line active"> controller.dispatch(action, req, res) </div><div class="line"> end </div><div class="line"> end </div><div class="line"> </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-29"> <div class="info"> Extracted source (around line <strong>#34</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>32</span> <span>33</span> <span>34</span> <span>35</span> <span>36</span> <span>37</span> </pre> </td> <td width="100%"> <pre> <div class="line"> controller = controller req </div><div class="line"> res = controller.make_response! req </div><div class="line active"> dispatch(controller, params[:action], req, res) </div><div class="line"> rescue ActionController::RoutingError </div><div class="line"> if @raise_on_name_error </div><div class="line"> raise </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-30"> <div class="info"> Extracted source (around line <strong>#52</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>50</span> <span>51</span> <span>52</span> <span>53</span> <span>54</span> <span>55</span> </pre> </td> <td width="100%"> <pre> <div class="line"> req.path_parameters = set_params.merge parameters </div><div class="line"> </div><div class="line active"> status, headers, body = route.app.serve(req) </div><div class="line"> </div><div class="line"> if &quot;pass&quot; == headers[&quot;X-Cascade&quot;] </div><div class="line"> req.script_name = script_name </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-31"> <div class="info"> Extracted source (around line <strong>#35</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>33</span> <span>34</span> <span>35</span> <span>36</span> <span>37</span> <span>38</span> </pre> </td> <td width="100%"> <pre> <div class="line"> </div><div class="line"> def serve(req) </div><div class="line active"> find_routes(req).each do |match, parameters, route| </div><div class="line"> set_params = req.path_parameters </div><div class="line"> path_info = req.path_info </div><div class="line"> script_name = req.script_name </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-32"> <div class="info"> Extracted source (around line <strong>#35</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>33</span> <span>34</span> <span>35</span> <span>36</span> <span>37</span> <span>38</span> </pre> </td> <td width="100%"> <pre> <div class="line"> </div><div class="line"> def serve(req) </div><div class="line active"> find_routes(req).each do |match, parameters, route| </div><div class="line"> set_params = req.path_parameters </div><div class="line"> path_info = req.path_info </div><div class="line"> script_name = req.script_name </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-33"> <div class="info"> Extracted source (around line <strong>#840</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>838</span> <span>839</span> <span>840</span> <span>841</span> <span>842</span> <span>843</span> </pre> </td> <td width="100%"> <pre> <div class="line"> req = make_request(env) </div><div class="line"> req.path_info = Journey::Router::Utils.normalize_path(req.path_info) </div><div class="line active"> @router.serve(req) </div><div class="line"> end </div><div class="line"> </div><div class="line"> def recognize_path(path, environment = {}) </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-34"> <div class="info"> Extracted source (around line <strong>#15</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>13</span> <span>14</span> <span>15</span> <span>16</span> <span>17</span> <span>18</span> </pre> </td> <td width="100%"> <pre> <div class="line"> def call(env) </div><div class="line"> env[RACK_TEMPFILES] ||= [] </div><div class="line active"> status, headers, body = @app.call(env) </div><div class="line"> body_proxy = BodyProxy.new(body) do </div><div class="line"> env[RACK_TEMPFILES].each(&amp;:close!) unless env[RACK_TEMPFILES].nil? </div><div class="line"> end </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-35"> <div class="info"> Extracted source (around line <strong>#27</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>25</span> <span>26</span> <span>27</span> <span>28</span> <span>29</span> <span>30</span> </pre> </td> <td width="100%"> <pre> <div class="line"> </div><div class="line"> def call(env) </div><div class="line active"> status, headers, body = @app.call(env) </div><div class="line"> </div><div class="line"> if etag_status?(status) &amp;&amp; etag_body?(body) &amp;&amp; !skip_caching?(headers) </div><div class="line"> original_body = body </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-36"> <div class="info"> Extracted source (around line <strong>#40</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>38</span> <span>39</span> <span>40</span> <span>41</span> <span>42</span> <span>43</span> </pre> </td> <td width="100%"> <pre> <div class="line"> [status, headers, body] </div><div class="line"> else </div><div class="line active"> @app.call(env) </div><div class="line"> end </div><div class="line"> end </div><div class="line"> </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-37"> <div class="info"> Extracted source (around line <strong>#12</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>10</span> <span>11</span> <span>12</span> <span>13</span> <span>14</span> <span>15</span> </pre> </td> <td width="100%"> <pre> <div class="line"> </div><div class="line"> def call(env) </div><div class="line active"> status, headers, body = @app.call(env) </div><div class="line"> </div><div class="line"> if env[REQUEST_METHOD] == HEAD </div><div class="line"> [ </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-38"> <div class="info"> Extracted source (around line <strong>#18</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>16</span> <span>17</span> <span>18</span> <span>19</span> <span>20</span> <span>21</span> </pre> </td> <td width="100%"> <pre> <div class="line"> def call(env) </div><div class="line"> request = ActionDispatch::Request.new env </div><div class="line active"> _, headers, _ = response = @app.call(env) </div><div class="line"> </div><div class="line"> return response unless html_response?(headers) </div><div class="line"> return response if policy_present?(headers) </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-39"> <div class="info"> Extracted source (around line <strong>#266</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>264</span> <span>265</span> <span>266</span> <span>267</span> <span>268</span> <span>269</span> </pre> </td> <td width="100%"> <pre> <div class="line"> req = make_request env </div><div class="line"> prepare_session(req) </div><div class="line active"> status, headers, body = app.call(req.env) </div><div class="line"> res = Rack::Response::Raw.new status, headers </div><div class="line"> commit_session(req, res) </div><div class="line"> [status, headers, body] </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-40"> <div class="info"> Extracted source (around line <strong>#260</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>258</span> <span>259</span> <span>260</span> <span>261</span> <span>262</span> <span>263</span> </pre> </td> <td width="100%"> <pre> <div class="line"> </div><div class="line"> def call(env) </div><div class="line active"> context(env) </div><div class="line"> end </div><div class="line"> </div><div class="line"> def context(env, app = @app) </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-41"> <div class="info"> Extracted source (around line <strong>#670</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>668</span> <span>669</span> <span>670</span> <span>671</span> <span>672</span> <span>673</span> </pre> </td> <td width="100%"> <pre> <div class="line"> request = ActionDispatch::Request.new env </div><div class="line"> </div><div class="line active"> status, headers, body = @app.call(env) </div><div class="line"> </div><div class="line"> if request.have_cookie_jar? </div><div class="line"> cookie_jar = request.cookie_jar </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-42"> <div class="info"> Extracted source (around line <strong>#28</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>26</span> <span>27</span> <span>28</span> <span>29</span> <span>30</span> <span>31</span> </pre> </td> <td width="100%"> <pre> <div class="line"> result = run_callbacks :call do </div><div class="line"> begin </div><div class="line active"> @app.call(env) </div><div class="line"> rescue =&gt; error </div><div class="line"> end </div><div class="line"> end </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-43"> <div class="info"> Extracted source (around line <strong>#98</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>96</span> <span>97</span> <span>98</span> <span>99</span> <span>100</span> <span>101</span> </pre> </td> <td width="100%"> <pre> <div class="line"> </div><div class="line"> if callbacks.empty? </div><div class="line active"> yield if block_given? </div><div class="line"> else </div><div class="line"> env = Filters::Environment.new(self, false, nil) </div><div class="line"> next_sequence = callbacks.compile </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-44"> <div class="info"> Extracted source (around line <strong>#26</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>24</span> <span>25</span> <span>26</span> <span>27</span> <span>28</span> <span>29</span> </pre> </td> <td width="100%"> <pre> <div class="line"> def call(env) </div><div class="line"> error = nil </div><div class="line active"> result = run_callbacks :call do </div><div class="line"> begin </div><div class="line"> @app.call(env) </div><div class="line"> rescue =&gt; error </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-45"> <div class="info"> Extracted source (around line <strong>#61</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>59</span> <span>60</span> <span>61</span> <span>62</span> <span>63</span> <span>64</span> </pre> </td> <td width="100%"> <pre> <div class="line"> def call(env) </div><div class="line"> request = ActionDispatch::Request.new env </div><div class="line active"> _, headers, body = response = @app.call(env) </div><div class="line"> </div><div class="line"> if headers[&quot;X-Cascade&quot;] == &quot;pass&quot; </div><div class="line"> body.close if body.respond_to?(:close) </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-46"> <div class="info"> Extracted source (around line <strong>#33</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>31</span> <span>32</span> <span>33</span> <span>34</span> <span>35</span> <span>36</span> </pre> </td> <td width="100%"> <pre> <div class="line"> def call(env) </div><div class="line"> request = ActionDispatch::Request.new env </div><div class="line active"> @app.call(env) </div><div class="line"> rescue Exception =&gt; exception </div><div class="line"> if request.show_exceptions? </div><div class="line"> render_exception(request, exception) </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-47"> <div class="info"> Extracted source (around line <strong>#38</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>36</span> <span>37</span> <span>38</span> <span>39</span> <span>40</span> <span>41</span> </pre> </td> <td width="100%"> <pre> <div class="line"> instrumenter.start &quot;request.action_dispatch&quot;, request: request </div><div class="line"> logger.info { started_request_message(request) } </div><div class="line active"> status, headers, body = @app.call(env) </div><div class="line"> body = ::Rack::BodyProxy.new(body) { finish(request) } </div><div class="line"> [status, headers, body] </div><div class="line"> rescue Exception </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-48"> <div class="info"> Extracted source (around line <strong>#26</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>24</span> <span>25</span> <span>26</span> <span>27</span> <span>28</span> <span>29</span> </pre> </td> <td width="100%"> <pre> <div class="line"> </div><div class="line"> if logger.respond_to?(:tagged) </div><div class="line active"> logger.tagged(compute_tags(request)) { call_app(request, env) } </div><div class="line"> else </div><div class="line"> call_app(request, env) </div><div class="line"> end </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-49"> <div class="info"> Extracted source (around line <strong>#71</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>69</span> <span>70</span> <span>71</span> <span>72</span> <span>73</span> <span>74</span> </pre> </td> <td width="100%"> <pre> <div class="line"> </div><div class="line"> def tagged(*tags) </div><div class="line active"> formatter.tagged(*tags) { yield self } </div><div class="line"> end </div><div class="line"> </div><div class="line"> def flush </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-50"> <div class="info"> Extracted source (around line <strong>#28</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>26</span> <span>27</span> <span>28</span> <span>29</span> <span>30</span> <span>31</span> </pre> </td> <td width="100%"> <pre> <div class="line"> def tagged(*tags) </div><div class="line"> new_tags = push_tags(*tags) </div><div class="line active"> yield self </div><div class="line"> ensure </div><div class="line"> pop_tags(new_tags.size) </div><div class="line"> end </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-51"> <div class="info"> Extracted source (around line <strong>#71</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>69</span> <span>70</span> <span>71</span> <span>72</span> <span>73</span> <span>74</span> </pre> </td> <td width="100%"> <pre> <div class="line"> </div><div class="line"> def tagged(*tags) </div><div class="line active"> formatter.tagged(*tags) { yield self } </div><div class="line"> end </div><div class="line"> </div><div class="line"> def flush </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-52"> <div class="info"> Extracted source (around line <strong>#26</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>24</span> <span>25</span> <span>26</span> <span>27</span> <span>28</span> <span>29</span> </pre> </td> <td width="100%"> <pre> <div class="line"> </div><div class="line"> if logger.respond_to?(:tagged) </div><div class="line active"> logger.tagged(compute_tags(request)) { call_app(request, env) } </div><div class="line"> else </div><div class="line"> call_app(request, env) </div><div class="line"> end </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-53"> <div class="info"> Extracted source (around line <strong>#81</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>79</span> <span>80</span> <span>81</span> <span>82</span> <span>83</span> <span>84</span> </pre> </td> <td width="100%"> <pre> <div class="line"> req = ActionDispatch::Request.new env </div><div class="line"> req.remote_ip = GetIp.new(req, check_ip, proxies) </div><div class="line active"> @app.call(req.env) </div><div class="line"> end </div><div class="line"> </div><div class="line"> # The GetIp class exists as a way to defer processing of the request data </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-54"> <div class="info"> Extracted source (around line <strong>#27</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>25</span> <span>26</span> <span>27</span> <span>28</span> <span>29</span> <span>30</span> </pre> </td> <td width="100%"> <pre> <div class="line"> req = ActionDispatch::Request.new env </div><div class="line"> req.request_id = make_request_id(req.x_request_id) </div><div class="line active"> @app.call(env).tap { |_status, headers, _body| headers[X_REQUEST_ID] = req.request_id } </div><div class="line"> end </div><div class="line"> </div><div class="line"> private </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-55"> <div class="info"> Extracted source (around line <strong>#24</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>22</span> <span>23</span> <span>24</span> <span>25</span> <span>26</span> <span>27</span> </pre> </td> <td width="100%"> <pre> <div class="line"> end </div><div class="line"> </div><div class="line active"> @app.call(env) </div><div class="line"> end </div><div class="line"> </div><div class="line"> def method_override(env) </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-56"> <div class="info"> Extracted source (around line <strong>#22</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>20</span> <span>21</span> <span>22</span> <span>23</span> <span>24</span> <span>25</span> </pre> </td> <td width="100%"> <pre> <div class="line"> def call(env) </div><div class="line"> start_time = Utils.clock_time </div><div class="line active"> status, headers, body = @app.call(env) </div><div class="line"> headers = Utils::HeaderHash[headers] </div><div class="line"> </div><div class="line"> request_time = Utils.clock_time - start_time </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-57"> <div class="info"> Extracted source (around line <strong>#29</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>27</span> <span>28</span> <span>29</span> <span>30</span> <span>31</span> <span>32</span> </pre> </td> <td width="100%"> <pre> <div class="line"> def call(env) </div><div class="line"> LocalCacheRegistry.set_cache_for(local_cache_key, LocalStore.new) </div><div class="line active"> response = @app.call(env) </div><div class="line"> response[2] = ::Rack::BodyProxy.new(response[2]) do </div><div class="line"> LocalCacheRegistry.set_cache_for(local_cache_key, nil) </div><div class="line"> end </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-58"> <div class="info"> Extracted source (around line <strong>#14</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>12</span> <span>13</span> <span>14</span> <span>15</span> <span>16</span> <span>17</span> </pre> </td> <td width="100%"> <pre> <div class="line"> state = @executor.run! </div><div class="line"> begin </div><div class="line active"> response = @app.call(env) </div><div class="line"> returned = response &lt;&lt; ::Rack::BodyProxy.new(response.pop) { state.complete! } </div><div class="line"> ensure </div><div class="line"> state.complete! unless returned </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-59"> <div class="info"> Extracted source (around line <strong>#127</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>125</span> <span>126</span> <span>127</span> <span>128</span> <span>129</span> <span>130</span> </pre> </td> <td width="100%"> <pre> <div class="line"> end </div><div class="line"> </div><div class="line active"> @app.call(req.env) </div><div class="line"> end </div><div class="line"> end </div><div class="line">end </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-60"> <div class="info"> Extracted source (around line <strong>#110</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>108</span> <span>109</span> <span>110</span> <span>111</span> <span>112</span> <span>113</span> </pre> </td> <td width="100%"> <pre> <div class="line"> </div><div class="line"> def call(env) </div><div class="line active"> status, headers, body = @app.call(env) </div><div class="line"> if body.respond_to?(:to_path) </div><div class="line"> case type = variation(env) </div><div class="line"> when &#39;X-Accel-Redirect&#39; </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-61"> <div class="info"> Extracted source (around line <strong>#524</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>522</span> <span>523</span> <span>524</span> <span>525</span> <span>526</span> <span>527</span> </pre> </td> <td width="100%"> <pre> <div class="line"> def call(env) </div><div class="line"> req = build_request env </div><div class="line active"> app.call req.env </div><div class="line"> end </div><div class="line"> </div><div class="line"> # Defines additional Rack env configuration that is added on each call. </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-62"> <div class="info"> Extracted source (around line <strong>#228</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>226</span> <span>227</span> <span>228</span> <span>229</span> <span>230</span> <span>231</span> </pre> </td> <td width="100%"> <pre> <div class="line"> def call(env) </div><div class="line"> env[Const::PUMA_CONFIG] = @config </div><div class="line active"> @app.call(env) </div><div class="line"> end </div><div class="line"> end </div><div class="line"> </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-63"> <div class="info"> Extracted source (around line <strong>#718</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>716</span> <span>717</span> <span>718</span> <span>719</span> <span>720</span> <span>721</span> </pre> </td> <td width="100%"> <pre> <div class="line"> begin </div><div class="line"> begin </div><div class="line active"> status, headers, res_body = @app.call(env) </div><div class="line"> </div><div class="line"> return :async if req.hijacked </div><div class="line"> </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-64"> <div class="info"> Extracted source (around line <strong>#472</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>470</span> <span>471</span> <span>472</span> <span>473</span> <span>474</span> <span>475</span> </pre> </td> <td width="100%"> <pre> <div class="line"> </div><div class="line"> while true </div><div class="line active"> case handle_request(client, buffer) </div><div class="line"> when false </div><div class="line"> return </div><div class="line"> when :async </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-65"> <div class="info"> Extracted source (around line <strong>#328</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>326</span> <span>327</span> <span>328</span> <span>329</span> <span>330</span> <span>331</span> </pre> </td> <td width="100%"> <pre> <div class="line"> else </div><div class="line"> if process_now </div><div class="line active"> process_client client, buffer </div><div class="line"> else </div><div class="line"> client.set_timeout @first_data_timeout </div><div class="line"> @reactor.add client </div> </pre> </td> </tr> </table> </div> </div> <div class="source hidden" id="frame-source-66"> <div class="info"> Extracted source (around line <strong>#134</strong>): </div> <div class="data"> <table cellpadding="0" cellspacing="0" class="lines"> <tr> <td> <pre class="line_numbers"> <span>132</span> <span>133</span> <span>134</span> <span>135</span> <span>136</span> <span>137</span> </pre> </td> <td width="100%"> <pre> <div class="line"> </div><div class="line"> begin </div><div class="line active"> block.call(work, *extra) </div><div class="line"> rescue Exception =&gt; e </div><div class="line"> STDERR.puts &quot;Error reached top of thread-pool: #{e.message} (#{e.class})&quot; </div><div class="line"> end </div> </pre> </td> </tr> </table> </div> </div> <p><code>Rails.root: /app</code></p> <div id="traces"> <a href="#" onclick="hide(&#39;Framework-Trace&#39;);hide(&#39;Full-Trace&#39;);show(&#39;Application-Trace&#39;);; return false;">Application Trace</a> | <a href="#" onclick="hide(&#39;Application-Trace&#39;);hide(&#39;Full-Trace&#39;);show(&#39;Framework-Trace&#39;);; return false;">Framework Trace</a> | <a href="#" onclick="hide(&#39;Application-Trace&#39;);hide(&#39;Framework-Trace&#39;);show(&#39;Full-Trace&#39;);; return false;">Full Trace</a> <div id="Application-Trace" style="display: block;"> <pre><code><a class="trace-frames" data-frame-id="0" href="#">app/models/platform.rb:55:in `initialize&#39;</a><br><a class="trace-frames" data-frame-id="1" href="#">app/models/platform.rb:55:in `new&#39;</a><br><a class="trace-frames" data-frame-id="2" href="#">app/models/platform.rb:55:in `openssl_tool_public_key&#39;</a><br><a class="trace-frames" data-frame-id="3" href="#">app/services/lti_platform/decode_tool_jwt.rb:20:in `tool_public_key&#39;</a><br><a class="trace-frames" data-frame-id="4" href="#">app/services/lti_platform/decode_tool_jwt.rb:12:in `call&#39;</a><br><a class="trace-frames" data-frame-id="5" href="#">app/services/lti_platform/generate_access_token.rb:41:in `decode_client_assertion&#39;</a><br><a class="trace-frames" data-frame-id="6" href="#">app/services/lti_platform/generate_access_token.rb:20:in `valid_request?&#39;</a><br><a class="trace-frames" data-frame-id="7" href="#">app/services/lti_platform/generate_access_token.rb:13:in `initialize&#39;</a><br><a class="trace-frames" data-frame-id="8" href="#">app/controllers/access_tokens_controller.rb:8:in `new&#39;</a><br><a class="trace-frames" data-frame-id="9" href="#">app/controllers/access_tokens_controller.rb:8:in `create&#39;</a><br></code></pre> </div> <div id="Framework-Trace" style="display: none;"> <pre><code><a class="trace-frames" data-frame-id="10" href="#">actionpack (5.2.4.6) lib/action_controller/metal/basic_implicit_render.rb:6:in `send_action&#39;</a><br><a class="trace-frames" data-frame-id="11" href="#">actionpack (5.2.4.6) lib/abstract_controller/base.rb:194:in `process_action&#39;</a><br><a class="trace-frames" data-frame-id="12" href="#">actionpack (5.2.4.6) lib/action_controller/metal/rendering.rb:30:in `process_action&#39;</a><br><a class="trace-frames" data-frame-id="13" href="#">actionpack (5.2.4.6) lib/abstract_controller/callbacks.rb:42:in `block in process_action&#39;</a><br><a class="trace-frames" data-frame-id="14" href="#">activesupport (5.2.4.6) lib/active_support/callbacks.rb:132:in `run_callbacks&#39;</a><br><a class="trace-frames" data-frame-id="15" href="#">actionpack (5.2.4.6) lib/abstract_controller/callbacks.rb:41:in `process_action&#39;</a><br><a class="trace-frames" data-frame-id="16" href="#">actionpack (5.2.4.6) lib/action_controller/metal/rescue.rb:22:in `process_action&#39;</a><br><a class="trace-frames" data-frame-id="17" href="#">actionpack (5.2.4.6) lib/action_controller/metal/instrumentation.rb:34:in `block in process_action&#39;</a><br><a class="trace-frames" data-frame-id="18" href="#">activesupport (5.2.4.6) lib/active_support/notifications.rb:168:in `block in instrument&#39;</a><br><a class="trace-frames" data-frame-id="19" href="#">activesupport (5.2.4.6) lib/active_support/notifications/instrumenter.rb:23:in `instrument&#39;</a><br><a class="trace-frames" data-frame-id="20" href="#">activesupport (5.2.4.6) lib/active_support/notifications.rb:168:in `instrument&#39;</a><br><a class="trace-frames" data-frame-id="21" href="#">actionpack (5.2.4.6) lib/action_controller/metal/instrumentation.rb:32:in `process_action&#39;</a><br><a class="trace-frames" data-frame-id="22" href="#">actionpack (5.2.4.6) lib/action_controller/metal/params_wrapper.rb:256:in `process_action&#39;</a><br><a class="trace-frames" data-frame-id="23" href="#">activerecord (5.2.4.6) lib/active_record/railties/controller_runtime.rb:24:in `process_action&#39;</a><br><a class="trace-frames" data-frame-id="24" href="#">actionpack (5.2.4.6) lib/abstract_controller/base.rb:134:in `process&#39;</a><br><a class="trace-frames" data-frame-id="25" href="#">actionview (5.2.4.6) lib/action_view/rendering.rb:32:in `process&#39;</a><br><a class="trace-frames" data-frame-id="26" href="#">actionpack (5.2.4.6) lib/action_controller/metal.rb:191:in `dispatch&#39;</a><br><a class="trace-frames" data-frame-id="27" href="#">actionpack (5.2.4.6) lib/action_controller/metal.rb:252:in `dispatch&#39;</a><br><a class="trace-frames" data-frame-id="28" href="#">actionpack (5.2.4.6) lib/action_dispatch/routing/route_set.rb:52:in `dispatch&#39;</a><br><a class="trace-frames" data-frame-id="29" href="#">actionpack (5.2.4.6) lib/action_dispatch/routing/route_set.rb:34:in `serve&#39;</a><br><a class="trace-frames" data-frame-id="30" href="#">actionpack (5.2.4.6) lib/action_dispatch/journey/router.rb:52:in `block in serve&#39;</a><br><a class="trace-frames" data-frame-id="31" href="#">actionpack (5.2.4.6) lib/action_dispatch/journey/router.rb:35:in `each&#39;</a><br><a class="trace-frames" data-frame-id="32" href="#">actionpack (5.2.4.6) lib/action_dispatch/journey/router.rb:35:in `serve&#39;</a><br><a class="trace-frames" data-frame-id="33" href="#">actionpack (5.2.4.6) lib/action_dispatch/routing/route_set.rb:840:in `call&#39;</a><br><a class="trace-frames" data-frame-id="34" href="#">rack (2.2.3) lib/rack/tempfile_reaper.rb:15:in `call&#39;</a><br><a class="trace-frames" data-frame-id="35" href="#">rack (2.2.3) lib/rack/etag.rb:27:in `call&#39;</a><br><a class="trace-frames" data-frame-id="36" href="#">rack (2.2.3) lib/rack/conditional_get.rb:40:in `call&#39;</a><br><a class="trace-frames" data-frame-id="37" href="#">rack (2.2.3) lib/rack/head.rb:12:in `call&#39;</a><br><a class="trace-frames" data-frame-id="38" href="#">actionpack (5.2.4.6) lib/action_dispatch/http/content_security_policy.rb:18:in `call&#39;</a><br><a class="trace-frames" data-frame-id="39" href="#">rack (2.2.3) lib/rack/session/abstract/id.rb:266:in `context&#39;</a><br><a class="trace-frames" data-frame-id="40" href="#">rack (2.2.3) lib/rack/session/abstract/id.rb:260:in `call&#39;</a><br><a class="trace-frames" data-frame-id="41" href="#">actionpack (5.2.4.6) lib/action_dispatch/middleware/cookies.rb:670:in `call&#39;</a><br><a class="trace-frames" data-frame-id="42" href="#">actionpack (5.2.4.6) lib/action_dispatch/middleware/callbacks.rb:28:in `block in call&#39;</a><br><a class="trace-frames" data-frame-id="43" href="#">activesupport (5.2.4.6) lib/active_support/callbacks.rb:98:in `run_callbacks&#39;</a><br><a class="trace-frames" data-frame-id="44" href="#">actionpack (5.2.4.6) lib/action_dispatch/middleware/callbacks.rb:26:in `call&#39;</a><br><a class="trace-frames" data-frame-id="45" href="#">actionpack (5.2.4.6) lib/action_dispatch/middleware/debug_exceptions.rb:61:in `call&#39;</a><br><a class="trace-frames" data-frame-id="46" href="#">actionpack (5.2.4.6) lib/action_dispatch/middleware/show_exceptions.rb:33:in `call&#39;</a><br><a class="trace-frames" data-frame-id="47" href="#">railties (5.2.4.6) lib/rails/rack/logger.rb:38:in `call_app&#39;</a><br><a class="trace-frames" data-frame-id="48" href="#">railties (5.2.4.6) lib/rails/rack/logger.rb:26:in `block in call&#39;</a><br><a class="trace-frames" data-frame-id="49" href="#">activesupport (5.2.4.6) lib/active_support/tagged_logging.rb:71:in `block in tagged&#39;</a><br><a class="trace-frames" data-frame-id="50" href="#">activesupport (5.2.4.6) lib/active_support/tagged_logging.rb:28:in `tagged&#39;</a><br><a class="trace-frames" data-frame-id="51" href="#">activesupport (5.2.4.6) lib/active_support/tagged_logging.rb:71:in `tagged&#39;</a><br><a class="trace-frames" data-frame-id="52" href="#">railties (5.2.4.6) lib/rails/rack/logger.rb:26:in `call&#39;</a><br><a class="trace-frames" data-frame-id="53" href="#">actionpack (5.2.4.6) lib/action_dispatch/middleware/remote_ip.rb:81:in `call&#39;</a><br><a class="trace-frames" data-frame-id="54" href="#">actionpack (5.2.4.6) lib/action_dispatch/middleware/request_id.rb:27:in `call&#39;</a><br><a class="trace-frames" data-frame-id="55" href="#">rack (2.2.3) lib/rack/method_override.rb:24:in `call&#39;</a><br><a class="trace-frames" data-frame-id="56" href="#">rack (2.2.3) lib/rack/runtime.rb:22:in `call&#39;</a><br><a class="trace-frames" data-frame-id="57" href="#">activesupport (5.2.4.6) lib/active_support/cache/strategy/local_cache_middleware.rb:29:in `call&#39;</a><br><a class="trace-frames" data-frame-id="58" href="#">actionpack (5.2.4.6) lib/action_dispatch/middleware/executor.rb:14:in `call&#39;</a><br><a class="trace-frames" data-frame-id="59" href="#">actionpack (5.2.4.6) lib/action_dispatch/middleware/static.rb:127:in `call&#39;</a><br><a class="trace-frames" data-frame-id="60" href="#">rack (2.2.3) lib/rack/sendfile.rb:110:in `call&#39;</a><br><a class="trace-frames" data-frame-id="61" href="#">railties (5.2.4.6) lib/rails/engine.rb:524:in `call&#39;</a><br><a class="trace-frames" data-frame-id="62" href="#">puma (4.3.8) lib/puma/configuration.rb:228:in `call&#39;</a><br><a class="trace-frames" data-frame-id="63" href="#">puma (4.3.8) lib/puma/server.rb:718:in `handle_request&#39;</a><br><a class="trace-frames" data-frame-id="64" href="#">puma (4.3.8) lib/puma/server.rb:472:in `process_client&#39;</a><br><a class="trace-frames" data-frame-id="65" href="#">puma (4.3.8) lib/puma/server.rb:328:in `block in run&#39;</a><br><a class="trace-frames" data-frame-id="66" href="#">puma (4.3.8) lib/puma/thread_pool.rb:134:in `block in spawn_thread&#39;</a><br></code></pre> </div> <div id="Full-Trace" style="display: none;"> <pre><code><a class="trace-frames" data-frame-id="0" href="#">app/models/platform.rb:55:in `initialize&#39;</a><br><a class="trace-frames" data-frame-id="1" href="#">app/models/platform.rb:55:in `new&#39;</a><br><a class="trace-frames" data-frame-id="2" href="#">app/models/platform.rb:55:in `openssl_tool_public_key&#39;</a><br><a class="trace-frames" data-frame-id="3" href="#">app/services/lti_platform/decode_tool_jwt.rb:20:in `tool_public_key&#39;</a><br><a class="trace-frames" data-frame-id="4" href="#">app/services/lti_platform/decode_tool_jwt.rb:12:in `call&#39;</a><br><a class="trace-frames" data-frame-id="5" href="#">app/services/lti_platform/generate_access_token.rb:41:in `decode_client_assertion&#39;</a><br><a class="trace-frames" data-frame-id="6" href="#">app/services/lti_platform/generate_access_token.rb:20:in `valid_request?&#39;</a><br><a class="trace-frames" data-frame-id="7" href="#">app/services/lti_platform/generate_access_token.rb:13:in `initialize&#39;</a><br><a class="trace-frames" data-frame-id="8" href="#">app/controllers/access_tokens_controller.rb:8:in `new&#39;</a><br><a class="trace-frames" data-frame-id="9" href="#">app/controllers/access_tokens_controller.rb:8:in `create&#39;</a><br><a class="trace-frames" data-frame-id="10" href="#">actionpack (5.2.4.6) lib/action_controller/metal/basic_implicit_render.rb:6:in `send_action&#39;</a><br><a class="trace-frames" data-frame-id="11" href="#">actionpack (5.2.4.6) lib/abstract_controller/base.rb:194:in `process_action&#39;</a><br><a class="trace-frames" data-frame-id="12" href="#">actionpack (5.2.4.6) lib/action_controller/metal/rendering.rb:30:in `process_action&#39;</a><br><a class="trace-frames" data-frame-id="13" href="#">actionpack (5.2.4.6) lib/abstract_controller/callbacks.rb:42:in `block in process_action&#39;</a><br><a class="trace-frames" data-frame-id="14" href="#">activesupport (5.2.4.6) lib/active_support/callbacks.rb:132:in `run_callbacks&#39;</a><br><a class="trace-frames" data-frame-id="15" href="#">actionpack (5.2.4.6) lib/abstract_controller/callbacks.rb:41:in `process_action&#39;</a><br><a class="trace-frames" data-frame-id="16" href="#">actionpack (5.2.4.6) lib/action_controller/metal/rescue.rb:22:in `process_action&#39;</a><br><a class="trace-frames" data-frame-id="17" href="#">actionpack (5.2.4.6) lib/action_controller/metal/instrumentation.rb:34:in `block in process_action&#39;</a><br><a class="trace-frames" data-frame-id="18" href="#">activesupport (5.2.4.6) lib/active_support/notifications.rb:168:in `block in instrument&#39;</a><br><a class="trace-frames" data-frame-id="19" href="#">activesupport (5.2.4.6) lib/active_support/notifications/instrumenter.rb:23:in `instrument&#39;</a><br><a class="trace-frames" data-frame-id="20" href="#">activesupport (5.2.4.6) lib/active_support/notifications.rb:168:in `instrument&#39;</a><br><a class="trace-frames" data-frame-id="21" href="#">actionpack (5.2.4.6) lib/action_controller/metal/instrumentation.rb:32:in `process_action&#39;</a><br><a class="trace-frames" data-frame-id="22" href="#">actionpack (5.2.4.6) lib/action_controller/metal/params_wrapper.rb:256:in `process_action&#39;</a><br><a class="trace-frames" data-frame-id="23" href="#">activerecord (5.2.4.6) lib/active_record/railties/controller_runtime.rb:24:in `process_action&#39;</a><br><a class="trace-frames" data-frame-id="24" href="#">actionpack (5.2.4.6) lib/abstract_controller/base.rb:134:in `process&#39;</a><br><a class="trace-frames" data-frame-id="25" href="#">actionview (5.2.4.6) lib/action_view/rendering.rb:32:in `process&#39;</a><br><a class="trace-frames" data-frame-id="26" href="#">actionpack (5.2.4.6) lib/action_controller/metal.rb:191:in `dispatch&#39;</a><br><a class="trace-frames" data-frame-id="27" href="#">actionpack (5.2.4.6) lib/action_controller/metal.rb:252:in `dispatch&#39;</a><br><a class="trace-frames" data-frame-id="28" href="#">actionpack (5.2.4.6) lib/action_dispatch/routing/route_set.rb:52:in `dispatch&#39;</a><br><a class="trace-frames" data-frame-id="29" href="#">actionpack (5.2.4.6) lib/action_dispatch/routing/route_set.rb:34:in `serve&#39;</a><br><a class="trace-frames" data-frame-id="30" href="#">actionpack (5.2.4.6) lib/action_dispatch/journey/router.rb:52:in `block in serve&#39;</a><br><a class="trace-frames" data-frame-id="31" href="#">actionpack (5.2.4.6) lib/action_dispatch/journey/router.rb:35:in `each&#39;</a><br><a class="trace-frames" data-frame-id="32" href="#">actionpack (5.2.4.6) lib/action_dispatch/journey/router.rb:35:in `serve&#39;</a><br><a class="trace-frames" data-frame-id="33" href="#">actionpack (5.2.4.6) lib/action_dispatch/routing/route_set.rb:840:in `call&#39;</a><br><a class="trace-frames" data-frame-id="34" href="#">rack (2.2.3) lib/rack/tempfile_reaper.rb:15:in `call&#39;</a><br><a class="trace-frames" data-frame-id="35" href="#">rack (2.2.3) lib/rack/etag.rb:27:in `call&#39;</a><br><a class="trace-frames" data-frame-id="36" href="#">rack (2.2.3) lib/rack/conditional_get.rb:40:in `call&#39;</a><br><a class="trace-frames" data-frame-id="37" href="#">rack (2.2.3) lib/rack/head.rb:12:in `call&#39;</a><br><a class="trace-frames" data-frame-id="38" href="#">actionpack (5.2.4.6) lib/action_dispatch/http/content_security_policy.rb:18:in `call&#39;</a><br><a class="trace-frames" data-frame-id="39" href="#">rack (2.2.3) lib/rack/session/abstract/id.rb:266:in `context&#39;</a><br><a class="trace-frames" data-frame-id="40" href="#">rack (2.2.3) lib/rack/session/abstract/id.rb:260:in `call&#39;</a><br><a class="trace-frames" data-frame-id="41" href="#">actionpack (5.2.4.6) lib/action_dispatch/middleware/cookies.rb:670:in `call&#39;</a><br><a class="trace-frames" data-frame-id="42" href="#">actionpack (5.2.4.6) lib/action_dispatch/middleware/callbacks.rb:28:in `block in call&#39;</a><br><a class="trace-frames" data-frame-id="43" href="#">activesupport (5.2.4.6) lib/active_support/callbacks.rb:98:in `run_callbacks&#39;</a><br><a class="trace-frames" data-frame-id="44" href="#">actionpack (5.2.4.6) lib/action_dispatch/middleware/callbacks.rb:26:in `call&#39;</a><br><a class="trace-frames" data-frame-id="45" href="#">actionpack (5.2.4.6) lib/action_dispatch/middleware/debug_exceptions.rb:61:in `call&#39;</a><br><a class="trace-frames" data-frame-id="46" href="#">actionpack (5.2.4.6) lib/action_dispatch/middleware/show_exceptions.rb:33:in `call&#39;</a><br><a class="trace-frames" data-frame-id="47" href="#">railties (5.2.4.6) lib/rails/rack/logger.rb:38:in `call_app&#39;</a><br><a class="trace-frames" data-frame-id="48" href="#">railties (5.2.4.6) lib/rails/rack/logger.rb:26:in `block in call&#39;</a><br><a class="trace-frames" data-frame-id="49" href="#">activesupport (5.2.4.6) lib/active_support/tagged_logging.rb:71:in `block in tagged&#39;</a><br><a class="trace-frames" data-frame-id="50" href="#">activesupport (5.2.4.6) lib/active_support/tagged_logging.rb:28:in `tagged&#39;</a><br><a class="trace-frames" data-frame-id="51" href="#">activesupport (5.2.4.6) lib/active_support/tagged_logging.rb:71:in `tagged&#39;</a><br><a class="trace-frames" data-frame-id="52" href="#">railties (5.2.4.6) lib/rails/rack/logger.rb:26:in `call&#39;</a><br><a class="trace-frames" data-frame-id="53" href="#">actionpack (5.2.4.6) lib/action_dispatch/middleware/remote_ip.rb:81:in `call&#39;</a><br><a class="trace-frames" data-frame-id="54" href="#">actionpack (5.2.4.6) lib/action_dispatch/middleware/request_id.rb:27:in `call&#39;</a><br><a class="trace-frames" data-frame-id="55" href="#">rack (2.2.3) lib/rack/method_override.rb:24:in `call&#39;</a><br><a class="trace-frames" data-frame-id="56" href="#">rack (2.2.3) lib/rack/runtime.rb:22:in `call&#39;</a><br><a class="trace-frames" data-frame-id="57" href="#">activesupport (5.2.4.6) lib/active_support/cache/strategy/local_cache_middleware.rb:29:in `call&#39;</a><br><a class="trace-frames" data-frame-id="58" href="#">actionpack (5.2.4.6) lib/action_dispatch/middleware/executor.rb:14:in `call&#39;</a><br><a class="trace-frames" data-frame-id="59" href="#">actionpack (5.2.4.6) lib/action_dispatch/middleware/static.rb:127:in `call&#39;</a><br><a class="trace-frames" data-frame-id="60" href="#">rack (2.2.3) lib/rack/sendfile.rb:110:in `call&#39;</a><br><a class="trace-frames" data-frame-id="61" href="#">railties (5.2.4.6) lib/rails/engine.rb:524:in `call&#39;</a><br><a class="trace-frames" data-frame-id="62" href="#">puma (4.3.8) lib/puma/configuration.rb:228:in `call&#39;</a><br><a class="trace-frames" data-frame-id="63" href="#">puma (4.3.8) lib/puma/server.rb:718:in `handle_request&#39;</a><br><a class="trace-frames" data-frame-id="64" href="#">puma (4.3.8) lib/puma/server.rb:472:in `process_client&#39;</a><br><a class="trace-frames" data-frame-id="65" href="#">puma (4.3.8) lib/puma/server.rb:328:in `block in run&#39;</a><br><a class="trace-frames" data-frame-id="66" href="#">puma (4.3.8) lib/puma/thread_pool.rb:134:in `block in spawn_thread&#39;</a><br></code></pre> </div> <script type="text/javascript"> var traceFrames = document.getElementsByClassName('trace-frames'); var selectedFrame, currentSource = document.getElementById('frame-source-0'); // Add click listeners for all stack frames for (var i = 0; i < traceFrames.length; i++) { traceFrames[i].addEventListener('click', function(e) { e.preventDefault(); var target = e.target; var frame_id = target.dataset.frameId; if (selectedFrame) { selectedFrame.className = selectedFrame.className.replace("selected", ""); } target.className += " selected"; selectedFrame = target; // Change the extracted source code changeSourceExtract(frame_id); }); function changeSourceExtract(frame_id) { var el = document.getElementById('frame-source-' + frame_id); if (currentSource && el) { currentSource.className += " hidden"; el.className = el.className.replace(" hidden", ""); currentSource = el; } } } </script> </div> <h2 style="margin-top: 30px">Request</h2> <p><b>Parameters</b>:</p> <pre>{&quot;client_assertion&quot;=&gt; &quot;eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IjlJdnBaaUx6WjFReG1fT2stTjdWLVFNcW4zSEl1M0p4WHNHRDRWS0hCNUEiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJkZXYgdG9vbCAyMSIsInN1YiI6IiBkc2Rzc2RzZHMiLCJhdWQiOiJodHRwczovL2x0aS1yaS5pbXNnbG9iYWwub3JnL3BsYXRmb3Jtcy8yMzkwL2FjY2Vzc190b2tlbnMiLCJpYXQiOjE3MTE2Mzc5OTksImV4cCI6MTcxMTYzODI5OSwianRpIjoiZmU3ZmYyNWZkYTlkN2UxMTAwNjgifQ.Ux42RIfs1xyyJdK9Nu-qbuJDvRtXuo1f2w645iKsTfq7JSqM2BDCYnMYzR1tIRGsbV394H_87ecrYQ8TZDM3ka2b7eIj1CxxXAGYRScWHilP2NNnP7ILGS4RfwphY2MbhkWLQkfu_lMoUyeUc14vArTnmDXrlfUSdVotWk7tlKg&quot;, &quot;client_assertion_type&quot;=&gt;&quot;urn:ietf:params:oauth:client-assertion-type:jwt-bearer&quot;, &quot;grant_type&quot;=&gt;&quot;client_credentials&quot;, &quot;scope&quot;=&gt; &quot;https://purl.imsglobal.org/spec/lti-ags/scope/lineitem https://purl.imsglobal.org/spec/lti-ags/scope/result.readonly https://purl.imsglobal.org/spec/lti-ags/scope/score https://purl.imsglobal.org/spec/lti-ap/scope/control.all https://purl.imsglobal.org/spec/lti-nrps/scope/contextmembership.readonly https://purl.imsglobal.org/spec/lti-ap/scope/control.all&quot;, &quot;platform_id&quot;=&gt;&quot;2390&quot;} </pre> <div class="details"> <div class="summary"><a href="#" onclick="return toggleSessionDump()">Toggle session dump</a></div> <div id="session_dump" style="display:none"><pre></pre></div> </div> <div class="details"> <div class="summary"><a href="#" onclick="return toggleEnvDump()">Toggle env dump</a></div> <div id="env_dump" style="display:none"><pre>GATEWAY_INTERFACE: &quot;CGI/1.2&quot; HTTP_ACCEPT: &quot;*/*&quot; HTTP_ACCEPT_ENCODING: &quot;gzip;q=1.0,deflate;q=0.6,identity;q=0.3&quot; HTTP_VERSION: &quot;HTTP/1.1&quot; HTTP_X_FORWARDED_FOR: &quot;10.128.0.14&quot; HTTP_X_FORWARDED_HOST: &quot;lti-ri.imsglobal.org&quot; HTTP_X_REQUEST_ID: &quot;45e2f1e9ae68589d0827ed7cfb8e1690&quot; ORIGINAL_SCRIPT_NAME: &quot;&quot; REMOTE_ADDR: &quot;10.24.0.8&quot; SERVER_NAME: &quot;lti-ri.imsglobal.org&quot; SERVER_PROTOCOL: &quot;HTTP/1.1&quot;</pre></div> </div> <h2 style="margin-top: 30px">Response</h2> <p><b>Headers</b>:</p> <pre>None</pre> </div> </body> </html> '

Extracted source (around line #26):
24
25
26
27
28
29
              
request = conn.post @tool.oauth2_url, body
JSON.parse(request.body)
end
def body

Rails.root: /app

Application Trace | Framework Trace | Full Trace

Request

Parameters:

{"tool_id"=>"2129", "id"=>"16301"}

Response

Headers:

None