OWA_UTIL is a database package that provides access to PL/SQL Common Gateway Interface (CGI) variables. This functionality is available for POST, PUT, and DELETE services - not for Collection or Query GET handlers.

## Background

When building ORDS REST services, you often need access to information about the incoming request beyond just the body parameters. CGI (Common Gateway Interface) variables provide metadata about the request, including headers, server information, and request details.

## Viewing All Available CGI Variables

You can use `owa_util.print_cgi_env` to display all available CGI variables. This is useful during development to understand what information is available:

BEGIN
      owa_util.print_cgi_env;
    END;

This will output variables including:

- **REQUEST_METHOD**: GET, POST, PUT, DELETE
- **PATH_INFO**: The resource path
- **SCRIPT_NAME**: The ORDS module path
- **SERVER_NAME**: The server hostname
- **REQUEST_PROTOCOL**: HTTP version
- **QUERY_STRING**: URL parameters
- **CONTENT_TYPE**: Request body format
- **HTTP_**\*: All HTTP headers

## Practical Applications

There are several practical use cases for CGI information in ORDS handlers:

### 1. Creating Generic Logging APIs

Build a logging service that captures all details about incoming web service calls:

DECLARE
      l_method    VARCHAR2(100);
      l_path      VARCHAR2(500);
      l_client_ip VARCHAR2(50);
    BEGIN
      l_method    := owa_util.get_cgi_env('REQUEST_METHOD');
      l_path      := owa_util.get_cgi_env('PATH_INFO');
      l_client_ip := owa_util.get_cgi_env('REMOTE_ADDR');

INSERT INTO api_log (method, path, client_ip, log_time)
      VALUES (l_method, l_path, l_client_ip, SYSDATE);
    END;

### 2. Honoring HTTP Header Values

Respect client preferences for response formatting:

DECLARE
      l_accept VARCHAR2(200);
    BEGIN
      l_accept := owa_util.get_cgi_env('HTTP_ACCEPT');

IF INSTR(l_accept, 'application/xml') > 0 THEN
        -- Return XML format
        NULL;
      ELSE
        -- Default to JSON
        NULL;
      END IF;
    END;

### 3. Identifying ORDS Version Information

Access server and ORDS version details:

DECLARE
      l_server_software VARCHAR2(200);
    BEGIN
      l_server_software := owa_util.get_cgi_env('SERVER_SOFTWARE');
      -- Returns something like: ORDS/3.0.7
    END;

## Accessing Individual Values

Rather than parsing all variables, use `owa_util.get_cgi_env` to retrieve specific values:

DECLARE
      l_request_url VARCHAR2(1000);
    BEGIN
      -- Reconstruct the complete request URL
      l_request_url :=
        owa_util.get_cgi_env('REQUEST_PROTOCOL') || '://' ||
        owa_util.get_cgi_env('SERVER_NAME') ||
        owa_util.get_cgi_env('SCRIPT_NAME') ||
        owa_util.get_cgi_env('PATH_INFO');

IF owa_util.get_cgi_env('QUERY_STRING') IS NOT NULL THEN
        l_request_url := l_request_url || '?' ||
                         owa_util.get_cgi_env('QUERY_STRING');
      END IF;

DBMS_OUTPUT.PUT_LINE('Full URL: ' || l_request_url);
    END;

## Common CGI Variables

Here are the most commonly used CGI variables in ORDS handlers:

| Variable | Description |
| --- | --- |
| REQUEST_METHOD | HTTP method (GET, POST, PUT, DELETE) |
| PATH_INFO | Resource path after the module |
| QUERY_STRING | URL query parameters |
| CONTENT_TYPE | MIME type of request body |
| CONTENT_LENGTH | Size of request body |
| SERVER_NAME | Hostname of the server |
| SERVER_PORT | Port number |
| REMOTE_ADDR | Client IP address |
| HTTP_AUTHORIZATION | Authorization header value |
| HTTP_* | Any HTTP header (prefixed with HTTP_) |

## Conclusion

CGI information provides valuable context about incoming requests that goes beyond the request body. By leveraging OWA_UTIL in your ORDS handlers, you can build more sophisticated services that log requests, honor client preferences, and access any HTTP header.
