\documentclass[a4paper, 11pt]{article}
\renewcommand{\familydefault}{\sfdefault}
\usepackage{a4wide}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{color}
\usepackage{graphicx}
\usepackage{setspace}
\usepackage{ulem}
\usepackage{listings}
\usepackage{float}
\usepackage[rflt]{floatflt}
\usepackage{tabularx}
\setlength{\parindent}{0pt}
\title{Browscap Apache Module}
\usepackage[
pdftitle={Browscap Apache Module}
pdfsubject={Ein Modul zur Nutzung der Browscap.ini auf dem Apache 2.2 Webserver}
pdfauthor={Udo Schmal}
pdfkeywords={Free Pascal}
]{hyperref}
\definecolor{darkblue}{rgb}{0,0,.5}
\hypersetup{pdftex=true, colorlinks=true, breaklinks=true, linkcolor=darkblue, menucolor=darkblue, pagecolor=darkblue, urlcolor=darkblue}
\begin{document}Browscap Apache Module
\singlespacing
{\LARGE \textbf{\label{sec:title}Browscap Apache Module}}

\singlespacing
{\large \textbf{\label{sec:subtitle}Ein Modul zur Nutzung der Browscap.ini auf dem Apache 2 Webserver}}

Hier nun meine erste Variante eines Apache Moduls zur Nutzung der Browscap.ini Datei, sicherlich stehe ich mit diesem Projekt zur Zeit noch ganz am Anfang, da es mein erstes Apache Modul ist, welches ich mit Free Pascal unter Windows entwickele, was auch unter Linux laufen soll. Also das bedeutet Cross-Kompilieren ich habe mir die benötigten Dateien aus dem Unix /lib Verzeichnis besorgt und einfach kompiliert ob das nun von Erfolg gekrönt ist weiß ich nicht da mir zur Zeit keine unterschiedlichen Linux Testumgebungen zur Verfügung stehen, darum bin ich auf Eure Mithilfe angewiesen!

Doch nun zu meinem Ansatz, ich lade die browscap.ini die im Apache Verzeichnis liegen muss, während des Serverstarts in den Speicher und erzeuge eine vorsortierte Liste der Sections. Bei einer Abfrage wird der User-Agent aus dem Request-Header gelesen und mit Hilfe der geladenen Browscap.ini die Eigenschaften ermittelt. Anschließend werden ein paar von mir als relevant befundene Eckwerte dem Request-Header hinzugefügt, wodurch sie dann allen folgenden Aktionen zur Verfügung stehen. Falls jemand von Euch eine bessere Idee hat an welcher Stelle ich sonst die Werte für eine folgende Bearbeitung z.B. durch PHP zur verfügung stellen könnte immer heraus damit.

Schön wäre es natürlich die Werte in einer \&quot;Session\&quot;-Datei auf dem Server abzulegen und dann dem Header lediglich eine Cookie zu setzen der Auskunft über die Datei gibt.

Erforderliche Eintrag in der \textbf{httpd.conf} damit das Modul überhaupt geladen wird:
\begin{lstlisting}[breaklines]LoadModule browscap\_module modules/mod\_browscap.so\end{lstlisting}

\textbf{Aktivieren des Moduls}, in einem Bereich \&lt;VirtualHost\&gt;, \&lt;Directory\&gt;, \&lt;Location\&gt;, \&lt;Files\&gt;, .htaccess (All) , damit es an dieser Stelle zum Einsatz kommt.
\begin{lstlisting}[breaklines]\&lt;IfModule browscap\_module\&gt;
    GetBrowscap On
\&lt;/IfModule\&gt;\end{lstlisting}

Die Apache Module .so \textbf{Datei gehört in das /apache/modules Verzeichnis}, hier zwei unterschiedliche Versionen, die erste Datei funktioniert in meiner lokalen UwAmp installation unter Windows, die zeite Datei ist ungetestet!\newline


