oos-utils icon indicating copy to clipboard operation
oos-utils copied to clipboard

Parse an APEX URL

Open martindsouza opened this issue 10 years ago • 1 comments

Reverse engineering an APEX URL. See apex_page.get_url for the parameters that this should return.

Update:

  • Should parse all "normal" URLs and parse into logical structures
  • Need to support new APEX 20.1 friendly URLs

martindsouza avatar Nov 18 '15 01:11 martindsouza

Wrote code, but took out until need arises:

Code:


type rec_apex_url is record(
    application_id apex_application_pages.application_id%type,
    page_id apex_application_pages.page_id%type,
    session_id apex_workspace_sessions.apex_session_id%type,
    request apex_workspace_activity_log.request_value%type,
    debug varchar2(4000),
    clear_cache varchar2(4000),
    items varchar2(4000),
    vals varchar2(4000),
    printer_friendly varchar2(4000),
    trace  varchar2(4000)
  );

function parse_url(
    p_url in varchar2)
    return rec_apex_url
  as
    l_return rec_apex_url;
    l_array apex_application_global.vc_arr2;
    l_url varchar2(32767) := p_url;
  begin

    -- Remove any http://... etc
    l_url := regexp_replace(l_url, '^.*f?p', 'f?p');

    l_array := apex_util.string_to_table(p_string => l_url, p_separator => ':');

    if l_array.count = 0 then
      null;
    else
      for i in 1..l_array.count loop
        if i = 1 then
          -- Page ID
          l_return.application_id := regexp_replace(l_array(i), '.*=');
        elsif i = 2 then
          l_return.page_id := l_array(i);
        elsif i = 3 then
          l_return.session_id := l_array(i);
        elsif i = 4 then
          l_return.request := l_array(i);
        elsif i = 5 then
          l_return.debug := l_array(i);
        elsif i = 6 then
          l_return.clear_cache := l_array(i);
        elsif i = 7 then
          l_return.items := l_array(i);
        elsif i = 8 then
          l_return.vals := l_array(i);
        elsif i = 9 then
          l_return.printer_friendly := l_array(i);
        elsif i = 10 then
          l_return.trace := l_array(i);
        end if;
      end loop;
    end if; -- l_array.count = 0

    return l_return;

  end parse_url;

Example:

declare
  l_url oos_util_apex.rec_apex_url;
begin

  l_url := oos_util_apex.parse_url('http://vcentos:10080/ords/f?p=160:1:1123123428512');

  dbms_output.put_line('application_id: ' || l_url.application_id);
  dbms_output.put_line('page_id: ' || l_url.page_id);
  dbms_output.put_line('session_id: ' || l_url.session_id);
  dbms_output.put_line('request: ' || l_url.request);
  dbms_output.put_line('debug: ' || l_url.debug);
  dbms_output.put_line('clear_cache: ' || l_url.clear_cache);
  dbms_output.put_line('items: ' || l_url.items);
  dbms_output.put_line('vals: ' || l_url.vals);
  dbms_output.put_line('printer_friendly: ' || l_url.printer_friendly);
  dbms_output.put_line('trace: ' || l_url.trace);
end;
/

martindsouza avatar Dec 29 '15 19:12 martindsouza