Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

https://github.com/michaelJustin/daraja-framework

A lightweight HTTP server framework for Object Pascal (Delphi 2009+/Free Pascal 3.2) based on Indy
https://github.com/michaelJustin/daraja-framework

daraja-framework delphi freepascal http-server indy

Last synced: about 1 month ago
JSON representation

A lightweight HTTP server framework for Object Pascal (Delphi 2009+/Free Pascal 3.2) based on Indy

Lists

README

        

[![pages-build-deployment](https://github.com/michaelJustin/daraja-framework/actions/workflows/pages/pages-build-deployment/badge.svg)](https://github.com/michaelJustin/daraja-framework/actions/workflows/pages/pages-build-deployment)
[![AGPL License](https://img.shields.io/badge/license-AGPL-blue.svg)](http://www.gnu.org/licenses/agpl-3.0) ![GitHub Release Date - Published_At](https://img.shields.io/github/release-date/michaelJustin/daraja-framework)

![](https://www.habarisoft.com/images/daraja_logo_landscape_2016_2.png)

# Daraja HTTP Framework

Daraja is a flexible HTTP server framework for Object Pascal, based on the non-visual HTTP server component in the free open source library Internet Direct (Indy).

Daraja provides the core foundation for serving HTTP resources of all content-types such as HTML pages, images, scripts, web service responses etc. by mapping resource paths to your own code. Your code then can create the response content, or let the framework serve a static file.

## Documentation

### API generated with doxygen

http://michaeljustin.github.io/daraja-framework/

### Getting Started PDF

A Getting Started document (PDF) is available at https://www.habarisoft.com/daraja_framework/2.8/docs/DarajaFrameworkGettingStarted.pdf

### Project home page

Visit https://www.habarisoft.com/daraja_framework.html for more information.

## IDE configuration

### Required paths

* The project search path must include the Indy and Daraja source directories.

Example:

`\source;\Lib\Core\;\Lib\Protocols\;\Lib\System\`

* The project search path for Include files must include the Indy Core path.

Example:

`\Lib\Core\`

### Optional source

Some useful (but optional) units are located in the `optional` subfolder. Include it when needed:

`\source;\source\optional;\Lib\Core\;\Lib\Protocols\;\Lib\System\`

## Usage example: contexts

In the Daraja Framework, contexts are used for the high-level separation of HTTP resources, depending on their first path segment. Here is an example which uses two contexts, 'context1' and 'context2':

http://example.com/context1/index.html
http://example.com/context2/other.html

This example uses 'news', 'files' and 'admin' contexts:

http://example.com/news/index.html
http://example.com/files/doc1.pdf
http://example.com/admin/login.html

### Code
In the Daraja Framework, creating a context only requires the context name as the parameter of the TdjWebAppContext constructor:

```pascal
Server := TdjServer.Create;
try
Context1 := TdjWebAppContext.Create('context1');
Server.AddContext(Context1);
Context2 := TdjWebAppContext.Create('context2');
Server.AddContext(Context2);
Server.Start;
...
```

## Dynamic resource handlers

Contexts need resource handlers to process requests. A **resource handler** is responsible for the generation of the HTTP response matching a specific client request.

However, the routing between the actual HTTP request and the resource handler is performed via 'mapping' rules.

For example, a resource handler which returns a HTML document could be mapped to the `/context1/index.html` resource path with this **absolute path** resource handler mapping:

```pascal
Context1.Add(TIndexPageResource, '/index.html');
```

Alternatively, a more general **suffix mapping** resource handler may be used, which should handle requests to any resources with the extension `*.html`:

```pascal
Context1.Add(TCatchAllHtmlResource, '*.html');
```

This resource handler will be invoked for all requests for *.html resources - independent of their actual document name, and also for resources in sub-paths like `/context1/this/works/with_any_page.html`. (But note: the resource handler will _not_ receive requests for other context, such as `/context2/index.html`!)

## Resource filter chains (new in 2.6)

For any resource handler, there may also exist one ore more filters. With filters, HTTP traffic can be modified in many ways.

Examples:

* detect missing authorization, and forward to a login page when the resource requires authorization
* set or remove headers depending con conditions
* pre- or postprocess the request body content

## Optional Extensions

### slf4p

A simple logging facade with support for LazLogger, Log4D, and other logging frameworks.

https://github.com/michaelJustin/slf4p

You can find this project at https://github.com/michaelJustin/daraja-framework

![](https://www.habarisoft.com/images/daraja_logo_landscape_2016_2.png)