---
name: "Lemonldap::NG::Common::PSGI"
section: "3pm"
platform: "linux"
package: "liblemonldap-ng-common-perl"
version: "2.21.2+ds-1+deb13u3"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/Lemonldap::NG::Common::PSGI"
---

# Lemonldap::NG::Common::PSGI(3pm)

Base library for PSGI modules of Lemonldap::NG. Use Lemonldap::NG::Common::PSGI::Router for REST API.

## NAME

Lemonldap::NG::Common::PSGI - Base library for PSGI modules of Lemonldap::NG. Use Lemonldap::NG::Common::PSGI::Router for REST API.

## SYNOPSIS

```
  package My::PSGI;

  use base Lemonldap::NG::Common::PSGI;

  sub init {
    my ($self,$args) = @_;
    # Will be called 1 time during startup

    # Store debug level
    $self->logLevel('info');
    # It is possible to use syslog for user actions
    $self->syslog('daemon');

    # Return a boolean. If false, then error message has to be stored in
    # $self->error
    return 1;
  }

  sub handler {
    my ( $self, $req ) = @_;
    # Do something and return a PSGI response
    # NB: $req is a Lemonldap::NG::Common::PSGI::Request object

    return [ 200, [ 'Content-Type' => 'text/plain' ], [ 'Body lines' ] ];
  }
```

This package could then be called as a CGI, using FastCGI,...

```
  #!/usr/bin/env perl

  use My::PSGI;
  use Plack::Handler::FCGI; # or Plack::Handler::CGI
  Plack::Handler::FCGI->new->run( My::PSGI->run() );
```

## DESCRIPTION

This package provides base class for Lemonldap::NG web interfaces but could be used regardless.

## METHODS

### Running methods

*run ( $args )*

Main method that will manage requests. It can be called using class or already created object:

- Class-\>run($args):

  launch new($args), **init()**, then manage requests (using private **\_run()** method

- $object-\>**run()**:

  manage directly requests. Initialization must have be done earlier.

### Logging

*lmLog ( $msg, $level)*

Print on STDERR messages if level \> `$self`-\>{logLevel}. Defined log levels are: debug, info, notice, warn, error.

*userLog ($msg, $level)*

Alias for `$self`-\>userLogger-\>$level($msg). Prefer to use this form (required for Auth/Combination)

***userError()*** ***userNotice()*** ***userInfo()***

Alias for userLog(level). Note that you must use `$self`-\>userLogger-\>$level instead

### Content sending

Note that `$req`, the first argument of these functions, is a Lemonldap::NG::Common::PSGI::Request. See the corresponding documentation.

*sendHtml ( $req, $template )*

This method build HTML response using HTML::Template and the template `$template`. `$template` file must be in `$self`-\>templateDir directory. HTML template will receive 5 variables:

- SCRIPT\_NAME: the path to the (F)CGI

  - STATIC\_PREFIX: content of $self-\>staticPrefix

  - AVAILABLE\_LANGUAGES: content of $self-\>languages

  - LINKS: JSON stringification of $self-\>links

  - VERSION: Lemonldap::NG version

  The response is always send with a 200 code.

*sendJSONresponse ( $req, $json, %args )*

Stringify `$json` object and send it to the client. `$req` is the Lemonldap::NG::Common::PSGI::Request object; `%args` can define the HTTP error code (200 by default) or headers to add.

If client is not json compatible (\`Accept\` header), response is send in XML.

Examples:

```
  $self->sendJSONresponse ( $req, { result => 0 }, code => 400 );
  $self->sendJSONresponse ( $req, { result => 1 } );
  $self->sendJSONresponse ( $req, { result => 1 }, headers => [ X => Z ] );
```

*sendError ( $req, $msg, $code )*

Call sendJSONresponse with \`{ error =\> `$msg` }\` and code (default to 500) and call **lmLog()** to duplicate error in logs

*abort ( $msg )*

When an error is detected during startup (**init()** sub), you must not call **sendError()** but call **abort()**. Each request received later will receive the error (abort uses **sendError()** behind the scene).

### Accessors

*error*

String error. Used if **init()** fails or if sendError is called without argument.

*languages*

String containing list of languages (ie "fr, en'). Used by **sendHtml()**.

*logLevel*

See **lmLog()**.

*staticPrefix*

String indicating the path of static content (js, css,...). Used by **sendHtml()**.

*templateDir*

Directory containing template files.

*links*

Array of links to display by **sendHtml()**. Each element has the form:

```
 { target => 'http://target', title => 'string to display' }
```

*syslog*

Syslog facility. If empty, STDERR will be used for logging

## SEE ALSO

\<http://lemonldap-ng.org/\>, Lemonldap::NG::Portal, Lemonldap::NG::Handler, Plack, PSGI, Lemonldap::NG::Common::PSGI::Router, Lemonldap::NG::Common::PSGI::Request, HTML::Template,

## AUTHORS

- LemonLDAP::NG team \<http://lemonldap-ng.org/team\>

  ## BUG REPORT

Use OW2 system to report bug or ask for features: \<https://gitlab.ow2.org/lemonldap-ng/lemonldap-ng/issues\>

## DOWNLOAD

Lemonldap::NG is available at \<https://lemonldap-ng.org/download\>

## COPYRIGHT AND LICENSE

See COPYING file for details.

This library is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program.  If not, see \<http://www.gnu.org/licenses/\>.