\href{https://www.gocher.me/downloads/mod_browscap-i386-win32.zip}{mod browscap-i386-win32.zip}\newline
\href{https://www.gocher.me/downloads/mod_browscap-i386-linux.zip}{mod browscap-i386-linux.zip}

mod\_browscap.ini (Konfigurationsdatei für mod\_browscap.so) auch im modules Verzeichnis ablegen: \newline

\begin{lstlisting}[breaklines][browscap]\newline
path=C:\textbackslashUwAmp\textbackslashbin\textbackslashapache\textbackslashmodules\textbackslashbrowscap.ini\newline
debug=1\newline
\newline
[fields]\newline
X-Client-Name=Browser\newline
X-Client-Version=Version\newline
X-Client-Is-Mobile-Device=isMobileDevice\newline
X-Client-Is-Tablet=isTablet\newline
X-Client-Is-Crawler=Crawler \newline
\end{lstlisting}

\textbf{Download der browscap.ini von \href{https://browscap.org/}{browscap.org}} die Variante der INI-Datei sollte egal sein. \newline
In der mod\_browscap.ini muss der Pfad zur browscap.ini angepasst werden, das setzen von debug auf 1 oder 0 aktiviert oder deaktiviert die Debug-Zeilen in der Apache error.log.\newline
Die Zuordnung in der Section 'fields' steuert die Übergabe der Werte in \underbar{Request}-Header.\newline


\textbf{Ein Beipiel} was unter PHP die von dem Modul zur Verfügung gestellten Werte ausgibt:
\begin{lstlisting}[breaklines]\&lt;?php\newline
echo 'client name: '.\$\_SERVER['HTTP\_X\_CLIENT\_NAME'].'\&lt;br /\&gt;';\newline
echo 'client version: '.\$\_SERVER['HTTP\_X\_CLIENT\_VERSION'].'\&lt;br /\&gt;';\newline
echo 'client is mobile device: '.\$\_SERVER['HTTP\_X\_CLIENT\_IS\_MOBILE\_DEVICE'].'\&lt;br /\&gt;';\newline
echo 'client is tablet: '.\$\_SERVER['HTTP\_X\_CLIENT\_IS\_TABLET'].'\&lt;br /\&gt;';\newline
echo 'client is crawler: '.\$\_SERVER['HTTP\_X\_CLIENT\_IS\_CRAWLER'].'\&lt;br /\&gt;';\newline
?\&gt;\newline
\end{lstlisting}

\textbf{Die Ausgabe:}
\begin{lstlisting}[breaklines]client name: Firefox\newline
client version: 29.0\newline
client is mobile device: false\newline
client is tablet: false\newline
client is crawler: false\end{lstlisting}

\textbf{Der Logfile Auszug:}
\begin{lstlisting}[breaklines][Tue May 27 01:26:20 2014] [notice] Apache/2.2.22 (Win32) PHP/5.3.25 configured -- resuming normal operations\newline
[Tue May 27 01:26:20 2014] [notice] Server built: Jan 28 2012 11:16:39\newline
[Tue May 27 01:26:20 2014] [notice] Parent: Created child process 2416\newline
[Tue May 27 01:26:20 2014] [debug] mpm\_winnt.c(477): Parent: Sent the scoreboard to the child\newline
\textbf{[Tue May 27 01:26:21 2014] [debug] mod\_browscap.so(146): createDirConfig(C:/UwAmp/www/test/)\newline
[Tue May 27 01:26:21 2014] [debug] mod\_browscap.so(182): createServerConfig(test.localhost)\newline
[Tue May 27 01:26:21 2014] [debug] mod\_browscap.so(212): cmd\_browscap()\newline
[Tue May 27 01:26:21 2014] [debug] mod\_browscap.so(200): mergeServerConfig(SVR(),SVR(test.localhost))\newline
[Tue May 27 01:26:22 2014] [debug] mod\_browscap.so(146): createDirConfig(C:/UwAmp/www/test/)\newline
[Tue May 27 01:26:22 2014] [debug] mod\_browscap.so(182): createServerConfig(test.localhost)\newline
[Tue May 27 01:26:22 2014] [debug] mod\_browscap.so(212): cmd\_browscap()\newline
[Tue May 27 01:26:22 2014] [debug] mod\_browscap.so(200): mergeServerConfig(SVR(),SVR(test.localhost))}\newline
[Tue May 27 01:26:22 2014] [notice] Child 2416: Child process is running\newline
[Tue May 27 01:26:22 2014] [debug] mpm\_winnt.c(398): Child 2416: Retrieved our scoreboard from the parent.\newline
[Tue May 27 01:26:22 2014] [info] Parent: Duplicating socket 220 and sending it to child process 2416\newline
[Tue May 27 01:26:22 2014] [debug] mpm\_winnt.c(595): Parent: Sent 1 listeners to child 2416\newline
[Tue May 27 01:26:22 2014] [debug] mpm\_winnt.c(554): Child 2416: retrieved 1 listeners from parent\newline
[Tue May 27 01:26:22 2014] [notice] Child 2416: Acquired the start mutex.\newline
[Tue May 27 01:26:22 2014] [notice] Child 2416: Starting 64 worker threads.\newline
[Tue May 27 01:26:22 2014] [notice] Child 2416: Starting thread to listen on port 80.\newline
\textbf{[Tue May 27 01:26:22 2014] [debug] mod\_browscap.so(114): get header(User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0)\newline
[Tue May 27 01:26:22 2014] [debug] mod\_browscap.so(127): add header(X-Client-Name: Firefox)\newline
[Tue May 27 01:26:22 2014] [debug] mod\_browscap.so(127): add header(X-Client-Version: 29.0)\newline
[Tue May 27 01:26:22 2014] [debug] mod\_browscap.so(127): add header(X-Client-Is-Mobile-Device: false)\newline
[Tue May 27 01:26:22 2014] [debug] mod\_browscap.so(127): add header(X-Client-Is-Tablet: false)\newline
[Tue May 27 01:26:22 2014] [debug] mod\_browscap.so(127): add header(X-Client-Is-Crawler: false)}\end{lstlisting}

\textbf{ToDo: }

\begin{enumerate}
\item Überprüfen der auf Cookies basierenden Variante
\item Tests besonders unter UNIX/Linux
\end{enumerate}

Der Quelltext:

\href{https://www.gocher.me/code/mod_browscap.lpr}{mod browscap.lpr}
\end{document}