Skip to content

Commit 76d8650

Browse files
committed
[server] Moved QgsFcgiServerRequest into its own header and cpp file
1 parent cd99de7 commit 76d8650

6 files changed

+278
-234
lines changed

src/server/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ SET(qgis_mapserv_SRCS
4848
qgsserverrequest.cpp
4949
qgsserverresponse.cpp
5050
qgsfcgiserverresponse.cpp
51+
qgsfcgiserverrequest.cpp
5152
qgsbufferserverresponse.cpp
5253
qgsbufferserverrequest.cpp
5354
qgsfilterresponsedecorator.cpp

src/server/qgis_map_serv.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "qgsconfig.h"
2121
#include "qgsserver.h"
2222
#include "qgsfcgiserverresponse.h"
23+
#include "qgsfcgiserverrequest.h"
2324

2425
#include <fcgi_stdio.h>
2526
#include <cstdlib>

src/server/qgsfcgiserverrequest.cpp

+220
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,220 @@
1+
/***************************************************************************
2+
qgsfcgiserverrequest.cpp
3+
4+
Define response wrapper for fcgi request
5+
-------------------
6+
begin : 2017-01-03
7+
copyright : (C) 2017 by David Marteau
8+
email : david dot marteau at 3liz dot com
9+
***************************************************************************/
10+
11+
/***************************************************************************
12+
* *
13+
* This program is free software; you can redistribute it and/or modify *
14+
* it under the terms of the GNU General Public License as published by *
15+
* the Free Software Foundation; either version 2 of the License, or *
16+
* (at your option) any later version. *
17+
* *
18+
***************************************************************************/
19+
20+
#include "qgis.h"
21+
#include "qgsfcgiserverrequest.h"
22+
#include "qgslogger.h"
23+
#include "qgsserverlogger.h"
24+
#include "qgsmessagelog.h"
25+
#include <fcgi_stdio.h>
26+
27+
#include <QDebug>
28+
29+
30+
QgsFcgiServerRequest::QgsFcgiServerRequest()
31+
{
32+
mHasError = false;
33+
34+
// Rebuild the full URL
35+
36+
// Get the REQUEST_URI from the environment
37+
QUrl url;
38+
QString uri = getenv( "REQUEST_URI" );
39+
if ( uri.isEmpty() )
40+
{
41+
uri = getenv( "SCRIPT_NAME" );
42+
}
43+
44+
url.setUrl( uri );
45+
46+
// Check if host is defined
47+
if ( url.host().isEmpty() )
48+
{
49+
url.setHost( getenv( "SERVER_NAME" ) );
50+
}
51+
52+
// Port ?
53+
if ( url.port( -1 ) == -1 )
54+
{
55+
QString portString = getenv( "SERVER_PORT" );
56+
if ( !portString.isEmpty() )
57+
{
58+
bool portOk;
59+
int portNumber = portString.toInt( &portOk );
60+
if ( portOk && portNumber != 80 )
61+
{
62+
url.setPort( portNumber );
63+
}
64+
}
65+
}
66+
67+
// scheme
68+
if ( url.scheme().isEmpty() )
69+
{
70+
QString( getenv( "HTTPS" ) ).compare( QLatin1String( "on" ), Qt::CaseInsensitive ) == 0
71+
? url.setScheme( QStringLiteral( "https" ) )
72+
: url.setScheme( QStringLiteral( "http" ) );
73+
}
74+
75+
// XXX OGC paremetrs are passed with the query string
76+
// we override the query string url in case it is
77+
// defined independently of REQUEST_URI
78+
const char *qs = getenv( "QUERY_STRING" );
79+
if ( qs )
80+
{
81+
url.setQuery( qs );
82+
}
83+
84+
#ifdef QGISDEBUG
85+
qDebug() << "fcgi query string: " << url.query();
86+
#endif
87+
88+
QgsServerRequest::Method method = GetMethod;
89+
90+
// Get method
91+
const char *me = getenv( "REQUEST_METHOD" );
92+
93+
if ( me )
94+
{
95+
if ( strcmp( me, "POST" ) == 0 )
96+
{
97+
method = PostMethod;
98+
}
99+
else if ( strcmp( me, "PUT" ) == 0 )
100+
{
101+
method = PutMethod;
102+
}
103+
else if ( strcmp( me, "DELETE" ) == 0 )
104+
{
105+
method = DeleteMethod;
106+
}
107+
else if ( strcmp( me, "HEAD" ) == 0 )
108+
{
109+
method = HeadMethod;
110+
}
111+
}
112+
113+
if ( method == PostMethod || method == PutMethod )
114+
{
115+
// Get post/put data
116+
readData();
117+
}
118+
119+
setUrl( url );
120+
setMethod( method );
121+
122+
// Output debug infos
123+
QgsMessageLog::MessageLevel logLevel = QgsServerLogger::instance()->logLevel();
124+
if ( logLevel <= QgsMessageLog::INFO )
125+
{
126+
printRequestInfos();
127+
}
128+
}
129+
130+
QgsFcgiServerRequest::~QgsFcgiServerRequest()
131+
{
132+
133+
}
134+
135+
QByteArray QgsFcgiServerRequest::data() const
136+
{
137+
return mData;
138+
}
139+
140+
// Read post put data
141+
void QgsFcgiServerRequest::readData()
142+
{
143+
// Check if we have CONTENT_LENGTH defined
144+
const char *lengthstr = getenv( "CONTENT_LENGTH" );
145+
if ( lengthstr )
146+
{
147+
#ifdef QGISDEBUG
148+
qDebug() << "fcgi: reading " << lengthstr << " bytes from stdin";
149+
#endif
150+
bool success = false;
151+
int length = QString( lengthstr ).toInt( &success );
152+
if ( success )
153+
{
154+
// XXX This not efficiont at all !!
155+
for ( int i = 0; i < length; ++i )
156+
{
157+
mData.append( getchar() );
158+
}
159+
}
160+
else
161+
{
162+
QgsMessageLog::logMessage( "fcgi: Failed to parse CONTENT_LENGTH",
163+
QStringLiteral( "Server" ), QgsMessageLog::CRITICAL );
164+
mHasError = true;
165+
}
166+
}
167+
else
168+
{
169+
QgsMessageLog::logMessage( "fcgi: No POST data" );
170+
}
171+
}
172+
173+
void QgsFcgiServerRequest::printRequestInfos()
174+
{
175+
QgsMessageLog::logMessage( QStringLiteral( "******************** New request ***************" ), QStringLiteral( "Server" ), QgsMessageLog::INFO );
176+
if ( getenv( "REMOTE_ADDR" ) )
177+
{
178+
QgsMessageLog::logMessage( "REMOTE_ADDR: " + QString( getenv( "REMOTE_ADDR" ) ), QStringLiteral( "Server" ), QgsMessageLog::INFO );
179+
}
180+
if ( getenv( "REMOTE_HOST" ) )
181+
{
182+
QgsMessageLog::logMessage( "REMOTE_HOST: " + QString( getenv( "REMOTE_HOST" ) ), QStringLiteral( "Server" ), QgsMessageLog::INFO );
183+
}
184+
if ( getenv( "REMOTE_USER" ) )
185+
{
186+
QgsMessageLog::logMessage( "REMOTE_USER: " + QString( getenv( "REMOTE_USER" ) ), QStringLiteral( "Server" ), QgsMessageLog::INFO );
187+
}
188+
if ( getenv( "REMOTE_IDENT" ) )
189+
{
190+
QgsMessageLog::logMessage( "REMOTE_IDENT: " + QString( getenv( "REMOTE_IDENT" ) ), QStringLiteral( "Server" ), QgsMessageLog::INFO );
191+
}
192+
if ( getenv( "CONTENT_TYPE" ) )
193+
{
194+
QgsMessageLog::logMessage( "CONTENT_TYPE: " + QString( getenv( "CONTENT_TYPE" ) ), QStringLiteral( "Server" ), QgsMessageLog::INFO );
195+
}
196+
if ( getenv( "AUTH_TYPE" ) )
197+
{
198+
QgsMessageLog::logMessage( "AUTH_TYPE: " + QString( getenv( "AUTH_TYPE" ) ), QStringLiteral( "Server" ), QgsMessageLog::INFO );
199+
}
200+
if ( getenv( "HTTP_USER_AGENT" ) )
201+
{
202+
QgsMessageLog::logMessage( "HTTP_USER_AGENT: " + QString( getenv( "HTTP_USER_AGENT" ) ), QStringLiteral( "Server" ), QgsMessageLog::INFO );
203+
}
204+
if ( getenv( "HTTP_PROXY" ) )
205+
{
206+
QgsMessageLog::logMessage( "HTTP_PROXY: " + QString( getenv( "HTTP_PROXY" ) ), QStringLiteral( "Server" ), QgsMessageLog::INFO );
207+
}
208+
if ( getenv( "HTTPS_PROXY" ) )
209+
{
210+
QgsMessageLog::logMessage( "HTTPS_PROXY: " + QString( getenv( "HTTPS_PROXY" ) ), QStringLiteral( "Server" ), QgsMessageLog::INFO );
211+
}
212+
if ( getenv( "NO_PROXY" ) )
213+
{
214+
QgsMessageLog::logMessage( "NO_PROXY: " + QString( getenv( "NO_PROXY" ) ), QStringLiteral( "Server" ), QgsMessageLog::INFO );
215+
}
216+
if ( getenv( "HTTP_AUTHORIZATION" ) )
217+
{
218+
QgsMessageLog::logMessage( "HTTP_AUTHORIZATION: " + QString( getenv( "HTTP_AUTHORIZATION" ) ), QStringLiteral( "Server" ), QgsMessageLog::INFO );
219+
}
220+
}

src/server/qgsfcgiserverrequest.h

+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/***************************************************************************
2+
qgsfcgiserverrequest.h
3+
4+
Define response wrapper for fcgi request
5+
-------------------
6+
begin : 2017-01-03
7+
copyright : (C) 2017 by David Marteau
8+
email : david dot marteau at 3liz dot com
9+
***************************************************************************/
10+
11+
/***************************************************************************
12+
* *
13+
* This program is free software; you can redistribute it and/or modify *
14+
* it under the terms of the GNU General Public License as published by *
15+
* the Free Software Foundation; either version 2 of the License, or *
16+
* (at your option) any later version. *
17+
* *
18+
***************************************************************************/
19+
#ifndef QGSFCGISERVERREQUEST_H
20+
#define QGSFCGISERVERREQUEST_H
21+
22+
#include "qgsserverrequest.h"
23+
24+
#include <QBuffer>
25+
26+
/**
27+
* \ingroup server
28+
* QgsFcgiServerResquest
29+
* Class defining fcgi request
30+
*/
31+
class SERVER_EXPORT QgsFcgiServerRequest: public QgsServerRequest
32+
{
33+
public:
34+
QgsFcgiServerRequest();
35+
~QgsFcgiServerRequest();
36+
37+
virtual QByteArray data() const override;
38+
39+
/**
40+
* Return true if an error occurred during initialization
41+
*/
42+
bool hasError() const { return mHasError; }
43+
44+
private:
45+
void readData();
46+
47+
// Log request info: print debug infos
48+
// about the request
49+
void printRequestInfos();
50+
51+
52+
QByteArray mData;
53+
bool mHasError;
54+
};
55+
56+
#endif

0 commit comments

Comments
 (0)