In short, Daraja enables Object Pascal developers to write well-structured HTTP server applications.
Daraja is a compact and flexible HTTP server application framework for Object Pascal, based on the HTTP server included in Indy - Internet Direct. The framework uses URL patterns to match requests to your resource handler code, and optional request filtering for pre- and post-processing. It enables developers to create well-structured HTTP server applications, written with 100% open source code.
- URL-pattern routing — map requests to handler classes by exact, prefix, suffix or default patterns
- Web components — handle requests by overriding per-method hooks (
OnGet,OnPost,OnPut, ...) - Filter chains — pluggable pre- and post-processing of requests and responses
- Contexts — group resources under a base path with their own init parameters
- HTTP sessions — server-side session state with configurable timeout
- Static content — serve files from a directory with path-traversal protection (
TdjDefaultWebComponent, see the note below) - Optional helpers — NCSA access logging and request-statistics filters
- Dual compiler support — one codebase for Delphi 2009+ and Lazarus 4.x / FPC 3.2.x
- AGPL or commercial — 100% open source, with a commercial license available
The static-content web component and the helper filters live in
source/optional/, which is unsupported example code:
review it before using it to serve untrusted content.
Prerequisites
The minimum requirements are:
- Delphi 2009 or higher or
- Lazarus 4.x / Free Pascal 3.2.x
- Indy - Internet Direct 10.6.2 or 10.6.3
- slf4p - Simple Logging Facade for Pascal
Optional dependencies for some code examples and logging:
Get the source
Daraja and its dependencies are expected to sit side by side in the same parent directory:
Projects/
├── daraja-framework/ this repository
├── Indy/ https://github.com/IndySockets/Indy (10.6.2 or 10.6.3)
└── slf4p/ https://github.com/michaelJustin/slf4p
mkdir Projects && cd Projects
git clone https://github.com/michaelJustin/daraja-framework.git
git clone https://github.com/IndySockets/Indy.git
git clone https://github.com/michaelJustin/slf4p.gitThe demo and test project files use relative paths (..\..\..\Indy\...,
..\..\..\slf4p\src\main) that rely on this layout.
IDE configuration guide
To make Daraja HTTP Framework and Internet Direct (Indy) available for a project,
- add the Daraja HTTP Framework
<Install>/sourcefolder to the project search path - add the folders
<Indy>/Lib/Core,<Indy>/Lib/Systemand<Indy>/Lib/Protocolsto the project search path
These are the basic steps to configure a simple "Hello, World!" application. A simple resource will be defined in a TdjWebComponent which has only one method, OnGet. The web component will then be installed in the server.
A Daraja Web Component defines the request handling and response building, but it does not specify the actual location (HTTP address) of a resource. The web component in this example handles HTTP GET requests by overriding the OnGet method. The method sets the response content text and content type.
type
THelloWorldResource = class(TdjWebComponent)
public
procedure OnGet(Request: TdjRequest; Response: TdjResponse); override;
end;
procedure THelloWorldResource.OnGet(Request: TdjRequest; Response: TdjResponse);
begin
Response.ContentText := 'Hello, World!';
Response.ContentType := 'text/plain';
end;We want to place the web component in the context tutorial and the absolute path /hello. We also want to use port 80.
The full URL of our resource is http://127.0.0.1/tutorial/hello
procedure Demo;
var
Server: TdjServer;
Context: TdjWebAppContext;
begin
Server := TdjServer.Create(80);
try
Context := TdjWebAppContext.Create('tutorial');
Context.Add(THelloWorldResource, '/hello');
Server.Add(Context);
Server.Start;
WriteLn('Server is running, please open http://127.0.0.1/tutorial/hello');
WriteLn('Hit enter to terminate.');
ReadLn;
finally
Server.Free;
end;
end;Full source: demo/01_helloworld/MainUnit.pas. More runnable examples — sessions, filters, static content, server-sent events, OpenID Connect — are in demo/.
curl -i http://127.0.0.1/tutorial/hello
HTTP/1.1 200 OK
Connection: keep-alive
Content-Type: text/plain; charset=ISO-8859-1
Content-Length: 13
Date: Wed, 22 Jan 2025 19:07:14 GMT
Hello, World!(The charset=ISO-8859-1 is appended automatically by Indy; the example code only sets text/plain.)
How a web request reaches your Pascal code — an illustrated walk through the framework's building blocks, for developers new to HTTP.
DarajaFrameworkGettingStarted.pdf (version 3.3.0, in this repository)
See CHANGELOG.md for the release history.
Daraja HTTP Framework is dual licensed under the GNU Affero General Public License and a commercial license. The GNU Affero General Public License is a free, copyleft license for software and other kinds of works, specifically designed to ensure cooperation with the community in the case of network server software.
Can I use it in my commercial Project?
Yes, if you open source your whole project (thus also AGPL it) otherwise no.Is it enough to ship the licence texts or do I need to ship the source code (from Daraja) too?
You have to supply the whole sourcecode of everything - but a download link should suffice.Do I need to mention the use of Daraja inside my program (like a info message or something)?
No, this is not required.You can be released from the requirements of the AGPL license by purchasing a commercial license. The commercial license can be obtained from https://www.habarisoft.com/daraja_framework.html
The commercial license terms are in COMMERCIAL-LICENSE.txt.
This software uses the following open source packages:
For example code, unit testing, and documentation, it uses the following open source packages:
- JsonDataObjects — example code
- Log4D and slf4p — logging
- DUnit and FPCUnit — unit testing
- Doxygen and pas2dox — API documentation generation
"Daraja" means "bridge" in Swahili. The Daraja Framework serves as a bridge between incoming HTTP requests and the Object Pascal code that handles them, enabling seamless integration between web traffic and application logic. — ChatGPT, OpenAI (May 2025)
"Daraja" is Swahili for "bridge" — a fitting name, since the framework is the bridge between an incoming HTTP request and the Object Pascal code that answers it: it matches each request by URL pattern and passes it to your handler class. — Claude Sonnet 5, Anthropic (September 2026)
