mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-11-03 21:20:31 -05:00 
			
		
		
		
	
		
			
	
	
		
			91 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			91 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								  @file
							 | 
						||
| 
								 | 
							
								  @author Stefan Frings
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "httplistener.h"
							 | 
						||
| 
								 | 
							
								#include "httpconnectionhandler.h"
							 | 
						||
| 
								 | 
							
								#include "httpconnectionhandlerpool.h"
							 | 
						||
| 
								 | 
							
								#include <QCoreApplication>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								using namespace stefanfrings;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								HttpListener::HttpListener(QSettings* settings, HttpRequestHandler* requestHandler, QObject *parent)
							 | 
						||
| 
								 | 
							
								    : QTcpServer(parent)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    Q_ASSERT(settings!=0);
							 | 
						||
| 
								 | 
							
								    Q_ASSERT(requestHandler!=0);
							 | 
						||
| 
								 | 
							
								    pool=NULL;
							 | 
						||
| 
								 | 
							
								    this->settings=settings;
							 | 
						||
| 
								 | 
							
								    this->requestHandler=requestHandler;
							 | 
						||
| 
								 | 
							
								    // Reqister type of socketDescriptor for signal/slot handling
							 | 
						||
| 
								 | 
							
								    qRegisterMetaType<tSocketDescriptor>("tSocketDescriptor");
							 | 
						||
| 
								 | 
							
								    // Start listening
							 | 
						||
| 
								 | 
							
								    listen();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								HttpListener::~HttpListener()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    close();
							 | 
						||
| 
								 | 
							
								    qDebug("HttpListener: destroyed");
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void HttpListener::listen()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    if (!pool)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        pool=new HttpConnectionHandlerPool(settings,requestHandler);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    QString host = settings->value("host").toString();
							 | 
						||
| 
								 | 
							
								    int port=settings->value("port").toInt();
							 | 
						||
| 
								 | 
							
								    QTcpServer::listen(host.isEmpty() ? QHostAddress::Any : QHostAddress(host), port);
							 | 
						||
| 
								 | 
							
								    if (!isListening())
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        qCritical("HttpListener: Cannot bind on port %i: %s",port,qPrintable(errorString()));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    else {
							 | 
						||
| 
								 | 
							
								        qDebug("HttpListener: Listening on port %i",port);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void HttpListener::close() {
							 | 
						||
| 
								 | 
							
								    QTcpServer::close();
							 | 
						||
| 
								 | 
							
								    qDebug("HttpListener: closed");
							 | 
						||
| 
								 | 
							
								    if (pool) {
							 | 
						||
| 
								 | 
							
								        delete pool;
							 | 
						||
| 
								 | 
							
								        pool=NULL;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void HttpListener::incomingConnection(tSocketDescriptor socketDescriptor) {
							 | 
						||
| 
								 | 
							
								#ifdef SUPERVERBOSE
							 | 
						||
| 
								 | 
							
								    qDebug("HttpListener: New connection");
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    HttpConnectionHandler* freeHandler=NULL;
							 | 
						||
| 
								 | 
							
								    if (pool)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        freeHandler=pool->getConnectionHandler();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // Let the handler process the new connection.
							 | 
						||
| 
								 | 
							
								    if (freeHandler)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        // The descriptor is passed via event queue because the handler lives in another thread
							 | 
						||
| 
								 | 
							
								        QMetaObject::invokeMethod(freeHandler, "handleConnection", Qt::QueuedConnection, Q_ARG(tSocketDescriptor, socketDescriptor));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    else
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        // Reject the connection
							 | 
						||
| 
								 | 
							
								        qDebug("HttpListener: Too many incoming connections");
							 | 
						||
| 
								 | 
							
								        QTcpSocket* socket=new QTcpSocket(this);
							 | 
						||
| 
								 | 
							
								        socket->setSocketDescriptor(socketDescriptor);
							 | 
						||
| 
								 | 
							
								        connect(socket, SIGNAL(disconnected()), socket, SLOT(deleteLater()));
							 | 
						||
| 
								 | 
							
								        socket->write("HTTP/1.1 503 too many connections\r\nConnection: close\r\n\r\nToo many connections\r\n");
							 | 
						||
| 
								 | 
							
								        socket->disconnectFromHost();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |