aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/poco/Net
diff options
context:
space:
mode:
authororivej <orivej@yandex-team.ru>2022-02-10 16:45:01 +0300
committerDaniil Cherednik <dcherednik@yandex-team.ru>2022-02-10 16:45:01 +0300
commit2d37894b1b037cf24231090eda8589bbb44fb6fc (patch)
treebe835aa92c6248212e705f25388ebafcf84bc7a1 /contrib/libs/poco/Net
parent718c552901d703c502ccbefdfc3c9028d608b947 (diff)
downloadydb-2d37894b1b037cf24231090eda8589bbb44fb6fc.tar.gz
Restoring authorship annotation for <orivej@yandex-team.ru>. Commit 2 of 2.
Diffstat (limited to 'contrib/libs/poco/Net')
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/AbstractHTTPRequestHandler.h272
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/DNS.h406
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/DatagramSocket.h336
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/DatagramSocketImpl.h110
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/DialogSocket.h420
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/FTPClientSession.h806
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/FTPStreamFactory.h240
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/FilePartSource.h154
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/HTMLForm.h544
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/HTTPAuthenticationParams.h206
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/HTTPBasicCredentials.h246
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/HTTPBasicStreamBuf.h72
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/HTTPBufferAllocator.h100
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/HTTPChunkedStream.h210
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/HTTPClientSession.h782
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/HTTPCookie.h544
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/HTTPCredentials.h412
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/HTTPDigestCredentials.h372
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/HTTPFixedLengthStream.h220
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/HTTPHeaderStream.h204
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/HTTPIOStream.h176
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/HTTPMessage.h370
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/HTTPRequest.h400
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/HTTPRequestHandler.h134
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/HTTPRequestHandlerFactory.h156
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/HTTPResponse.h598
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/HTTPServer.h206
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/HTTPServerConnection.h130
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/HTTPServerConnectionFactory.h110
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/HTTPServerParams.h308
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/HTTPServerRequest.h160
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/HTTPServerRequestImpl.h284
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/HTTPServerResponse.h254
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/HTTPServerResponseImpl.h302
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/HTTPServerSession.h152
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/HTTPSession.h500
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/HTTPSessionFactory.h310
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/HTTPSessionInstantiator.h234
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/HTTPStream.h206
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/HTTPStreamFactory.h184
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/HostEntry.h230
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/ICMPClient.h192
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/ICMPEventArgs.h326
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/ICMPPacket.h178
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/ICMPPacketImpl.h282
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/ICMPSocket.h182
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/ICMPSocketImpl.h188
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/ICMPv4PacketImpl.h346
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/IPAddress.h900
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/IPAddressImpl.h358
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/MailMessage.h628
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/MailRecipient.h240
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/MailStream.h292
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/MediaType.h338
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/MessageHeader.h334
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/MulticastSocket.h270
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/MultipartReader.h320
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/MultipartWriter.h218
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/NTPClient.h128
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/NTPEventArgs.h168
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/NTPPacket.h414
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/NameValueCollection.h252
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/Net.h244
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/NetException.h120
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/NetworkInterface.h698
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/NullPartHandler.h94
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/OAuth10Credentials.h546
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/OAuth20Credentials.h264
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/POP3ClientSession.h370
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/ParallelSocketAcceptor.h462
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/ParallelSocketReactor.h180
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/PartHandler.h136
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/PartSource.h220
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/PartStore.h212
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/PollSet.h172
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/QuotedPrintableDecoder.h172
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/QuotedPrintableEncoder.h170
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/RawSocket.h322
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/RawSocketImpl.h112
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/RemoteSyslogChannel.h316
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/RemoteSyslogListener.h242
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/SMTPChannel.h216
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/SMTPClientSession.h468
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/ServerSocket.h460
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/ServerSocketImpl.h90
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/Socket.h1260
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/SocketAcceptor.h388
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/SocketAddress.h602
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/SocketAddressImpl.h516
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/SocketConnector.h424
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/SocketDefs.h770
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/SocketImpl.h998
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/SocketNotification.h306
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/SocketNotifier.h220
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/SocketReactor.h466
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/SocketStream.h354
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/StreamSocket.h360
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/StreamSocketImpl.h118
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/StringPartSource.h142
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/TCPServer.h520
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/TCPServerConnection.h172
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/TCPServerConnectionFactory.h178
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/TCPServerDispatcher.h260
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/TCPServerParams.h272
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/WebSocket.h594
-rw-r--r--contrib/libs/poco/Net/include/Poco/Net/WebSocketImpl.h284
-rw-r--r--contrib/libs/poco/Net/src/AbstractHTTPRequestHandler.cpp218
-rw-r--r--contrib/libs/poco/Net/src/DNS.cpp1734
-rw-r--r--contrib/libs/poco/Net/src/DatagramSocket.cpp228
-rw-r--r--contrib/libs/poco/Net/src/DatagramSocketImpl.cpp126
-rw-r--r--contrib/libs/poco/Net/src/DialogSocket.cpp590
-rw-r--r--contrib/libs/poco/Net/src/FTPClientSession.cpp1194
-rw-r--r--contrib/libs/poco/Net/src/FTPStreamFactory.cpp486
-rw-r--r--contrib/libs/poco/Net/src/FilePartSource.cpp174
-rw-r--r--contrib/libs/poco/Net/src/HTMLForm.cpp936
-rw-r--r--contrib/libs/poco/Net/src/HTTPAuthenticationParams.cpp630
-rw-r--r--contrib/libs/poco/Net/src/HTTPBasicCredentials.cpp268
-rw-r--r--contrib/libs/poco/Net/src/HTTPBufferAllocator.cpp88
-rw-r--r--contrib/libs/poco/Net/src/HTTPChunkedStream.cpp426
-rw-r--r--contrib/libs/poco/Net/src/HTTPClientSession.cpp940
-rw-r--r--contrib/libs/poco/Net/src/HTTPCookie.cpp686
-rw-r--r--contrib/libs/poco/Net/src/HTTPCredentials.cpp406
-rw-r--r--contrib/libs/poco/Net/src/HTTPDigestCredentials.cpp626
-rw-r--r--contrib/libs/poco/Net/src/HTTPFixedLengthStream.cpp362
-rw-r--r--contrib/libs/poco/Net/src/HTTPHeaderStream.cpp352
-rw-r--r--contrib/libs/poco/Net/src/HTTPIOStream.cpp130
-rw-r--r--contrib/libs/poco/Net/src/HTTPMessage.cpp368
-rw-r--r--contrib/libs/poco/Net/src/HTTPRequest.cpp554
-rw-r--r--contrib/libs/poco/Net/src/HTTPRequestHandler.cpp64
-rw-r--r--contrib/libs/poco/Net/src/HTTPRequestHandlerFactory.cpp64
-rw-r--r--contrib/libs/poco/Net/src/HTTPResponse.cpp780
-rw-r--r--contrib/libs/poco/Net/src/HTTPServer.cpp112
-rw-r--r--contrib/libs/poco/Net/src/HTTPServerConnection.cpp360
-rw-r--r--contrib/libs/poco/Net/src/HTTPServerConnectionFactory.cpp86
-rw-r--r--contrib/libs/poco/Net/src/HTTPServerParams.cpp146
-rw-r--r--contrib/libs/poco/Net/src/HTTPServerRequest.cpp64
-rw-r--r--contrib/libs/poco/Net/src/HTTPServerRequestImpl.cpp176
-rw-r--r--contrib/libs/poco/Net/src/HTTPServerResponse.cpp64
-rw-r--r--contrib/libs/poco/Net/src/HTTPServerResponseImpl.cpp442
-rw-r--r--contrib/libs/poco/Net/src/HTTPServerSession.cpp140
-rw-r--r--contrib/libs/poco/Net/src/HTTPSession.cpp522
-rw-r--r--contrib/libs/poco/Net/src/HTTPSessionFactory.cpp292
-rw-r--r--contrib/libs/poco/Net/src/HTTPSessionInstantiator.cpp154
-rw-r--r--contrib/libs/poco/Net/src/HTTPStream.cpp346
-rw-r--r--contrib/libs/poco/Net/src/HTTPStreamFactory.cpp374
-rw-r--r--contrib/libs/poco/Net/src/HostEntry.cpp270
-rw-r--r--contrib/libs/poco/Net/src/ICMPClient.cpp300
-rw-r--r--contrib/libs/poco/Net/src/ICMPEventArgs.cpp336
-rw-r--r--contrib/libs/poco/Net/src/ICMPPacket.cpp220
-rw-r--r--contrib/libs/poco/Net/src/ICMPPacketImpl.cpp206
-rw-r--r--contrib/libs/poco/Net/src/ICMPSocket.cpp188
-rw-r--r--contrib/libs/poco/Net/src/ICMPSocketImpl.cpp194
-rw-r--r--contrib/libs/poco/Net/src/ICMPv4PacketImpl.cpp526
-rw-r--r--contrib/libs/poco/Net/src/IPAddress.cpp1200
-rw-r--r--contrib/libs/poco/Net/src/IPAddressImpl.cpp1626
-rw-r--r--contrib/libs/poco/Net/src/MailMessage.cpp1390
-rw-r--r--contrib/libs/poco/Net/src/MailRecipient.cpp188
-rw-r--r--contrib/libs/poco/Net/src/MailStream.cpp442
-rw-r--r--contrib/libs/poco/Net/src/MediaType.cpp382
-rw-r--r--contrib/libs/poco/Net/src/MessageHeader.cpp788
-rw-r--r--contrib/libs/poco/Net/src/MulticastSocket.cpp578
-rw-r--r--contrib/libs/poco/Net/src/MultipartReader.cpp620
-rw-r--r--contrib/libs/poco/Net/src/MultipartWriter.cpp174
-rw-r--r--contrib/libs/poco/Net/src/NTPClient.cpp174
-rw-r--r--contrib/libs/poco/Net/src/NTPEventArgs.cpp142
-rw-r--r--contrib/libs/poco/Net/src/NTPPacket.cpp316
-rw-r--r--contrib/libs/poco/Net/src/NameValueCollection.cpp306
-rw-r--r--contrib/libs/poco/Net/src/Net.cpp152
-rw-r--r--contrib/libs/poco/Net/src/NetException.cpp108
-rw-r--r--contrib/libs/poco/Net/src/NetworkInterface.cpp3648
-rw-r--r--contrib/libs/poco/Net/src/NullPartHandler.cpp92
-rw-r--r--contrib/libs/poco/Net/src/OAuth10Credentials.cpp730
-rw-r--r--contrib/libs/poco/Net/src/OAuth20Credentials.cpp210
-rw-r--r--contrib/libs/poco/Net/src/POP3ClientSession.cpp560
-rw-r--r--contrib/libs/poco/Net/src/PartHandler.cpp64
-rw-r--r--contrib/libs/poco/Net/src/PartSource.cpp116
-rw-r--r--contrib/libs/poco/Net/src/PartStore.cpp174
-rw-r--r--contrib/libs/poco/Net/src/PollSet.cpp1058
-rw-r--r--contrib/libs/poco/Net/src/QuotedPrintableDecoder.cpp204
-rw-r--r--contrib/libs/poco/Net/src/QuotedPrintableEncoder.cpp300
-rw-r--r--contrib/libs/poco/Net/src/RawSocket.cpp234
-rw-r--r--contrib/libs/poco/Net/src/RawSocketImpl.cpp138
-rw-r--r--contrib/libs/poco/Net/src/RemoteSyslogChannel.cpp710
-rw-r--r--contrib/libs/poco/Net/src/RemoteSyslogListener.cpp1258
-rw-r--r--contrib/libs/poco/Net/src/SMTPChannel.cpp414
-rw-r--r--contrib/libs/poco/Net/src/SMTPClientSession.cpp932
-rw-r--r--contrib/libs/poco/Net/src/ServerSocket.cpp316
-rw-r--r--contrib/libs/poco/Net/src/ServerSocketImpl.cpp64
-rw-r--r--contrib/libs/poco/Net/src/Socket.cpp784
-rw-r--r--contrib/libs/poco/Net/src/SocketAddress.cpp870
-rw-r--r--contrib/libs/poco/Net/src/SocketAddressImpl.cpp368
-rw-r--r--contrib/libs/poco/Net/src/SocketImpl.cpp2240
-rw-r--r--contrib/libs/poco/Net/src/SocketNotification.cpp210
-rw-r--r--contrib/libs/poco/Net/src/SocketNotifier.cpp178
-rw-r--r--contrib/libs/poco/Net/src/SocketReactor.cpp594
-rw-r--r--contrib/libs/poco/Net/src/SocketStream.cpp312
-rw-r--r--contrib/libs/poco/Net/src/StreamSocket.cpp300
-rw-r--r--contrib/libs/poco/Net/src/StreamSocketImpl.cpp154
-rw-r--r--contrib/libs/poco/Net/src/StringPartSource.cpp134
-rw-r--r--contrib/libs/poco/Net/src/TCPServer.cpp486
-rw-r--r--contrib/libs/poco/Net/src/TCPServerConnection.cpp120
-rw-r--r--contrib/libs/poco/Net/src/TCPServerConnectionFactory.cpp64
-rw-r--r--contrib/libs/poco/Net/src/TCPServerDispatcher.cpp512
-rw-r--r--contrib/libs/poco/Net/src/TCPServerParams.cpp128
-rw-r--r--contrib/libs/poco/Net/src/WebSocket.cpp526
-rw-r--r--contrib/libs/poco/Net/src/WebSocketImpl.cpp800
-rw-r--r--contrib/libs/poco/Net/ya.make250
207 files changed, 40445 insertions, 40445 deletions
diff --git a/contrib/libs/poco/Net/include/Poco/Net/AbstractHTTPRequestHandler.h b/contrib/libs/poco/Net/include/Poco/Net/AbstractHTTPRequestHandler.h
index 710ef68702..7bbc174c81 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/AbstractHTTPRequestHandler.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/AbstractHTTPRequestHandler.h
@@ -1,136 +1,136 @@
-//
-// AbstractHTTPRequestHandler.h
-//
-// Library: Net
-// Package: HTTPServer
-// Module: AbstractHTTPRequestHandler
-//
-// Definition of the AbstractHTTPRequestHandler class.
-//
-// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_AbstractHTTPRequestHandler_INCLUDED
-#define Net_AbstractHTTPRequestHandler_INCLUDED
-
-
-#include "Poco/Net/HTTPRequestHandler.h"
-#include "Poco/Net/HTTPResponse.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class HTMLForm;
-
-
-class Net_API AbstractHTTPRequestHandler: public HTTPRequestHandler
- /// The abstract base class for AbstractHTTPRequestHandlers
- /// created by HTTPServer.
- ///
- /// Derived classes must override the run() method.
-
- /// Contrary to a HTTPRequestHandler, an AbstractHTTPRequestHandler
- /// stores request and response as member variables to avoid having
- /// to pass them around as method parameters. Additionally, a
- /// HTMLForm object is created for use by subclasses.
- ///
- /// The run() method must perform the complete handling
- /// of the HTTP request connection. As soon as the run()
- /// method returns, the request handler object is destroyed.
- ///
- /// A new AbstractHTTPRequestHandler object will be created for
- /// each new HTTP request that is received by the HTTPServer.
-{
-public:
- AbstractHTTPRequestHandler();
- /// Creates the AbstractHTTPRequestHandler.
-
- virtual ~AbstractHTTPRequestHandler();
- /// Destroys the AbstractHTTPRequestHandler.
-
- void handleRequest(HTTPServerRequest& request, HTTPServerResponse& response);
- /// This class implements some common behavior,
- /// before calling run() to actually handle the request:
- /// - save request and response objects;
- /// - call authorize();
- /// - if authorize() returns true call run(),
- /// else send 401 (Unauthorized) response.
- ///
- /// If run() throws an exception and the response has not been
- /// sent yet, sends a 500 (Internal Server Error) response with
- /// the exception's display text.
-
- HTTPServerRequest& request();
- /// Returns the request.
-
- HTTPServerResponse& response();
- /// Returns the response.
-
- HTMLForm& form();
- /// Returns a HTMLForm for the given request.
- /// The HTMLForm object is created when this
- /// member function is executed the first time.
-
- void sendErrorResponse(HTTPResponse::HTTPStatus status, const std::string& message);
- /// Sends a HTML error page for the given status code.
- /// The given message is added to the page:
- /// <HTML>
- /// <HEAD>
- /// <TITLE>status - reason</TITLE>
- /// </HEAD>
- /// <BODY>
- /// <H1>status - reason</H1>
- /// <P>message</P>
- /// </BODY>
- /// </HTML>
-
-protected:
- virtual void run() = 0;
- /// Must be overridden by subclasses.
- ///
- /// Handles the given request.
-
- virtual bool authenticate();
- /// Check authentication; returns true if okay, false if failed to authenticate.
- /// The default implementation always returns true.
- ///
- /// Subclasses can override this member function to perform
- /// some form of client or request authentication before
- /// the request is actually handled.
-
-private:
- HTTPServerRequest* _pRequest;
- HTTPServerResponse* _pResponse;
- HTMLForm* _pForm;
-};
-
-
-//
-// inlines
-//
-inline HTTPServerRequest& AbstractHTTPRequestHandler::request()
-{
- poco_check_ptr (_pRequest);
-
- return *_pRequest;
-}
-
-
-inline HTTPServerResponse& AbstractHTTPRequestHandler::response()
-{
- poco_check_ptr (_pResponse);
-
- return *_pResponse;
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_AbstractHTTPRequestHandler_INCLUDED
+//
+// AbstractHTTPRequestHandler.h
+//
+// Library: Net
+// Package: HTTPServer
+// Module: AbstractHTTPRequestHandler
+//
+// Definition of the AbstractHTTPRequestHandler class.
+//
+// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_AbstractHTTPRequestHandler_INCLUDED
+#define Net_AbstractHTTPRequestHandler_INCLUDED
+
+
+#include "Poco/Net/HTTPRequestHandler.h"
+#include "Poco/Net/HTTPResponse.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class HTMLForm;
+
+
+class Net_API AbstractHTTPRequestHandler: public HTTPRequestHandler
+ /// The abstract base class for AbstractHTTPRequestHandlers
+ /// created by HTTPServer.
+ ///
+ /// Derived classes must override the run() method.
+
+ /// Contrary to a HTTPRequestHandler, an AbstractHTTPRequestHandler
+ /// stores request and response as member variables to avoid having
+ /// to pass them around as method parameters. Additionally, a
+ /// HTMLForm object is created for use by subclasses.
+ ///
+ /// The run() method must perform the complete handling
+ /// of the HTTP request connection. As soon as the run()
+ /// method returns, the request handler object is destroyed.
+ ///
+ /// A new AbstractHTTPRequestHandler object will be created for
+ /// each new HTTP request that is received by the HTTPServer.
+{
+public:
+ AbstractHTTPRequestHandler();
+ /// Creates the AbstractHTTPRequestHandler.
+
+ virtual ~AbstractHTTPRequestHandler();
+ /// Destroys the AbstractHTTPRequestHandler.
+
+ void handleRequest(HTTPServerRequest& request, HTTPServerResponse& response);
+ /// This class implements some common behavior,
+ /// before calling run() to actually handle the request:
+ /// - save request and response objects;
+ /// - call authorize();
+ /// - if authorize() returns true call run(),
+ /// else send 401 (Unauthorized) response.
+ ///
+ /// If run() throws an exception and the response has not been
+ /// sent yet, sends a 500 (Internal Server Error) response with
+ /// the exception's display text.
+
+ HTTPServerRequest& request();
+ /// Returns the request.
+
+ HTTPServerResponse& response();
+ /// Returns the response.
+
+ HTMLForm& form();
+ /// Returns a HTMLForm for the given request.
+ /// The HTMLForm object is created when this
+ /// member function is executed the first time.
+
+ void sendErrorResponse(HTTPResponse::HTTPStatus status, const std::string& message);
+ /// Sends a HTML error page for the given status code.
+ /// The given message is added to the page:
+ /// <HTML>
+ /// <HEAD>
+ /// <TITLE>status - reason</TITLE>
+ /// </HEAD>
+ /// <BODY>
+ /// <H1>status - reason</H1>
+ /// <P>message</P>
+ /// </BODY>
+ /// </HTML>
+
+protected:
+ virtual void run() = 0;
+ /// Must be overridden by subclasses.
+ ///
+ /// Handles the given request.
+
+ virtual bool authenticate();
+ /// Check authentication; returns true if okay, false if failed to authenticate.
+ /// The default implementation always returns true.
+ ///
+ /// Subclasses can override this member function to perform
+ /// some form of client or request authentication before
+ /// the request is actually handled.
+
+private:
+ HTTPServerRequest* _pRequest;
+ HTTPServerResponse* _pResponse;
+ HTMLForm* _pForm;
+};
+
+
+//
+// inlines
+//
+inline HTTPServerRequest& AbstractHTTPRequestHandler::request()
+{
+ poco_check_ptr (_pRequest);
+
+ return *_pRequest;
+}
+
+
+inline HTTPServerResponse& AbstractHTTPRequestHandler::response()
+{
+ poco_check_ptr (_pResponse);
+
+ return *_pResponse;
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_AbstractHTTPRequestHandler_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/DNS.h b/contrib/libs/poco/Net/include/Poco/Net/DNS.h
index 27d700ec5c..f896862d9f 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/DNS.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/DNS.h
@@ -1,203 +1,203 @@
-//
-// DNS.h
-//
-// Library: Net
-// Package: NetCore
-// Module: DNS
-//
-// Definition of the DNS class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_DNS_INCLUDED
-#define Net_DNS_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/SocketDefs.h"
-#include "Poco/Net/IPAddress.h"
-#include "Poco/Net/HostEntry.h"
-
-#include "Poco/Timespan.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API DNS
- /// This class provides an interface to the
- /// domain name service.
- ///
- /// Starting with POCO C++ Libraries release 1.9.0,
- /// this class also supports Internationalized Domain Names (IDNs).
- ///
- /// Regarding IDNs, the following rules apply:
- ///
- /// * An IDN passed to hostByName() must be encoded manually, by calling
- /// encodeIDN() (after testing with isIDN() first).
- /// * An UTF-8 IDN passed to resolve() or resolveOne() is automatically encoded.
- /// * IDNs returned in HostEntry objects are never decoded. They can be
- /// decoded by calling decodeIDN() (after testing for an encoded IDN by
- /// calling isEncodedIDN()).
-{
-public:
- enum HintFlag
- {
- DNS_HINT_NONE = 0,
-#ifdef POCO_HAVE_ADDRINFO
- DNS_HINT_AI_PASSIVE = AI_PASSIVE, /// Socket address will be used in bind() call
- DNS_HINT_AI_CANONNAME = AI_CANONNAME, /// Return canonical name in first ai_canonname
- DNS_HINT_AI_NUMERICHOST = AI_NUMERICHOST, /// Nodename must be a numeric address string
- DNS_HINT_AI_NUMERICSERV = AI_NUMERICSERV, /// Servicename must be a numeric port number
- DNS_HINT_AI_ALL = AI_ALL, /// Query both IP6 and IP4 with AI_V4MAPPED
- DNS_HINT_AI_ADDRCONFIG = AI_ADDRCONFIG, /// Resolution only if global address configured
- DNS_HINT_AI_V4MAPPED = AI_V4MAPPED /// On v6 failure, query v4 and convert to V4MAPPED format
-#endif
- };
-
- static const Poco::Timespan DEFAULT_DNS_TIMEOUT;
-
- static HostEntry hostByName(const std::string& hostname, const Poco::Timespan * timeout_ = &DEFAULT_DNS_TIMEOUT, unsigned hintFlags =
-#ifdef POCO_HAVE_ADDRINFO
- DNS_HINT_AI_CANONNAME | DNS_HINT_AI_ADDRCONFIG
-#else
- DNS_HINT_NONE
-#endif
- );
- /// Returns a HostEntry object containing the DNS information
- /// for the host with the given name. HintFlag argument is only
- /// used on platforms that have getaddrinfo().
- ///
- /// Note that Internationalized Domain Names must be encoded
- /// using Punycode (see encodeIDN()) before calling this method.
- ///
- /// Throws a HostNotFoundException if a host with the given
- /// name cannot be found.
- ///
- /// Throws a NoAddressFoundException if no address can be
- /// found for the hostname.
- ///
- /// Throws a DNSException in case of a general DNS error.
- ///
- /// Throws an IOException in case of any other error.
-
- static HostEntry hostByAddress(const IPAddress& address, const Poco::Timespan * timeout_ = &DEFAULT_DNS_TIMEOUT, unsigned hintFlags =
-#ifdef POCO_HAVE_ADDRINFO
- DNS_HINT_AI_CANONNAME | DNS_HINT_AI_ADDRCONFIG
-#else
- DNS_HINT_NONE
-#endif
- );
- /// Returns a HostEntry object containing the DNS information
- /// for the host with the given IP address. HintFlag argument is only
- /// used on platforms that have getaddrinfo().
- ///
- /// Throws a HostNotFoundException if a host with the given
- /// name cannot be found.
- ///
- /// Throws a DNSException in case of a general DNS error.
- ///
- /// Throws an IOException in case of any other error.
-
- static HostEntry resolve(const std::string& address);
- /// Returns a HostEntry object containing the DNS information
- /// for the host with the given IP address or host name.
- ///
- /// If address contains a UTF-8 encoded IDN (internationalized
- /// domain name), the domain name will be encoded first using
- /// Punycode.
- ///
- /// Throws a HostNotFoundException if a host with the given
- /// name cannot be found.
- ///
- /// Throws a NoAddressFoundException if no address can be
- /// found for the hostname.
- ///
- /// Throws a DNSException in case of a general DNS error.
- ///
- /// Throws an IOException in case of any other error.
-
- static IPAddress resolveOne(const std::string& address);
- /// Convenience method that calls resolve(address) and returns
- /// the first address from the HostInfo.
-
- static HostEntry thisHost();
- /// Returns a HostEntry object containing the DNS information
- /// for this host.
- ///
- /// Throws a HostNotFoundException if DNS information
- /// for this host cannot be found.
- ///
- /// Throws a NoAddressFoundException if no address can be
- /// found for this host.
- ///
- /// Throws a DNSException in case of a general DNS error.
- ///
- /// Throws an IOException in case of any other error.
-
- static void reload();
- /// Reloads the resolver configuration.
- ///
- /// This method will call res_init() if the Net library
- /// has been compiled with -DPOCO_HAVE_LIBRESOLV. Otherwise
- /// it will do nothing.
-
- static std::string hostName();
- /// Returns the host name of this host.
-
- static bool isIDN(const std::string& hostname);
- /// Returns true if the given hostname is an internationalized
- /// domain name (IDN) containing non-ASCII characters, otherwise false.
- ///
- /// The IDN must be UTF-8 encoded.
-
- static bool isEncodedIDN(const std::string& hostname);
- /// Returns true if the given hostname is an Punycode-encoded
- /// internationalized domain name (IDN), otherwise false.
- ///
- /// An encoded IDN starts with the character sequence "xn--".
-
- static std::string encodeIDN(const std::string& idn);
- /// Encodes the given IDN (internationalized domain name), which must
- /// be in UTF-8 encoding.
- ///
- /// The resulting string will be encoded according to Punycode.
-
- static std::string decodeIDN(const std::string& encodedIDN);
- /// Decodes the given Punycode-encoded IDN (internationalized domain name).
- ///
- /// The resulting string will be UTF-8 encoded.
-
-protected:
- static int lastError();
- /// Returns the code of the last error.
-
- static void error(int code, const std::string& arg);
- /// Throws an exception according to the error code.
-
- static void aierror(int code, const std::string& arg);
- /// Throws an exception according to the getaddrinfo() error code.
-
- static std::string encodeIDNLabel(const std::string& idn);
- /// Encodes the given IDN (internationalized domain name) label, which must
- /// be in UTF-8 encoding.
- ///
- /// The resulting string will be encoded according to Punycode.
-
- static std::string decodeIDNLabel(const std::string& encodedIDN);
- /// Decodes the given Punycode-encoded IDN (internationalized domain name) label.
- ///
- /// The resulting string will be UTF-8 encoded.
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_DNS_INCLUDED
+//
+// DNS.h
+//
+// Library: Net
+// Package: NetCore
+// Module: DNS
+//
+// Definition of the DNS class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_DNS_INCLUDED
+#define Net_DNS_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/SocketDefs.h"
+#include "Poco/Net/IPAddress.h"
+#include "Poco/Net/HostEntry.h"
+
+#include "Poco/Timespan.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API DNS
+ /// This class provides an interface to the
+ /// domain name service.
+ ///
+ /// Starting with POCO C++ Libraries release 1.9.0,
+ /// this class also supports Internationalized Domain Names (IDNs).
+ ///
+ /// Regarding IDNs, the following rules apply:
+ ///
+ /// * An IDN passed to hostByName() must be encoded manually, by calling
+ /// encodeIDN() (after testing with isIDN() first).
+ /// * An UTF-8 IDN passed to resolve() or resolveOne() is automatically encoded.
+ /// * IDNs returned in HostEntry objects are never decoded. They can be
+ /// decoded by calling decodeIDN() (after testing for an encoded IDN by
+ /// calling isEncodedIDN()).
+{
+public:
+ enum HintFlag
+ {
+ DNS_HINT_NONE = 0,
+#ifdef POCO_HAVE_ADDRINFO
+ DNS_HINT_AI_PASSIVE = AI_PASSIVE, /// Socket address will be used in bind() call
+ DNS_HINT_AI_CANONNAME = AI_CANONNAME, /// Return canonical name in first ai_canonname
+ DNS_HINT_AI_NUMERICHOST = AI_NUMERICHOST, /// Nodename must be a numeric address string
+ DNS_HINT_AI_NUMERICSERV = AI_NUMERICSERV, /// Servicename must be a numeric port number
+ DNS_HINT_AI_ALL = AI_ALL, /// Query both IP6 and IP4 with AI_V4MAPPED
+ DNS_HINT_AI_ADDRCONFIG = AI_ADDRCONFIG, /// Resolution only if global address configured
+ DNS_HINT_AI_V4MAPPED = AI_V4MAPPED /// On v6 failure, query v4 and convert to V4MAPPED format
+#endif
+ };
+
+ static const Poco::Timespan DEFAULT_DNS_TIMEOUT;
+
+ static HostEntry hostByName(const std::string& hostname, const Poco::Timespan * timeout_ = &DEFAULT_DNS_TIMEOUT, unsigned hintFlags =
+#ifdef POCO_HAVE_ADDRINFO
+ DNS_HINT_AI_CANONNAME | DNS_HINT_AI_ADDRCONFIG
+#else
+ DNS_HINT_NONE
+#endif
+ );
+ /// Returns a HostEntry object containing the DNS information
+ /// for the host with the given name. HintFlag argument is only
+ /// used on platforms that have getaddrinfo().
+ ///
+ /// Note that Internationalized Domain Names must be encoded
+ /// using Punycode (see encodeIDN()) before calling this method.
+ ///
+ /// Throws a HostNotFoundException if a host with the given
+ /// name cannot be found.
+ ///
+ /// Throws a NoAddressFoundException if no address can be
+ /// found for the hostname.
+ ///
+ /// Throws a DNSException in case of a general DNS error.
+ ///
+ /// Throws an IOException in case of any other error.
+
+ static HostEntry hostByAddress(const IPAddress& address, const Poco::Timespan * timeout_ = &DEFAULT_DNS_TIMEOUT, unsigned hintFlags =
+#ifdef POCO_HAVE_ADDRINFO
+ DNS_HINT_AI_CANONNAME | DNS_HINT_AI_ADDRCONFIG
+#else
+ DNS_HINT_NONE
+#endif
+ );
+ /// Returns a HostEntry object containing the DNS information
+ /// for the host with the given IP address. HintFlag argument is only
+ /// used on platforms that have getaddrinfo().
+ ///
+ /// Throws a HostNotFoundException if a host with the given
+ /// name cannot be found.
+ ///
+ /// Throws a DNSException in case of a general DNS error.
+ ///
+ /// Throws an IOException in case of any other error.
+
+ static HostEntry resolve(const std::string& address);
+ /// Returns a HostEntry object containing the DNS information
+ /// for the host with the given IP address or host name.
+ ///
+ /// If address contains a UTF-8 encoded IDN (internationalized
+ /// domain name), the domain name will be encoded first using
+ /// Punycode.
+ ///
+ /// Throws a HostNotFoundException if a host with the given
+ /// name cannot be found.
+ ///
+ /// Throws a NoAddressFoundException if no address can be
+ /// found for the hostname.
+ ///
+ /// Throws a DNSException in case of a general DNS error.
+ ///
+ /// Throws an IOException in case of any other error.
+
+ static IPAddress resolveOne(const std::string& address);
+ /// Convenience method that calls resolve(address) and returns
+ /// the first address from the HostInfo.
+
+ static HostEntry thisHost();
+ /// Returns a HostEntry object containing the DNS information
+ /// for this host.
+ ///
+ /// Throws a HostNotFoundException if DNS information
+ /// for this host cannot be found.
+ ///
+ /// Throws a NoAddressFoundException if no address can be
+ /// found for this host.
+ ///
+ /// Throws a DNSException in case of a general DNS error.
+ ///
+ /// Throws an IOException in case of any other error.
+
+ static void reload();
+ /// Reloads the resolver configuration.
+ ///
+ /// This method will call res_init() if the Net library
+ /// has been compiled with -DPOCO_HAVE_LIBRESOLV. Otherwise
+ /// it will do nothing.
+
+ static std::string hostName();
+ /// Returns the host name of this host.
+
+ static bool isIDN(const std::string& hostname);
+ /// Returns true if the given hostname is an internationalized
+ /// domain name (IDN) containing non-ASCII characters, otherwise false.
+ ///
+ /// The IDN must be UTF-8 encoded.
+
+ static bool isEncodedIDN(const std::string& hostname);
+ /// Returns true if the given hostname is an Punycode-encoded
+ /// internationalized domain name (IDN), otherwise false.
+ ///
+ /// An encoded IDN starts with the character sequence "xn--".
+
+ static std::string encodeIDN(const std::string& idn);
+ /// Encodes the given IDN (internationalized domain name), which must
+ /// be in UTF-8 encoding.
+ ///
+ /// The resulting string will be encoded according to Punycode.
+
+ static std::string decodeIDN(const std::string& encodedIDN);
+ /// Decodes the given Punycode-encoded IDN (internationalized domain name).
+ ///
+ /// The resulting string will be UTF-8 encoded.
+
+protected:
+ static int lastError();
+ /// Returns the code of the last error.
+
+ static void error(int code, const std::string& arg);
+ /// Throws an exception according to the error code.
+
+ static void aierror(int code, const std::string& arg);
+ /// Throws an exception according to the getaddrinfo() error code.
+
+ static std::string encodeIDNLabel(const std::string& idn);
+ /// Encodes the given IDN (internationalized domain name) label, which must
+ /// be in UTF-8 encoding.
+ ///
+ /// The resulting string will be encoded according to Punycode.
+
+ static std::string decodeIDNLabel(const std::string& encodedIDN);
+ /// Decodes the given Punycode-encoded IDN (internationalized domain name) label.
+ ///
+ /// The resulting string will be UTF-8 encoded.
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_DNS_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/DatagramSocket.h b/contrib/libs/poco/Net/include/Poco/Net/DatagramSocket.h
index 143381ddee..17d0253155 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/DatagramSocket.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/DatagramSocket.h
@@ -1,168 +1,168 @@
-//
-// DatagramSocket.h
-//
-// Library: Net
-// Package: Sockets
-// Module: DatagramSocket
-//
-// Definition of the DatagramSocket class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_DatagramSocket_INCLUDED
-#define Net_DatagramSocket_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/Socket.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API DatagramSocket: public Socket
- /// This class provides an interface to an
- /// UDP stream socket.
-{
-public:
- DatagramSocket();
- /// Creates an unconnected, unbound datagram socket.
- ///
- /// Before the datagram socket can be used, bind(),
- /// bind6() or connect() must be called.
- ///
- /// Notice: The behavior of this constructor has changed
- /// in release 2.0. Previously, the constructor created
- /// an unbound IPv4 datagram socket.
-
- explicit DatagramSocket(SocketAddress::Family family);
- /// Creates an unconnected datagram socket.
- ///
- /// The socket will be created for the
- /// given address family.
-
- DatagramSocket(const SocketAddress& address, bool reuseAddress = false);
- /// Creates a datagram socket and binds it
- /// to the given address.
- ///
- /// Depending on the address family, the socket
- /// will be either an IPv4 or an IPv6 socket.
-
- DatagramSocket(const Socket& socket);
- /// Creates the DatagramSocket with the SocketImpl
- /// from another socket. The SocketImpl must be
- /// a DatagramSocketImpl, otherwise an InvalidArgumentException
- /// will be thrown.
-
- ~DatagramSocket();
- /// Destroys the DatagramSocket.
-
- DatagramSocket& operator = (const Socket& socket);
- /// Assignment operator.
- ///
- /// Releases the socket's SocketImpl and
- /// attaches the SocketImpl from the other socket and
- /// increments the reference count of the SocketImpl.
-
- void connect(const SocketAddress& address);
- /// Restricts incoming and outgoing
- /// packets to the specified address.
- ///
- /// Calls to connect() cannot come before calls to bind().
-
- void bind(const SocketAddress& address, bool reuseAddress = false);
- /// Bind a local address to the socket.
- ///
- /// This is usually only done when establishing a server
- /// socket.
- ///
- /// If reuseAddress is true, sets the SO_REUSEADDR
- /// socket option.
- ///
- /// Calls to connect cannot() come before calls to bind().
-
- void bind(const SocketAddress& address, bool reuseAddress, bool reusePort);
- /// Bind a local address to the socket.
- ///
- /// This is usually only done when establishing a server
- /// socket.
- ///
- /// If reuseAddress is true, sets the SO_REUSEADDR
- /// socket option.
- ///
- /// If reusePort is true, sets the SO_REUSEPORT
- /// socket option.
- ///
- /// Calls to connect cannot() come before calls to bind().
-
- int sendBytes(const void* buffer, int length, int flags = 0);
- /// Sends the contents of the given buffer through
- /// the socket.
- ///
- /// Returns the number of bytes sent, which may be
- /// less than the number of bytes specified.
-
- int receiveBytes(void* buffer, int length, int flags = 0);
- /// Receives data from the socket and stores it
- /// in buffer. Up to length bytes are received.
- ///
- /// Returns the number of bytes received.
-
- int sendTo(const void* buffer, int length, const SocketAddress& address, int flags = 0);
- /// Sends the contents of the given buffer through
- /// the socket to the given address.
- ///
- /// Returns the number of bytes sent, which may be
- /// less than the number of bytes specified.
-
- int receiveFrom(void* buffer, int length, SocketAddress& address, int flags = 0);
- /// Receives data from the socket and stores it
- /// in buffer. Up to length bytes are received.
- /// Stores the address of the sender in address.
- ///
- /// Returns the number of bytes received.
-
- void setBroadcast(bool flag);
- /// Sets the value of the SO_BROADCAST socket option.
- ///
- /// Setting this flag allows sending datagrams to
- /// the broadcast address.
-
- bool getBroadcast() const;
- /// Returns the value of the SO_BROADCAST socket option.
-
-protected:
- DatagramSocket(SocketImpl* pImpl);
- /// Creates the Socket and attaches the given SocketImpl.
- /// The socket takes ownership of the SocketImpl.
- ///
- /// The SocketImpl must be a StreamSocketImpl, otherwise
- /// an InvalidArgumentException will be thrown.
-};
-
-
-//
-// inlines
-//
-inline void DatagramSocket::setBroadcast(bool flag)
-{
- impl()->setBroadcast(flag);
-}
-
-
-inline bool DatagramSocket::getBroadcast() const
-{
- return impl()->getBroadcast();
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_DatagramSocket_INCLUDED
+//
+// DatagramSocket.h
+//
+// Library: Net
+// Package: Sockets
+// Module: DatagramSocket
+//
+// Definition of the DatagramSocket class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_DatagramSocket_INCLUDED
+#define Net_DatagramSocket_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/Socket.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API DatagramSocket: public Socket
+ /// This class provides an interface to an
+ /// UDP stream socket.
+{
+public:
+ DatagramSocket();
+ /// Creates an unconnected, unbound datagram socket.
+ ///
+ /// Before the datagram socket can be used, bind(),
+ /// bind6() or connect() must be called.
+ ///
+ /// Notice: The behavior of this constructor has changed
+ /// in release 2.0. Previously, the constructor created
+ /// an unbound IPv4 datagram socket.
+
+ explicit DatagramSocket(SocketAddress::Family family);
+ /// Creates an unconnected datagram socket.
+ ///
+ /// The socket will be created for the
+ /// given address family.
+
+ DatagramSocket(const SocketAddress& address, bool reuseAddress = false);
+ /// Creates a datagram socket and binds it
+ /// to the given address.
+ ///
+ /// Depending on the address family, the socket
+ /// will be either an IPv4 or an IPv6 socket.
+
+ DatagramSocket(const Socket& socket);
+ /// Creates the DatagramSocket with the SocketImpl
+ /// from another socket. The SocketImpl must be
+ /// a DatagramSocketImpl, otherwise an InvalidArgumentException
+ /// will be thrown.
+
+ ~DatagramSocket();
+ /// Destroys the DatagramSocket.
+
+ DatagramSocket& operator = (const Socket& socket);
+ /// Assignment operator.
+ ///
+ /// Releases the socket's SocketImpl and
+ /// attaches the SocketImpl from the other socket and
+ /// increments the reference count of the SocketImpl.
+
+ void connect(const SocketAddress& address);
+ /// Restricts incoming and outgoing
+ /// packets to the specified address.
+ ///
+ /// Calls to connect() cannot come before calls to bind().
+
+ void bind(const SocketAddress& address, bool reuseAddress = false);
+ /// Bind a local address to the socket.
+ ///
+ /// This is usually only done when establishing a server
+ /// socket.
+ ///
+ /// If reuseAddress is true, sets the SO_REUSEADDR
+ /// socket option.
+ ///
+ /// Calls to connect cannot() come before calls to bind().
+
+ void bind(const SocketAddress& address, bool reuseAddress, bool reusePort);
+ /// Bind a local address to the socket.
+ ///
+ /// This is usually only done when establishing a server
+ /// socket.
+ ///
+ /// If reuseAddress is true, sets the SO_REUSEADDR
+ /// socket option.
+ ///
+ /// If reusePort is true, sets the SO_REUSEPORT
+ /// socket option.
+ ///
+ /// Calls to connect cannot() come before calls to bind().
+
+ int sendBytes(const void* buffer, int length, int flags = 0);
+ /// Sends the contents of the given buffer through
+ /// the socket.
+ ///
+ /// Returns the number of bytes sent, which may be
+ /// less than the number of bytes specified.
+
+ int receiveBytes(void* buffer, int length, int flags = 0);
+ /// Receives data from the socket and stores it
+ /// in buffer. Up to length bytes are received.
+ ///
+ /// Returns the number of bytes received.
+
+ int sendTo(const void* buffer, int length, const SocketAddress& address, int flags = 0);
+ /// Sends the contents of the given buffer through
+ /// the socket to the given address.
+ ///
+ /// Returns the number of bytes sent, which may be
+ /// less than the number of bytes specified.
+
+ int receiveFrom(void* buffer, int length, SocketAddress& address, int flags = 0);
+ /// Receives data from the socket and stores it
+ /// in buffer. Up to length bytes are received.
+ /// Stores the address of the sender in address.
+ ///
+ /// Returns the number of bytes received.
+
+ void setBroadcast(bool flag);
+ /// Sets the value of the SO_BROADCAST socket option.
+ ///
+ /// Setting this flag allows sending datagrams to
+ /// the broadcast address.
+
+ bool getBroadcast() const;
+ /// Returns the value of the SO_BROADCAST socket option.
+
+protected:
+ DatagramSocket(SocketImpl* pImpl);
+ /// Creates the Socket and attaches the given SocketImpl.
+ /// The socket takes ownership of the SocketImpl.
+ ///
+ /// The SocketImpl must be a StreamSocketImpl, otherwise
+ /// an InvalidArgumentException will be thrown.
+};
+
+
+//
+// inlines
+//
+inline void DatagramSocket::setBroadcast(bool flag)
+{
+ impl()->setBroadcast(flag);
+}
+
+
+inline bool DatagramSocket::getBroadcast() const
+{
+ return impl()->getBroadcast();
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_DatagramSocket_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/DatagramSocketImpl.h b/contrib/libs/poco/Net/include/Poco/Net/DatagramSocketImpl.h
index 6bf7bc8fd8..f9d280aa1b 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/DatagramSocketImpl.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/DatagramSocketImpl.h
@@ -1,55 +1,55 @@
-//
-// DatagramSocketImpl.h
-//
-// Library: Net
-// Package: Sockets
-// Module: DatagramSocketImpl
-//
-// Definition of the DatagramSocketImpl class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_DatagramSocketImpl_INCLUDED
-#define Net_DatagramSocketImpl_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/SocketImpl.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API DatagramSocketImpl: public SocketImpl
- /// This class implements an UDP socket.
-{
-public:
- DatagramSocketImpl();
- /// Creates an unconnected, unbound datagram socket.
-
- explicit DatagramSocketImpl(SocketAddress::Family family);
- /// Creates an unconnected datagram socket.
- ///
- /// The socket will be created for the
- /// given address family.
-
- DatagramSocketImpl(poco_socket_t sockfd);
- /// Creates a StreamSocketImpl using the given native socket.
-
-protected:
- void init(int af);
-
- ~DatagramSocketImpl();
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_DatagramSocketImpl_INCLUDED
+//
+// DatagramSocketImpl.h
+//
+// Library: Net
+// Package: Sockets
+// Module: DatagramSocketImpl
+//
+// Definition of the DatagramSocketImpl class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_DatagramSocketImpl_INCLUDED
+#define Net_DatagramSocketImpl_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/SocketImpl.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API DatagramSocketImpl: public SocketImpl
+ /// This class implements an UDP socket.
+{
+public:
+ DatagramSocketImpl();
+ /// Creates an unconnected, unbound datagram socket.
+
+ explicit DatagramSocketImpl(SocketAddress::Family family);
+ /// Creates an unconnected datagram socket.
+ ///
+ /// The socket will be created for the
+ /// given address family.
+
+ DatagramSocketImpl(poco_socket_t sockfd);
+ /// Creates a StreamSocketImpl using the given native socket.
+
+protected:
+ void init(int af);
+
+ ~DatagramSocketImpl();
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_DatagramSocketImpl_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/DialogSocket.h b/contrib/libs/poco/Net/include/Poco/Net/DialogSocket.h
index 93fa8c36db..ca47b73ba6 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/DialogSocket.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/DialogSocket.h
@@ -1,211 +1,211 @@
-//
-// DialogSocket.h
-//
-// Library: Net
-// Package: Sockets
-// Module: DialogSocket
-//
-// Definition of the DialogSocket class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_DialogSocket_INCLUDED
-#define Net_DialogSocket_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/StreamSocket.h"
-#include <cstdlib>
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API DialogSocket: public StreamSocket
- /// DialogSocket is a subclass of StreamSocket that
- /// can be used for implementing request-response
- /// based client server connections.
- ///
- /// A request is always a single-line command terminated
- /// by CR-LF.
- ///
- /// A response can either be a single line of text terminated
- /// by CR-LF, or multiple lines of text in the format used
- /// by the FTP and SMTP protocols.
- ///
- /// Limited support for the TELNET protocol (RFC 854) is
- /// available.
- ///
- /// Warning: Do not call receiveBytes() on a DialogSocket.
- /// Due to internal buffering in DialogSocket, receiveBytes()
- /// may return an unexpected result and interfere with
- /// DialogSocket's buffering. Use receiveRawBytes() instead.
-{
-public:
- DialogSocket();
- /// Creates an unconnected stream socket.
+//
+// DialogSocket.h
+//
+// Library: Net
+// Package: Sockets
+// Module: DialogSocket
+//
+// Definition of the DialogSocket class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_DialogSocket_INCLUDED
+#define Net_DialogSocket_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/StreamSocket.h"
+#include <cstdlib>
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API DialogSocket: public StreamSocket
+ /// DialogSocket is a subclass of StreamSocket that
+ /// can be used for implementing request-response
+ /// based client server connections.
+ ///
+ /// A request is always a single-line command terminated
+ /// by CR-LF.
+ ///
+ /// A response can either be a single line of text terminated
+ /// by CR-LF, or multiple lines of text in the format used
+ /// by the FTP and SMTP protocols.
+ ///
+ /// Limited support for the TELNET protocol (RFC 854) is
+ /// available.
+ ///
+ /// Warning: Do not call receiveBytes() on a DialogSocket.
+ /// Due to internal buffering in DialogSocket, receiveBytes()
+ /// may return an unexpected result and interfere with
+ /// DialogSocket's buffering. Use receiveRawBytes() instead.
+{
+public:
+ DialogSocket();
+ /// Creates an unconnected stream socket.
+ ///
+ /// Before sending or receiving data, the socket
+ /// must be connected with a call to connect().
+
+ explicit DialogSocket(const SocketAddress& address);
+ /// Creates a stream socket and connects it to
+ /// the socket specified by address.
+
+ DialogSocket(const Socket& socket);
+ /// Creates the DialogSocket with the SocketImpl
+ /// from another socket. The SocketImpl must be
+ /// a StreamSocketImpl, otherwise an InvalidArgumentException
+ /// will be thrown.
+
+ DialogSocket(const DialogSocket& socket);
+ /// Creates the DialogSocket as copy of another dialog socket.
+
+ ~DialogSocket();
+ /// Destroys the DialogSocket.
+
+ DialogSocket& operator = (const Socket& socket);
+ /// Assignment operator.
+ ///
+ /// Releases the socket's SocketImpl and
+ /// attaches the SocketImpl from the other socket and
+ /// increments the reference count of the SocketImpl.
+
+ DialogSocket& operator = (const DialogSocket& socket);
+ /// Assignment operator.
+
+ void sendByte(unsigned char ch);
+ /// Sends a single byte over the socket connection.
+
+ void sendString(const char* str);
+ /// Sends the given null-terminated string over
+ /// the socket connection.
+
+ void sendString(const std::string& str);
+ /// Sends the given string over the socket connection.
+
+ void sendMessage(const std::string& message);
+ /// Appends a CR-LF sequence to the message and sends it
+ /// over the socket connection.
+
+ void sendMessage(const std::string& message, const std::string& arg);
+ /// Concatenates message and arg, separated by a space, appends a
+ /// CR-LF sequence, and sends the result over the socket connection.
+
+ void sendMessage(const std::string& message, const std::string& arg1, const std::string& arg2);
+ /// Concatenates message and args, separated by a space, appends a
+ /// CR-LF sequence, and sends the result over the socket connection.
+
+ bool receiveMessage(std::string& message);
+ /// Receives a single-line message, terminated by CR-LF,
+ /// from the socket connection and appends it to response.
///
- /// Before sending or receiving data, the socket
- /// must be connected with a call to connect().
-
- explicit DialogSocket(const SocketAddress& address);
- /// Creates a stream socket and connects it to
- /// the socket specified by address.
-
- DialogSocket(const Socket& socket);
- /// Creates the DialogSocket with the SocketImpl
- /// from another socket. The SocketImpl must be
- /// a StreamSocketImpl, otherwise an InvalidArgumentException
- /// will be thrown.
-
- DialogSocket(const DialogSocket& socket);
- /// Creates the DialogSocket as copy of another dialog socket.
-
- ~DialogSocket();
- /// Destroys the DialogSocket.
-
- DialogSocket& operator = (const Socket& socket);
- /// Assignment operator.
- ///
- /// Releases the socket's SocketImpl and
- /// attaches the SocketImpl from the other socket and
- /// increments the reference count of the SocketImpl.
-
- DialogSocket& operator = (const DialogSocket& socket);
- /// Assignment operator.
-
- void sendByte(unsigned char ch);
- /// Sends a single byte over the socket connection.
-
- void sendString(const char* str);
- /// Sends the given null-terminated string over
- /// the socket connection.
-
- void sendString(const std::string& str);
- /// Sends the given string over the socket connection.
-
- void sendMessage(const std::string& message);
- /// Appends a CR-LF sequence to the message and sends it
- /// over the socket connection.
-
- void sendMessage(const std::string& message, const std::string& arg);
- /// Concatenates message and arg, separated by a space, appends a
- /// CR-LF sequence, and sends the result over the socket connection.
-
- void sendMessage(const std::string& message, const std::string& arg1, const std::string& arg2);
- /// Concatenates message and args, separated by a space, appends a
- /// CR-LF sequence, and sends the result over the socket connection.
-
- bool receiveMessage(std::string& message);
- /// Receives a single-line message, terminated by CR-LF,
- /// from the socket connection and appends it to response.
- ///
- /// Returns true if a message has been read or false if
- /// the connection has been closed by the peer.
-
- int receiveStatusMessage(std::string& message);
- /// Receives a single-line or multi-line response from
- /// the socket connection. The format must be according to
- /// one of the response formats specified in the FTP (RFC 959)
- /// or SMTP (RFC 2821) specifications.
- ///
- /// The first line starts with a 3-digit status code.
- /// Following the status code is either a space character (' ' )
- /// (in case of a single-line response) or a minus character ('-')
- /// in case of a multi-line response. The following lines can have
- /// a three-digit status code followed by a minus-sign and some
- /// text, or some arbitrary text only. The last line again begins
- /// with a three-digit status code (which must be the same as the
- /// one in the first line), followed by a space and some arbitrary
- /// text. All lines must be terminated by a CR-LF sequence.
- ///
- /// The response contains all response lines, separated by a newline
- /// character, including the status code. The status code is returned.
- /// If the response line does not contain a status code, 0 is returned.
-
- int get();
- /// Reads one character from the connection.
- ///
- /// Returns -1 (EOF_CHAR) if no more characters are available.
-
- int peek();
- /// Returns the character that would be returned by the next call
- /// to get(), without actually extracting the character from the
- /// buffer.
- ///
- /// Returns -1 (EOF_CHAR) if no more characters are available.
-
- int receiveRawBytes(void* buffer, int length);
- /// Read up to length bytes from the connection and place
- /// them into buffer. If there are data bytes in the internal
- /// buffer, these bytes are returned first.
- ///
- /// Use this member function instead of receiveBytes().
- ///
- /// Returns the number of bytes read, which may be
- /// less than requested.
-
- void synch();
- /// Sends a TELNET SYNCH signal over the connection.
- ///
- /// According to RFC 854, a TELNET_DM char is sent
- /// via sendUrgent().
-
- void sendTelnetCommand(unsigned char command);
- /// Sends a TELNET command sequence (TELNET_IAC followed
- /// by the given command) over the connection.
-
- void sendTelnetCommand(unsigned char command, unsigned char arg);
- /// Sends a TELNET command sequence (TELNET_IAC followed
- /// by the given command, followed by arg) over the connection.
-
- enum TelnetCodes
- {
- TELNET_SE = 240,
- TELNET_NOP = 241,
- TELNET_DM = 242,
- TELNET_BRK = 243,
- TELNET_IP = 244,
- TELNET_AO = 245,
- TELNET_AYT = 246,
- TELNET_EC = 247,
- TELNET_EL = 248,
- TELNET_GA = 249,
- TELNET_SB = 250,
- TELNET_WILL = 251,
- TELNET_WONT = 252,
- TELNET_DO = 253,
- TELNET_DONT = 254,
- TELNET_IAC = 255
- };
-
-protected:
- void allocBuffer();
- void refill();
- bool receiveLine(std::string& line, std::size_t lineLengthLimit = 0);
- int receiveStatusLine(std::string& line, std::size_t lineLengthLimit = 0);
-
-private:
- enum
- {
- RECEIVE_BUFFER_SIZE = 1024,
- MAX_LINE_LENGTH = 4096,
- EOF_CHAR = -1
- };
-
- char* _pBuffer;
- char* _pNext;
- char* _pEnd;
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_DialogSocket_INCLUDED
+ /// Returns true if a message has been read or false if
+ /// the connection has been closed by the peer.
+
+ int receiveStatusMessage(std::string& message);
+ /// Receives a single-line or multi-line response from
+ /// the socket connection. The format must be according to
+ /// one of the response formats specified in the FTP (RFC 959)
+ /// or SMTP (RFC 2821) specifications.
+ ///
+ /// The first line starts with a 3-digit status code.
+ /// Following the status code is either a space character (' ' )
+ /// (in case of a single-line response) or a minus character ('-')
+ /// in case of a multi-line response. The following lines can have
+ /// a three-digit status code followed by a minus-sign and some
+ /// text, or some arbitrary text only. The last line again begins
+ /// with a three-digit status code (which must be the same as the
+ /// one in the first line), followed by a space and some arbitrary
+ /// text. All lines must be terminated by a CR-LF sequence.
+ ///
+ /// The response contains all response lines, separated by a newline
+ /// character, including the status code. The status code is returned.
+ /// If the response line does not contain a status code, 0 is returned.
+
+ int get();
+ /// Reads one character from the connection.
+ ///
+ /// Returns -1 (EOF_CHAR) if no more characters are available.
+
+ int peek();
+ /// Returns the character that would be returned by the next call
+ /// to get(), without actually extracting the character from the
+ /// buffer.
+ ///
+ /// Returns -1 (EOF_CHAR) if no more characters are available.
+
+ int receiveRawBytes(void* buffer, int length);
+ /// Read up to length bytes from the connection and place
+ /// them into buffer. If there are data bytes in the internal
+ /// buffer, these bytes are returned first.
+ ///
+ /// Use this member function instead of receiveBytes().
+ ///
+ /// Returns the number of bytes read, which may be
+ /// less than requested.
+
+ void synch();
+ /// Sends a TELNET SYNCH signal over the connection.
+ ///
+ /// According to RFC 854, a TELNET_DM char is sent
+ /// via sendUrgent().
+
+ void sendTelnetCommand(unsigned char command);
+ /// Sends a TELNET command sequence (TELNET_IAC followed
+ /// by the given command) over the connection.
+
+ void sendTelnetCommand(unsigned char command, unsigned char arg);
+ /// Sends a TELNET command sequence (TELNET_IAC followed
+ /// by the given command, followed by arg) over the connection.
+
+ enum TelnetCodes
+ {
+ TELNET_SE = 240,
+ TELNET_NOP = 241,
+ TELNET_DM = 242,
+ TELNET_BRK = 243,
+ TELNET_IP = 244,
+ TELNET_AO = 245,
+ TELNET_AYT = 246,
+ TELNET_EC = 247,
+ TELNET_EL = 248,
+ TELNET_GA = 249,
+ TELNET_SB = 250,
+ TELNET_WILL = 251,
+ TELNET_WONT = 252,
+ TELNET_DO = 253,
+ TELNET_DONT = 254,
+ TELNET_IAC = 255
+ };
+
+protected:
+ void allocBuffer();
+ void refill();
+ bool receiveLine(std::string& line, std::size_t lineLengthLimit = 0);
+ int receiveStatusLine(std::string& line, std::size_t lineLengthLimit = 0);
+
+private:
+ enum
+ {
+ RECEIVE_BUFFER_SIZE = 1024,
+ MAX_LINE_LENGTH = 4096,
+ EOF_CHAR = -1
+ };
+
+ char* _pBuffer;
+ char* _pNext;
+ char* _pEnd;
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_DialogSocket_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/FTPClientSession.h b/contrib/libs/poco/Net/include/Poco/Net/FTPClientSession.h
index ca69ef234f..1750cfc028 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/FTPClientSession.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/FTPClientSession.h
@@ -1,403 +1,403 @@
-//
-// FTPClientSession.h
-//
-// Library: Net
-// Package: FTP
-// Module: FTPClientSession
-//
-// Definition of the FTPClientSession class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_FTPClientSession_INCLUDED
-#define Net_FTPClientSession_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/DialogSocket.h"
-#include "Poco/Timespan.h"
-#include <istream>
-#include <ostream>
-
-
-namespace Poco {
-namespace Net {
-
-
-class SocketStream;
-
-
-class Net_API FTPClientSession
- /// This class implements an File Transfer Protocol
- /// (FTP, RFC 959) client.
- ///
- /// Most of the features of the FTP protocol, as specified
- /// in RFC 959, are supported. Not supported are EBCDIC and
- /// LOCAL data types and format control and structured files.
- ///
- /// Also supported are the EPRT and EPSV commands from
- /// RFC 1738 (FTP Extensions for IPv6 and NAT).
- /// The client will first attempt to use the EPRT and EPSV
- /// commands. If the server does not supports these commands,
- /// the client will fall back to PORT and PASV.
-{
-public:
- enum
- {
- FTP_PORT = 21
- };
-
- enum FileType
- {
- TYPE_TEXT, // TYPE A (ASCII)
- TYPE_BINARY // TYPE I (Image)
- };
-
- FTPClientSession();
- /// Creates an FTPClientSession.
- ///
- /// Passive mode will be used for data transfers.
-
- explicit FTPClientSession(const StreamSocket& socket);
- /// Creates an FTPClientSession using the given
- /// connected socket for the control connection.
- ///
- /// Passive mode will be used for data transfers.
-
- FTPClientSession(const std::string& host,
- Poco::UInt16 port = FTP_PORT,
- const std::string& username = "",
- const std::string& password = "");
- /// Creates an FTPClientSession using a socket connected
- /// to the given host and port. If username is supplied,
- /// login is attempted.
- ///
- /// Passive mode will be used for data transfers.
-
- virtual ~FTPClientSession();
- /// Destroys the FTPClientSession.
-
- void setTimeout(const Poco::Timespan& timeout);
- /// Sets the timeout for socket operations.
-
- Poco::Timespan getTimeout() const;
- /// Returns the timeout for socket operations.
-
- void setPassive(bool flag, bool useRFC1738 = true);
- /// Enables (default) or disables FTP passive mode for this session.
- ///
- /// If useRFC1738 is true (the default), the RFC 1738
- /// EPSV command is used (with a fallback to PASV if EPSV fails)
- /// for switching to passive mode. The same applies to
- /// EPRT and PORT for active connections.
-
- bool getPassive() const;
- /// Returns true iff passive mode is enabled for this connection.
-
- void open(const std::string& host,
- Poco::UInt16 port,
- const std::string& username = "",
- const std::string& password = "");
- /// Opens the FTP connection to the given host and port.
- /// If username is supplied, login is attempted.
-
- void login(const std::string& username, const std::string& password);
- /// Authenticates the user against the FTP server. Must be
- /// called before any other commands (except QUIT) can be sent.
- ///
- /// Sends a USER command followed by a PASS command with the
- /// respective arguments to the server.
- ///
- /// Throws a FTPException in case of a FTP-specific error, or a
- /// NetException in case of a general network communication failure.
-
- void logout();
-
- void close();
- /// Sends a QUIT command and closes the connection to the server.
- ///
- /// Throws a FTPException in case of a FTP-specific error, or a
- /// NetException in case of a general network communication failure.
-
- std::string systemType();
- /// Returns the system type of the FTP server.
- ///
- /// Sends a SYST command to the server and returns the result.
-
- void setFileType(FileType type);
- /// Sets the file type for transferring files.
- ///
- /// Sends a TYPE command with a corresponding argument to the
- /// server.
- ///
- /// Throws a FTPException in case of a FTP-specific error, or a
- /// NetException in case of a general network communication failure.
-
- FileType getFileType() const;
- /// Returns the file type for transferring files.
-
- void setWorkingDirectory(const std::string& path);
- /// Changes the current working directory on the server.
- ///
- /// Sends a CWD command with the given path as argument to the
- /// server.
- ///
- /// Throws a FTPException in case of a FTP-specific error, or a
- /// NetException in case of a general network communication failure.
-
- std::string getWorkingDirectory();
- /// Returns the current working directory on the server.
- ///
- /// Throws a FTPException in case of a FTP-specific error, or a
- /// NetException in case of a general network communication failure.
-
- void cdup();
- /// Moves one directory up from the current working directory
- /// on the server.
- ///
- /// Sends a CDUP command to the server.
- ///
- /// Throws a FTPException in case of a FTP-specific error, or a
- /// NetException in case of a general network communication failure.
-
- void rename(const std::string& oldName, const std::string& newName);
- /// Renames the file on the server given by oldName to newName.
- ///
- /// Sends a RNFR command, followed by a RNTO command to the server.
- ///
- /// Throws a FTPException in case of a FTP-specific error, or a
- /// NetException in case of a general network communication failure.
-
- void remove(const std::string& path);
- /// Deletes the file specified by path on the server.
- ///
- /// Sends a DELE command with path as argument to the server.
- ///
- /// Throws a FTPException in case of a FTP-specific error, or a
- /// NetException in case of a general network communication failure.
-
- void createDirectory(const std::string& path);
- /// Creates a new directory with the given path on the server.
- ///
- /// Sends a MKD command with path as argument to the server.
- ///
- /// Throws a FTPException in case of a FTP-specific error, or a
- /// NetException in case of a general network communication failure.
-
- void removeDirectory(const std::string& path);
- /// Removes the directory specified by path from the server.
- ///
- /// Sends a RMD command with path as argument to the server.
- ///
- /// Throws a FTPException in case of a FTP-specific error, or a
- /// NetException in case of a general network communication failure.
-
- std::istream& beginDownload(const std::string& path);
- /// Starts downloading the file with the given name.
- /// After all data has been read from the returned stream,
- /// endDownload() must be called to finish the download.
- ///
- /// A stream for reading the file's content is returned.
- /// The stream is valid until endDownload() is called.
- ///
- /// Creates a data connection between the client and the
- /// server. If passive mode is on, then the server waits for
- /// a connection request from the client. Otherwise, the
- /// client waits for a connection request from the server.
- /// After establishing the data connection, a SocketStream
- /// for transferring the data is created.
- ///
- /// If ASCII transfer mode is selected, the caller is
- /// responsible for converting the received data to
- /// the native text file format.
- /// The InputLineEndingConverter class from the Foundation
- /// library can be used for that purpose.
-
- void endDownload();
- /// Must be called to complete a download initiated with
- /// beginDownload().
-
- std::ostream& beginUpload(const std::string& path);
- /// Starts uploading the file with the given name.
- /// After all data has been written to the returned stream,
- /// endUpload() must be called to finish the upload.
- ///
- /// A stream for reading the file's content is returned.
- /// The stream is valid until endUpload() is called.
- ///
- /// Creates a data connection between the client and the
- /// server. If passive mode is on, then the server waits for
- /// a connection request from the client. Otherwise, the
- /// client waits for a connection request from the server.
- /// After establishing the data connection, a SocketStream
- /// for transferring the data is created.
- ///
- /// If ASCII transfer mode is selected, the caller is
- /// responsible for converting the data to be sent
- /// into network (CR-LF line endings) format.
- /// The OutputLineEndingConverter class from the Foundation
- /// library can be used for that purpose.
-
- void endUpload();
- /// Must be called to complete an upload initiated with
- /// beginUpload().
-
- std::istream& beginList(const std::string& path = "", bool extended = false);
- /// Starts downloading a directory listing.
- /// After all data has been read from the returned stream,
- /// endList() must be called to finish the download.
- ///
- /// A stream for reading the directory data is returned.
- /// The stream is valid until endList() is called.
- ///
- /// Optionally, a path to a directory or file can be specified.
- /// According to the FTP protocol, if a path to a filename is
- /// given, only information for the specific file is returned.
- /// If a path to a directory is given, a listing of that directory
- /// is returned. If no path is given, a listing of the current
- /// working directory is returned.
- ///
- /// If extended is false, only a filenames (one per line) are
- /// returned. Otherwise, a full directory listing including
- /// file attributes is returned. The format of this listing
- /// depends on the FTP server. No attempt is made to interpret
- /// this data.
- ///
- /// Creates a data connection between the client and the
- /// server. If passive mode is on, then the server waits for
- /// a connection request from the client. Otherwise, the
- /// client waits for a connection request from the server.
- /// After establishing the data connection, a SocketStream
- /// for transferring the data is created.
-
- void endList();
- /// Must be called to complete a directory listing download
- /// initiated with beginList().
-
- void abort();
- /// Aborts the download or upload currently in progress.
- ///
- /// Sends a TELNET IP/SYNCH sequence, followed by an ABOR
- /// command to the server.
- ///
- /// A separate call to endDownload() or endUpload() is
- /// not necessary.
-
- int sendCommand(const std::string& command, std::string& response);
- /// Sends the given command verbatim to the server
- /// and waits for a response.
-
- int sendCommand(const std::string& command, const std::string& arg, std::string& response);
- /// Sends the given command verbatim to the server
- /// and waits for a response.
-
- bool isOpen() const;
- /// Returns true if the connection with FTP server is opened.
-
- bool isLoggedIn() const;
- /// Returns true if the session is logged in.
-
-protected:
- enum StatusClass
- {
- FTP_POSITIVE_PRELIMINARY = 1,
- FTP_POSITIVE_COMPLETION = 2,
- FTP_POSITIVE_INTERMEDIATE = 3,
- FTP_TRANSIENT_NEGATIVE = 4,
- FTP_PERMANENT_NEGATIVE = 5
- };
- enum
- {
- DEFAULT_TIMEOUT = 30000000 // 30 seconds default timeout for socket operations
- };
-
- static bool isPositivePreliminary(int status);
- static bool isPositiveCompletion(int status);
- static bool isPositiveIntermediate(int status);
- static bool isTransientNegative(int status);
- static bool isPermanentNegative(int status);
- std::string extractPath(const std::string& response);
- StreamSocket establishDataConnection(const std::string& command, const std::string& arg);
- StreamSocket activeDataConnection(const std::string& command, const std::string& arg);
- StreamSocket passiveDataConnection(const std::string& command, const std::string& arg);
- void sendPortCommand(const SocketAddress& addr);
- SocketAddress sendPassiveCommand();
- bool sendEPRT(const SocketAddress& addr);
- void sendPORT(const SocketAddress& addr);
- bool sendEPSV(SocketAddress& addr);
- void sendPASV(SocketAddress& addr);
- void parseAddress(const std::string& str, SocketAddress& addr);
- void parseExtAddress(const std::string& str, SocketAddress& addr);
- void endTransfer();
-
-private:
- FTPClientSession(const FTPClientSession&);
- FTPClientSession& operator = (const FTPClientSession&);
-
- std::string _host;
- Poco::UInt16 _port;
- DialogSocket* _pControlSocket;
- SocketStream* _pDataStream;
- bool _passiveMode;
- FileType _fileType;
- bool _supports1738;
- bool _serverReady;
- bool _isLoggedIn;
- Poco::Timespan _timeout;
-};
-
-
-//
-// inlines
-//
-inline bool FTPClientSession::isPositivePreliminary(int status)
-{
- return status/100 == FTP_POSITIVE_PRELIMINARY;
-}
-
-
-inline bool FTPClientSession::isPositiveCompletion(int status)
-{
- return status/100 == FTP_POSITIVE_COMPLETION;
-}
-
-
-inline bool FTPClientSession::isPositiveIntermediate(int status)
-{
- return status/100 == FTP_POSITIVE_INTERMEDIATE;
-}
-
-
-inline bool FTPClientSession::isTransientNegative(int status)
-{
- return status/100 == FTP_TRANSIENT_NEGATIVE;
-}
-
-
-inline bool FTPClientSession::isPermanentNegative(int status)
-{
- return status/100 == FTP_PERMANENT_NEGATIVE;
-}
-
-
-inline bool FTPClientSession::isOpen() const
-{
- return _pControlSocket != 0;
-}
-
-
-inline bool FTPClientSession::isLoggedIn() const
-{
- return _isLoggedIn;
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_FTPClientSession_INCLUDED
+//
+// FTPClientSession.h
+//
+// Library: Net
+// Package: FTP
+// Module: FTPClientSession
+//
+// Definition of the FTPClientSession class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_FTPClientSession_INCLUDED
+#define Net_FTPClientSession_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/DialogSocket.h"
+#include "Poco/Timespan.h"
+#include <istream>
+#include <ostream>
+
+
+namespace Poco {
+namespace Net {
+
+
+class SocketStream;
+
+
+class Net_API FTPClientSession
+ /// This class implements an File Transfer Protocol
+ /// (FTP, RFC 959) client.
+ ///
+ /// Most of the features of the FTP protocol, as specified
+ /// in RFC 959, are supported. Not supported are EBCDIC and
+ /// LOCAL data types and format control and structured files.
+ ///
+ /// Also supported are the EPRT and EPSV commands from
+ /// RFC 1738 (FTP Extensions for IPv6 and NAT).
+ /// The client will first attempt to use the EPRT and EPSV
+ /// commands. If the server does not supports these commands,
+ /// the client will fall back to PORT and PASV.
+{
+public:
+ enum
+ {
+ FTP_PORT = 21
+ };
+
+ enum FileType
+ {
+ TYPE_TEXT, // TYPE A (ASCII)
+ TYPE_BINARY // TYPE I (Image)
+ };
+
+ FTPClientSession();
+ /// Creates an FTPClientSession.
+ ///
+ /// Passive mode will be used for data transfers.
+
+ explicit FTPClientSession(const StreamSocket& socket);
+ /// Creates an FTPClientSession using the given
+ /// connected socket for the control connection.
+ ///
+ /// Passive mode will be used for data transfers.
+
+ FTPClientSession(const std::string& host,
+ Poco::UInt16 port = FTP_PORT,
+ const std::string& username = "",
+ const std::string& password = "");
+ /// Creates an FTPClientSession using a socket connected
+ /// to the given host and port. If username is supplied,
+ /// login is attempted.
+ ///
+ /// Passive mode will be used for data transfers.
+
+ virtual ~FTPClientSession();
+ /// Destroys the FTPClientSession.
+
+ void setTimeout(const Poco::Timespan& timeout);
+ /// Sets the timeout for socket operations.
+
+ Poco::Timespan getTimeout() const;
+ /// Returns the timeout for socket operations.
+
+ void setPassive(bool flag, bool useRFC1738 = true);
+ /// Enables (default) or disables FTP passive mode for this session.
+ ///
+ /// If useRFC1738 is true (the default), the RFC 1738
+ /// EPSV command is used (with a fallback to PASV if EPSV fails)
+ /// for switching to passive mode. The same applies to
+ /// EPRT and PORT for active connections.
+
+ bool getPassive() const;
+ /// Returns true iff passive mode is enabled for this connection.
+
+ void open(const std::string& host,
+ Poco::UInt16 port,
+ const std::string& username = "",
+ const std::string& password = "");
+ /// Opens the FTP connection to the given host and port.
+ /// If username is supplied, login is attempted.
+
+ void login(const std::string& username, const std::string& password);
+ /// Authenticates the user against the FTP server. Must be
+ /// called before any other commands (except QUIT) can be sent.
+ ///
+ /// Sends a USER command followed by a PASS command with the
+ /// respective arguments to the server.
+ ///
+ /// Throws a FTPException in case of a FTP-specific error, or a
+ /// NetException in case of a general network communication failure.
+
+ void logout();
+
+ void close();
+ /// Sends a QUIT command and closes the connection to the server.
+ ///
+ /// Throws a FTPException in case of a FTP-specific error, or a
+ /// NetException in case of a general network communication failure.
+
+ std::string systemType();
+ /// Returns the system type of the FTP server.
+ ///
+ /// Sends a SYST command to the server and returns the result.
+
+ void setFileType(FileType type);
+ /// Sets the file type for transferring files.
+ ///
+ /// Sends a TYPE command with a corresponding argument to the
+ /// server.
+ ///
+ /// Throws a FTPException in case of a FTP-specific error, or a
+ /// NetException in case of a general network communication failure.
+
+ FileType getFileType() const;
+ /// Returns the file type for transferring files.
+
+ void setWorkingDirectory(const std::string& path);
+ /// Changes the current working directory on the server.
+ ///
+ /// Sends a CWD command with the given path as argument to the
+ /// server.
+ ///
+ /// Throws a FTPException in case of a FTP-specific error, or a
+ /// NetException in case of a general network communication failure.
+
+ std::string getWorkingDirectory();
+ /// Returns the current working directory on the server.
+ ///
+ /// Throws a FTPException in case of a FTP-specific error, or a
+ /// NetException in case of a general network communication failure.
+
+ void cdup();
+ /// Moves one directory up from the current working directory
+ /// on the server.
+ ///
+ /// Sends a CDUP command to the server.
+ ///
+ /// Throws a FTPException in case of a FTP-specific error, or a
+ /// NetException in case of a general network communication failure.
+
+ void rename(const std::string& oldName, const std::string& newName);
+ /// Renames the file on the server given by oldName to newName.
+ ///
+ /// Sends a RNFR command, followed by a RNTO command to the server.
+ ///
+ /// Throws a FTPException in case of a FTP-specific error, or a
+ /// NetException in case of a general network communication failure.
+
+ void remove(const std::string& path);
+ /// Deletes the file specified by path on the server.
+ ///
+ /// Sends a DELE command with path as argument to the server.
+ ///
+ /// Throws a FTPException in case of a FTP-specific error, or a
+ /// NetException in case of a general network communication failure.
+
+ void createDirectory(const std::string& path);
+ /// Creates a new directory with the given path on the server.
+ ///
+ /// Sends a MKD command with path as argument to the server.
+ ///
+ /// Throws a FTPException in case of a FTP-specific error, or a
+ /// NetException in case of a general network communication failure.
+
+ void removeDirectory(const std::string& path);
+ /// Removes the directory specified by path from the server.
+ ///
+ /// Sends a RMD command with path as argument to the server.
+ ///
+ /// Throws a FTPException in case of a FTP-specific error, or a
+ /// NetException in case of a general network communication failure.
+
+ std::istream& beginDownload(const std::string& path);
+ /// Starts downloading the file with the given name.
+ /// After all data has been read from the returned stream,
+ /// endDownload() must be called to finish the download.
+ ///
+ /// A stream for reading the file's content is returned.
+ /// The stream is valid until endDownload() is called.
+ ///
+ /// Creates a data connection between the client and the
+ /// server. If passive mode is on, then the server waits for
+ /// a connection request from the client. Otherwise, the
+ /// client waits for a connection request from the server.
+ /// After establishing the data connection, a SocketStream
+ /// for transferring the data is created.
+ ///
+ /// If ASCII transfer mode is selected, the caller is
+ /// responsible for converting the received data to
+ /// the native text file format.
+ /// The InputLineEndingConverter class from the Foundation
+ /// library can be used for that purpose.
+
+ void endDownload();
+ /// Must be called to complete a download initiated with
+ /// beginDownload().
+
+ std::ostream& beginUpload(const std::string& path);
+ /// Starts uploading the file with the given name.
+ /// After all data has been written to the returned stream,
+ /// endUpload() must be called to finish the upload.
+ ///
+ /// A stream for reading the file's content is returned.
+ /// The stream is valid until endUpload() is called.
+ ///
+ /// Creates a data connection between the client and the
+ /// server. If passive mode is on, then the server waits for
+ /// a connection request from the client. Otherwise, the
+ /// client waits for a connection request from the server.
+ /// After establishing the data connection, a SocketStream
+ /// for transferring the data is created.
+ ///
+ /// If ASCII transfer mode is selected, the caller is
+ /// responsible for converting the data to be sent
+ /// into network (CR-LF line endings) format.
+ /// The OutputLineEndingConverter class from the Foundation
+ /// library can be used for that purpose.
+
+ void endUpload();
+ /// Must be called to complete an upload initiated with
+ /// beginUpload().
+
+ std::istream& beginList(const std::string& path = "", bool extended = false);
+ /// Starts downloading a directory listing.
+ /// After all data has been read from the returned stream,
+ /// endList() must be called to finish the download.
+ ///
+ /// A stream for reading the directory data is returned.
+ /// The stream is valid until endList() is called.
+ ///
+ /// Optionally, a path to a directory or file can be specified.
+ /// According to the FTP protocol, if a path to a filename is
+ /// given, only information for the specific file is returned.
+ /// If a path to a directory is given, a listing of that directory
+ /// is returned. If no path is given, a listing of the current
+ /// working directory is returned.
+ ///
+ /// If extended is false, only a filenames (one per line) are
+ /// returned. Otherwise, a full directory listing including
+ /// file attributes is returned. The format of this listing
+ /// depends on the FTP server. No attempt is made to interpret
+ /// this data.
+ ///
+ /// Creates a data connection between the client and the
+ /// server. If passive mode is on, then the server waits for
+ /// a connection request from the client. Otherwise, the
+ /// client waits for a connection request from the server.
+ /// After establishing the data connection, a SocketStream
+ /// for transferring the data is created.
+
+ void endList();
+ /// Must be called to complete a directory listing download
+ /// initiated with beginList().
+
+ void abort();
+ /// Aborts the download or upload currently in progress.
+ ///
+ /// Sends a TELNET IP/SYNCH sequence, followed by an ABOR
+ /// command to the server.
+ ///
+ /// A separate call to endDownload() or endUpload() is
+ /// not necessary.
+
+ int sendCommand(const std::string& command, std::string& response);
+ /// Sends the given command verbatim to the server
+ /// and waits for a response.
+
+ int sendCommand(const std::string& command, const std::string& arg, std::string& response);
+ /// Sends the given command verbatim to the server
+ /// and waits for a response.
+
+ bool isOpen() const;
+ /// Returns true if the connection with FTP server is opened.
+
+ bool isLoggedIn() const;
+ /// Returns true if the session is logged in.
+
+protected:
+ enum StatusClass
+ {
+ FTP_POSITIVE_PRELIMINARY = 1,
+ FTP_POSITIVE_COMPLETION = 2,
+ FTP_POSITIVE_INTERMEDIATE = 3,
+ FTP_TRANSIENT_NEGATIVE = 4,
+ FTP_PERMANENT_NEGATIVE = 5
+ };
+ enum
+ {
+ DEFAULT_TIMEOUT = 30000000 // 30 seconds default timeout for socket operations
+ };
+
+ static bool isPositivePreliminary(int status);
+ static bool isPositiveCompletion(int status);
+ static bool isPositiveIntermediate(int status);
+ static bool isTransientNegative(int status);
+ static bool isPermanentNegative(int status);
+ std::string extractPath(const std::string& response);
+ StreamSocket establishDataConnection(const std::string& command, const std::string& arg);
+ StreamSocket activeDataConnection(const std::string& command, const std::string& arg);
+ StreamSocket passiveDataConnection(const std::string& command, const std::string& arg);
+ void sendPortCommand(const SocketAddress& addr);
+ SocketAddress sendPassiveCommand();
+ bool sendEPRT(const SocketAddress& addr);
+ void sendPORT(const SocketAddress& addr);
+ bool sendEPSV(SocketAddress& addr);
+ void sendPASV(SocketAddress& addr);
+ void parseAddress(const std::string& str, SocketAddress& addr);
+ void parseExtAddress(const std::string& str, SocketAddress& addr);
+ void endTransfer();
+
+private:
+ FTPClientSession(const FTPClientSession&);
+ FTPClientSession& operator = (const FTPClientSession&);
+
+ std::string _host;
+ Poco::UInt16 _port;
+ DialogSocket* _pControlSocket;
+ SocketStream* _pDataStream;
+ bool _passiveMode;
+ FileType _fileType;
+ bool _supports1738;
+ bool _serverReady;
+ bool _isLoggedIn;
+ Poco::Timespan _timeout;
+};
+
+
+//
+// inlines
+//
+inline bool FTPClientSession::isPositivePreliminary(int status)
+{
+ return status/100 == FTP_POSITIVE_PRELIMINARY;
+}
+
+
+inline bool FTPClientSession::isPositiveCompletion(int status)
+{
+ return status/100 == FTP_POSITIVE_COMPLETION;
+}
+
+
+inline bool FTPClientSession::isPositiveIntermediate(int status)
+{
+ return status/100 == FTP_POSITIVE_INTERMEDIATE;
+}
+
+
+inline bool FTPClientSession::isTransientNegative(int status)
+{
+ return status/100 == FTP_TRANSIENT_NEGATIVE;
+}
+
+
+inline bool FTPClientSession::isPermanentNegative(int status)
+{
+ return status/100 == FTP_PERMANENT_NEGATIVE;
+}
+
+
+inline bool FTPClientSession::isOpen() const
+{
+ return _pControlSocket != 0;
+}
+
+
+inline bool FTPClientSession::isLoggedIn() const
+{
+ return _isLoggedIn;
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_FTPClientSession_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/FTPStreamFactory.h b/contrib/libs/poco/Net/include/Poco/Net/FTPStreamFactory.h
index f59fbe6bfd..4f33f19c19 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/FTPStreamFactory.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/FTPStreamFactory.h
@@ -1,120 +1,120 @@
-//
-// FTPStreamFactory.h
-//
-// Library: Net
-// Package: FTP
-// Module: FTPStreamFactory
-//
-// Definition of the FTPStreamFactory class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_FTPStreamFactory_INCLUDED
-#define Net_FTPStreamFactory_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/HTTPSession.h"
-#include "Poco/URIStreamFactory.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API FTPPasswordProvider
- /// The base class for all password providers.
- /// An instance of a subclass of this class can be
- /// registered with the FTPStreamFactory to
- /// provide a password
-{
-public:
- virtual std::string password(const std::string& username, const std::string& host) = 0;
- /// Provide the password for the given user on the given host.
-
-protected:
- FTPPasswordProvider();
- virtual ~FTPPasswordProvider();
-};
-
-
-class Net_API FTPStreamFactory: public Poco::URIStreamFactory
- /// An implementation of the URIStreamFactory interface
- /// that handles File Transfer Protocol (ftp) URIs.
- ///
- /// The URI's path may end with an optional type specification
- /// in the form (;type=<typecode>), where <typecode> is
- /// one of a, i or d. If type=a, the file identified by the path
- /// is transferred in ASCII (text) mode. If type=i, the file
- /// is transferred in Image (binary) mode. If type=d, a directory
- /// listing (in NLST format) is returned. This corresponds with
- /// the FTP URL format specified in RFC 1738.
- ///
- /// If the URI does not contain a username and password, the
- /// username "anonymous" and the password "
-{
-public:
- FTPStreamFactory();
- /// Creates the FTPStreamFactory.
-
- ~FTPStreamFactory();
- /// Destroys the FTPStreamFactory.
-
- std::istream* open(const Poco::URI& uri);
- /// Creates and opens a HTTP stream for the given URI.
- /// The URI must be a ftp://... URI.
- ///
- /// Throws a NetException if anything goes wrong.
-
- static void setAnonymousPassword(const std::string& password);
- /// Sets the password used for anonymous FTP.
- ///
- /// WARNING: Setting the anonymous password is not
- /// thread-safe, so it's best to call this method
- /// during application initialization, before the
- /// FTPStreamFactory is used for the first time.
-
- static const std::string& getAnonymousPassword();
- /// Returns the password used for anonymous FTP.
-
- static void setPasswordProvider(FTPPasswordProvider* pProvider);
- /// Sets the FTPPasswordProvider. If NULL is given,
- /// no password provider is used.
- ///
- /// WARNING: Setting the password provider is not
- /// thread-safe, so it's best to call this method
- /// during application initialization, before the
- /// FTPStreamFactory is used for the first time.
-
- static FTPPasswordProvider* getPasswordProvider();
- /// Returns the FTPPasswordProvider currently in use,
- /// or NULL if no one has been set.
-
- static void registerFactory();
- /// Registers the FTPStreamFactory with the
- /// default URIStreamOpener instance.
-
- static void unregisterFactory();
- /// Unregisters the FTPStreamFactory with the
- /// default URIStreamOpener instance.
-
-protected:
- static void splitUserInfo(const std::string& userInfo, std::string& username, std::string& password);
- static void getUserInfo(const Poco::URI& uri, std::string& username, std::string& password);
- static void getPathAndType(const Poco::URI& uri, std::string& path, char& type);
-
-private:
- static std::string _anonymousPassword;
- static FTPPasswordProvider* _pPasswordProvider;
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_FTPStreamFactory_INCLUDED
+//
+// FTPStreamFactory.h
+//
+// Library: Net
+// Package: FTP
+// Module: FTPStreamFactory
+//
+// Definition of the FTPStreamFactory class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_FTPStreamFactory_INCLUDED
+#define Net_FTPStreamFactory_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/HTTPSession.h"
+#include "Poco/URIStreamFactory.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API FTPPasswordProvider
+ /// The base class for all password providers.
+ /// An instance of a subclass of this class can be
+ /// registered with the FTPStreamFactory to
+ /// provide a password
+{
+public:
+ virtual std::string password(const std::string& username, const std::string& host) = 0;
+ /// Provide the password for the given user on the given host.
+
+protected:
+ FTPPasswordProvider();
+ virtual ~FTPPasswordProvider();
+};
+
+
+class Net_API FTPStreamFactory: public Poco::URIStreamFactory
+ /// An implementation of the URIStreamFactory interface
+ /// that handles File Transfer Protocol (ftp) URIs.
+ ///
+ /// The URI's path may end with an optional type specification
+ /// in the form (;type=<typecode>), where <typecode> is
+ /// one of a, i or d. If type=a, the file identified by the path
+ /// is transferred in ASCII (text) mode. If type=i, the file
+ /// is transferred in Image (binary) mode. If type=d, a directory
+ /// listing (in NLST format) is returned. This corresponds with
+ /// the FTP URL format specified in RFC 1738.
+ ///
+ /// If the URI does not contain a username and password, the
+ /// username "anonymous" and the password "
+{
+public:
+ FTPStreamFactory();
+ /// Creates the FTPStreamFactory.
+
+ ~FTPStreamFactory();
+ /// Destroys the FTPStreamFactory.
+
+ std::istream* open(const Poco::URI& uri);
+ /// Creates and opens a HTTP stream for the given URI.
+ /// The URI must be a ftp://... URI.
+ ///
+ /// Throws a NetException if anything goes wrong.
+
+ static void setAnonymousPassword(const std::string& password);
+ /// Sets the password used for anonymous FTP.
+ ///
+ /// WARNING: Setting the anonymous password is not
+ /// thread-safe, so it's best to call this method
+ /// during application initialization, before the
+ /// FTPStreamFactory is used for the first time.
+
+ static const std::string& getAnonymousPassword();
+ /// Returns the password used for anonymous FTP.
+
+ static void setPasswordProvider(FTPPasswordProvider* pProvider);
+ /// Sets the FTPPasswordProvider. If NULL is given,
+ /// no password provider is used.
+ ///
+ /// WARNING: Setting the password provider is not
+ /// thread-safe, so it's best to call this method
+ /// during application initialization, before the
+ /// FTPStreamFactory is used for the first time.
+
+ static FTPPasswordProvider* getPasswordProvider();
+ /// Returns the FTPPasswordProvider currently in use,
+ /// or NULL if no one has been set.
+
+ static void registerFactory();
+ /// Registers the FTPStreamFactory with the
+ /// default URIStreamOpener instance.
+
+ static void unregisterFactory();
+ /// Unregisters the FTPStreamFactory with the
+ /// default URIStreamOpener instance.
+
+protected:
+ static void splitUserInfo(const std::string& userInfo, std::string& username, std::string& password);
+ static void getUserInfo(const Poco::URI& uri, std::string& username, std::string& password);
+ static void getPathAndType(const Poco::URI& uri, std::string& path, char& type);
+
+private:
+ static std::string _anonymousPassword;
+ static FTPPasswordProvider* _pPasswordProvider;
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_FTPStreamFactory_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/FilePartSource.h b/contrib/libs/poco/Net/include/Poco/Net/FilePartSource.h
index c99b8bbedb..056718541d 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/FilePartSource.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/FilePartSource.h
@@ -1,77 +1,77 @@
-//
-// FilePartSource.h
-//
-// Library: Net
-// Package: Messages
-// Module: FilePartSource
-//
-// Definition of the FilePartSource class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_FilePartSource_INCLUDED
-#define Net_FilePartSource_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/PartSource.h"
-#include "Poco/FileStream.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API FilePartSource: public PartSource
- /// An implementation of PartSource for
- /// plain files.
-{
-public:
- FilePartSource(const std::string& path);
- /// Creates the FilePartSource for the given path.
- ///
- /// The MIME type is set to application/octet-stream.
- ///
- /// Throws an OpenFileException if the file cannot be opened.
-
- FilePartSource(const std::string& path, const std::string& mediaType);
- /// Creates the FilePartSource for the given
- /// path and MIME type.
- ///
- /// Throws an OpenFileException if the file cannot be opened.
-
- FilePartSource(const std::string& path, const std::string& filename, const std::string& mediaType);
- /// Creates the FilePartSource for the given
- /// path and MIME type. The given filename is
- /// used as part filename (see filename()) only.
- ///
- /// Throws an OpenFileException if the file cannot be opened.
-
- ~FilePartSource();
- /// Destroys the FilePartSource.
-
- std::istream& stream();
- /// Returns a file input stream for the given file.
-
- const std::string& filename() const;
- /// Returns the filename portion of the path.
-
- std::streamsize getContentLength() const;
- /// Returns the file size.
-
-private:
- std::string _path;
- std::string _filename;
- Poco::FileInputStream _istr;
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_FilePartSource_INCLUDED
+//
+// FilePartSource.h
+//
+// Library: Net
+// Package: Messages
+// Module: FilePartSource
+//
+// Definition of the FilePartSource class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_FilePartSource_INCLUDED
+#define Net_FilePartSource_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/PartSource.h"
+#include "Poco/FileStream.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API FilePartSource: public PartSource
+ /// An implementation of PartSource for
+ /// plain files.
+{
+public:
+ FilePartSource(const std::string& path);
+ /// Creates the FilePartSource for the given path.
+ ///
+ /// The MIME type is set to application/octet-stream.
+ ///
+ /// Throws an OpenFileException if the file cannot be opened.
+
+ FilePartSource(const std::string& path, const std::string& mediaType);
+ /// Creates the FilePartSource for the given
+ /// path and MIME type.
+ ///
+ /// Throws an OpenFileException if the file cannot be opened.
+
+ FilePartSource(const std::string& path, const std::string& filename, const std::string& mediaType);
+ /// Creates the FilePartSource for the given
+ /// path and MIME type. The given filename is
+ /// used as part filename (see filename()) only.
+ ///
+ /// Throws an OpenFileException if the file cannot be opened.
+
+ ~FilePartSource();
+ /// Destroys the FilePartSource.
+
+ std::istream& stream();
+ /// Returns a file input stream for the given file.
+
+ const std::string& filename() const;
+ /// Returns the filename portion of the path.
+
+ std::streamsize getContentLength() const;
+ /// Returns the file size.
+
+private:
+ std::string _path;
+ std::string _filename;
+ Poco::FileInputStream _istr;
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_FilePartSource_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/HTMLForm.h b/contrib/libs/poco/Net/include/Poco/Net/HTMLForm.h
index 160c0d0d8e..a4649dd2c2 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/HTMLForm.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/HTMLForm.h
@@ -1,272 +1,272 @@
-//
-// HTMLForm.h
-//
-// Library: Net
-// Package: HTML
-// Module: HTMLForm
-//
-// Definition of the HTMLForm class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_HTMLForm_INCLUDED
-#define Net_HTMLForm_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/NameValueCollection.h"
-#include <ostream>
-#include <istream>
-#include <vector>
-
-
-namespace Poco {
-namespace Net {
-
-
-class HTTPRequest;
-class PartHandler;
-class PartSource;
-
-
-class Net_API HTMLForm: public NameValueCollection
- /// HTMLForm is a helper class for working with HTML forms,
- /// both on the client and on the server side.
- ///
- /// The maximum number of form fields can be restricted
- /// by calling setFieldLimit(). This is useful to
- /// defend against certain kinds of denial-of-service
- /// attacks. The limit is only enforced when parsing
- /// form data from a stream or string, not when adding
- /// form fields programmatically. The default limit is 100.
-{
-public:
- enum Options
- {
- OPT_USE_CONTENT_LENGTH = 0x01
- /// Don't use Chunked Transfer-Encoding for multipart requests.
- };
-
- HTMLForm();
- /// Creates an empty HTMLForm and sets the
- /// encoding to "application/x-www-form-urlencoded".
-
- explicit HTMLForm(const std::string& encoding);
- /// Creates an empty HTMLForm that uses
- /// the given encoding.
- ///
- /// Encoding must be either "application/x-www-form-urlencoded"
- /// (which is the default) or "multipart/form-data".
-
- HTMLForm(const HTTPRequest& request, std::istream& requestBody, PartHandler& handler);
- /// Creates a HTMLForm from the given HTTP request.
- ///
- /// Uploaded files are passed to the given PartHandler.
-
- HTMLForm(const HTTPRequest& request, std::istream& requestBody);
- /// Creates a HTMLForm from the given HTTP request.
- ///
- /// Uploaded files are silently discarded.
-
- explicit HTMLForm(const HTTPRequest& request);
- /// Creates a HTMLForm from the given HTTP request.
- ///
- /// The request must be a GET request and the form data
- /// must be in the query string (URL encoded).
- ///
- /// For POST requests, you must use one of the constructors
- /// taking an additional input stream for the request body.
-
- ~HTMLForm();
- /// Destroys the HTMLForm.
-
- void setEncoding(const std::string& encoding);
- /// Sets the encoding used for posting the form.
- ///
- /// Encoding must be either "application/x-www-form-urlencoded"
- /// (which is the default) or "multipart/form-data".
-
- const std::string& getEncoding() const;
- /// Returns the encoding used for posting the form.
-
- void addPart(const std::string& name, PartSource* pSource);
- /// Adds an part/attachment (file upload) to the form.
- ///
- /// The form takes ownership of the PartSource and deletes it
- /// when it is no longer needed.
- ///
- /// The part will only be sent if the encoding
- /// set for the form is "multipart/form-data"
-
- void load(const HTTPRequest& request, std::istream& requestBody, PartHandler& handler);
- /// Reads the form data from the given HTTP request.
- ///
- /// Uploaded files are passed to the given PartHandler.
-
- void load(const HTTPRequest& request, std::istream& requestBody);
- /// Reads the form data from the given HTTP request.
- ///
- /// Uploaded files are silently discarded.
-
- void load(const HTTPRequest& request);
- /// Reads the form data from the given HTTP request.
- ///
- /// The request must be a GET request and the form data
- /// must be in the query string (URL encoded).
- ///
- /// For POST requests, you must use one of the overloads
- /// taking an additional input stream for the request body.
-
- void read(std::istream& istr, PartHandler& handler);
- /// Reads the form data from the given input stream.
- ///
- /// The form data read from the stream must be
- /// in the encoding specified for the form.
- ///
- /// Note that read() does not clear the form before
- /// reading the new values.
-
- void read(std::istream& istr);
- /// Reads the URL-encoded form data from the given input stream.
- ///
- /// Note that read() does not clear the form before
- /// reading the new values.
-
- void read(const std::string& queryString);
- /// Reads the form data from the given HTTP query string.
- ///
- /// Note that read() does not clear the form before
- /// reading the new values.
-
- void prepareSubmit(HTTPRequest& request, int options = 0);
- /// Fills out the request object for submitting the form.
- ///
- /// If the request method is GET, the encoded form is appended to the
- /// request URI as query string. Otherwise (the method is
- /// POST), the form's content type is set to the form's encoding.
- /// The form's parameters must be written to the
- /// request body separately, with a call to write.
- /// If the request's HTTP version is HTTP/1.0:
- /// - persistent connections are disabled
- /// - the content transfer encoding is set to identity encoding
- /// Otherwise, if the request's HTTP version is HTTP/1.1:
- /// - the request's persistent connection state is left unchanged
- /// - the content transfer encoding is set to chunked, unless
- /// the OPT_USE_CONTENT_LENGTH is given in options
- ///
- /// Note: Not using chunked transfer encoding for multipart forms
- /// degrades performance, as the request content must be generated
- /// twice, first to determine its size, then to actually send it.
-
- std::streamsize calculateContentLength();
- /// Calculate the content length for the form.
- /// May be UNKNOWN_CONTENT_LENGTH if not possible
- /// to calculate
-
- void write(std::ostream& ostr, const std::string& boundary);
- /// Writes the form data to the given output stream,
- /// using the specified encoding.
-
- void write(std::ostream& ostr);
- /// Writes the form data to the given output stream,
- /// using the specified encoding.
-
- const std::string& boundary() const;
- /// Returns the MIME boundary used for writing
- /// multipart form data.
-
- int getFieldLimit() const;
- /// Returns the maximum number of header fields
- /// allowed.
- ///
- /// See setFieldLimit() for more information.
-
- void setFieldLimit(int limit);
- /// Sets the maximum number of header fields
- /// allowed. This limit is used to defend certain
- /// kinds of denial-of-service attacks.
- /// Specify 0 for unlimited (not recommended).
- ///
- /// The default limit is 100.
-
- void setValueLengthLimit(int limit);
- /// Sets the maximum size for form field values
- /// stored as strings.
-
- int getValueLengthLimit() const;
- /// Returns the maximum size for form field values
- /// stored as strings.
-
- static const std::string ENCODING_URL; /// "application/x-www-form-urlencoded"
- static const std::string ENCODING_MULTIPART; /// "multipart/form-data"
- static const int UNKNOWN_CONTENT_LENGTH;
-
-protected:
- void readUrl(std::istream& istr);
- void readMultipart(std::istream& istr, PartHandler& handler);
- void writeUrl(std::ostream& ostr);
- void writeMultipart(std::ostream& ostr);
-
-private:
- HTMLForm(const HTMLForm&);
- HTMLForm& operator = (const HTMLForm&);
-
- enum Limits
- {
- DFL_FIELD_LIMIT = 100,
- MAX_NAME_LENGTH = 1024,
- DFL_MAX_VALUE_LENGTH = 256*1024
- };
-
- struct Part
- {
- std::string name;
- PartSource* pSource;
- };
-
- typedef std::vector<Part> PartVec;
-
- int _fieldLimit;
- int _valueLengthLimit;
- std::string _encoding;
- std::string _boundary;
- PartVec _parts;
-};
-
-
-//
-// inlines
-//
-inline const std::string& HTMLForm::getEncoding() const
-{
- return _encoding;
-}
-
-
-inline const std::string& HTMLForm::boundary() const
-{
- return _boundary;
-}
-
-
-inline int HTMLForm::getFieldLimit() const
-{
- return _fieldLimit;
-}
-
-
-inline int HTMLForm::getValueLengthLimit() const
-{
- return _valueLengthLimit;
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_HTMLForm_INCLUDED
+//
+// HTMLForm.h
+//
+// Library: Net
+// Package: HTML
+// Module: HTMLForm
+//
+// Definition of the HTMLForm class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_HTMLForm_INCLUDED
+#define Net_HTMLForm_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/NameValueCollection.h"
+#include <ostream>
+#include <istream>
+#include <vector>
+
+
+namespace Poco {
+namespace Net {
+
+
+class HTTPRequest;
+class PartHandler;
+class PartSource;
+
+
+class Net_API HTMLForm: public NameValueCollection
+ /// HTMLForm is a helper class for working with HTML forms,
+ /// both on the client and on the server side.
+ ///
+ /// The maximum number of form fields can be restricted
+ /// by calling setFieldLimit(). This is useful to
+ /// defend against certain kinds of denial-of-service
+ /// attacks. The limit is only enforced when parsing
+ /// form data from a stream or string, not when adding
+ /// form fields programmatically. The default limit is 100.
+{
+public:
+ enum Options
+ {
+ OPT_USE_CONTENT_LENGTH = 0x01
+ /// Don't use Chunked Transfer-Encoding for multipart requests.
+ };
+
+ HTMLForm();
+ /// Creates an empty HTMLForm and sets the
+ /// encoding to "application/x-www-form-urlencoded".
+
+ explicit HTMLForm(const std::string& encoding);
+ /// Creates an empty HTMLForm that uses
+ /// the given encoding.
+ ///
+ /// Encoding must be either "application/x-www-form-urlencoded"
+ /// (which is the default) or "multipart/form-data".
+
+ HTMLForm(const HTTPRequest& request, std::istream& requestBody, PartHandler& handler);
+ /// Creates a HTMLForm from the given HTTP request.
+ ///
+ /// Uploaded files are passed to the given PartHandler.
+
+ HTMLForm(const HTTPRequest& request, std::istream& requestBody);
+ /// Creates a HTMLForm from the given HTTP request.
+ ///
+ /// Uploaded files are silently discarded.
+
+ explicit HTMLForm(const HTTPRequest& request);
+ /// Creates a HTMLForm from the given HTTP request.
+ ///
+ /// The request must be a GET request and the form data
+ /// must be in the query string (URL encoded).
+ ///
+ /// For POST requests, you must use one of the constructors
+ /// taking an additional input stream for the request body.
+
+ ~HTMLForm();
+ /// Destroys the HTMLForm.
+
+ void setEncoding(const std::string& encoding);
+ /// Sets the encoding used for posting the form.
+ ///
+ /// Encoding must be either "application/x-www-form-urlencoded"
+ /// (which is the default) or "multipart/form-data".
+
+ const std::string& getEncoding() const;
+ /// Returns the encoding used for posting the form.
+
+ void addPart(const std::string& name, PartSource* pSource);
+ /// Adds an part/attachment (file upload) to the form.
+ ///
+ /// The form takes ownership of the PartSource and deletes it
+ /// when it is no longer needed.
+ ///
+ /// The part will only be sent if the encoding
+ /// set for the form is "multipart/form-data"
+
+ void load(const HTTPRequest& request, std::istream& requestBody, PartHandler& handler);
+ /// Reads the form data from the given HTTP request.
+ ///
+ /// Uploaded files are passed to the given PartHandler.
+
+ void load(const HTTPRequest& request, std::istream& requestBody);
+ /// Reads the form data from the given HTTP request.
+ ///
+ /// Uploaded files are silently discarded.
+
+ void load(const HTTPRequest& request);
+ /// Reads the form data from the given HTTP request.
+ ///
+ /// The request must be a GET request and the form data
+ /// must be in the query string (URL encoded).
+ ///
+ /// For POST requests, you must use one of the overloads
+ /// taking an additional input stream for the request body.
+
+ void read(std::istream& istr, PartHandler& handler);
+ /// Reads the form data from the given input stream.
+ ///
+ /// The form data read from the stream must be
+ /// in the encoding specified for the form.
+ ///
+ /// Note that read() does not clear the form before
+ /// reading the new values.
+
+ void read(std::istream& istr);
+ /// Reads the URL-encoded form data from the given input stream.
+ ///
+ /// Note that read() does not clear the form before
+ /// reading the new values.
+
+ void read(const std::string& queryString);
+ /// Reads the form data from the given HTTP query string.
+ ///
+ /// Note that read() does not clear the form before
+ /// reading the new values.
+
+ void prepareSubmit(HTTPRequest& request, int options = 0);
+ /// Fills out the request object for submitting the form.
+ ///
+ /// If the request method is GET, the encoded form is appended to the
+ /// request URI as query string. Otherwise (the method is
+ /// POST), the form's content type is set to the form's encoding.
+ /// The form's parameters must be written to the
+ /// request body separately, with a call to write.
+ /// If the request's HTTP version is HTTP/1.0:
+ /// - persistent connections are disabled
+ /// - the content transfer encoding is set to identity encoding
+ /// Otherwise, if the request's HTTP version is HTTP/1.1:
+ /// - the request's persistent connection state is left unchanged
+ /// - the content transfer encoding is set to chunked, unless
+ /// the OPT_USE_CONTENT_LENGTH is given in options
+ ///
+ /// Note: Not using chunked transfer encoding for multipart forms
+ /// degrades performance, as the request content must be generated
+ /// twice, first to determine its size, then to actually send it.
+
+ std::streamsize calculateContentLength();
+ /// Calculate the content length for the form.
+ /// May be UNKNOWN_CONTENT_LENGTH if not possible
+ /// to calculate
+
+ void write(std::ostream& ostr, const std::string& boundary);
+ /// Writes the form data to the given output stream,
+ /// using the specified encoding.
+
+ void write(std::ostream& ostr);
+ /// Writes the form data to the given output stream,
+ /// using the specified encoding.
+
+ const std::string& boundary() const;
+ /// Returns the MIME boundary used for writing
+ /// multipart form data.
+
+ int getFieldLimit() const;
+ /// Returns the maximum number of header fields
+ /// allowed.
+ ///
+ /// See setFieldLimit() for more information.
+
+ void setFieldLimit(int limit);
+ /// Sets the maximum number of header fields
+ /// allowed. This limit is used to defend certain
+ /// kinds of denial-of-service attacks.
+ /// Specify 0 for unlimited (not recommended).
+ ///
+ /// The default limit is 100.
+
+ void setValueLengthLimit(int limit);
+ /// Sets the maximum size for form field values
+ /// stored as strings.
+
+ int getValueLengthLimit() const;
+ /// Returns the maximum size for form field values
+ /// stored as strings.
+
+ static const std::string ENCODING_URL; /// "application/x-www-form-urlencoded"
+ static const std::string ENCODING_MULTIPART; /// "multipart/form-data"
+ static const int UNKNOWN_CONTENT_LENGTH;
+
+protected:
+ void readUrl(std::istream& istr);
+ void readMultipart(std::istream& istr, PartHandler& handler);
+ void writeUrl(std::ostream& ostr);
+ void writeMultipart(std::ostream& ostr);
+
+private:
+ HTMLForm(const HTMLForm&);
+ HTMLForm& operator = (const HTMLForm&);
+
+ enum Limits
+ {
+ DFL_FIELD_LIMIT = 100,
+ MAX_NAME_LENGTH = 1024,
+ DFL_MAX_VALUE_LENGTH = 256*1024
+ };
+
+ struct Part
+ {
+ std::string name;
+ PartSource* pSource;
+ };
+
+ typedef std::vector<Part> PartVec;
+
+ int _fieldLimit;
+ int _valueLengthLimit;
+ std::string _encoding;
+ std::string _boundary;
+ PartVec _parts;
+};
+
+
+//
+// inlines
+//
+inline const std::string& HTMLForm::getEncoding() const
+{
+ return _encoding;
+}
+
+
+inline const std::string& HTMLForm::boundary() const
+{
+ return _boundary;
+}
+
+
+inline int HTMLForm::getFieldLimit() const
+{
+ return _fieldLimit;
+}
+
+
+inline int HTMLForm::getValueLengthLimit() const
+{
+ return _valueLengthLimit;
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_HTMLForm_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/HTTPAuthenticationParams.h b/contrib/libs/poco/Net/include/Poco/Net/HTTPAuthenticationParams.h
index dd182b09a6..492e2c45d4 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/HTTPAuthenticationParams.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/HTTPAuthenticationParams.h
@@ -1,103 +1,103 @@
-//
-// HTTPAuthenticationParams.h
-//
-// Library: Net
-// Package: HTTP
-// Module: HTTPAuthenticationParams
-//
-// Definition of the HTTPAuthenticationParams class.
-//
-// Copyright (c) 2011, Anton V. Yabchinskiy (arn at bestmx dot ru).
-// Copyright (c) 2012, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_HTTPAuthenticationParams_INCLUDED
-#define Net_HTTPAuthenticationParams_INCLUDED
-
-
-#include "Poco/Net/NameValueCollection.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class HTTPRequest;
-class HTTPResponse;
-
-
-class Net_API HTTPAuthenticationParams: public NameValueCollection
- /// Collection of name-value pairs of HTTP authentication header (i.e.
- /// "realm", "qop", "nonce" in case of digest authentication header).
-{
-public:
- HTTPAuthenticationParams();
- /// Creates an empty authentication parameters collection.
-
- explicit HTTPAuthenticationParams(const std::string& authInfo);
- /// See fromAuthInfo() documentation.
-
- explicit HTTPAuthenticationParams(const HTTPRequest& request);
- /// See fromRequest() documentation.
-
- HTTPAuthenticationParams(const HTTPResponse& response, const std::string& header = WWW_AUTHENTICATE);
- /// See fromResponse() documentation.
-
- virtual ~HTTPAuthenticationParams();
- /// Destroys the HTTPAuthenticationParams.
-
- HTTPAuthenticationParams& operator = (const HTTPAuthenticationParams& authParams);
- /// Assigns the content of another HTTPAuthenticationParams.
-
- void fromAuthInfo(const std::string& authInfo);
- /// Creates an HTTPAuthenticationParams by parsing authentication
- /// information.
-
- void fromRequest(const HTTPRequest& request);
- /// Extracts authentication information from the request and creates
- /// HTTPAuthenticationParams by parsing it.
- ///
- /// Throws a NotAuthenticatedException if no authentication
- /// information is contained in request.
- /// Throws a InvalidArgumentException if authentication scheme is
- /// unknown or invalid.
-
- void fromResponse(const HTTPResponse& response, const std::string& header = WWW_AUTHENTICATE);
- /// Extracts authentication information from the response and creates
- /// HTTPAuthenticationParams by parsing it.
- ///
- /// Throws a NotAuthenticatedException if no authentication
- /// information is contained in response.
- /// Throws a InvalidArgumentException if authentication scheme is
- /// unknown or invalid.
-
- void setRealm(const std::string& realm);
- /// Sets the "realm" parameter to the provided string.
-
- const std::string& getRealm() const;
- /// Returns value of the "realm" parameter.
- ///
- /// Throws NotFoundException is there is no "realm" set in the
- /// HTTPAuthenticationParams.
-
- std::string toString() const;
- /// Formats the HTTPAuthenticationParams for inclusion in HTTP
- /// request or response authentication header.
-
- static const std::string REALM;
- static const std::string WWW_AUTHENTICATE;
- static const std::string PROXY_AUTHENTICATE;
-
-private:
- void parse(std::string::const_iterator first, std::string::const_iterator last);
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_HTTPAuthenticationParams_INCLUDED
+//
+// HTTPAuthenticationParams.h
+//
+// Library: Net
+// Package: HTTP
+// Module: HTTPAuthenticationParams
+//
+// Definition of the HTTPAuthenticationParams class.
+//
+// Copyright (c) 2011, Anton V. Yabchinskiy (arn at bestmx dot ru).
+// Copyright (c) 2012, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_HTTPAuthenticationParams_INCLUDED
+#define Net_HTTPAuthenticationParams_INCLUDED
+
+
+#include "Poco/Net/NameValueCollection.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class HTTPRequest;
+class HTTPResponse;
+
+
+class Net_API HTTPAuthenticationParams: public NameValueCollection
+ /// Collection of name-value pairs of HTTP authentication header (i.e.
+ /// "realm", "qop", "nonce" in case of digest authentication header).
+{
+public:
+ HTTPAuthenticationParams();
+ /// Creates an empty authentication parameters collection.
+
+ explicit HTTPAuthenticationParams(const std::string& authInfo);
+ /// See fromAuthInfo() documentation.
+
+ explicit HTTPAuthenticationParams(const HTTPRequest& request);
+ /// See fromRequest() documentation.
+
+ HTTPAuthenticationParams(const HTTPResponse& response, const std::string& header = WWW_AUTHENTICATE);
+ /// See fromResponse() documentation.
+
+ virtual ~HTTPAuthenticationParams();
+ /// Destroys the HTTPAuthenticationParams.
+
+ HTTPAuthenticationParams& operator = (const HTTPAuthenticationParams& authParams);
+ /// Assigns the content of another HTTPAuthenticationParams.
+
+ void fromAuthInfo(const std::string& authInfo);
+ /// Creates an HTTPAuthenticationParams by parsing authentication
+ /// information.
+
+ void fromRequest(const HTTPRequest& request);
+ /// Extracts authentication information from the request and creates
+ /// HTTPAuthenticationParams by parsing it.
+ ///
+ /// Throws a NotAuthenticatedException if no authentication
+ /// information is contained in request.
+ /// Throws a InvalidArgumentException if authentication scheme is
+ /// unknown or invalid.
+
+ void fromResponse(const HTTPResponse& response, const std::string& header = WWW_AUTHENTICATE);
+ /// Extracts authentication information from the response and creates
+ /// HTTPAuthenticationParams by parsing it.
+ ///
+ /// Throws a NotAuthenticatedException if no authentication
+ /// information is contained in response.
+ /// Throws a InvalidArgumentException if authentication scheme is
+ /// unknown or invalid.
+
+ void setRealm(const std::string& realm);
+ /// Sets the "realm" parameter to the provided string.
+
+ const std::string& getRealm() const;
+ /// Returns value of the "realm" parameter.
+ ///
+ /// Throws NotFoundException is there is no "realm" set in the
+ /// HTTPAuthenticationParams.
+
+ std::string toString() const;
+ /// Formats the HTTPAuthenticationParams for inclusion in HTTP
+ /// request or response authentication header.
+
+ static const std::string REALM;
+ static const std::string WWW_AUTHENTICATE;
+ static const std::string PROXY_AUTHENTICATE;
+
+private:
+ void parse(std::string::const_iterator first, std::string::const_iterator last);
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_HTTPAuthenticationParams_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/HTTPBasicCredentials.h b/contrib/libs/poco/Net/include/Poco/Net/HTTPBasicCredentials.h
index bb1eae3300..56894db8ca 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/HTTPBasicCredentials.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/HTTPBasicCredentials.h
@@ -1,123 +1,123 @@
-//
-// HTTPBasicCredentials.h
-//
-// Library: Net
-// Package: HTTP
-// Module: HTTPBasicCredentials
-//
-// Definition of the HTTPBasicCredentials class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_HTTPBasicCredentials_INCLUDED
-#define Net_HTTPBasicCredentials_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class HTTPRequest;
-
-
-class Net_API HTTPBasicCredentials
- /// This is a utility class for working with
- /// HTTP Basic Authentication in HTTPRequest
- /// objects.
-{
-public:
- HTTPBasicCredentials();
- /// Creates an empty HTTPBasicCredentials object.
-
- HTTPBasicCredentials(const std::string& username, const std::string& password);
- /// Creates a HTTPBasicCredentials object with the given username and password.
-
- explicit HTTPBasicCredentials(const HTTPRequest& request);
- /// Creates a HTTPBasicCredentials object with the authentication information
- /// from the given request.
- ///
- /// Throws a NotAuthenticatedException if the request does
- /// not contain basic authentication information.
-
- explicit HTTPBasicCredentials(const std::string& authInfo);
- /// Creates a HTTPBasicCredentials object with the authentication information
- /// in the given string. The authentication information can be extracted
- /// from a HTTPRequest object by calling HTTPRequest::getCredentials().
-
- ~HTTPBasicCredentials();
- /// Destroys the HTTPBasicCredentials.
-
- void clear();
- /// Clears both username and password.
-
- void setUsername(const std::string& username);
- /// Sets the username.
-
- const std::string& getUsername() const;
- /// Returns the username.
-
- void setPassword(const std::string& password);
- /// Sets the password.
-
- const std::string& getPassword() const;
- /// Returns the password.
-
- bool empty() const;
- /// Returns true if both username and password are empty, otherwise false.
-
- void authenticate(HTTPRequest& request) const;
- /// Adds authentication information to the given HTTPRequest.
-
- void proxyAuthenticate(HTTPRequest& request) const;
- /// Adds proxy authentication information to the given HTTPRequest.
-
- static const std::string SCHEME;
-
-protected:
- void parseAuthInfo(const std::string& authInfo);
- /// Extracts username and password from Basic authentication info
- /// by base64-decoding authInfo and splitting the resulting
- /// string at the ':' delimiter.
-
-private:
- HTTPBasicCredentials(const HTTPBasicCredentials&);
- HTTPBasicCredentials& operator = (const HTTPBasicCredentials&);
-
- std::string _username;
- std::string _password;
-};
-
-
-//
-// inlines
-//
-inline const std::string& HTTPBasicCredentials::getUsername() const
-{
- return _username;
-}
-
-
-inline const std::string& HTTPBasicCredentials::getPassword() const
-{
- return _password;
-}
-
-
-inline bool HTTPBasicCredentials::empty() const
-{
- return _username.empty() && _password.empty();
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_HTTPBasicCredentials_INCLUDED
+//
+// HTTPBasicCredentials.h
+//
+// Library: Net
+// Package: HTTP
+// Module: HTTPBasicCredentials
+//
+// Definition of the HTTPBasicCredentials class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_HTTPBasicCredentials_INCLUDED
+#define Net_HTTPBasicCredentials_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class HTTPRequest;
+
+
+class Net_API HTTPBasicCredentials
+ /// This is a utility class for working with
+ /// HTTP Basic Authentication in HTTPRequest
+ /// objects.
+{
+public:
+ HTTPBasicCredentials();
+ /// Creates an empty HTTPBasicCredentials object.
+
+ HTTPBasicCredentials(const std::string& username, const std::string& password);
+ /// Creates a HTTPBasicCredentials object with the given username and password.
+
+ explicit HTTPBasicCredentials(const HTTPRequest& request);
+ /// Creates a HTTPBasicCredentials object with the authentication information
+ /// from the given request.
+ ///
+ /// Throws a NotAuthenticatedException if the request does
+ /// not contain basic authentication information.
+
+ explicit HTTPBasicCredentials(const std::string& authInfo);
+ /// Creates a HTTPBasicCredentials object with the authentication information
+ /// in the given string. The authentication information can be extracted
+ /// from a HTTPRequest object by calling HTTPRequest::getCredentials().
+
+ ~HTTPBasicCredentials();
+ /// Destroys the HTTPBasicCredentials.
+
+ void clear();
+ /// Clears both username and password.
+
+ void setUsername(const std::string& username);
+ /// Sets the username.
+
+ const std::string& getUsername() const;
+ /// Returns the username.
+
+ void setPassword(const std::string& password);
+ /// Sets the password.
+
+ const std::string& getPassword() const;
+ /// Returns the password.
+
+ bool empty() const;
+ /// Returns true if both username and password are empty, otherwise false.
+
+ void authenticate(HTTPRequest& request) const;
+ /// Adds authentication information to the given HTTPRequest.
+
+ void proxyAuthenticate(HTTPRequest& request) const;
+ /// Adds proxy authentication information to the given HTTPRequest.
+
+ static const std::string SCHEME;
+
+protected:
+ void parseAuthInfo(const std::string& authInfo);
+ /// Extracts username and password from Basic authentication info
+ /// by base64-decoding authInfo and splitting the resulting
+ /// string at the ':' delimiter.
+
+private:
+ HTTPBasicCredentials(const HTTPBasicCredentials&);
+ HTTPBasicCredentials& operator = (const HTTPBasicCredentials&);
+
+ std::string _username;
+ std::string _password;
+};
+
+
+//
+// inlines
+//
+inline const std::string& HTTPBasicCredentials::getUsername() const
+{
+ return _username;
+}
+
+
+inline const std::string& HTTPBasicCredentials::getPassword() const
+{
+ return _password;
+}
+
+
+inline bool HTTPBasicCredentials::empty() const
+{
+ return _username.empty() && _password.empty();
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_HTTPBasicCredentials_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/HTTPBasicStreamBuf.h b/contrib/libs/poco/Net/include/Poco/Net/HTTPBasicStreamBuf.h
index 5ea5626750..0edbec3298 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/HTTPBasicStreamBuf.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/HTTPBasicStreamBuf.h
@@ -1,36 +1,36 @@
-//
-// HTTPBasicStreamBuf.h
-//
-// Library: Net
-// Package: HTTP
-// Module: HTTPBasicStreamBuf
-//
-// Definition of the HTTPBasicStreamBuf class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_HTTPBasicStreamBuf_INCLUDED
-#define Net_HTTPBasicStreamBuf_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/BufferedStreamBuf.h"
-#include "Poco/Net/HTTPBufferAllocator.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-typedef Poco::BasicBufferedStreamBuf<char, std::char_traits<char>, HTTPBufferAllocator> HTTPBasicStreamBuf;
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_HTTPBasicStreamBuf_INCLUDED
+//
+// HTTPBasicStreamBuf.h
+//
+// Library: Net
+// Package: HTTP
+// Module: HTTPBasicStreamBuf
+//
+// Definition of the HTTPBasicStreamBuf class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_HTTPBasicStreamBuf_INCLUDED
+#define Net_HTTPBasicStreamBuf_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/BufferedStreamBuf.h"
+#include "Poco/Net/HTTPBufferAllocator.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+typedef Poco::BasicBufferedStreamBuf<char, std::char_traits<char>, HTTPBufferAllocator> HTTPBasicStreamBuf;
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_HTTPBasicStreamBuf_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/HTTPBufferAllocator.h b/contrib/libs/poco/Net/include/Poco/Net/HTTPBufferAllocator.h
index 05bc642ae2..ce2039aeaa 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/HTTPBufferAllocator.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/HTTPBufferAllocator.h
@@ -1,50 +1,50 @@
-//
-// HTTPBufferAllocator.h
-//
-// Library: Net
-// Package: HTTP
-// Module: HTTPBufferAllocator
-//
-// Definition of the HTTPBufferAllocator class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_HTTPBufferAllocator_INCLUDED
-#define Net_HTTPBufferAllocator_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/MemoryPool.h"
-#include <ios>
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API HTTPBufferAllocator
- /// A BufferAllocator for HTTP streams.
-{
-public:
- static char* allocate(std::streamsize size);
- static void deallocate(char* ptr, std::streamsize size);
-
- enum
- {
- BUFFER_SIZE = 4096
- };
-
-private:
- static Poco::MemoryPool _pool;
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_HTTPBufferAllocator_INCLUDED
+//
+// HTTPBufferAllocator.h
+//
+// Library: Net
+// Package: HTTP
+// Module: HTTPBufferAllocator
+//
+// Definition of the HTTPBufferAllocator class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_HTTPBufferAllocator_INCLUDED
+#define Net_HTTPBufferAllocator_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/MemoryPool.h"
+#include <ios>
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API HTTPBufferAllocator
+ /// A BufferAllocator for HTTP streams.
+{
+public:
+ static char* allocate(std::streamsize size);
+ static void deallocate(char* ptr, std::streamsize size);
+
+ enum
+ {
+ BUFFER_SIZE = 4096
+ };
+
+private:
+ static Poco::MemoryPool _pool;
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_HTTPBufferAllocator_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/HTTPChunkedStream.h b/contrib/libs/poco/Net/include/Poco/Net/HTTPChunkedStream.h
index d9dfe11d15..7e140ed586 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/HTTPChunkedStream.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/HTTPChunkedStream.h
@@ -1,105 +1,105 @@
-//
-// HTTPChunkedStream.h
-//
-// Library: Net
-// Package: HTTP
-// Module: HTTPChunkedStream
-//
-// Definition of the HTTPChunkedStream class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_HTTPChunkedStream_INCLUDED
-#define Net_HTTPChunkedStream_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/HTTPBasicStreamBuf.h"
-#include "Poco/MemoryPool.h"
-#include <cstddef>
-#include <istream>
-#include <ostream>
-
-
-namespace Poco {
-namespace Net {
-
-
-class HTTPSession;
-
-
-class Net_API HTTPChunkedStreamBuf: public HTTPBasicStreamBuf
- /// This is the streambuf class used for reading and writing
- /// HTTP message bodies in chunked transfer coding.
-{
-public:
- typedef HTTPBasicStreamBuf::openmode openmode;
-
- HTTPChunkedStreamBuf(HTTPSession& session, openmode mode);
- ~HTTPChunkedStreamBuf();
- void close();
-
-protected:
- int readFromDevice(char* buffer, std::streamsize length);
- int writeToDevice(const char* buffer, std::streamsize length);
-
-private:
- HTTPSession& _session;
- openmode _mode;
- std::streamsize _chunk;
- std::string _chunkBuffer;
-};
-
-
-class Net_API HTTPChunkedIOS: public virtual std::ios
- /// The base class for HTTPInputStream.
-{
-public:
- HTTPChunkedIOS(HTTPSession& session, HTTPChunkedStreamBuf::openmode mode);
- ~HTTPChunkedIOS();
- HTTPChunkedStreamBuf* rdbuf();
-
-protected:
- HTTPChunkedStreamBuf _buf;
-};
-
-
-class Net_API HTTPChunkedInputStream: public HTTPChunkedIOS, public std::istream
- /// This class is for internal use by HTTPSession only.
-{
-public:
- HTTPChunkedInputStream(HTTPSession& session);
- ~HTTPChunkedInputStream();
-
- void* operator new(std::size_t size);
- void operator delete(void* ptr);
-
-private:
- static Poco::MemoryPool _pool;
-};
-
-
-class Net_API HTTPChunkedOutputStream: public HTTPChunkedIOS, public std::ostream
- /// This class is for internal use by HTTPSession only.
-{
-public:
- HTTPChunkedOutputStream(HTTPSession& session);
- ~HTTPChunkedOutputStream();
-
- void* operator new(std::size_t size);
- void operator delete(void* ptr);
-
-private:
- static Poco::MemoryPool _pool;
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_HTTPChunkedStream_INCLUDED
+//
+// HTTPChunkedStream.h
+//
+// Library: Net
+// Package: HTTP
+// Module: HTTPChunkedStream
+//
+// Definition of the HTTPChunkedStream class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_HTTPChunkedStream_INCLUDED
+#define Net_HTTPChunkedStream_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/HTTPBasicStreamBuf.h"
+#include "Poco/MemoryPool.h"
+#include <cstddef>
+#include <istream>
+#include <ostream>
+
+
+namespace Poco {
+namespace Net {
+
+
+class HTTPSession;
+
+
+class Net_API HTTPChunkedStreamBuf: public HTTPBasicStreamBuf
+ /// This is the streambuf class used for reading and writing
+ /// HTTP message bodies in chunked transfer coding.
+{
+public:
+ typedef HTTPBasicStreamBuf::openmode openmode;
+
+ HTTPChunkedStreamBuf(HTTPSession& session, openmode mode);
+ ~HTTPChunkedStreamBuf();
+ void close();
+
+protected:
+ int readFromDevice(char* buffer, std::streamsize length);
+ int writeToDevice(const char* buffer, std::streamsize length);
+
+private:
+ HTTPSession& _session;
+ openmode _mode;
+ std::streamsize _chunk;
+ std::string _chunkBuffer;
+};
+
+
+class Net_API HTTPChunkedIOS: public virtual std::ios
+ /// The base class for HTTPInputStream.
+{
+public:
+ HTTPChunkedIOS(HTTPSession& session, HTTPChunkedStreamBuf::openmode mode);
+ ~HTTPChunkedIOS();
+ HTTPChunkedStreamBuf* rdbuf();
+
+protected:
+ HTTPChunkedStreamBuf _buf;
+};
+
+
+class Net_API HTTPChunkedInputStream: public HTTPChunkedIOS, public std::istream
+ /// This class is for internal use by HTTPSession only.
+{
+public:
+ HTTPChunkedInputStream(HTTPSession& session);
+ ~HTTPChunkedInputStream();
+
+ void* operator new(std::size_t size);
+ void operator delete(void* ptr);
+
+private:
+ static Poco::MemoryPool _pool;
+};
+
+
+class Net_API HTTPChunkedOutputStream: public HTTPChunkedIOS, public std::ostream
+ /// This class is for internal use by HTTPSession only.
+{
+public:
+ HTTPChunkedOutputStream(HTTPSession& session);
+ ~HTTPChunkedOutputStream();
+
+ void* operator new(std::size_t size);
+ void operator delete(void* ptr);
+
+private:
+ static Poco::MemoryPool _pool;
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_HTTPChunkedStream_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/HTTPClientSession.h b/contrib/libs/poco/Net/include/Poco/Net/HTTPClientSession.h
index b48facd7e5..2f2e21c599 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/HTTPClientSession.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/HTTPClientSession.h
@@ -1,391 +1,391 @@
-//
-// HTTPClientSession.h
-//
-// Library: Net
-// Package: HTTPClient
-// Module: HTTPClientSession
-//
-// Definition of the HTTPClientSession class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_HTTPClientSession_INCLUDED
-#define Net_HTTPClientSession_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/HTTPSession.h"
-#include "Poco/Net/SocketAddress.h"
-#include "Poco/SharedPtr.h"
-#include <istream>
-#include <ostream>
-
-
-namespace Poco {
-namespace Net {
-
-
-class HTTPRequest;
-class HTTPResponse;
-
-
-class Net_API HTTPClientSession: public HTTPSession
- /// This class implements the client-side of
- /// a HTTP session.
- ///
- /// To send a HTTP request to a HTTP server, first
- /// instantiate a HTTPClientSession object and
- /// specify the server's host name and port number.
- ///
- /// Then create a HTTPRequest object, fill it accordingly,
- /// and pass it as argument to the sendRequest() method.
- ///
- /// sendRequest() will return an output stream that can
- /// be used to send the request body, if there is any.
- ///
- /// After you are done sending the request body, create
- /// a HTTPResponse object and pass it to receiveResponse().
- ///
- /// This will return an input stream that can be used to
- /// read the response body.
- ///
- /// See RFC 2616 <http://www.faqs.org/rfcs/rfc2616.html> for more
- /// information about the HTTP protocol.
- ///
- /// Proxies and proxy authorization (only HTTP Basic Authorization)
- /// is supported. Use setProxy() and setProxyCredentials() to
- /// set up a session through a proxy.
-{
-public:
- struct ProxyConfig
- /// HTTP proxy server configuration.
- {
- ProxyConfig():
- port(HTTP_PORT)
- {
- }
-
- std::string host;
- /// Proxy server host name or IP address.
- Poco::UInt16 port;
- /// Proxy server TCP port.
- std::string username;
- /// Proxy server username.
- std::string password;
- /// Proxy server password.
- std::string nonProxyHosts;
- /// A regular expression defining hosts for which the proxy should be bypassed,
- /// e.g. "localhost|127\.0\.0\.1|192\.168\.0\.\d+". Can also be an empty
- /// string to disable proxy bypassing.
- };
-
- HTTPClientSession();
- /// Creates an unconnected HTTPClientSession.
-
- explicit HTTPClientSession(const StreamSocket& socket);
- /// Creates a HTTPClientSession using the given socket.
- /// The socket must not be connected. The session
- /// takes ownership of the socket.
-
- explicit HTTPClientSession(const SocketAddress& address);
- /// Creates a HTTPClientSession using the given address.
-
- HTTPClientSession(const std::string& host, Poco::UInt16 port = HTTPSession::HTTP_PORT);
- /// Creates a HTTPClientSession using the given host and port.
-
- HTTPClientSession(const std::string& host, Poco::UInt16 port, const ProxyConfig& proxyConfig);
- /// Creates a HTTPClientSession using the given host, port and proxy configuration.
-
- virtual ~HTTPClientSession();
- /// Destroys the HTTPClientSession and closes
- /// the underlying socket.
-
- void setHost(const std::string& host);
- /// Sets the host name of the target HTTP server.
- ///
- /// The host must not be changed once there is an
- /// open connection to the server.
-
- const std::string& getHost() const;
- /// Returns the host name of the target HTTP server.
-
- void setPort(Poco::UInt16 port);
- /// Sets the port number of the target HTTP server.
- ///
- /// The port number must not be changed once there is an
- /// open connection to the server.
-
- Poco::UInt16 getPort() const;
- /// Returns the port number of the target HTTP server.
-
- void setProxy(const std::string& host, Poco::UInt16 port = HTTPSession::HTTP_PORT);
- /// Sets the proxy host name and port number.
-
- void setProxyHost(const std::string& host);
- /// Sets the host name of the proxy server.
-
- void setProxyPort(Poco::UInt16 port);
- /// Sets the port number of the proxy server.
-
- const std::string& getProxyHost() const;
- /// Returns the proxy host name.
-
- Poco::UInt16 getProxyPort() const;
- /// Returns the proxy port number.
-
- void setProxyCredentials(const std::string& username, const std::string& password);
- /// Sets the username and password for proxy authentication.
- /// Only Basic authentication is supported.
-
- void setProxyUsername(const std::string& username);
- /// Sets the username for proxy authentication.
- /// Only Basic authentication is supported.
-
- const std::string& getProxyUsername() const;
- /// Returns the username for proxy authentication.
-
- void setProxyPassword(const std::string& password);
- /// Sets the password for proxy authentication.
- /// Only Basic authentication is supported.
-
- const std::string& getProxyPassword() const;
- /// Returns the password for proxy authentication.
-
- void setProxyConfig(const ProxyConfig& config);
- /// Sets the proxy configuration.
-
- const ProxyConfig& getProxyConfig() const;
- /// Returns the proxy configuration.
-
- static void setGlobalProxyConfig(const ProxyConfig& config);
- /// Sets the global proxy configuration.
- ///
- /// The global proxy configuration is used by all HTTPClientSession
- /// instances, unless a different proxy configuration is explicitly set.
- ///
- /// Warning: Setting the global proxy configuration is not thread safe.
- /// The global proxy configuration should be set at start up, before
- /// the first HTTPClientSession instance is created.
-
- static const ProxyConfig& getGlobalProxyConfig();
- /// Returns the global proxy configuration.
-
- void setKeepAliveTimeout(const Poco::Timespan& timeout);
- /// Sets the connection timeout for HTTP connections.
-
- const Poco::Timespan& getKeepAliveTimeout() const;
- /// Returns the connection timeout for HTTP connections.
-
- virtual std::ostream& sendRequest(HTTPRequest& request);
- /// Sends the header for the given HTTP request to
- /// the server.
- ///
- /// The HTTPClientSession will set the request's
- /// Host and Keep-Alive headers accordingly.
- ///
- /// The returned output stream can be used to write
- /// the request body. The stream is valid until
- /// receiveResponse() is called or the session
- /// is destroyed.
- ///
- /// In case a network or server failure happens
- /// while writing the request body to the returned stream,
- /// the stream state will change to bad or fail. In this
- /// case, reset() should be called if the session will
- /// be reused and persistent connections are enabled
- /// to ensure a new connection will be set up
- /// for the next request.
-
- virtual std::istream& receiveResponse(HTTPResponse& response);
- /// Receives the header for the response to the previous
- /// HTTP request.
- ///
- /// The returned input stream can be used to read
- /// the response body. The stream is valid until
- /// sendRequest() is called or the session is
- /// destroyed.
- ///
- /// It must be ensured that the response stream
- /// is fully consumed before sending a new request
- /// and persistent connections are enabled. Otherwise,
- /// the unread part of the response body may be treated as
- /// part of the next request's response header, resulting
- /// in a Poco::Net::MessageException being thrown.
- ///
- /// In case a network or server failure happens
- /// while reading the response body from the returned stream,
- /// the stream state will change to bad or fail. In this
- /// case, reset() should be called if the session will
- /// be reused and persistent connections are enabled
- /// to ensure a new connection will be set up
- /// for the next request.
-
- virtual bool peekResponse(HTTPResponse& response);
- /// If the request contains a "Expect: 100-continue" header,
- /// (see HTTPRequest::setExpectContinue()) this method can be
- /// used to check whether the server has sent a 100 Continue response
- /// before continuing with the request, i.e. sending the request body,
- /// after calling sendRequest().
- ///
- /// Returns true if the server has responded with 100 Continue,
- /// otherwise false. The HTTPResponse object contains the
- /// response sent by the server.
- ///
- /// In any case, receiveResponse() must be called afterwards as well in
- /// order to complete the request. The same HTTPResponse object
- /// passed to peekResponse() must also be passed to receiveResponse().
- ///
- /// This method should only be called if the request contains
- /// a "Expect: 100-continue" header.
-
- void flushRequest();
- /// Flushes the request stream.
- ///
- /// Normally this method does not need to be called.
- /// It can be used to ensure the request has been
- /// fully sent if receiveResponse() is not called, e.g.,
- /// because the underlying socket will be detached.
-
- void reset();
- /// Resets the session and closes the socket.
- ///
- /// The next request will initiate a new connection,
- /// even if persistent connections are enabled.
- ///
- /// This should be called whenever something went
- /// wrong when sending a request (e.g., sendRequest()
- /// or receiveResponse() throws an exception, or
- /// the request or response stream changes into
- /// fail or bad state, but not eof state).
-
- virtual bool secure() const;
- /// Return true iff the session uses SSL or TLS,
- /// or false otherwise.
-
- bool bypassProxy() const;
- /// Returns true if the proxy should be bypassed
- /// for the current host.
-
-protected:
- enum
- {
- DEFAULT_KEEP_ALIVE_TIMEOUT = 8
- };
-
- void reconnect();
- /// Connects the underlying socket to the HTTP server.
-
- int write(const char* buffer, std::streamsize length);
- /// Tries to re-connect if keep-alive is on.
-
- virtual std::string proxyRequestPrefix() const;
- /// Returns the prefix prepended to the URI for proxy requests
- /// (e.g., "http://myhost.com").
-
- virtual bool mustReconnect() const;
- /// Checks if we can reuse a persistent connection.
-
- virtual void proxyAuthenticate(HTTPRequest& request);
- /// Sets the proxy credentials (Proxy-Authorization header), if
- /// proxy username and password have been set.
-
- void proxyAuthenticateImpl(HTTPRequest& request);
- /// Sets the proxy credentials (Proxy-Authorization header), if
- /// proxy username and password have been set.
-
- StreamSocket proxyConnect();
- /// Sends a CONNECT request to the proxy server and returns
- /// a StreamSocket for the resulting connection.
-
- void proxyTunnel();
- /// Calls proxyConnect() and attaches the resulting StreamSocket
- /// to the HTTPClientSession.
-
-private:
- std::string _host;
- Poco::UInt16 _port;
- ProxyConfig _proxyConfig;
- Poco::Timespan _keepAliveTimeout;
- Poco::Timestamp _lastRequest;
- bool _reconnect;
- bool _mustReconnect;
- bool _expectResponseBody;
- bool _responseReceived;
- Poco::SharedPtr<std::ostream> _pRequestStream;
- Poco::SharedPtr<std::istream> _pResponseStream;
-
- static ProxyConfig _globalProxyConfig;
-
- HTTPClientSession(const HTTPClientSession&);
- HTTPClientSession& operator = (const HTTPClientSession&);
-
- friend class WebSocket;
-};
-
-
-//
-// inlines
-//
-inline const std::string& HTTPClientSession::getHost() const
-{
- return _host;
-}
-
-
-inline Poco::UInt16 HTTPClientSession::getPort() const
-{
- return _port;
-}
-
-
-inline const std::string& HTTPClientSession::getProxyHost() const
-{
- return _proxyConfig.host;
-}
-
-
-inline Poco::UInt16 HTTPClientSession::getProxyPort() const
-{
- return _proxyConfig.port;
-}
-
-
-inline const std::string& HTTPClientSession::getProxyUsername() const
-{
- return _proxyConfig.username;
-}
-
-
-inline const std::string& HTTPClientSession::getProxyPassword() const
-{
- return _proxyConfig.password;
-}
-
-
-inline const HTTPClientSession::ProxyConfig& HTTPClientSession::getProxyConfig() const
-{
- return _proxyConfig;
-}
-
-
-inline const HTTPClientSession::ProxyConfig& HTTPClientSession::getGlobalProxyConfig()
-{
- return _globalProxyConfig;
-}
-
-
-inline const Poco::Timespan& HTTPClientSession::getKeepAliveTimeout() const
-{
- return _keepAliveTimeout;
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_HTTPClientSession_INCLUDED
+//
+// HTTPClientSession.h
+//
+// Library: Net
+// Package: HTTPClient
+// Module: HTTPClientSession
+//
+// Definition of the HTTPClientSession class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_HTTPClientSession_INCLUDED
+#define Net_HTTPClientSession_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/HTTPSession.h"
+#include "Poco/Net/SocketAddress.h"
+#include "Poco/SharedPtr.h"
+#include <istream>
+#include <ostream>
+
+
+namespace Poco {
+namespace Net {
+
+
+class HTTPRequest;
+class HTTPResponse;
+
+
+class Net_API HTTPClientSession: public HTTPSession
+ /// This class implements the client-side of
+ /// a HTTP session.
+ ///
+ /// To send a HTTP request to a HTTP server, first
+ /// instantiate a HTTPClientSession object and
+ /// specify the server's host name and port number.
+ ///
+ /// Then create a HTTPRequest object, fill it accordingly,
+ /// and pass it as argument to the sendRequest() method.
+ ///
+ /// sendRequest() will return an output stream that can
+ /// be used to send the request body, if there is any.
+ ///
+ /// After you are done sending the request body, create
+ /// a HTTPResponse object and pass it to receiveResponse().
+ ///
+ /// This will return an input stream that can be used to
+ /// read the response body.
+ ///
+ /// See RFC 2616 <http://www.faqs.org/rfcs/rfc2616.html> for more
+ /// information about the HTTP protocol.
+ ///
+ /// Proxies and proxy authorization (only HTTP Basic Authorization)
+ /// is supported. Use setProxy() and setProxyCredentials() to
+ /// set up a session through a proxy.
+{
+public:
+ struct ProxyConfig
+ /// HTTP proxy server configuration.
+ {
+ ProxyConfig():
+ port(HTTP_PORT)
+ {
+ }
+
+ std::string host;
+ /// Proxy server host name or IP address.
+ Poco::UInt16 port;
+ /// Proxy server TCP port.
+ std::string username;
+ /// Proxy server username.
+ std::string password;
+ /// Proxy server password.
+ std::string nonProxyHosts;
+ /// A regular expression defining hosts for which the proxy should be bypassed,
+ /// e.g. "localhost|127\.0\.0\.1|192\.168\.0\.\d+". Can also be an empty
+ /// string to disable proxy bypassing.
+ };
+
+ HTTPClientSession();
+ /// Creates an unconnected HTTPClientSession.
+
+ explicit HTTPClientSession(const StreamSocket& socket);
+ /// Creates a HTTPClientSession using the given socket.
+ /// The socket must not be connected. The session
+ /// takes ownership of the socket.
+
+ explicit HTTPClientSession(const SocketAddress& address);
+ /// Creates a HTTPClientSession using the given address.
+
+ HTTPClientSession(const std::string& host, Poco::UInt16 port = HTTPSession::HTTP_PORT);
+ /// Creates a HTTPClientSession using the given host and port.
+
+ HTTPClientSession(const std::string& host, Poco::UInt16 port, const ProxyConfig& proxyConfig);
+ /// Creates a HTTPClientSession using the given host, port and proxy configuration.
+
+ virtual ~HTTPClientSession();
+ /// Destroys the HTTPClientSession and closes
+ /// the underlying socket.
+
+ void setHost(const std::string& host);
+ /// Sets the host name of the target HTTP server.
+ ///
+ /// The host must not be changed once there is an
+ /// open connection to the server.
+
+ const std::string& getHost() const;
+ /// Returns the host name of the target HTTP server.
+
+ void setPort(Poco::UInt16 port);
+ /// Sets the port number of the target HTTP server.
+ ///
+ /// The port number must not be changed once there is an
+ /// open connection to the server.
+
+ Poco::UInt16 getPort() const;
+ /// Returns the port number of the target HTTP server.
+
+ void setProxy(const std::string& host, Poco::UInt16 port = HTTPSession::HTTP_PORT);
+ /// Sets the proxy host name and port number.
+
+ void setProxyHost(const std::string& host);
+ /// Sets the host name of the proxy server.
+
+ void setProxyPort(Poco::UInt16 port);
+ /// Sets the port number of the proxy server.
+
+ const std::string& getProxyHost() const;
+ /// Returns the proxy host name.
+
+ Poco::UInt16 getProxyPort() const;
+ /// Returns the proxy port number.
+
+ void setProxyCredentials(const std::string& username, const std::string& password);
+ /// Sets the username and password for proxy authentication.
+ /// Only Basic authentication is supported.
+
+ void setProxyUsername(const std::string& username);
+ /// Sets the username for proxy authentication.
+ /// Only Basic authentication is supported.
+
+ const std::string& getProxyUsername() const;
+ /// Returns the username for proxy authentication.
+
+ void setProxyPassword(const std::string& password);
+ /// Sets the password for proxy authentication.
+ /// Only Basic authentication is supported.
+
+ const std::string& getProxyPassword() const;
+ /// Returns the password for proxy authentication.
+
+ void setProxyConfig(const ProxyConfig& config);
+ /// Sets the proxy configuration.
+
+ const ProxyConfig& getProxyConfig() const;
+ /// Returns the proxy configuration.
+
+ static void setGlobalProxyConfig(const ProxyConfig& config);
+ /// Sets the global proxy configuration.
+ ///
+ /// The global proxy configuration is used by all HTTPClientSession
+ /// instances, unless a different proxy configuration is explicitly set.
+ ///
+ /// Warning: Setting the global proxy configuration is not thread safe.
+ /// The global proxy configuration should be set at start up, before
+ /// the first HTTPClientSession instance is created.
+
+ static const ProxyConfig& getGlobalProxyConfig();
+ /// Returns the global proxy configuration.
+
+ void setKeepAliveTimeout(const Poco::Timespan& timeout);
+ /// Sets the connection timeout for HTTP connections.
+
+ const Poco::Timespan& getKeepAliveTimeout() const;
+ /// Returns the connection timeout for HTTP connections.
+
+ virtual std::ostream& sendRequest(HTTPRequest& request);
+ /// Sends the header for the given HTTP request to
+ /// the server.
+ ///
+ /// The HTTPClientSession will set the request's
+ /// Host and Keep-Alive headers accordingly.
+ ///
+ /// The returned output stream can be used to write
+ /// the request body. The stream is valid until
+ /// receiveResponse() is called or the session
+ /// is destroyed.
+ ///
+ /// In case a network or server failure happens
+ /// while writing the request body to the returned stream,
+ /// the stream state will change to bad or fail. In this
+ /// case, reset() should be called if the session will
+ /// be reused and persistent connections are enabled
+ /// to ensure a new connection will be set up
+ /// for the next request.
+
+ virtual std::istream& receiveResponse(HTTPResponse& response);
+ /// Receives the header for the response to the previous
+ /// HTTP request.
+ ///
+ /// The returned input stream can be used to read
+ /// the response body. The stream is valid until
+ /// sendRequest() is called or the session is
+ /// destroyed.
+ ///
+ /// It must be ensured that the response stream
+ /// is fully consumed before sending a new request
+ /// and persistent connections are enabled. Otherwise,
+ /// the unread part of the response body may be treated as
+ /// part of the next request's response header, resulting
+ /// in a Poco::Net::MessageException being thrown.
+ ///
+ /// In case a network or server failure happens
+ /// while reading the response body from the returned stream,
+ /// the stream state will change to bad or fail. In this
+ /// case, reset() should be called if the session will
+ /// be reused and persistent connections are enabled
+ /// to ensure a new connection will be set up
+ /// for the next request.
+
+ virtual bool peekResponse(HTTPResponse& response);
+ /// If the request contains a "Expect: 100-continue" header,
+ /// (see HTTPRequest::setExpectContinue()) this method can be
+ /// used to check whether the server has sent a 100 Continue response
+ /// before continuing with the request, i.e. sending the request body,
+ /// after calling sendRequest().
+ ///
+ /// Returns true if the server has responded with 100 Continue,
+ /// otherwise false. The HTTPResponse object contains the
+ /// response sent by the server.
+ ///
+ /// In any case, receiveResponse() must be called afterwards as well in
+ /// order to complete the request. The same HTTPResponse object
+ /// passed to peekResponse() must also be passed to receiveResponse().
+ ///
+ /// This method should only be called if the request contains
+ /// a "Expect: 100-continue" header.
+
+ void flushRequest();
+ /// Flushes the request stream.
+ ///
+ /// Normally this method does not need to be called.
+ /// It can be used to ensure the request has been
+ /// fully sent if receiveResponse() is not called, e.g.,
+ /// because the underlying socket will be detached.
+
+ void reset();
+ /// Resets the session and closes the socket.
+ ///
+ /// The next request will initiate a new connection,
+ /// even if persistent connections are enabled.
+ ///
+ /// This should be called whenever something went
+ /// wrong when sending a request (e.g., sendRequest()
+ /// or receiveResponse() throws an exception, or
+ /// the request or response stream changes into
+ /// fail or bad state, but not eof state).
+
+ virtual bool secure() const;
+ /// Return true iff the session uses SSL or TLS,
+ /// or false otherwise.
+
+ bool bypassProxy() const;
+ /// Returns true if the proxy should be bypassed
+ /// for the current host.
+
+protected:
+ enum
+ {
+ DEFAULT_KEEP_ALIVE_TIMEOUT = 8
+ };
+
+ void reconnect();
+ /// Connects the underlying socket to the HTTP server.
+
+ int write(const char* buffer, std::streamsize length);
+ /// Tries to re-connect if keep-alive is on.
+
+ virtual std::string proxyRequestPrefix() const;
+ /// Returns the prefix prepended to the URI for proxy requests
+ /// (e.g., "http://myhost.com").
+
+ virtual bool mustReconnect() const;
+ /// Checks if we can reuse a persistent connection.
+
+ virtual void proxyAuthenticate(HTTPRequest& request);
+ /// Sets the proxy credentials (Proxy-Authorization header), if
+ /// proxy username and password have been set.
+
+ void proxyAuthenticateImpl(HTTPRequest& request);
+ /// Sets the proxy credentials (Proxy-Authorization header), if
+ /// proxy username and password have been set.
+
+ StreamSocket proxyConnect();
+ /// Sends a CONNECT request to the proxy server and returns
+ /// a StreamSocket for the resulting connection.
+
+ void proxyTunnel();
+ /// Calls proxyConnect() and attaches the resulting StreamSocket
+ /// to the HTTPClientSession.
+
+private:
+ std::string _host;
+ Poco::UInt16 _port;
+ ProxyConfig _proxyConfig;
+ Poco::Timespan _keepAliveTimeout;
+ Poco::Timestamp _lastRequest;
+ bool _reconnect;
+ bool _mustReconnect;
+ bool _expectResponseBody;
+ bool _responseReceived;
+ Poco::SharedPtr<std::ostream> _pRequestStream;
+ Poco::SharedPtr<std::istream> _pResponseStream;
+
+ static ProxyConfig _globalProxyConfig;
+
+ HTTPClientSession(const HTTPClientSession&);
+ HTTPClientSession& operator = (const HTTPClientSession&);
+
+ friend class WebSocket;
+};
+
+
+//
+// inlines
+//
+inline const std::string& HTTPClientSession::getHost() const
+{
+ return _host;
+}
+
+
+inline Poco::UInt16 HTTPClientSession::getPort() const
+{
+ return _port;
+}
+
+
+inline const std::string& HTTPClientSession::getProxyHost() const
+{
+ return _proxyConfig.host;
+}
+
+
+inline Poco::UInt16 HTTPClientSession::getProxyPort() const
+{
+ return _proxyConfig.port;
+}
+
+
+inline const std::string& HTTPClientSession::getProxyUsername() const
+{
+ return _proxyConfig.username;
+}
+
+
+inline const std::string& HTTPClientSession::getProxyPassword() const
+{
+ return _proxyConfig.password;
+}
+
+
+inline const HTTPClientSession::ProxyConfig& HTTPClientSession::getProxyConfig() const
+{
+ return _proxyConfig;
+}
+
+
+inline const HTTPClientSession::ProxyConfig& HTTPClientSession::getGlobalProxyConfig()
+{
+ return _globalProxyConfig;
+}
+
+
+inline const Poco::Timespan& HTTPClientSession::getKeepAliveTimeout() const
+{
+ return _keepAliveTimeout;
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_HTTPClientSession_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/HTTPCookie.h b/contrib/libs/poco/Net/include/Poco/Net/HTTPCookie.h
index f525a107d9..c7c47b2e0a 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/HTTPCookie.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/HTTPCookie.h
@@ -1,272 +1,272 @@
-//
-// HTTPCookie.h
-//
-// Library: Net
-// Package: HTTP
-// Module: HTTPCookie
-//
-// Definition of the HTTPCookie class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_HTTPCookie_INCLUDED
-#define Net_HTTPCookie_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class NameValueCollection;
-
-
-class Net_API HTTPCookie
- /// This class represents a HTTP Cookie.
- ///
- /// A cookie is a small amount of information sent by a Web
- /// server to a Web browser, saved by the browser, and later sent back
- /// to the server. A cookie's value can uniquely identify a client, so
- /// cookies are commonly used for session management.
- ///
- /// A cookie has a name, a single value, and optional attributes such
- /// as a comment, path and domain qualifiers, a maximum age, and a
- /// version number.
- ///
- /// This class supports both the Version 0 (by Netscape) and Version 1
- /// (by RFC 2109) cookie specifications. By default, cookies are created
- /// using Version 0 to ensure the best interoperability.
-{
-public:
- HTTPCookie();
- /// Creates an empty HTTPCookie.
-
- explicit HTTPCookie(const std::string& name);
- /// Creates a cookie with the given name.
- /// The cookie never expires.
-
- explicit HTTPCookie(const NameValueCollection& nvc);
- /// Creates a cookie from the given NameValueCollection.
-
- HTTPCookie(const std::string& name, const std::string& value);
- /// Creates a cookie with the given name and value.
- /// The cookie never expires.
- ///
- /// Note: If value contains whitespace or non-alphanumeric
- /// characters, the value should be escaped by calling escape()
- /// before passing it to the constructor.
-
- HTTPCookie(const HTTPCookie& cookie);
- /// Creates the HTTPCookie by copying another one.
-
- ~HTTPCookie();
- /// Destroys the HTTPCookie.
-
- HTTPCookie& operator = (const HTTPCookie& cookie);
- /// Assigns a cookie.
-
- void setVersion(int version);
- /// Sets the version of the cookie.
- ///
- /// Version must be either 0 (denoting a Netscape cookie)
- /// or 1 (denoting a RFC 2109 cookie).
-
- int getVersion() const;
- /// Returns the version of the cookie, which is
- /// either 0 or 1.
-
- void setName(const std::string& name);
- /// Sets the name of the cookie.
-
- const std::string& getName() const;
- /// Returns the name of the cookie.
-
- void setValue(const std::string& value);
- /// Sets the value of the cookie.
- ///
- /// According to the cookie specification, the
- /// size of the value should not exceed 4 Kbytes.
- ///
- /// Note: If value contains whitespace or non-alphanumeric
- /// characters, the value should be escaped by calling escape()
- /// prior to passing it to setName().
-
- const std::string& getValue() const;
- /// Returns the value of the cookie.
-
- void setComment(const std::string& comment);
- /// Sets the comment for the cookie.
- ///
- /// Comments are only supported for version 1 cookies.
-
- const std::string& getComment() const;
- /// Returns the comment for the cookie.
-
- void setDomain(const std::string& domain);
- /// Sets the domain for the cookie.
-
- const std::string& getDomain() const;
- /// Returns the domain for the cookie.
-
- void setPath(const std::string& path);
- /// Sets the path for the cookie.
-
- void setPriority(const std::string& priority);
- /// Sets the priority for the cookie.
-
- const std::string& getPath() const;
- /// Returns the path for the cookie.
-
- const std::string& getPriority() const;
- /// Returns the priority for the cookie.
-
- void setSecure(bool secure);
- /// Sets the value of the secure flag for
- /// the cookie.
-
- bool getSecure() const;
- /// Returns the value of the secure flag
- /// for the cookie.
-
- void setMaxAge(int maxAge);
- /// Sets the maximum age in seconds for
- /// the cookie.
- ///
- /// A value of -1 (default) causes the cookie
- /// to become a session cookie, which will
- /// be deleted when the browser window
- /// is closed.
- ///
- /// A value of 0 deletes the cookie on
- /// the client.
-
- int getMaxAge() const;
- /// Returns the maximum age in seconds for
- /// the cookie.
-
- void setHttpOnly(bool flag = true);
- /// Sets the HttpOnly flag for the cookie.
-
- bool getHttpOnly() const;
- /// Returns true iff the cookie's HttpOnly flag is set.
-
- std::string toString() const;
- /// Returns a string representation of the cookie,
- /// suitable for use in a Set-Cookie header.
-
- static std::string escape(const std::string& str);
- /// Escapes the given string by replacing all
- /// non-alphanumeric characters with escape
- /// sequences in the form %xx, where xx is the
- /// hexadecimal character code.
- ///
- /// The following characters will be replaced
- /// with escape sequences:
- /// - percent sign %
- /// - less-than and greater-than < and >
- /// - curly brackets { and }
- /// - square brackets [ and ]
- /// - parenthesis ( and )
- /// - solidus /
- /// - vertical line |
- /// - reverse solidus (backslash /)
- /// - quotation mark "
- /// - apostrophe '
- /// - circumflex accent ^
- /// - grave accent `
- /// - comma and semicolon , and ;
- /// - whitespace and control characters
-
- static std::string unescape(const std::string& str);
- /// Unescapes the given string by replacing all
- /// escape sequences in the form %xx with the
- /// respective characters.
-
-private:
- int _version;
- std::string _name;
- std::string _value;
- std::string _comment;
- std::string _domain;
- std::string _path;
- std::string _priority;
- bool _secure;
- int _maxAge;
- bool _httpOnly;
-};
-
-
-//
-// inlines
-//
-inline int HTTPCookie::getVersion() const
-{
- return _version;
-}
-
-
-inline const std::string& HTTPCookie::getName() const
-{
- return _name;
-}
-
-
-inline const std::string& HTTPCookie::getValue() const
-{
- return _value;
-}
-
-
-inline const std::string& HTTPCookie::getComment() const
-{
- return _comment;
-}
-
-
-inline const std::string& HTTPCookie::getDomain() const
-{
- return _domain;
-}
-
-
-inline const std::string& HTTPCookie::getPath() const
-{
- return _path;
-}
-
-
-inline const std::string& HTTPCookie::getPriority() const
-{
- return _priority;
-}
-
-
-inline bool HTTPCookie::getSecure() const
-{
- return _secure;
-}
-
-
-inline int HTTPCookie::getMaxAge() const
-{
- return _maxAge;
-}
-
-
-inline bool HTTPCookie::getHttpOnly() const
-{
- return _httpOnly;
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_HTTPCookie_INCLUDED
+//
+// HTTPCookie.h
+//
+// Library: Net
+// Package: HTTP
+// Module: HTTPCookie
+//
+// Definition of the HTTPCookie class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_HTTPCookie_INCLUDED
+#define Net_HTTPCookie_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class NameValueCollection;
+
+
+class Net_API HTTPCookie
+ /// This class represents a HTTP Cookie.
+ ///
+ /// A cookie is a small amount of information sent by a Web
+ /// server to a Web browser, saved by the browser, and later sent back
+ /// to the server. A cookie's value can uniquely identify a client, so
+ /// cookies are commonly used for session management.
+ ///
+ /// A cookie has a name, a single value, and optional attributes such
+ /// as a comment, path and domain qualifiers, a maximum age, and a
+ /// version number.
+ ///
+ /// This class supports both the Version 0 (by Netscape) and Version 1
+ /// (by RFC 2109) cookie specifications. By default, cookies are created
+ /// using Version 0 to ensure the best interoperability.
+{
+public:
+ HTTPCookie();
+ /// Creates an empty HTTPCookie.
+
+ explicit HTTPCookie(const std::string& name);
+ /// Creates a cookie with the given name.
+ /// The cookie never expires.
+
+ explicit HTTPCookie(const NameValueCollection& nvc);
+ /// Creates a cookie from the given NameValueCollection.
+
+ HTTPCookie(const std::string& name, const std::string& value);
+ /// Creates a cookie with the given name and value.
+ /// The cookie never expires.
+ ///
+ /// Note: If value contains whitespace or non-alphanumeric
+ /// characters, the value should be escaped by calling escape()
+ /// before passing it to the constructor.
+
+ HTTPCookie(const HTTPCookie& cookie);
+ /// Creates the HTTPCookie by copying another one.
+
+ ~HTTPCookie();
+ /// Destroys the HTTPCookie.
+
+ HTTPCookie& operator = (const HTTPCookie& cookie);
+ /// Assigns a cookie.
+
+ void setVersion(int version);
+ /// Sets the version of the cookie.
+ ///
+ /// Version must be either 0 (denoting a Netscape cookie)
+ /// or 1 (denoting a RFC 2109 cookie).
+
+ int getVersion() const;
+ /// Returns the version of the cookie, which is
+ /// either 0 or 1.
+
+ void setName(const std::string& name);
+ /// Sets the name of the cookie.
+
+ const std::string& getName() const;
+ /// Returns the name of the cookie.
+
+ void setValue(const std::string& value);
+ /// Sets the value of the cookie.
+ ///
+ /// According to the cookie specification, the
+ /// size of the value should not exceed 4 Kbytes.
+ ///
+ /// Note: If value contains whitespace or non-alphanumeric
+ /// characters, the value should be escaped by calling escape()
+ /// prior to passing it to setName().
+
+ const std::string& getValue() const;
+ /// Returns the value of the cookie.
+
+ void setComment(const std::string& comment);
+ /// Sets the comment for the cookie.
+ ///
+ /// Comments are only supported for version 1 cookies.
+
+ const std::string& getComment() const;
+ /// Returns the comment for the cookie.
+
+ void setDomain(const std::string& domain);
+ /// Sets the domain for the cookie.
+
+ const std::string& getDomain() const;
+ /// Returns the domain for the cookie.
+
+ void setPath(const std::string& path);
+ /// Sets the path for the cookie.
+
+ void setPriority(const std::string& priority);
+ /// Sets the priority for the cookie.
+
+ const std::string& getPath() const;
+ /// Returns the path for the cookie.
+
+ const std::string& getPriority() const;
+ /// Returns the priority for the cookie.
+
+ void setSecure(bool secure);
+ /// Sets the value of the secure flag for
+ /// the cookie.
+
+ bool getSecure() const;
+ /// Returns the value of the secure flag
+ /// for the cookie.
+
+ void setMaxAge(int maxAge);
+ /// Sets the maximum age in seconds for
+ /// the cookie.
+ ///
+ /// A value of -1 (default) causes the cookie
+ /// to become a session cookie, which will
+ /// be deleted when the browser window
+ /// is closed.
+ ///
+ /// A value of 0 deletes the cookie on
+ /// the client.
+
+ int getMaxAge() const;
+ /// Returns the maximum age in seconds for
+ /// the cookie.
+
+ void setHttpOnly(bool flag = true);
+ /// Sets the HttpOnly flag for the cookie.
+
+ bool getHttpOnly() const;
+ /// Returns true iff the cookie's HttpOnly flag is set.
+
+ std::string toString() const;
+ /// Returns a string representation of the cookie,
+ /// suitable for use in a Set-Cookie header.
+
+ static std::string escape(const std::string& str);
+ /// Escapes the given string by replacing all
+ /// non-alphanumeric characters with escape
+ /// sequences in the form %xx, where xx is the
+ /// hexadecimal character code.
+ ///
+ /// The following characters will be replaced
+ /// with escape sequences:
+ /// - percent sign %
+ /// - less-than and greater-than < and >
+ /// - curly brackets { and }
+ /// - square brackets [ and ]
+ /// - parenthesis ( and )
+ /// - solidus /
+ /// - vertical line |
+ /// - reverse solidus (backslash /)
+ /// - quotation mark "
+ /// - apostrophe '
+ /// - circumflex accent ^
+ /// - grave accent `
+ /// - comma and semicolon , and ;
+ /// - whitespace and control characters
+
+ static std::string unescape(const std::string& str);
+ /// Unescapes the given string by replacing all
+ /// escape sequences in the form %xx with the
+ /// respective characters.
+
+private:
+ int _version;
+ std::string _name;
+ std::string _value;
+ std::string _comment;
+ std::string _domain;
+ std::string _path;
+ std::string _priority;
+ bool _secure;
+ int _maxAge;
+ bool _httpOnly;
+};
+
+
+//
+// inlines
+//
+inline int HTTPCookie::getVersion() const
+{
+ return _version;
+}
+
+
+inline const std::string& HTTPCookie::getName() const
+{
+ return _name;
+}
+
+
+inline const std::string& HTTPCookie::getValue() const
+{
+ return _value;
+}
+
+
+inline const std::string& HTTPCookie::getComment() const
+{
+ return _comment;
+}
+
+
+inline const std::string& HTTPCookie::getDomain() const
+{
+ return _domain;
+}
+
+
+inline const std::string& HTTPCookie::getPath() const
+{
+ return _path;
+}
+
+
+inline const std::string& HTTPCookie::getPriority() const
+{
+ return _priority;
+}
+
+
+inline bool HTTPCookie::getSecure() const
+{
+ return _secure;
+}
+
+
+inline int HTTPCookie::getMaxAge() const
+{
+ return _maxAge;
+}
+
+
+inline bool HTTPCookie::getHttpOnly() const
+{
+ return _httpOnly;
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_HTTPCookie_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/HTTPCredentials.h b/contrib/libs/poco/Net/include/Poco/Net/HTTPCredentials.h
index 9c26ac7b97..e62b8c2467 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/HTTPCredentials.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/HTTPCredentials.h
@@ -1,206 +1,206 @@
-//
-// HTTPCredentials.h
-//
-// Library: Net
-// Package: HTTP
-// Module: HTTPCredentials
-//
-// Definition of the HTTPCredentials class.
-//
-// Copyright (c) 2011, Anton V. Yabchinskiy (arn at bestmx dot ru).
-// Copyright (c) 2012, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_HTTPCredentials_INCLUDED
-#define Net_HTTPCredentials_INCLUDED
-
-
-#include "Poco/Net/HTTPDigestCredentials.h"
-
-
-namespace Poco {
-
-
-class URI;
-
-
-namespace Net {
-
-
-class HTTPRequest;
-class HTTPResponse;
-
-
-class Net_API HTTPCredentials
- /// This is a utility class for working with HTTP
- /// authentication (Basic or Digest) in HTTPRequest objects.
- ///
- /// Usage is as follows:
- /// First, create a HTTPCredentials object containing
- /// the username and password.
- /// Poco::Net::HTTPCredentials creds("user", "s3cr3t");
- ///
- /// Second, send the HTTP request with Poco::Net::HTTPClientSession.
- /// Poco::Net::HTTPClientSession session("pocoproject.org");
- /// Poco::Net::HTTPRequest request(HTTPRequest::HTTP_GET, "/index.html", HTTPMessage::HTTP_1_1);
- /// session.sendRequest(request);
- /// Poco::Net::HTTPResponse;
- /// std::istream& istr = session.receiveResponse(response);
- ///
- /// If the server responds with a 401 status, authenticate the
- /// request and resend it:
- /// if (response.getStatus() == Poco::Net::HTTPResponse::HTTP_UNAUTHORIZED)
- /// {
- /// creds.authenticate(request, response);
- /// session.sendRequest(request);
- /// ...
- /// }
- ///
- /// To perform multiple authenticated requests, call updateAuthInfo()
- /// instead of authenticate() on subsequent requests.
- /// creds.updateAuthInfo(request);
- /// session.sendRequest(request);
- /// ...
- ///
- /// Note: Do not forget to read the entire response stream from the 401 response
- /// before sending the authenticated request, otherwise there may be
- /// problems if a persistent connection is used.
-{
-public:
- HTTPCredentials();
- /// Creates an empty HTTPCredentials object.
-
- HTTPCredentials(const std::string& username, const std::string& password);
- /// Creates an HTTPCredentials object with the given username and password.
-
- ~HTTPCredentials();
- /// Destroys the HTTPCredentials.
-
- void fromUserInfo(const std::string& userInfo);
- /// Parses username:password string and sets username and password of
- /// the credentials object.
- /// Throws SyntaxException on invalid user information.
-
- void fromURI(const URI& uri);
- /// Extracts username and password from the given URI and sets username
- /// and password of the credentials object.
- /// Does nothing if URI has no user info part.
-
- void clear();
- /// Clears username, password and host.
-
- void setUsername(const std::string& username);
- /// Sets the username.
-
- const std::string& getUsername() const;
- /// Returns the username.
-
- void setPassword(const std::string& password);
- /// Sets the password.
-
- const std::string& getPassword() const;
- /// Returns the password.
-
- bool empty() const;
- /// Returns true if both username and password are empty, otherwise false.
-
- void authenticate(HTTPRequest& request, const HTTPResponse& response);
- /// Inspects WWW-Authenticate header of the response, initializes
- /// the internal state (in case of digest authentication) and
- /// adds required information to the given HTTPRequest.
- ///
- /// Does nothing if there is no WWW-Authenticate header in the
- /// HTTPResponse.
-
- void updateAuthInfo(HTTPRequest& request);
- /// Updates internal state (in case of digest authentication) and
- /// replaces authentication information in the request accordingly.
-
- void proxyAuthenticate(HTTPRequest& request, const HTTPResponse& response);
- /// Inspects Proxy-Authenticate header of the response, initializes
- /// the internal state (in case of digest authentication) and
- /// adds required information to the given HTTPRequest.
- ///
- /// Does nothing if there is no Proxy-Authenticate header in the
- /// HTTPResponse.
-
- void updateProxyAuthInfo(HTTPRequest& request);
- /// Updates internal state (in case of digest authentication) and
- /// replaces proxy authentication information in the request accordingly.
-
- static bool isBasicCredentials(const std::string& header);
- /// Returns true if authentication header is for Basic authentication.
-
- static bool isDigestCredentials(const std::string& header);
- /// Returns true if authentication header is for Digest authentication.
-
- static bool hasBasicCredentials(const HTTPRequest& request);
- /// Returns true if an Authorization header with Basic credentials is present in the request.
-
- static bool hasDigestCredentials(const HTTPRequest& request);
- /// Returns true if an Authorization header with Digest credentials is present in the request.
-
- static bool hasNTLMCredentials(const HTTPRequest& request);
- /// Returns true if an Authorization header with NTLM credentials is present in the request.
-
- static bool hasProxyBasicCredentials(const HTTPRequest& request);
- /// Returns true if a Proxy-Authorization header with Basic credentials is present in the request.
-
- static bool hasProxyDigestCredentials(const HTTPRequest& request);
- /// Returns true if a Proxy-Authorization header with Digest credentials is present in the request.
-
- static void extractCredentials(const std::string& userInfo, std::string& username, std::string& password);
- /// Extracts username and password from user:password information string.
-
- static void extractCredentials(const Poco::URI& uri, std::string& username, std::string& password);
- /// Extracts username and password from the given URI (e.g.: "http://user:pass@sample.com/secret").
-
-private:
- HTTPCredentials(const HTTPCredentials&);
- HTTPCredentials& operator = (const HTTPCredentials&);
-
- HTTPDigestCredentials _digest;
-};
-
-
-//
-// inlines
-//
-inline void HTTPCredentials::setUsername(const std::string& username)
-{
- _digest.setUsername(username);
-}
-
-
-inline const std::string& HTTPCredentials::getUsername() const
-{
- return _digest.getUsername();
-}
-
-
-inline void HTTPCredentials::setPassword(const std::string& password)
-{
- _digest.setPassword(password);
-}
-
-
-inline const std::string& HTTPCredentials::getPassword() const
-{
- return _digest.getPassword();
-}
-
-
-inline bool HTTPCredentials::empty() const
-{
- return _digest.empty();
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_HTTPCredentials_INCLUDED
+//
+// HTTPCredentials.h
+//
+// Library: Net
+// Package: HTTP
+// Module: HTTPCredentials
+//
+// Definition of the HTTPCredentials class.
+//
+// Copyright (c) 2011, Anton V. Yabchinskiy (arn at bestmx dot ru).
+// Copyright (c) 2012, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_HTTPCredentials_INCLUDED
+#define Net_HTTPCredentials_INCLUDED
+
+
+#include "Poco/Net/HTTPDigestCredentials.h"
+
+
+namespace Poco {
+
+
+class URI;
+
+
+namespace Net {
+
+
+class HTTPRequest;
+class HTTPResponse;
+
+
+class Net_API HTTPCredentials
+ /// This is a utility class for working with HTTP
+ /// authentication (Basic or Digest) in HTTPRequest objects.
+ ///
+ /// Usage is as follows:
+ /// First, create a HTTPCredentials object containing
+ /// the username and password.
+ /// Poco::Net::HTTPCredentials creds("user", "s3cr3t");
+ ///
+ /// Second, send the HTTP request with Poco::Net::HTTPClientSession.
+ /// Poco::Net::HTTPClientSession session("pocoproject.org");
+ /// Poco::Net::HTTPRequest request(HTTPRequest::HTTP_GET, "/index.html", HTTPMessage::HTTP_1_1);
+ /// session.sendRequest(request);
+ /// Poco::Net::HTTPResponse;
+ /// std::istream& istr = session.receiveResponse(response);
+ ///
+ /// If the server responds with a 401 status, authenticate the
+ /// request and resend it:
+ /// if (response.getStatus() == Poco::Net::HTTPResponse::HTTP_UNAUTHORIZED)
+ /// {
+ /// creds.authenticate(request, response);
+ /// session.sendRequest(request);
+ /// ...
+ /// }
+ ///
+ /// To perform multiple authenticated requests, call updateAuthInfo()
+ /// instead of authenticate() on subsequent requests.
+ /// creds.updateAuthInfo(request);
+ /// session.sendRequest(request);
+ /// ...
+ ///
+ /// Note: Do not forget to read the entire response stream from the 401 response
+ /// before sending the authenticated request, otherwise there may be
+ /// problems if a persistent connection is used.
+{
+public:
+ HTTPCredentials();
+ /// Creates an empty HTTPCredentials object.
+
+ HTTPCredentials(const std::string& username, const std::string& password);
+ /// Creates an HTTPCredentials object with the given username and password.
+
+ ~HTTPCredentials();
+ /// Destroys the HTTPCredentials.
+
+ void fromUserInfo(const std::string& userInfo);
+ /// Parses username:password string and sets username and password of
+ /// the credentials object.
+ /// Throws SyntaxException on invalid user information.
+
+ void fromURI(const URI& uri);
+ /// Extracts username and password from the given URI and sets username
+ /// and password of the credentials object.
+ /// Does nothing if URI has no user info part.
+
+ void clear();
+ /// Clears username, password and host.
+
+ void setUsername(const std::string& username);
+ /// Sets the username.
+
+ const std::string& getUsername() const;
+ /// Returns the username.
+
+ void setPassword(const std::string& password);
+ /// Sets the password.
+
+ const std::string& getPassword() const;
+ /// Returns the password.
+
+ bool empty() const;
+ /// Returns true if both username and password are empty, otherwise false.
+
+ void authenticate(HTTPRequest& request, const HTTPResponse& response);
+ /// Inspects WWW-Authenticate header of the response, initializes
+ /// the internal state (in case of digest authentication) and
+ /// adds required information to the given HTTPRequest.
+ ///
+ /// Does nothing if there is no WWW-Authenticate header in the
+ /// HTTPResponse.
+
+ void updateAuthInfo(HTTPRequest& request);
+ /// Updates internal state (in case of digest authentication) and
+ /// replaces authentication information in the request accordingly.
+
+ void proxyAuthenticate(HTTPRequest& request, const HTTPResponse& response);
+ /// Inspects Proxy-Authenticate header of the response, initializes
+ /// the internal state (in case of digest authentication) and
+ /// adds required information to the given HTTPRequest.
+ ///
+ /// Does nothing if there is no Proxy-Authenticate header in the
+ /// HTTPResponse.
+
+ void updateProxyAuthInfo(HTTPRequest& request);
+ /// Updates internal state (in case of digest authentication) and
+ /// replaces proxy authentication information in the request accordingly.
+
+ static bool isBasicCredentials(const std::string& header);
+ /// Returns true if authentication header is for Basic authentication.
+
+ static bool isDigestCredentials(const std::string& header);
+ /// Returns true if authentication header is for Digest authentication.
+
+ static bool hasBasicCredentials(const HTTPRequest& request);
+ /// Returns true if an Authorization header with Basic credentials is present in the request.
+
+ static bool hasDigestCredentials(const HTTPRequest& request);
+ /// Returns true if an Authorization header with Digest credentials is present in the request.
+
+ static bool hasNTLMCredentials(const HTTPRequest& request);
+ /// Returns true if an Authorization header with NTLM credentials is present in the request.
+
+ static bool hasProxyBasicCredentials(const HTTPRequest& request);
+ /// Returns true if a Proxy-Authorization header with Basic credentials is present in the request.
+
+ static bool hasProxyDigestCredentials(const HTTPRequest& request);
+ /// Returns true if a Proxy-Authorization header with Digest credentials is present in the request.
+
+ static void extractCredentials(const std::string& userInfo, std::string& username, std::string& password);
+ /// Extracts username and password from user:password information string.
+
+ static void extractCredentials(const Poco::URI& uri, std::string& username, std::string& password);
+ /// Extracts username and password from the given URI (e.g.: "http://user:pass@sample.com/secret").
+
+private:
+ HTTPCredentials(const HTTPCredentials&);
+ HTTPCredentials& operator = (const HTTPCredentials&);
+
+ HTTPDigestCredentials _digest;
+};
+
+
+//
+// inlines
+//
+inline void HTTPCredentials::setUsername(const std::string& username)
+{
+ _digest.setUsername(username);
+}
+
+
+inline const std::string& HTTPCredentials::getUsername() const
+{
+ return _digest.getUsername();
+}
+
+
+inline void HTTPCredentials::setPassword(const std::string& password)
+{
+ _digest.setPassword(password);
+}
+
+
+inline const std::string& HTTPCredentials::getPassword() const
+{
+ return _digest.getPassword();
+}
+
+
+inline bool HTTPCredentials::empty() const
+{
+ return _digest.empty();
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_HTTPCredentials_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/HTTPDigestCredentials.h b/contrib/libs/poco/Net/include/Poco/Net/HTTPDigestCredentials.h
index 857d2f31fb..c321c9fc87 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/HTTPDigestCredentials.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/HTTPDigestCredentials.h
@@ -1,186 +1,186 @@
-//
-// HTTPDigestCredentials.h
-//
-// Library: Net
-// Package: HTTP
-// Module: HTTPDigestCredentials
-//
-// Definition of the HTTPDigestCredentials class.
-//
-// Copyright (c) 2011, Anton V. Yabchinskiy (arn at bestmx dot ru).
-// Copyright (c) 2012, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_HTTPDigestCredentials_INCLUDED
-#define Net_HTTPDigestCredentials_INCLUDED
-
-
-#include "Poco/Net/HTTPAuthenticationParams.h"
-#include "Poco/Mutex.h"
-#include <map>
-
-
-namespace Poco {
-namespace Net {
-
-
-class HTTPRequest;
-class HTTPResponse;
-
-
-class Net_API HTTPDigestCredentials
- /// This is a utility class for working with
- /// HTTP Digest Authentication in HTTPRequest
- /// objects.
- ///
- /// Note: currently, no qop or qop=auth is
- /// supported only.
-{
-public:
- HTTPDigestCredentials();
- /// Creates an empty HTTPDigestCredentials object.
-
- HTTPDigestCredentials(const std::string& username, const std::string& password);
- /// Creates a HTTPDigestCredentials object with the given username and password.
-
- ~HTTPDigestCredentials();
- /// Destroys the HTTPDigestCredentials.
-
- void reset();
- /// Resets the HTTPDigestCredentials object to a clean state.
- /// Does not clear username and password.
-
- void clear();
- /// Clears both username and password.
-
- void setUsername(const std::string& username);
- /// Sets the username.
-
- const std::string& getUsername() const;
- /// Returns the username.
-
- void setPassword(const std::string& password);
- /// Sets the password.
-
- const std::string& getPassword() const;
- /// Returns the password.
-
- bool empty() const;
- /// Returns true if both username and password are empty, otherwise false.
-
- void authenticate(HTTPRequest& request, const HTTPResponse& response);
- /// Parses WWW-Authenticate header of the HTTPResponse, initializes
- /// internal state, and adds authentication information to the given HTTPRequest.
-
- void authenticate(HTTPRequest& request, const HTTPAuthenticationParams& responseAuthParams);
- /// Initializes internal state according to information from the
- /// HTTPAuthenticationParams of the response, and adds authentication
- /// information to the given HTTPRequest.
- ///
- /// Throws InvalidArgumentException if HTTPAuthenticationParams is
- /// invalid or some required parameter is missing.
- /// Throws NotImplementedException in case of unsupported digest
- /// algorithm or quality of protection method.
-
- void updateAuthInfo(HTTPRequest& request);
- /// Updates internal state and adds authentication information to
- /// the given HTTPRequest.
-
- void proxyAuthenticate(HTTPRequest& request, const HTTPResponse& response);
- /// Parses Proxy-Authenticate header of the HTTPResponse, initializes
- /// internal state, and adds proxy authentication information to the given HTTPRequest.
-
- void proxyAuthenticate(HTTPRequest& request, const HTTPAuthenticationParams& responseAuthParams);
- /// Initializes internal state according to information from the
- /// HTTPAuthenticationParams of the response, and adds proxy authentication
- /// information to the given HTTPRequest.
- ///
- /// Throws InvalidArgumentException if HTTPAuthenticationParams is
- /// invalid or some required parameter is missing.
- /// Throws NotImplementedException in case of unsupported digest
- /// algorithm or quality of protection method.
-
- void updateProxyAuthInfo(HTTPRequest& request);
- /// Updates internal state and adds proxy authentication information to
- /// the given HTTPRequest.
-
- bool verifyAuthInfo(const HTTPRequest& request) const;
- /// Verifies the digest authentication information in the given HTTPRequest
- /// by recomputing the response and comparing it with what's in the request.
- ///
- /// Note: This method creates a HTTPAuthenticationParams object from the request
- /// and calls verifyAuthParams() with request and params.
-
- bool verifyAuthParams(const HTTPRequest& request, const HTTPAuthenticationParams& params) const;
- /// Verifies the digest authentication information in the given HTTPRequest
- /// and HTTPAuthenticationParams by recomputing the response and comparing
- /// it with what's in the request.
-
- static std::string createNonce();
- /// Creates a random nonce string.
-
- static const std::string SCHEME;
-
-private:
- HTTPDigestCredentials(const HTTPDigestCredentials&);
- HTTPDigestCredentials& operator = (const HTTPDigestCredentials&);
-
- void createAuthParams(const HTTPRequest& request, const HTTPAuthenticationParams& responseAuthParams);
- void updateAuthParams(const HTTPRequest& request);
- int updateNonceCounter(const std::string& nonce);
-
- static const std::string DEFAULT_ALGORITHM;
- static const std::string DEFAULT_QOP;
- static const std::string NONCE_PARAM;
- static const std::string REALM_PARAM;
- static const std::string QOP_PARAM;
- static const std::string ALGORITHM_PARAM;
- static const std::string USERNAME_PARAM;
- static const std::string OPAQUE_PARAM;
- static const std::string URI_PARAM;
- static const std::string RESPONSE_PARAM;
- static const std::string AUTH_PARAM;
- static const std::string CNONCE_PARAM;
- static const std::string NC_PARAM;
-
- typedef std::map<std::string, int> NonceCounterMap;
-
- std::string _username;
- std::string _password;
- HTTPAuthenticationParams _requestAuthParams;
- NonceCounterMap _nc;
-
- static int _nonceCounter;
- static Poco::FastMutex _nonceMutex;
-};
-
-
-//
-// inlines
-//
-inline const std::string& HTTPDigestCredentials::getUsername() const
-{
- return _username;
-}
-
-
-inline const std::string& HTTPDigestCredentials::getPassword() const
-{
- return _password;
-}
-
-
-inline bool HTTPDigestCredentials::empty() const
-{
- return _username.empty() && _password.empty();
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_HTTPDigestCredentials_INCLUDED
+//
+// HTTPDigestCredentials.h
+//
+// Library: Net
+// Package: HTTP
+// Module: HTTPDigestCredentials
+//
+// Definition of the HTTPDigestCredentials class.
+//
+// Copyright (c) 2011, Anton V. Yabchinskiy (arn at bestmx dot ru).
+// Copyright (c) 2012, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_HTTPDigestCredentials_INCLUDED
+#define Net_HTTPDigestCredentials_INCLUDED
+
+
+#include "Poco/Net/HTTPAuthenticationParams.h"
+#include "Poco/Mutex.h"
+#include <map>
+
+
+namespace Poco {
+namespace Net {
+
+
+class HTTPRequest;
+class HTTPResponse;
+
+
+class Net_API HTTPDigestCredentials
+ /// This is a utility class for working with
+ /// HTTP Digest Authentication in HTTPRequest
+ /// objects.
+ ///
+ /// Note: currently, no qop or qop=auth is
+ /// supported only.
+{
+public:
+ HTTPDigestCredentials();
+ /// Creates an empty HTTPDigestCredentials object.
+
+ HTTPDigestCredentials(const std::string& username, const std::string& password);
+ /// Creates a HTTPDigestCredentials object with the given username and password.
+
+ ~HTTPDigestCredentials();
+ /// Destroys the HTTPDigestCredentials.
+
+ void reset();
+ /// Resets the HTTPDigestCredentials object to a clean state.
+ /// Does not clear username and password.
+
+ void clear();
+ /// Clears both username and password.
+
+ void setUsername(const std::string& username);
+ /// Sets the username.
+
+ const std::string& getUsername() const;
+ /// Returns the username.
+
+ void setPassword(const std::string& password);
+ /// Sets the password.
+
+ const std::string& getPassword() const;
+ /// Returns the password.
+
+ bool empty() const;
+ /// Returns true if both username and password are empty, otherwise false.
+
+ void authenticate(HTTPRequest& request, const HTTPResponse& response);
+ /// Parses WWW-Authenticate header of the HTTPResponse, initializes
+ /// internal state, and adds authentication information to the given HTTPRequest.
+
+ void authenticate(HTTPRequest& request, const HTTPAuthenticationParams& responseAuthParams);
+ /// Initializes internal state according to information from the
+ /// HTTPAuthenticationParams of the response, and adds authentication
+ /// information to the given HTTPRequest.
+ ///
+ /// Throws InvalidArgumentException if HTTPAuthenticationParams is
+ /// invalid or some required parameter is missing.
+ /// Throws NotImplementedException in case of unsupported digest
+ /// algorithm or quality of protection method.
+
+ void updateAuthInfo(HTTPRequest& request);
+ /// Updates internal state and adds authentication information to
+ /// the given HTTPRequest.
+
+ void proxyAuthenticate(HTTPRequest& request, const HTTPResponse& response);
+ /// Parses Proxy-Authenticate header of the HTTPResponse, initializes
+ /// internal state, and adds proxy authentication information to the given HTTPRequest.
+
+ void proxyAuthenticate(HTTPRequest& request, const HTTPAuthenticationParams& responseAuthParams);
+ /// Initializes internal state according to information from the
+ /// HTTPAuthenticationParams of the response, and adds proxy authentication
+ /// information to the given HTTPRequest.
+ ///
+ /// Throws InvalidArgumentException if HTTPAuthenticationParams is
+ /// invalid or some required parameter is missing.
+ /// Throws NotImplementedException in case of unsupported digest
+ /// algorithm or quality of protection method.
+
+ void updateProxyAuthInfo(HTTPRequest& request);
+ /// Updates internal state and adds proxy authentication information to
+ /// the given HTTPRequest.
+
+ bool verifyAuthInfo(const HTTPRequest& request) const;
+ /// Verifies the digest authentication information in the given HTTPRequest
+ /// by recomputing the response and comparing it with what's in the request.
+ ///
+ /// Note: This method creates a HTTPAuthenticationParams object from the request
+ /// and calls verifyAuthParams() with request and params.
+
+ bool verifyAuthParams(const HTTPRequest& request, const HTTPAuthenticationParams& params) const;
+ /// Verifies the digest authentication information in the given HTTPRequest
+ /// and HTTPAuthenticationParams by recomputing the response and comparing
+ /// it with what's in the request.
+
+ static std::string createNonce();
+ /// Creates a random nonce string.
+
+ static const std::string SCHEME;
+
+private:
+ HTTPDigestCredentials(const HTTPDigestCredentials&);
+ HTTPDigestCredentials& operator = (const HTTPDigestCredentials&);
+
+ void createAuthParams(const HTTPRequest& request, const HTTPAuthenticationParams& responseAuthParams);
+ void updateAuthParams(const HTTPRequest& request);
+ int updateNonceCounter(const std::string& nonce);
+
+ static const std::string DEFAULT_ALGORITHM;
+ static const std::string DEFAULT_QOP;
+ static const std::string NONCE_PARAM;
+ static const std::string REALM_PARAM;
+ static const std::string QOP_PARAM;
+ static const std::string ALGORITHM_PARAM;
+ static const std::string USERNAME_PARAM;
+ static const std::string OPAQUE_PARAM;
+ static const std::string URI_PARAM;
+ static const std::string RESPONSE_PARAM;
+ static const std::string AUTH_PARAM;
+ static const std::string CNONCE_PARAM;
+ static const std::string NC_PARAM;
+
+ typedef std::map<std::string, int> NonceCounterMap;
+
+ std::string _username;
+ std::string _password;
+ HTTPAuthenticationParams _requestAuthParams;
+ NonceCounterMap _nc;
+
+ static int _nonceCounter;
+ static Poco::FastMutex _nonceMutex;
+};
+
+
+//
+// inlines
+//
+inline const std::string& HTTPDigestCredentials::getUsername() const
+{
+ return _username;
+}
+
+
+inline const std::string& HTTPDigestCredentials::getPassword() const
+{
+ return _password;
+}
+
+
+inline bool HTTPDigestCredentials::empty() const
+{
+ return _username.empty() && _password.empty();
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_HTTPDigestCredentials_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/HTTPFixedLengthStream.h b/contrib/libs/poco/Net/include/Poco/Net/HTTPFixedLengthStream.h
index 112a6a029d..ad781e4e00 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/HTTPFixedLengthStream.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/HTTPFixedLengthStream.h
@@ -1,110 +1,110 @@
-//
-// HTTPFixedLengthStream.h
-//
-// Library: Net
-// Package: HTTP
-// Module: HTTPFixedLengthStream
-//
-// Definition of the HTTPFixedLengthStream class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_HTTPFixedLengthStream_INCLUDED
-#define Net_HTTPFixedLengthStream_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/HTTPBasicStreamBuf.h"
-#include <cstddef>
-#include <istream>
-#include <ostream>
-
-
-namespace Poco {
-namespace Net {
-
-
-class HTTPSession;
-
-
-class Net_API HTTPFixedLengthStreamBuf: public HTTPBasicStreamBuf
- /// This is the streambuf class used for reading and writing fixed-size
- /// HTTP message bodies.
- ///
- /// At most a given number of bytes are read or written.
-{
-public:
- typedef HTTPBasicStreamBuf::openmode openmode;
-
-#if defined(POCO_HAVE_INT64)
- typedef Poco::Int64 ContentLength;
-#else
- typedef std::streamsize ContentLength;
-#endif
-
- HTTPFixedLengthStreamBuf(HTTPSession& session, ContentLength length, openmode mode);
- ~HTTPFixedLengthStreamBuf();
-
-protected:
- int readFromDevice(char* buffer, std::streamsize length);
- int writeToDevice(const char* buffer, std::streamsize length);
-
-private:
- HTTPSession& _session;
- ContentLength _length;
- ContentLength _count;
-};
-
-
-class Net_API HTTPFixedLengthIOS: public virtual std::ios
- /// The base class for HTTPFixedLengthInputStream.
-{
-public:
- HTTPFixedLengthIOS(HTTPSession& session, HTTPFixedLengthStreamBuf::ContentLength length, HTTPFixedLengthStreamBuf::openmode mode);
- ~HTTPFixedLengthIOS();
- HTTPFixedLengthStreamBuf* rdbuf();
-
-protected:
- HTTPFixedLengthStreamBuf _buf;
-};
-
-
-class Net_API HTTPFixedLengthInputStream: public HTTPFixedLengthIOS, public std::istream
- /// This class is for internal use by HTTPSession only.
-{
-public:
- HTTPFixedLengthInputStream(HTTPSession& session, HTTPFixedLengthStreamBuf::ContentLength length);
- ~HTTPFixedLengthInputStream();
-
- void* operator new(std::size_t size);
- void operator delete(void* ptr);
-
-private:
- static Poco::MemoryPool _pool;
-};
-
-
-class Net_API HTTPFixedLengthOutputStream: public HTTPFixedLengthIOS, public std::ostream
- /// This class is for internal use by HTTPSession only.
-{
-public:
- HTTPFixedLengthOutputStream(HTTPSession& session, HTTPFixedLengthStreamBuf::ContentLength length);
- ~HTTPFixedLengthOutputStream();
-
- void* operator new(std::size_t size);
- void operator delete(void* ptr);
-
-private:
- static Poco::MemoryPool _pool;
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_HTTPFixedLengthStream_INCLUDED
+//
+// HTTPFixedLengthStream.h
+//
+// Library: Net
+// Package: HTTP
+// Module: HTTPFixedLengthStream
+//
+// Definition of the HTTPFixedLengthStream class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_HTTPFixedLengthStream_INCLUDED
+#define Net_HTTPFixedLengthStream_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/HTTPBasicStreamBuf.h"
+#include <cstddef>
+#include <istream>
+#include <ostream>
+
+
+namespace Poco {
+namespace Net {
+
+
+class HTTPSession;
+
+
+class Net_API HTTPFixedLengthStreamBuf: public HTTPBasicStreamBuf
+ /// This is the streambuf class used for reading and writing fixed-size
+ /// HTTP message bodies.
+ ///
+ /// At most a given number of bytes are read or written.
+{
+public:
+ typedef HTTPBasicStreamBuf::openmode openmode;
+
+#if defined(POCO_HAVE_INT64)
+ typedef Poco::Int64 ContentLength;
+#else
+ typedef std::streamsize ContentLength;
+#endif
+
+ HTTPFixedLengthStreamBuf(HTTPSession& session, ContentLength length, openmode mode);
+ ~HTTPFixedLengthStreamBuf();
+
+protected:
+ int readFromDevice(char* buffer, std::streamsize length);
+ int writeToDevice(const char* buffer, std::streamsize length);
+
+private:
+ HTTPSession& _session;
+ ContentLength _length;
+ ContentLength _count;
+};
+
+
+class Net_API HTTPFixedLengthIOS: public virtual std::ios
+ /// The base class for HTTPFixedLengthInputStream.
+{
+public:
+ HTTPFixedLengthIOS(HTTPSession& session, HTTPFixedLengthStreamBuf::ContentLength length, HTTPFixedLengthStreamBuf::openmode mode);
+ ~HTTPFixedLengthIOS();
+ HTTPFixedLengthStreamBuf* rdbuf();
+
+protected:
+ HTTPFixedLengthStreamBuf _buf;
+};
+
+
+class Net_API HTTPFixedLengthInputStream: public HTTPFixedLengthIOS, public std::istream
+ /// This class is for internal use by HTTPSession only.
+{
+public:
+ HTTPFixedLengthInputStream(HTTPSession& session, HTTPFixedLengthStreamBuf::ContentLength length);
+ ~HTTPFixedLengthInputStream();
+
+ void* operator new(std::size_t size);
+ void operator delete(void* ptr);
+
+private:
+ static Poco::MemoryPool _pool;
+};
+
+
+class Net_API HTTPFixedLengthOutputStream: public HTTPFixedLengthIOS, public std::ostream
+ /// This class is for internal use by HTTPSession only.
+{
+public:
+ HTTPFixedLengthOutputStream(HTTPSession& session, HTTPFixedLengthStreamBuf::ContentLength length);
+ ~HTTPFixedLengthOutputStream();
+
+ void* operator new(std::size_t size);
+ void operator delete(void* ptr);
+
+private:
+ static Poco::MemoryPool _pool;
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_HTTPFixedLengthStream_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/HTTPHeaderStream.h b/contrib/libs/poco/Net/include/Poco/Net/HTTPHeaderStream.h
index 6b7f0b1202..f3f4c891b6 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/HTTPHeaderStream.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/HTTPHeaderStream.h
@@ -1,103 +1,103 @@
-//
-// HTTPHeaderStream.h
-//
-// Library: Net
-// Package: HTTP
-// Module: HTTPHeaderStream
-//
-// Definition of the HTTPHeaderStream class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_HTTPHeaderStream_INCLUDED
-#define Net_HTTPHeaderStream_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/HTTPBasicStreamBuf.h"
-#include "Poco/MemoryPool.h"
-#include <cstddef>
-#include <istream>
-#include <ostream>
-
-
-namespace Poco {
-namespace Net {
-
-
-class HTTPSession;
-
-
-class Net_API HTTPHeaderStreamBuf: public HTTPBasicStreamBuf
- /// This is the streambuf class used for reading from a HTTP header
- /// in a HTTPSession.
-{
-public:
- typedef HTTPBasicStreamBuf::openmode openmode;
-
- HTTPHeaderStreamBuf(HTTPSession& session, openmode mode);
- ~HTTPHeaderStreamBuf();
-
-protected:
- int readFromDevice(char* buffer, std::streamsize length);
- int writeToDevice(const char* buffer, std::streamsize length);
-
-private:
- HTTPSession& _session;
- bool _end;
+//
+// HTTPHeaderStream.h
+//
+// Library: Net
+// Package: HTTP
+// Module: HTTPHeaderStream
+//
+// Definition of the HTTPHeaderStream class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_HTTPHeaderStream_INCLUDED
+#define Net_HTTPHeaderStream_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/HTTPBasicStreamBuf.h"
+#include "Poco/MemoryPool.h"
+#include <cstddef>
+#include <istream>
+#include <ostream>
+
+
+namespace Poco {
+namespace Net {
+
+
+class HTTPSession;
+
+
+class Net_API HTTPHeaderStreamBuf: public HTTPBasicStreamBuf
+ /// This is the streambuf class used for reading from a HTTP header
+ /// in a HTTPSession.
+{
+public:
+ typedef HTTPBasicStreamBuf::openmode openmode;
+
+ HTTPHeaderStreamBuf(HTTPSession& session, openmode mode);
+ ~HTTPHeaderStreamBuf();
+
+protected:
+ int readFromDevice(char* buffer, std::streamsize length);
+ int writeToDevice(const char* buffer, std::streamsize length);
+
+private:
+ HTTPSession& _session;
+ bool _end;
bool _line_ended;
-};
-
-
-class Net_API HTTPHeaderIOS: public virtual std::ios
- /// The base class for HTTPHeaderInputStream.
-{
-public:
- HTTPHeaderIOS(HTTPSession& session, HTTPHeaderStreamBuf::openmode mode);
- ~HTTPHeaderIOS();
- HTTPHeaderStreamBuf* rdbuf();
-
-protected:
- HTTPHeaderStreamBuf _buf;
-};
-
-
-class Net_API HTTPHeaderInputStream: public HTTPHeaderIOS, public std::istream
- /// This class is for internal use by HTTPSession only.
-{
-public:
- HTTPHeaderInputStream(HTTPSession& session);
- ~HTTPHeaderInputStream();
-
- void* operator new(std::size_t size);
- void operator delete(void* ptr);
-
-private:
- static Poco::MemoryPool _pool;
-};
-
-
-class Net_API HTTPHeaderOutputStream: public HTTPHeaderIOS, public std::ostream
- /// This class is for internal use by HTTPSession only.
-{
-public:
- HTTPHeaderOutputStream(HTTPSession& session);
- ~HTTPHeaderOutputStream();
-
- void* operator new(std::size_t size);
- void operator delete(void* ptr);
-
-private:
- static Poco::MemoryPool _pool;
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_HTTPHeaderStream_INCLUDED
+};
+
+
+class Net_API HTTPHeaderIOS: public virtual std::ios
+ /// The base class for HTTPHeaderInputStream.
+{
+public:
+ HTTPHeaderIOS(HTTPSession& session, HTTPHeaderStreamBuf::openmode mode);
+ ~HTTPHeaderIOS();
+ HTTPHeaderStreamBuf* rdbuf();
+
+protected:
+ HTTPHeaderStreamBuf _buf;
+};
+
+
+class Net_API HTTPHeaderInputStream: public HTTPHeaderIOS, public std::istream
+ /// This class is for internal use by HTTPSession only.
+{
+public:
+ HTTPHeaderInputStream(HTTPSession& session);
+ ~HTTPHeaderInputStream();
+
+ void* operator new(std::size_t size);
+ void operator delete(void* ptr);
+
+private:
+ static Poco::MemoryPool _pool;
+};
+
+
+class Net_API HTTPHeaderOutputStream: public HTTPHeaderIOS, public std::ostream
+ /// This class is for internal use by HTTPSession only.
+{
+public:
+ HTTPHeaderOutputStream(HTTPSession& session);
+ ~HTTPHeaderOutputStream();
+
+ void* operator new(std::size_t size);
+ void operator delete(void* ptr);
+
+private:
+ static Poco::MemoryPool _pool;
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_HTTPHeaderStream_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/HTTPIOStream.h b/contrib/libs/poco/Net/include/Poco/Net/HTTPIOStream.h
index aa40d06b0a..2c45812ae1 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/HTTPIOStream.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/HTTPIOStream.h
@@ -1,88 +1,88 @@
-//
-// HTTPIOStream.h
-//
-// Library: Net
-// Package: HTTP
-// Module: HTTPIOStream
-//
-// Definition of the HTTPIOStream class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_HTTPIOStream_INCLUDED
-#define Net_HTTPIOStream_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/HTTPResponse.h"
-#include "Poco/UnbufferedStreamBuf.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class HTTPClientSession;
-
-
-class Net_API HTTPResponseStreamBuf: public Poco::UnbufferedStreamBuf
-{
-public:
- HTTPResponseStreamBuf(std::istream& istr);
-
- ~HTTPResponseStreamBuf();
-
-private:
- int readFromDevice();
-
- std::istream& _istr;
-};
-
-
-inline int HTTPResponseStreamBuf::readFromDevice()
-{
- return _istr.get();
-}
-
-
-class Net_API HTTPResponseIOS: public virtual std::ios
-{
-public:
- HTTPResponseIOS(std::istream& istr);
-
- ~HTTPResponseIOS();
-
- HTTPResponseStreamBuf* rdbuf();
-
-protected:
- HTTPResponseStreamBuf _buf;
-};
-
-
-inline HTTPResponseStreamBuf* HTTPResponseIOS::rdbuf()
-{
- return &_buf;
-}
-
-
-class Net_API HTTPResponseStream: public HTTPResponseIOS, public std::istream
-{
-public:
- HTTPResponseStream(std::istream& istr, HTTPClientSession* pSession);
-
- ~HTTPResponseStream();
-
-private:
- HTTPClientSession* _pSession;
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_HTTPIOStream_INCLUDED
+//
+// HTTPIOStream.h
+//
+// Library: Net
+// Package: HTTP
+// Module: HTTPIOStream
+//
+// Definition of the HTTPIOStream class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_HTTPIOStream_INCLUDED
+#define Net_HTTPIOStream_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/HTTPResponse.h"
+#include "Poco/UnbufferedStreamBuf.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class HTTPClientSession;
+
+
+class Net_API HTTPResponseStreamBuf: public Poco::UnbufferedStreamBuf
+{
+public:
+ HTTPResponseStreamBuf(std::istream& istr);
+
+ ~HTTPResponseStreamBuf();
+
+private:
+ int readFromDevice();
+
+ std::istream& _istr;
+};
+
+
+inline int HTTPResponseStreamBuf::readFromDevice()
+{
+ return _istr.get();
+}
+
+
+class Net_API HTTPResponseIOS: public virtual std::ios
+{
+public:
+ HTTPResponseIOS(std::istream& istr);
+
+ ~HTTPResponseIOS();
+
+ HTTPResponseStreamBuf* rdbuf();
+
+protected:
+ HTTPResponseStreamBuf _buf;
+};
+
+
+inline HTTPResponseStreamBuf* HTTPResponseIOS::rdbuf()
+{
+ return &_buf;
+}
+
+
+class Net_API HTTPResponseStream: public HTTPResponseIOS, public std::istream
+{
+public:
+ HTTPResponseStream(std::istream& istr, HTTPClientSession* pSession);
+
+ ~HTTPResponseStream();
+
+private:
+ HTTPClientSession* _pSession;
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_HTTPIOStream_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/HTTPMessage.h b/contrib/libs/poco/Net/include/Poco/Net/HTTPMessage.h
index 6a6bbdf412..345543d5a1 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/HTTPMessage.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/HTTPMessage.h
@@ -1,185 +1,185 @@
-//
-// HTTPMessage.h
-//
-// Library: Net
-// Package: HTTP
-// Module: HTTPMessage
-//
-// Definition of the HTTPMessage class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_HTTPMessage_INCLUDED
-#define Net_HTTPMessage_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/MessageHeader.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class MediaType;
-
-
-class Net_API HTTPMessage: public MessageHeader
- /// The base class for HTTPRequest and HTTPResponse.
- ///
- /// Defines the common properties of all HTTP messages.
- /// These are version, content length, content type
- /// and transfer encoding.
-{
-public:
- void setVersion(const std::string& version);
- /// Sets the HTTP version for this message.
-
- const std::string& getVersion() const;
- /// Returns the HTTP version for this message.
-
- void setContentLength(std::streamsize length);
- /// Sets the Content-Length header.
- ///
- /// If length is UNKNOWN_CONTENT_LENGTH, removes
- /// the Content-Length header.
-
- std::streamsize getContentLength() const;
- /// Returns the content length for this message,
- /// which may be UNKNOWN_CONTENT_LENGTH if
- /// no Content-Length header is present.
-
-#if defined(POCO_HAVE_INT64)
- void setContentLength64(Poco::Int64 length);
- /// Sets the Content-Length header.
- ///
- /// If length is UNKNOWN_CONTENT_LENGTH, removes
- /// the Content-Length header.
- ///
- /// In contrast to setContentLength(), this method takes
- /// a 64-bit integer as content length.
-
- Poco::Int64 getContentLength64() const;
- /// Returns the content length for this message,
- /// which may be UNKNOWN_CONTENT_LENGTH if
- /// no Content-Length header is present.
- ///
- /// In contrast to getContentLength(), this method
- /// always returns a 64-bit integer for content length.
-#endif // defined(POCO_HAVE_INT64)
-
- bool hasContentLength() const;
- /// Returns true iff a Content-Length header is present.
-
- void setTransferEncoding(const std::string& transferEncoding);
- /// Sets the transfer encoding for this message.
- ///
- /// The value should be either IDENTITY_TRANSFER_CODING
- /// or CHUNKED_TRANSFER_CODING.
-
- const std::string& getTransferEncoding() const;
- /// Returns the transfer encoding used for this
- /// message.
- ///
- /// Normally, this is the value of the Transfer-Encoding
- /// header field. If no such field is present,
- /// returns IDENTITY_TRANSFER_CODING.
-
- void setChunkedTransferEncoding(bool flag);
- /// If flag is true, sets the Transfer-Encoding header to
- /// chunked. Otherwise, removes the Transfer-Encoding
- /// header.
-
- bool getChunkedTransferEncoding() const;
- /// Returns true if the Transfer-Encoding header is set
- /// and its value is chunked.
-
- void setContentType(const std::string& mediaType);
- /// Sets the content type for this message.
- ///
- /// Specify NO_CONTENT_TYPE to remove the
- /// Content-Type header.
-
- void setContentType(const MediaType& mediaType);
- /// Sets the content type for this message.
-
- const std::string& getContentType() const;
- /// Returns the content type for this message.
- ///
- /// If no Content-Type header is present,
- /// returns UNKNOWN_CONTENT_TYPE.
-
- void setKeepAlive(bool keepAlive);
- /// Sets the value of the Connection header field.
- ///
- /// The value is set to "Keep-Alive" if keepAlive is
- /// true, or to "Close" otherwise.
-
- bool getKeepAlive() const;
- /// Returns true if
- /// * the message has a Connection header field and its value is "Keep-Alive"
- /// * the message is a HTTP/1.1 message and not Connection header is set
- /// Returns false otherwise.
-
- static const std::string HTTP_1_0;
- static const std::string HTTP_1_1;
-
- static const std::string IDENTITY_TRANSFER_ENCODING;
- static const std::string CHUNKED_TRANSFER_ENCODING;
-
- static const int UNKNOWN_CONTENT_LENGTH;
- static const std::string UNKNOWN_CONTENT_TYPE;
-
- static const std::string CONTENT_LENGTH;
- static const std::string CONTENT_TYPE;
- static const std::string TRANSFER_ENCODING;
- static const std::string CONNECTION;
-
- static const std::string CONNECTION_KEEP_ALIVE;
- static const std::string CONNECTION_CLOSE;
-
- static const std::string EMPTY;
-
-protected:
- HTTPMessage();
- /// Creates the HTTPMessage with version HTTP/1.0.
-
- HTTPMessage(const std::string& version);
- /// Creates the HTTPMessage and sets
- /// the version.
-
- virtual ~HTTPMessage();
- /// Destroys the HTTPMessage.
-
-private:
- HTTPMessage(const HTTPMessage&);
- HTTPMessage& operator = (const HTTPMessage&);
-
- std::string _version;
-};
-
-
-//
-// inlines
-//
-inline const std::string& HTTPMessage::getVersion() const
-{
- return _version;
-}
-
-
-inline bool HTTPMessage::hasContentLength() const
-{
- return has(CONTENT_LENGTH);
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_HTTPMessage_INCLUDED
+//
+// HTTPMessage.h
+//
+// Library: Net
+// Package: HTTP
+// Module: HTTPMessage
+//
+// Definition of the HTTPMessage class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_HTTPMessage_INCLUDED
+#define Net_HTTPMessage_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/MessageHeader.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class MediaType;
+
+
+class Net_API HTTPMessage: public MessageHeader
+ /// The base class for HTTPRequest and HTTPResponse.
+ ///
+ /// Defines the common properties of all HTTP messages.
+ /// These are version, content length, content type
+ /// and transfer encoding.
+{
+public:
+ void setVersion(const std::string& version);
+ /// Sets the HTTP version for this message.
+
+ const std::string& getVersion() const;
+ /// Returns the HTTP version for this message.
+
+ void setContentLength(std::streamsize length);
+ /// Sets the Content-Length header.
+ ///
+ /// If length is UNKNOWN_CONTENT_LENGTH, removes
+ /// the Content-Length header.
+
+ std::streamsize getContentLength() const;
+ /// Returns the content length for this message,
+ /// which may be UNKNOWN_CONTENT_LENGTH if
+ /// no Content-Length header is present.
+
+#if defined(POCO_HAVE_INT64)
+ void setContentLength64(Poco::Int64 length);
+ /// Sets the Content-Length header.
+ ///
+ /// If length is UNKNOWN_CONTENT_LENGTH, removes
+ /// the Content-Length header.
+ ///
+ /// In contrast to setContentLength(), this method takes
+ /// a 64-bit integer as content length.
+
+ Poco::Int64 getContentLength64() const;
+ /// Returns the content length for this message,
+ /// which may be UNKNOWN_CONTENT_LENGTH if
+ /// no Content-Length header is present.
+ ///
+ /// In contrast to getContentLength(), this method
+ /// always returns a 64-bit integer for content length.
+#endif // defined(POCO_HAVE_INT64)
+
+ bool hasContentLength() const;
+ /// Returns true iff a Content-Length header is present.
+
+ void setTransferEncoding(const std::string& transferEncoding);
+ /// Sets the transfer encoding for this message.
+ ///
+ /// The value should be either IDENTITY_TRANSFER_CODING
+ /// or CHUNKED_TRANSFER_CODING.
+
+ const std::string& getTransferEncoding() const;
+ /// Returns the transfer encoding used for this
+ /// message.
+ ///
+ /// Normally, this is the value of the Transfer-Encoding
+ /// header field. If no such field is present,
+ /// returns IDENTITY_TRANSFER_CODING.
+
+ void setChunkedTransferEncoding(bool flag);
+ /// If flag is true, sets the Transfer-Encoding header to
+ /// chunked. Otherwise, removes the Transfer-Encoding
+ /// header.
+
+ bool getChunkedTransferEncoding() const;
+ /// Returns true if the Transfer-Encoding header is set
+ /// and its value is chunked.
+
+ void setContentType(const std::string& mediaType);
+ /// Sets the content type for this message.
+ ///
+ /// Specify NO_CONTENT_TYPE to remove the
+ /// Content-Type header.
+
+ void setContentType(const MediaType& mediaType);
+ /// Sets the content type for this message.
+
+ const std::string& getContentType() const;
+ /// Returns the content type for this message.
+ ///
+ /// If no Content-Type header is present,
+ /// returns UNKNOWN_CONTENT_TYPE.
+
+ void setKeepAlive(bool keepAlive);
+ /// Sets the value of the Connection header field.
+ ///
+ /// The value is set to "Keep-Alive" if keepAlive is
+ /// true, or to "Close" otherwise.
+
+ bool getKeepAlive() const;
+ /// Returns true if
+ /// * the message has a Connection header field and its value is "Keep-Alive"
+ /// * the message is a HTTP/1.1 message and not Connection header is set
+ /// Returns false otherwise.
+
+ static const std::string HTTP_1_0;
+ static const std::string HTTP_1_1;
+
+ static const std::string IDENTITY_TRANSFER_ENCODING;
+ static const std::string CHUNKED_TRANSFER_ENCODING;
+
+ static const int UNKNOWN_CONTENT_LENGTH;
+ static const std::string UNKNOWN_CONTENT_TYPE;
+
+ static const std::string CONTENT_LENGTH;
+ static const std::string CONTENT_TYPE;
+ static const std::string TRANSFER_ENCODING;
+ static const std::string CONNECTION;
+
+ static const std::string CONNECTION_KEEP_ALIVE;
+ static const std::string CONNECTION_CLOSE;
+
+ static const std::string EMPTY;
+
+protected:
+ HTTPMessage();
+ /// Creates the HTTPMessage with version HTTP/1.0.
+
+ HTTPMessage(const std::string& version);
+ /// Creates the HTTPMessage and sets
+ /// the version.
+
+ virtual ~HTTPMessage();
+ /// Destroys the HTTPMessage.
+
+private:
+ HTTPMessage(const HTTPMessage&);
+ HTTPMessage& operator = (const HTTPMessage&);
+
+ std::string _version;
+};
+
+
+//
+// inlines
+//
+inline const std::string& HTTPMessage::getVersion() const
+{
+ return _version;
+}
+
+
+inline bool HTTPMessage::hasContentLength() const
+{
+ return has(CONTENT_LENGTH);
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_HTTPMessage_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/HTTPRequest.h b/contrib/libs/poco/Net/include/Poco/Net/HTTPRequest.h
index 13ea06121f..817a74dc46 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/HTTPRequest.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/HTTPRequest.h
@@ -1,200 +1,200 @@
-//
-// HTTPRequest.h
-//
-// Library: Net
-// Package: HTTP
-// Module: HTTPRequest
-//
-// Definition of the HTTPRequest class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_HTTPRequest_INCLUDED
-#define Net_HTTPRequest_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/HTTPMessage.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API HTTPRequest: public HTTPMessage
- /// This class encapsulates an HTTP request
- /// message.
- ///
- /// In addition to the properties common to
- /// all HTTP messages, a HTTP request has
- /// a method (e.g. GET, HEAD, POST, etc.) and
- /// a request URI.
-{
-public:
- HTTPRequest();
- /// Creates a GET / HTTP/1.0 HTTP request.
-
- HTTPRequest(const std::string& version);
- /// Creates a GET / HTTP/1.x request with
- /// the given version (HTTP/1.0 or HTTP/1.1).
-
- HTTPRequest(const std::string& method, const std::string& uri);
- /// Creates a HTTP/1.0 request with the given method and URI.
-
- HTTPRequest(const std::string& method, const std::string& uri, const std::string& version);
- /// Creates a HTTP request with the given method, URI and version.
-
- virtual ~HTTPRequest();
- /// Destroys the HTTPRequest.
-
- void setMethod(const std::string& method);
- /// Sets the method.
-
- const std::string& getMethod() const;
- /// Returns the method.
-
- void setURI(const std::string& uri);
- /// Sets the request URI.
-
- const std::string& getURI() const;
- /// Returns the request URI.
-
- void setHost(const std::string& host);
- /// Sets the value of the Host header field.
-
- void setHost(const std::string& host, Poco::UInt16 port);
- /// Sets the value of the Host header field.
- ///
- /// If the given port number is a non-standard
- /// port number (other than 80 or 443), it is
- /// included in the Host header field.
-
- const std::string& getHost() const;
- /// Returns the value of the Host header field.
- ///
- /// Throws a NotFoundException if the request
- /// does not have a Host header field.
-
- void setCookies(const NameValueCollection& cookies);
- /// Adds a Cookie header with the names and
- /// values from cookies.
-
- void getCookies(NameValueCollection& cookies) const;
- /// Fills cookies with the cookies extracted
- /// from the Cookie headers in the request.
-
- bool hasCredentials() const;
- /// Returns true iff the request contains authentication
- /// information in the form of an Authorization header.
-
- void getCredentials(std::string& scheme, std::string& authInfo) const;
- /// Returns the authentication scheme and additional authentication
- /// information contained in this request.
- ///
- /// Throws a NotAuthenticatedException if no authentication information
- /// is contained in the request.
-
- void setCredentials(const std::string& scheme, const std::string& authInfo);
- /// Sets the authentication scheme and information for
- /// this request.
-
- bool getExpectContinue() const;
- /// Returns true if the request contains an
- /// "Expect: 100-continue" header.
-
- void setExpectContinue(bool expectContinue);
- /// Adds a "Expect: 100-continue" header to the request if
- /// expectContinue is true, otherwise removes the Expect header.
-
- bool hasProxyCredentials() const;
- /// Returns true iff the request contains proxy authentication
- /// information in the form of an Proxy-Authorization header.
-
- void getProxyCredentials(std::string& scheme, std::string& authInfo) const;
- /// Returns the proxy authentication scheme and additional proxy authentication
- /// information contained in this request.
- ///
- /// Throws a NotAuthenticatedException if no proxy authentication information
- /// is contained in the request.
-
- void setProxyCredentials(const std::string& scheme, const std::string& authInfo);
- /// Sets the proxy authentication scheme and information for
- /// this request.
-
- void write(std::ostream& ostr) const;
- /// Writes the HTTP request to the given
- /// output stream.
-
- void read(std::istream& istr);
- /// Reads the HTTP request from the
- /// given input stream.
-
- static const std::string HTTP_GET;
- static const std::string HTTP_HEAD;
- static const std::string HTTP_PUT;
- static const std::string HTTP_POST;
- static const std::string HTTP_OPTIONS;
- static const std::string HTTP_DELETE;
- static const std::string HTTP_TRACE;
- static const std::string HTTP_CONNECT;
- static const std::string HTTP_PATCH;
-
- static const std::string HOST;
- static const std::string COOKIE;
- static const std::string AUTHORIZATION;
- static const std::string PROXY_AUTHORIZATION;
- static const std::string UPGRADE;
- static const std::string EXPECT;
-
-protected:
- void getCredentials(const std::string& header, std::string& scheme, std::string& authInfo) const;
- /// Returns the authentication scheme and additional authentication
- /// information contained in the given header of request.
- ///
- /// Throws a NotAuthenticatedException if no authentication information
- /// is contained in the request.
-
- void setCredentials(const std::string& header, const std::string& scheme, const std::string& authInfo);
- /// Writes the authentication scheme and information for
- /// this request to the given header.
-
-private:
- enum Limits
- {
- MAX_METHOD_LENGTH = 32,
- MAX_URI_LENGTH = 16384,
- MAX_VERSION_LENGTH = 8
- };
-
- std::string _method;
- std::string _uri;
-
- HTTPRequest(const HTTPRequest&);
- HTTPRequest& operator = (const HTTPRequest&);
-};
-
-
-//
-// inlines
-//
-inline const std::string& HTTPRequest::getMethod() const
-{
- return _method;
-}
-
-
-inline const std::string& HTTPRequest::getURI() const
-{
- return _uri;
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_HTTPRequest_INCLUDED
+//
+// HTTPRequest.h
+//
+// Library: Net
+// Package: HTTP
+// Module: HTTPRequest
+//
+// Definition of the HTTPRequest class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_HTTPRequest_INCLUDED
+#define Net_HTTPRequest_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/HTTPMessage.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API HTTPRequest: public HTTPMessage
+ /// This class encapsulates an HTTP request
+ /// message.
+ ///
+ /// In addition to the properties common to
+ /// all HTTP messages, a HTTP request has
+ /// a method (e.g. GET, HEAD, POST, etc.) and
+ /// a request URI.
+{
+public:
+ HTTPRequest();
+ /// Creates a GET / HTTP/1.0 HTTP request.
+
+ HTTPRequest(const std::string& version);
+ /// Creates a GET / HTTP/1.x request with
+ /// the given version (HTTP/1.0 or HTTP/1.1).
+
+ HTTPRequest(const std::string& method, const std::string& uri);
+ /// Creates a HTTP/1.0 request with the given method and URI.
+
+ HTTPRequest(const std::string& method, const std::string& uri, const std::string& version);
+ /// Creates a HTTP request with the given method, URI and version.
+
+ virtual ~HTTPRequest();
+ /// Destroys the HTTPRequest.
+
+ void setMethod(const std::string& method);
+ /// Sets the method.
+
+ const std::string& getMethod() const;
+ /// Returns the method.
+
+ void setURI(const std::string& uri);
+ /// Sets the request URI.
+
+ const std::string& getURI() const;
+ /// Returns the request URI.
+
+ void setHost(const std::string& host);
+ /// Sets the value of the Host header field.
+
+ void setHost(const std::string& host, Poco::UInt16 port);
+ /// Sets the value of the Host header field.
+ ///
+ /// If the given port number is a non-standard
+ /// port number (other than 80 or 443), it is
+ /// included in the Host header field.
+
+ const std::string& getHost() const;
+ /// Returns the value of the Host header field.
+ ///
+ /// Throws a NotFoundException if the request
+ /// does not have a Host header field.
+
+ void setCookies(const NameValueCollection& cookies);
+ /// Adds a Cookie header with the names and
+ /// values from cookies.
+
+ void getCookies(NameValueCollection& cookies) const;
+ /// Fills cookies with the cookies extracted
+ /// from the Cookie headers in the request.
+
+ bool hasCredentials() const;
+ /// Returns true iff the request contains authentication
+ /// information in the form of an Authorization header.
+
+ void getCredentials(std::string& scheme, std::string& authInfo) const;
+ /// Returns the authentication scheme and additional authentication
+ /// information contained in this request.
+ ///
+ /// Throws a NotAuthenticatedException if no authentication information
+ /// is contained in the request.
+
+ void setCredentials(const std::string& scheme, const std::string& authInfo);
+ /// Sets the authentication scheme and information for
+ /// this request.
+
+ bool getExpectContinue() const;
+ /// Returns true if the request contains an
+ /// "Expect: 100-continue" header.
+
+ void setExpectContinue(bool expectContinue);
+ /// Adds a "Expect: 100-continue" header to the request if
+ /// expectContinue is true, otherwise removes the Expect header.
+
+ bool hasProxyCredentials() const;
+ /// Returns true iff the request contains proxy authentication
+ /// information in the form of an Proxy-Authorization header.
+
+ void getProxyCredentials(std::string& scheme, std::string& authInfo) const;
+ /// Returns the proxy authentication scheme and additional proxy authentication
+ /// information contained in this request.
+ ///
+ /// Throws a NotAuthenticatedException if no proxy authentication information
+ /// is contained in the request.
+
+ void setProxyCredentials(const std::string& scheme, const std::string& authInfo);
+ /// Sets the proxy authentication scheme and information for
+ /// this request.
+
+ void write(std::ostream& ostr) const;
+ /// Writes the HTTP request to the given
+ /// output stream.
+
+ void read(std::istream& istr);
+ /// Reads the HTTP request from the
+ /// given input stream.
+
+ static const std::string HTTP_GET;
+ static const std::string HTTP_HEAD;
+ static const std::string HTTP_PUT;
+ static const std::string HTTP_POST;
+ static const std::string HTTP_OPTIONS;
+ static const std::string HTTP_DELETE;
+ static const std::string HTTP_TRACE;
+ static const std::string HTTP_CONNECT;
+ static const std::string HTTP_PATCH;
+
+ static const std::string HOST;
+ static const std::string COOKIE;
+ static const std::string AUTHORIZATION;
+ static const std::string PROXY_AUTHORIZATION;
+ static const std::string UPGRADE;
+ static const std::string EXPECT;
+
+protected:
+ void getCredentials(const std::string& header, std::string& scheme, std::string& authInfo) const;
+ /// Returns the authentication scheme and additional authentication
+ /// information contained in the given header of request.
+ ///
+ /// Throws a NotAuthenticatedException if no authentication information
+ /// is contained in the request.
+
+ void setCredentials(const std::string& header, const std::string& scheme, const std::string& authInfo);
+ /// Writes the authentication scheme and information for
+ /// this request to the given header.
+
+private:
+ enum Limits
+ {
+ MAX_METHOD_LENGTH = 32,
+ MAX_URI_LENGTH = 16384,
+ MAX_VERSION_LENGTH = 8
+ };
+
+ std::string _method;
+ std::string _uri;
+
+ HTTPRequest(const HTTPRequest&);
+ HTTPRequest& operator = (const HTTPRequest&);
+};
+
+
+//
+// inlines
+//
+inline const std::string& HTTPRequest::getMethod() const
+{
+ return _method;
+}
+
+
+inline const std::string& HTTPRequest::getURI() const
+{
+ return _uri;
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_HTTPRequest_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/HTTPRequestHandler.h b/contrib/libs/poco/Net/include/Poco/Net/HTTPRequestHandler.h
index 790b748c4c..8a6271204c 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/HTTPRequestHandler.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/HTTPRequestHandler.h
@@ -1,67 +1,67 @@
-//
-// HTTPRequestHandler.h
-//
-// Library: Net
-// Package: HTTPServer
-// Module: HTTPRequestHandler
-//
-// Definition of the HTTPRequestHandler class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_HTTPRequestHandler_INCLUDED
-#define Net_HTTPRequestHandler_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class HTTPServerRequest;
-class HTTPServerResponse;
-
-
-class Net_API HTTPRequestHandler
- /// The abstract base class for HTTPRequestHandlers
- /// created by HTTPServer.
- ///
- /// Derived classes must override the handleRequest() method.
- /// Furthermore, a HTTPRequestHandlerFactory must be provided.
- ///
- /// The handleRequest() method must perform the complete handling
- /// of the HTTP request connection. As soon as the handleRequest()
- /// method returns, the request handler object is destroyed.
- ///
- /// A new HTTPRequestHandler object will be created for
- /// each new HTTP request that is received by the HTTPServer.
-{
-public:
- HTTPRequestHandler();
- /// Creates the HTTPRequestHandler.
-
- virtual ~HTTPRequestHandler();
- /// Destroys the HTTPRequestHandler.
-
- virtual void handleRequest(HTTPServerRequest& request, HTTPServerResponse& response) = 0;
- /// Must be overridden by subclasses.
- ///
- /// Handles the given request.
-
-private:
- HTTPRequestHandler(const HTTPRequestHandler&);
- HTTPRequestHandler& operator = (const HTTPRequestHandler&);
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_HTTPRequestHandler_INCLUDED
+//
+// HTTPRequestHandler.h
+//
+// Library: Net
+// Package: HTTPServer
+// Module: HTTPRequestHandler
+//
+// Definition of the HTTPRequestHandler class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_HTTPRequestHandler_INCLUDED
+#define Net_HTTPRequestHandler_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class HTTPServerRequest;
+class HTTPServerResponse;
+
+
+class Net_API HTTPRequestHandler
+ /// The abstract base class for HTTPRequestHandlers
+ /// created by HTTPServer.
+ ///
+ /// Derived classes must override the handleRequest() method.
+ /// Furthermore, a HTTPRequestHandlerFactory must be provided.
+ ///
+ /// The handleRequest() method must perform the complete handling
+ /// of the HTTP request connection. As soon as the handleRequest()
+ /// method returns, the request handler object is destroyed.
+ ///
+ /// A new HTTPRequestHandler object will be created for
+ /// each new HTTP request that is received by the HTTPServer.
+{
+public:
+ HTTPRequestHandler();
+ /// Creates the HTTPRequestHandler.
+
+ virtual ~HTTPRequestHandler();
+ /// Destroys the HTTPRequestHandler.
+
+ virtual void handleRequest(HTTPServerRequest& request, HTTPServerResponse& response) = 0;
+ /// Must be overridden by subclasses.
+ ///
+ /// Handles the given request.
+
+private:
+ HTTPRequestHandler(const HTTPRequestHandler&);
+ HTTPRequestHandler& operator = (const HTTPRequestHandler&);
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_HTTPRequestHandler_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/HTTPRequestHandlerFactory.h b/contrib/libs/poco/Net/include/Poco/Net/HTTPRequestHandlerFactory.h
index d3a8319bc7..421c465018 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/HTTPRequestHandlerFactory.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/HTTPRequestHandlerFactory.h
@@ -1,78 +1,78 @@
-//
-// HTTPRequestHandlerFactory.h
-//
-// Library: Net
-// Package: HTTPServer
-// Module: HTTPRequestHandlerFactory
-//
-// Definition of the HTTPRequestHandlerFactory class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_HTTPRequestHandlerFactory_INCLUDED
-#define Net_HTTPRequestHandlerFactory_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/SharedPtr.h"
-#include "Poco/BasicEvent.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class HTTPServerRequest;
-class HTTPServerResponse;
-class HTTPRequestHandler;
-
-
-class Net_API HTTPRequestHandlerFactory
- /// A factory for HTTPRequestHandler objects.
- /// Subclasses must override the createRequestHandler()
- /// method.
-{
-public:
- typedef Poco::SharedPtr<HTTPRequestHandlerFactory> Ptr;
-
- HTTPRequestHandlerFactory();
- /// Creates the HTTPRequestHandlerFactory.
-
- virtual ~HTTPRequestHandlerFactory();
- /// Destroys the HTTPRequestHandlerFactory.
-
- virtual HTTPRequestHandler* createRequestHandler(const HTTPServerRequest& request) = 0;
- /// Must be overridden by subclasses.
- ///
- /// Creates a new request handler for the given HTTP request.
- ///
- /// The method should inspect the given HTTPServerRequest object (e.g., method
- /// and URI) and create an appropriate HTTPRequestHandler object to handle the
- /// request.
- ///
- /// If the request contains a "Expect: 100-continue" header, it's possible
- /// to prevent the server from sending the default 100 Continue response
- /// by setting the status of the response object that can be obtained through
- /// the request object (request.response()) to something other than 200 OK.
-
-protected:
- Poco::BasicEvent<const bool> serverStopped;
-
-private:
- HTTPRequestHandlerFactory(const HTTPRequestHandlerFactory&);
- HTTPRequestHandlerFactory& operator = (const HTTPRequestHandlerFactory&);
-
- friend class HTTPServer;
- friend class HTTPServerConnection;
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_HTTPRequestHandlerFactory_INCLUDED
+//
+// HTTPRequestHandlerFactory.h
+//
+// Library: Net
+// Package: HTTPServer
+// Module: HTTPRequestHandlerFactory
+//
+// Definition of the HTTPRequestHandlerFactory class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_HTTPRequestHandlerFactory_INCLUDED
+#define Net_HTTPRequestHandlerFactory_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/SharedPtr.h"
+#include "Poco/BasicEvent.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class HTTPServerRequest;
+class HTTPServerResponse;
+class HTTPRequestHandler;
+
+
+class Net_API HTTPRequestHandlerFactory
+ /// A factory for HTTPRequestHandler objects.
+ /// Subclasses must override the createRequestHandler()
+ /// method.
+{
+public:
+ typedef Poco::SharedPtr<HTTPRequestHandlerFactory> Ptr;
+
+ HTTPRequestHandlerFactory();
+ /// Creates the HTTPRequestHandlerFactory.
+
+ virtual ~HTTPRequestHandlerFactory();
+ /// Destroys the HTTPRequestHandlerFactory.
+
+ virtual HTTPRequestHandler* createRequestHandler(const HTTPServerRequest& request) = 0;
+ /// Must be overridden by subclasses.
+ ///
+ /// Creates a new request handler for the given HTTP request.
+ ///
+ /// The method should inspect the given HTTPServerRequest object (e.g., method
+ /// and URI) and create an appropriate HTTPRequestHandler object to handle the
+ /// request.
+ ///
+ /// If the request contains a "Expect: 100-continue" header, it's possible
+ /// to prevent the server from sending the default 100 Continue response
+ /// by setting the status of the response object that can be obtained through
+ /// the request object (request.response()) to something other than 200 OK.
+
+protected:
+ Poco::BasicEvent<const bool> serverStopped;
+
+private:
+ HTTPRequestHandlerFactory(const HTTPRequestHandlerFactory&);
+ HTTPRequestHandlerFactory& operator = (const HTTPRequestHandlerFactory&);
+
+ friend class HTTPServer;
+ friend class HTTPServerConnection;
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_HTTPRequestHandlerFactory_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/HTTPResponse.h b/contrib/libs/poco/Net/include/Poco/Net/HTTPResponse.h
index 861dd3d914..0c795f8f29 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/HTTPResponse.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/HTTPResponse.h
@@ -1,299 +1,299 @@
-//
-// HTTPResponse.h
-//
-// Library: Net
-// Package: HTTP
-// Module: HTTPResponse
-//
-// Definition of the HTTPResponse class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_HTTPResponse_INCLUDED
-#define Net_HTTPResponse_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/HTTPMessage.h"
-#include "Poco/Net/HTTPCookie.h"
-#include "Poco/Timestamp.h"
-#include <vector>
-
-
-namespace Poco {
-namespace Net {
-
-
-class HTTPCookie;
-
-
-class Net_API HTTPResponse: public HTTPMessage
- /// This class encapsulates an HTTP response
- /// message.
- ///
- /// In addition to the properties common to
- /// all HTTP messages, a HTTP response has
- /// status code and a reason phrase.
-{
-public:
- enum HTTPStatus
- {
- HTTP_CONTINUE = 100,
- HTTP_SWITCHING_PROTOCOLS = 101,
- HTTP_PROCESSING = 102,
- HTTP_OK = 200,
- HTTP_CREATED = 201,
- HTTP_ACCEPTED = 202,
- HTTP_NONAUTHORITATIVE = 203,
- HTTP_NO_CONTENT = 204,
- HTTP_RESET_CONTENT = 205,
- HTTP_PARTIAL_CONTENT = 206,
- HTTP_MULTI_STATUS = 207,
- HTTP_ALREADY_REPORTED = 208,
- HTTP_IM_USED = 226,
- HTTP_MULTIPLE_CHOICES = 300,
- HTTP_MOVED_PERMANENTLY = 301,
- HTTP_FOUND = 302,
- HTTP_SEE_OTHER = 303,
- HTTP_NOT_MODIFIED = 304,
- HTTP_USE_PROXY = 305,
- HTTP_USEPROXY = 305, /// @deprecated
- // UNUSED: 306
- HTTP_TEMPORARY_REDIRECT = 307,
- HTTP_PERMANENT_REDIRECT = 308,
- HTTP_BAD_REQUEST = 400,
- HTTP_UNAUTHORIZED = 401,
- HTTP_PAYMENT_REQUIRED = 402,
- HTTP_FORBIDDEN = 403,
- HTTP_NOT_FOUND = 404,
- HTTP_METHOD_NOT_ALLOWED = 405,
- HTTP_NOT_ACCEPTABLE = 406,
- HTTP_PROXY_AUTHENTICATION_REQUIRED = 407,
- HTTP_REQUEST_TIMEOUT = 408,
- HTTP_CONFLICT = 409,
- HTTP_GONE = 410,
- HTTP_LENGTH_REQUIRED = 411,
- HTTP_PRECONDITION_FAILED = 412,
- HTTP_REQUEST_ENTITY_TOO_LARGE = 413,
- HTTP_REQUESTENTITYTOOLARGE = 413, /// @deprecated
- HTTP_REQUEST_URI_TOO_LONG = 414,
- HTTP_REQUESTURITOOLONG = 414, /// @deprecated
- HTTP_UNSUPPORTED_MEDIA_TYPE = 415,
- HTTP_UNSUPPORTEDMEDIATYPE = 415, /// @deprecated
- HTTP_REQUESTED_RANGE_NOT_SATISFIABLE = 416,
- HTTP_EXPECTATION_FAILED = 417,
- HTTP_IM_A_TEAPOT = 418,
- HTTP_ENCHANCE_YOUR_CALM = 420,
- HTTP_MISDIRECTED_REQUEST = 421,
- HTTP_UNPROCESSABLE_ENTITY = 422,
- HTTP_LOCKED = 423,
- HTTP_FAILED_DEPENDENCY = 424,
- HTTP_UPGRADE_REQUIRED = 426,
- HTTP_PRECONDITION_REQUIRED = 428,
- HTTP_TOO_MANY_REQUESTS = 429,
- HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE = 431,
- HTTP_UNAVAILABLE_FOR_LEGAL_REASONS = 451,
- HTTP_INTERNAL_SERVER_ERROR = 500,
- HTTP_NOT_IMPLEMENTED = 501,
- HTTP_BAD_GATEWAY = 502,
- HTTP_SERVICE_UNAVAILABLE = 503,
- HTTP_GATEWAY_TIMEOUT = 504,
- HTTP_VERSION_NOT_SUPPORTED = 505,
- HTTP_VARIANT_ALSO_NEGOTIATES = 506,
- HTTP_INSUFFICIENT_STORAGE = 507,
- HTTP_LOOP_DETECTED = 508,
- HTTP_NOT_EXTENDED = 510,
- HTTP_NETWORK_AUTHENTICATION_REQUIRED = 511
- };
-
- HTTPResponse();
- /// Creates the HTTPResponse with OK status.
-
- HTTPResponse(HTTPStatus status, const std::string& reason);
- /// Creates the HTTPResponse with the given status
- /// and reason phrase.
-
- HTTPResponse(const std::string& version, HTTPStatus status, const std::string& reason);
- /// Creates the HTTPResponse with the given version, status
- /// and reason phrase.
-
- HTTPResponse(HTTPStatus status);
- /// Creates the HTTPResponse with the given status
- /// an an appropriate reason phrase.
-
- HTTPResponse(const std::string& version, HTTPStatus status);
- /// Creates the HTTPResponse with the given version, status
- /// an an appropriate reason phrase.
-
- virtual ~HTTPResponse();
- /// Destroys the HTTPResponse.
-
- void setStatus(HTTPStatus status);
- /// Sets the HTTP status code.
- ///
- /// Does not change the reason phrase.
-
- HTTPStatus getStatus() const;
- /// Returns the HTTP status code.
-
- void setStatus(const std::string& status);
- /// Sets the HTTP status code.
- ///
- /// The string must contain a valid
- /// HTTP numerical status code.
-
- void setReason(const std::string& reason);
- /// Sets the HTTP reason phrase.
-
- const std::string& getReason() const;
- /// Returns the HTTP reason phrase.
-
- void setStatusAndReason(HTTPStatus status, const std::string& reason);
- /// Sets the HTTP status code and reason phrase.
-
- void setStatusAndReason(HTTPStatus status);
- /// Sets the HTTP status code and reason phrase.
- ///
- /// The reason phrase is set according to the status code.
-
- void setDate(const Poco::Timestamp& dateTime);
- /// Sets the Date header to the given date/time value.
-
- Poco::Timestamp getDate() const;
- /// Returns the value of the Date header.
-
- void addCookie(const HTTPCookie& cookie);
- /// Adds the cookie to the response by
- /// adding a Set-Cookie header.
-
- void getCookies(std::vector<HTTPCookie>& cookies) const;
- /// Returns a vector with all the cookies
- /// set in the response header.
- ///
- /// May throw an exception in case of a malformed
- /// Set-Cookie header.
-
- void write(std::ostream& ostr) const;
- /// Writes the HTTP response to the given
- /// output stream.
-
- void beginWrite(std::ostream& ostr) const;
- /// Writes the HTTP response to the given
- /// output stream, but do not finish with \r\n delimiter.
-
- void read(std::istream& istr);
- /// Reads the HTTP response from the
- /// given input stream.
- ///
- /// 100 Continue responses are ignored.
-
- static const std::string& getReasonForStatus(HTTPStatus status);
- /// Returns an appropriate reason phrase
- /// for the given status code.
-
- static const std::string HTTP_REASON_CONTINUE;
- static const std::string HTTP_REASON_SWITCHING_PROTOCOLS;
- static const std::string HTTP_REASON_PROCESSING;
- static const std::string HTTP_REASON_OK;
- static const std::string HTTP_REASON_CREATED;
- static const std::string HTTP_REASON_ACCEPTED;
- static const std::string HTTP_REASON_NONAUTHORITATIVE;
- static const std::string HTTP_REASON_NO_CONTENT;
- static const std::string HTTP_REASON_RESET_CONTENT;
- static const std::string HTTP_REASON_PARTIAL_CONTENT;
- static const std::string HTTP_REASON_MULTI_STATUS;
- static const std::string HTTP_REASON_ALREADY_REPORTED;
- static const std::string HTTP_REASON_IM_USED;
- static const std::string HTTP_REASON_MULTIPLE_CHOICES;
- static const std::string HTTP_REASON_MOVED_PERMANENTLY;
- static const std::string HTTP_REASON_FOUND;
- static const std::string HTTP_REASON_SEE_OTHER;
- static const std::string HTTP_REASON_NOT_MODIFIED;
- static const std::string HTTP_REASON_USE_PROXY;
- static const std::string HTTP_REASON_TEMPORARY_REDIRECT;
- static const std::string HTTP_REASON_PERMANENT_REDIRECT;
- static const std::string HTTP_REASON_BAD_REQUEST;
- static const std::string HTTP_REASON_UNAUTHORIZED;
- static const std::string HTTP_REASON_PAYMENT_REQUIRED;
- static const std::string HTTP_REASON_FORBIDDEN;
- static const std::string HTTP_REASON_NOT_FOUND;
- static const std::string HTTP_REASON_METHOD_NOT_ALLOWED;
- static const std::string HTTP_REASON_NOT_ACCEPTABLE;
- static const std::string HTTP_REASON_PROXY_AUTHENTICATION_REQUIRED;
- static const std::string HTTP_REASON_REQUEST_TIMEOUT;
- static const std::string HTTP_REASON_CONFLICT;
- static const std::string HTTP_REASON_GONE;
- static const std::string HTTP_REASON_LENGTH_REQUIRED;
- static const std::string HTTP_REASON_PRECONDITION_FAILED;
- static const std::string HTTP_REASON_REQUEST_ENTITY_TOO_LARGE;
- static const std::string HTTP_REASON_REQUEST_URI_TOO_LONG;
- static const std::string HTTP_REASON_UNSUPPORTED_MEDIA_TYPE;
- static const std::string HTTP_REASON_REQUESTED_RANGE_NOT_SATISFIABLE;
- static const std::string HTTP_REASON_EXPECTATION_FAILED;
- static const std::string HTTP_REASON_IM_A_TEAPOT;
- static const std::string HTTP_REASON_ENCHANCE_YOUR_CALM;
- static const std::string HTTP_REASON_MISDIRECTED_REQUEST;
- static const std::string HTTP_REASON_UNPROCESSABLE_ENTITY;
- static const std::string HTTP_REASON_LOCKED;
- static const std::string HTTP_REASON_FAILED_DEPENDENCY;
- static const std::string HTTP_REASON_UPGRADE_REQUIRED;
- static const std::string HTTP_REASON_PRECONDITION_REQUIRED;
- static const std::string HTTP_REASON_TOO_MANY_REQUESTS;
- static const std::string HTTP_REASON_REQUEST_HEADER_FIELDS_TOO_LARGE;
- static const std::string HTTP_REASON_UNAVAILABLE_FOR_LEGAL_REASONS;
- static const std::string HTTP_REASON_INTERNAL_SERVER_ERROR;
- static const std::string HTTP_REASON_NOT_IMPLEMENTED;
- static const std::string HTTP_REASON_BAD_GATEWAY;
- static const std::string HTTP_REASON_SERVICE_UNAVAILABLE;
- static const std::string HTTP_REASON_GATEWAY_TIMEOUT;
- static const std::string HTTP_REASON_VERSION_NOT_SUPPORTED;
- static const std::string HTTP_REASON_VARIANT_ALSO_NEGOTIATES;
- static const std::string HTTP_REASON_INSUFFICIENT_STORAGE;
- static const std::string HTTP_REASON_LOOP_DETECTED;
- static const std::string HTTP_REASON_NOT_EXTENDED;
- static const std::string HTTP_REASON_NETWORK_AUTHENTICATION_REQUIRED;
- static const std::string HTTP_REASON_UNKNOWN;
-
- static const std::string DATE;
- static const std::string SET_COOKIE;
-
-private:
- enum Limits
- {
- MAX_VERSION_LENGTH = 8,
- MAX_STATUS_LENGTH = 3,
- MAX_REASON_LENGTH = 512
- };
-
- HTTPStatus _status;
- std::string _reason;
-
- HTTPResponse(const HTTPResponse&);
- HTTPResponse& operator = (const HTTPResponse&);
-};
-
-
-//
-// inlines
-//
-inline HTTPResponse::HTTPStatus HTTPResponse::getStatus() const
-{
- return _status;
-}
-
-
-inline const std::string& HTTPResponse::getReason() const
-{
- return _reason;
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_HTTPResponse_INCLUDED
+//
+// HTTPResponse.h
+//
+// Library: Net
+// Package: HTTP
+// Module: HTTPResponse
+//
+// Definition of the HTTPResponse class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_HTTPResponse_INCLUDED
+#define Net_HTTPResponse_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/HTTPMessage.h"
+#include "Poco/Net/HTTPCookie.h"
+#include "Poco/Timestamp.h"
+#include <vector>
+
+
+namespace Poco {
+namespace Net {
+
+
+class HTTPCookie;
+
+
+class Net_API HTTPResponse: public HTTPMessage
+ /// This class encapsulates an HTTP response
+ /// message.
+ ///
+ /// In addition to the properties common to
+ /// all HTTP messages, a HTTP response has
+ /// status code and a reason phrase.
+{
+public:
+ enum HTTPStatus
+ {
+ HTTP_CONTINUE = 100,
+ HTTP_SWITCHING_PROTOCOLS = 101,
+ HTTP_PROCESSING = 102,
+ HTTP_OK = 200,
+ HTTP_CREATED = 201,
+ HTTP_ACCEPTED = 202,
+ HTTP_NONAUTHORITATIVE = 203,
+ HTTP_NO_CONTENT = 204,
+ HTTP_RESET_CONTENT = 205,
+ HTTP_PARTIAL_CONTENT = 206,
+ HTTP_MULTI_STATUS = 207,
+ HTTP_ALREADY_REPORTED = 208,
+ HTTP_IM_USED = 226,
+ HTTP_MULTIPLE_CHOICES = 300,
+ HTTP_MOVED_PERMANENTLY = 301,
+ HTTP_FOUND = 302,
+ HTTP_SEE_OTHER = 303,
+ HTTP_NOT_MODIFIED = 304,
+ HTTP_USE_PROXY = 305,
+ HTTP_USEPROXY = 305, /// @deprecated
+ // UNUSED: 306
+ HTTP_TEMPORARY_REDIRECT = 307,
+ HTTP_PERMANENT_REDIRECT = 308,
+ HTTP_BAD_REQUEST = 400,
+ HTTP_UNAUTHORIZED = 401,
+ HTTP_PAYMENT_REQUIRED = 402,
+ HTTP_FORBIDDEN = 403,
+ HTTP_NOT_FOUND = 404,
+ HTTP_METHOD_NOT_ALLOWED = 405,
+ HTTP_NOT_ACCEPTABLE = 406,
+ HTTP_PROXY_AUTHENTICATION_REQUIRED = 407,
+ HTTP_REQUEST_TIMEOUT = 408,
+ HTTP_CONFLICT = 409,
+ HTTP_GONE = 410,
+ HTTP_LENGTH_REQUIRED = 411,
+ HTTP_PRECONDITION_FAILED = 412,
+ HTTP_REQUEST_ENTITY_TOO_LARGE = 413,
+ HTTP_REQUESTENTITYTOOLARGE = 413, /// @deprecated
+ HTTP_REQUEST_URI_TOO_LONG = 414,
+ HTTP_REQUESTURITOOLONG = 414, /// @deprecated
+ HTTP_UNSUPPORTED_MEDIA_TYPE = 415,
+ HTTP_UNSUPPORTEDMEDIATYPE = 415, /// @deprecated
+ HTTP_REQUESTED_RANGE_NOT_SATISFIABLE = 416,
+ HTTP_EXPECTATION_FAILED = 417,
+ HTTP_IM_A_TEAPOT = 418,
+ HTTP_ENCHANCE_YOUR_CALM = 420,
+ HTTP_MISDIRECTED_REQUEST = 421,
+ HTTP_UNPROCESSABLE_ENTITY = 422,
+ HTTP_LOCKED = 423,
+ HTTP_FAILED_DEPENDENCY = 424,
+ HTTP_UPGRADE_REQUIRED = 426,
+ HTTP_PRECONDITION_REQUIRED = 428,
+ HTTP_TOO_MANY_REQUESTS = 429,
+ HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE = 431,
+ HTTP_UNAVAILABLE_FOR_LEGAL_REASONS = 451,
+ HTTP_INTERNAL_SERVER_ERROR = 500,
+ HTTP_NOT_IMPLEMENTED = 501,
+ HTTP_BAD_GATEWAY = 502,
+ HTTP_SERVICE_UNAVAILABLE = 503,
+ HTTP_GATEWAY_TIMEOUT = 504,
+ HTTP_VERSION_NOT_SUPPORTED = 505,
+ HTTP_VARIANT_ALSO_NEGOTIATES = 506,
+ HTTP_INSUFFICIENT_STORAGE = 507,
+ HTTP_LOOP_DETECTED = 508,
+ HTTP_NOT_EXTENDED = 510,
+ HTTP_NETWORK_AUTHENTICATION_REQUIRED = 511
+ };
+
+ HTTPResponse();
+ /// Creates the HTTPResponse with OK status.
+
+ HTTPResponse(HTTPStatus status, const std::string& reason);
+ /// Creates the HTTPResponse with the given status
+ /// and reason phrase.
+
+ HTTPResponse(const std::string& version, HTTPStatus status, const std::string& reason);
+ /// Creates the HTTPResponse with the given version, status
+ /// and reason phrase.
+
+ HTTPResponse(HTTPStatus status);
+ /// Creates the HTTPResponse with the given status
+ /// an an appropriate reason phrase.
+
+ HTTPResponse(const std::string& version, HTTPStatus status);
+ /// Creates the HTTPResponse with the given version, status
+ /// an an appropriate reason phrase.
+
+ virtual ~HTTPResponse();
+ /// Destroys the HTTPResponse.
+
+ void setStatus(HTTPStatus status);
+ /// Sets the HTTP status code.
+ ///
+ /// Does not change the reason phrase.
+
+ HTTPStatus getStatus() const;
+ /// Returns the HTTP status code.
+
+ void setStatus(const std::string& status);
+ /// Sets the HTTP status code.
+ ///
+ /// The string must contain a valid
+ /// HTTP numerical status code.
+
+ void setReason(const std::string& reason);
+ /// Sets the HTTP reason phrase.
+
+ const std::string& getReason() const;
+ /// Returns the HTTP reason phrase.
+
+ void setStatusAndReason(HTTPStatus status, const std::string& reason);
+ /// Sets the HTTP status code and reason phrase.
+
+ void setStatusAndReason(HTTPStatus status);
+ /// Sets the HTTP status code and reason phrase.
+ ///
+ /// The reason phrase is set according to the status code.
+
+ void setDate(const Poco::Timestamp& dateTime);
+ /// Sets the Date header to the given date/time value.
+
+ Poco::Timestamp getDate() const;
+ /// Returns the value of the Date header.
+
+ void addCookie(const HTTPCookie& cookie);
+ /// Adds the cookie to the response by
+ /// adding a Set-Cookie header.
+
+ void getCookies(std::vector<HTTPCookie>& cookies) const;
+ /// Returns a vector with all the cookies
+ /// set in the response header.
+ ///
+ /// May throw an exception in case of a malformed
+ /// Set-Cookie header.
+
+ void write(std::ostream& ostr) const;
+ /// Writes the HTTP response to the given
+ /// output stream.
+
+ void beginWrite(std::ostream& ostr) const;
+ /// Writes the HTTP response to the given
+ /// output stream, but do not finish with \r\n delimiter.
+
+ void read(std::istream& istr);
+ /// Reads the HTTP response from the
+ /// given input stream.
+ ///
+ /// 100 Continue responses are ignored.
+
+ static const std::string& getReasonForStatus(HTTPStatus status);
+ /// Returns an appropriate reason phrase
+ /// for the given status code.
+
+ static const std::string HTTP_REASON_CONTINUE;
+ static const std::string HTTP_REASON_SWITCHING_PROTOCOLS;
+ static const std::string HTTP_REASON_PROCESSING;
+ static const std::string HTTP_REASON_OK;
+ static const std::string HTTP_REASON_CREATED;
+ static const std::string HTTP_REASON_ACCEPTED;
+ static const std::string HTTP_REASON_NONAUTHORITATIVE;
+ static const std::string HTTP_REASON_NO_CONTENT;
+ static const std::string HTTP_REASON_RESET_CONTENT;
+ static const std::string HTTP_REASON_PARTIAL_CONTENT;
+ static const std::string HTTP_REASON_MULTI_STATUS;
+ static const std::string HTTP_REASON_ALREADY_REPORTED;
+ static const std::string HTTP_REASON_IM_USED;
+ static const std::string HTTP_REASON_MULTIPLE_CHOICES;
+ static const std::string HTTP_REASON_MOVED_PERMANENTLY;
+ static const std::string HTTP_REASON_FOUND;
+ static const std::string HTTP_REASON_SEE_OTHER;
+ static const std::string HTTP_REASON_NOT_MODIFIED;
+ static const std::string HTTP_REASON_USE_PROXY;
+ static const std::string HTTP_REASON_TEMPORARY_REDIRECT;
+ static const std::string HTTP_REASON_PERMANENT_REDIRECT;
+ static const std::string HTTP_REASON_BAD_REQUEST;
+ static const std::string HTTP_REASON_UNAUTHORIZED;
+ static const std::string HTTP_REASON_PAYMENT_REQUIRED;
+ static const std::string HTTP_REASON_FORBIDDEN;
+ static const std::string HTTP_REASON_NOT_FOUND;
+ static const std::string HTTP_REASON_METHOD_NOT_ALLOWED;
+ static const std::string HTTP_REASON_NOT_ACCEPTABLE;
+ static const std::string HTTP_REASON_PROXY_AUTHENTICATION_REQUIRED;
+ static const std::string HTTP_REASON_REQUEST_TIMEOUT;
+ static const std::string HTTP_REASON_CONFLICT;
+ static const std::string HTTP_REASON_GONE;
+ static const std::string HTTP_REASON_LENGTH_REQUIRED;
+ static const std::string HTTP_REASON_PRECONDITION_FAILED;
+ static const std::string HTTP_REASON_REQUEST_ENTITY_TOO_LARGE;
+ static const std::string HTTP_REASON_REQUEST_URI_TOO_LONG;
+ static const std::string HTTP_REASON_UNSUPPORTED_MEDIA_TYPE;
+ static const std::string HTTP_REASON_REQUESTED_RANGE_NOT_SATISFIABLE;
+ static const std::string HTTP_REASON_EXPECTATION_FAILED;
+ static const std::string HTTP_REASON_IM_A_TEAPOT;
+ static const std::string HTTP_REASON_ENCHANCE_YOUR_CALM;
+ static const std::string HTTP_REASON_MISDIRECTED_REQUEST;
+ static const std::string HTTP_REASON_UNPROCESSABLE_ENTITY;
+ static const std::string HTTP_REASON_LOCKED;
+ static const std::string HTTP_REASON_FAILED_DEPENDENCY;
+ static const std::string HTTP_REASON_UPGRADE_REQUIRED;
+ static const std::string HTTP_REASON_PRECONDITION_REQUIRED;
+ static const std::string HTTP_REASON_TOO_MANY_REQUESTS;
+ static const std::string HTTP_REASON_REQUEST_HEADER_FIELDS_TOO_LARGE;
+ static const std::string HTTP_REASON_UNAVAILABLE_FOR_LEGAL_REASONS;
+ static const std::string HTTP_REASON_INTERNAL_SERVER_ERROR;
+ static const std::string HTTP_REASON_NOT_IMPLEMENTED;
+ static const std::string HTTP_REASON_BAD_GATEWAY;
+ static const std::string HTTP_REASON_SERVICE_UNAVAILABLE;
+ static const std::string HTTP_REASON_GATEWAY_TIMEOUT;
+ static const std::string HTTP_REASON_VERSION_NOT_SUPPORTED;
+ static const std::string HTTP_REASON_VARIANT_ALSO_NEGOTIATES;
+ static const std::string HTTP_REASON_INSUFFICIENT_STORAGE;
+ static const std::string HTTP_REASON_LOOP_DETECTED;
+ static const std::string HTTP_REASON_NOT_EXTENDED;
+ static const std::string HTTP_REASON_NETWORK_AUTHENTICATION_REQUIRED;
+ static const std::string HTTP_REASON_UNKNOWN;
+
+ static const std::string DATE;
+ static const std::string SET_COOKIE;
+
+private:
+ enum Limits
+ {
+ MAX_VERSION_LENGTH = 8,
+ MAX_STATUS_LENGTH = 3,
+ MAX_REASON_LENGTH = 512
+ };
+
+ HTTPStatus _status;
+ std::string _reason;
+
+ HTTPResponse(const HTTPResponse&);
+ HTTPResponse& operator = (const HTTPResponse&);
+};
+
+
+//
+// inlines
+//
+inline HTTPResponse::HTTPStatus HTTPResponse::getStatus() const
+{
+ return _status;
+}
+
+
+inline const std::string& HTTPResponse::getReason() const
+{
+ return _reason;
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_HTTPResponse_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/HTTPServer.h b/contrib/libs/poco/Net/include/Poco/Net/HTTPServer.h
index 5266fdbec4..69f092a673 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/HTTPServer.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/HTTPServer.h
@@ -1,103 +1,103 @@
-//
-// HTTPServer.h
-//
-// Library: Net
-// Package: HTTPServer
-// Module: HTTPServer
-//
-// Definition of the HTTPServer class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_HTTPServer_INCLUDED
-#define Net_HTTPServer_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/TCPServer.h"
-#include "Poco/Net/HTTPRequestHandlerFactory.h"
-#include "Poco/Net/HTTPServerParams.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API HTTPServer: public TCPServer
- /// A subclass of TCPServer that implements a
- /// full-featured multithreaded HTTP server.
- ///
- /// A HTTPRequestHandlerFactory must be supplied.
- /// The ServerSocket must be bound and in listening state.
- ///
- /// To configure various aspects of the server, a HTTPServerParams
- /// object can be passed to the constructor.
- ///
- /// The server supports:
- /// - HTTP/1.0 and HTTP/1.1
- /// - automatic handling of persistent connections.
- /// - automatic decoding/encoding of request/response message bodies
- /// using chunked transfer encoding.
- ///
- /// Please see the TCPServer class for information about
- /// connection and thread handling.
- ///
- /// See RFC 2616 <http://www.faqs.org/rfcs/rfc2616.html> for more
- /// information about the HTTP protocol.
-{
-public:
- HTTPServer(HTTPRequestHandlerFactory::Ptr pFactory, Poco::UInt16 portNumber = 80, HTTPServerParams::Ptr pParams = new HTTPServerParams);
- /// Creates HTTPServer listening on the given port (default 80).
- ///
- /// The server takes ownership of the HTTPRequstHandlerFactory
- /// and deletes it when it's no longer needed.
- ///
- /// New threads are taken from the default thread pool.
-
- HTTPServer(HTTPRequestHandlerFactory::Ptr pFactory, const ServerSocket& socket, HTTPServerParams::Ptr pParams);
- /// Creates the HTTPServer, using the given ServerSocket.
- ///
- /// The server takes ownership of the HTTPRequstHandlerFactory
- /// and deletes it when it's no longer needed.
- ///
- /// The server also takes ownership of the HTTPServerParams object.
- ///
- /// New threads are taken from the default thread pool.
-
- HTTPServer(HTTPRequestHandlerFactory::Ptr pFactory, Poco::ThreadPool& threadPool, const ServerSocket& socket, HTTPServerParams::Ptr pParams);
- /// Creates the HTTPServer, using the given ServerSocket.
- ///
- /// The server takes ownership of the HTTPRequstHandlerFactory
- /// and deletes it when it's no longer needed.
- ///
- /// The server also takes ownership of the HTTPServerParams object.
- ///
- /// New threads are taken from the given thread pool.
-
- ~HTTPServer();
- /// Destroys the HTTPServer and its HTTPRequestHandlerFactory.
-
- void stopAll(bool abortCurrent = false);
- /// Stops the server. In contrast to TCPServer::stop(), which also
- /// stops the server, but allows all client connections to finish at
- /// their pace, this allows finer control over client connections.
- ///
- /// If abortCurrent is false, all current requests are allowed to
- /// complete. If abortCurrent is true, the underlying sockets of
- /// all client connections are shut down, causing all requests
- /// to abort.
-
-private:
- HTTPRequestHandlerFactory::Ptr _pFactory;
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_HTTPServer_INCLUDED
+//
+// HTTPServer.h
+//
+// Library: Net
+// Package: HTTPServer
+// Module: HTTPServer
+//
+// Definition of the HTTPServer class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_HTTPServer_INCLUDED
+#define Net_HTTPServer_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/TCPServer.h"
+#include "Poco/Net/HTTPRequestHandlerFactory.h"
+#include "Poco/Net/HTTPServerParams.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API HTTPServer: public TCPServer
+ /// A subclass of TCPServer that implements a
+ /// full-featured multithreaded HTTP server.
+ ///
+ /// A HTTPRequestHandlerFactory must be supplied.
+ /// The ServerSocket must be bound and in listening state.
+ ///
+ /// To configure various aspects of the server, a HTTPServerParams
+ /// object can be passed to the constructor.
+ ///
+ /// The server supports:
+ /// - HTTP/1.0 and HTTP/1.1
+ /// - automatic handling of persistent connections.
+ /// - automatic decoding/encoding of request/response message bodies
+ /// using chunked transfer encoding.
+ ///
+ /// Please see the TCPServer class for information about
+ /// connection and thread handling.
+ ///
+ /// See RFC 2616 <http://www.faqs.org/rfcs/rfc2616.html> for more
+ /// information about the HTTP protocol.
+{
+public:
+ HTTPServer(HTTPRequestHandlerFactory::Ptr pFactory, Poco::UInt16 portNumber = 80, HTTPServerParams::Ptr pParams = new HTTPServerParams);
+ /// Creates HTTPServer listening on the given port (default 80).
+ ///
+ /// The server takes ownership of the HTTPRequstHandlerFactory
+ /// and deletes it when it's no longer needed.
+ ///
+ /// New threads are taken from the default thread pool.
+
+ HTTPServer(HTTPRequestHandlerFactory::Ptr pFactory, const ServerSocket& socket, HTTPServerParams::Ptr pParams);
+ /// Creates the HTTPServer, using the given ServerSocket.
+ ///
+ /// The server takes ownership of the HTTPRequstHandlerFactory
+ /// and deletes it when it's no longer needed.
+ ///
+ /// The server also takes ownership of the HTTPServerParams object.
+ ///
+ /// New threads are taken from the default thread pool.
+
+ HTTPServer(HTTPRequestHandlerFactory::Ptr pFactory, Poco::ThreadPool& threadPool, const ServerSocket& socket, HTTPServerParams::Ptr pParams);
+ /// Creates the HTTPServer, using the given ServerSocket.
+ ///
+ /// The server takes ownership of the HTTPRequstHandlerFactory
+ /// and deletes it when it's no longer needed.
+ ///
+ /// The server also takes ownership of the HTTPServerParams object.
+ ///
+ /// New threads are taken from the given thread pool.
+
+ ~HTTPServer();
+ /// Destroys the HTTPServer and its HTTPRequestHandlerFactory.
+
+ void stopAll(bool abortCurrent = false);
+ /// Stops the server. In contrast to TCPServer::stop(), which also
+ /// stops the server, but allows all client connections to finish at
+ /// their pace, this allows finer control over client connections.
+ ///
+ /// If abortCurrent is false, all current requests are allowed to
+ /// complete. If abortCurrent is true, the underlying sockets of
+ /// all client connections are shut down, causing all requests
+ /// to abort.
+
+private:
+ HTTPRequestHandlerFactory::Ptr _pFactory;
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_HTTPServer_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/HTTPServerConnection.h b/contrib/libs/poco/Net/include/Poco/Net/HTTPServerConnection.h
index 9e0d3cf376..536889c04a 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/HTTPServerConnection.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/HTTPServerConnection.h
@@ -1,65 +1,65 @@
-//
-// HTTPServerConnection.h
-//
-// Library: Net
-// Package: HTTPServer
-// Module: HTTPServerConnection
-//
-// Definition of the HTTPServerConnection class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_HTTPServerConnection_INCLUDED
-#define Net_HTTPServerConnection_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/TCPServerConnection.h"
-#include "Poco/Net/HTTPResponse.h"
-#include "Poco/Net/HTTPRequestHandlerFactory.h"
-#include "Poco/Net/HTTPServerParams.h"
-#include "Poco/Mutex.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class HTTPServerSession;
-
-
-class Net_API HTTPServerConnection: public TCPServerConnection
- /// This subclass of TCPServerConnection handles HTTP
- /// connections.
-{
-public:
- HTTPServerConnection(const StreamSocket& socket, HTTPServerParams::Ptr pParams, HTTPRequestHandlerFactory::Ptr pFactory);
- /// Creates the HTTPServerConnection.
-
- virtual ~HTTPServerConnection();
- /// Destroys the HTTPServerConnection.
-
- void run();
- /// Handles all HTTP requests coming in.
-
-protected:
- void sendErrorResponse(HTTPServerSession& session, HTTPResponse::HTTPStatus status);
- void onServerStopped(const bool& abortCurrent);
-
-private:
- HTTPServerParams::Ptr _pParams;
- HTTPRequestHandlerFactory::Ptr _pFactory;
- bool _stopped;
- Poco::FastMutex _mutex;
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_HTTPServerConnection_INCLUDED
+//
+// HTTPServerConnection.h
+//
+// Library: Net
+// Package: HTTPServer
+// Module: HTTPServerConnection
+//
+// Definition of the HTTPServerConnection class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_HTTPServerConnection_INCLUDED
+#define Net_HTTPServerConnection_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/TCPServerConnection.h"
+#include "Poco/Net/HTTPResponse.h"
+#include "Poco/Net/HTTPRequestHandlerFactory.h"
+#include "Poco/Net/HTTPServerParams.h"
+#include "Poco/Mutex.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class HTTPServerSession;
+
+
+class Net_API HTTPServerConnection: public TCPServerConnection
+ /// This subclass of TCPServerConnection handles HTTP
+ /// connections.
+{
+public:
+ HTTPServerConnection(const StreamSocket& socket, HTTPServerParams::Ptr pParams, HTTPRequestHandlerFactory::Ptr pFactory);
+ /// Creates the HTTPServerConnection.
+
+ virtual ~HTTPServerConnection();
+ /// Destroys the HTTPServerConnection.
+
+ void run();
+ /// Handles all HTTP requests coming in.
+
+protected:
+ void sendErrorResponse(HTTPServerSession& session, HTTPResponse::HTTPStatus status);
+ void onServerStopped(const bool& abortCurrent);
+
+private:
+ HTTPServerParams::Ptr _pParams;
+ HTTPRequestHandlerFactory::Ptr _pFactory;
+ bool _stopped;
+ Poco::FastMutex _mutex;
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_HTTPServerConnection_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/HTTPServerConnectionFactory.h b/contrib/libs/poco/Net/include/Poco/Net/HTTPServerConnectionFactory.h
index 0386b68c7a..fc44f912c5 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/HTTPServerConnectionFactory.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/HTTPServerConnectionFactory.h
@@ -1,55 +1,55 @@
-//
-// HTTPServerConnectionFactory.h
-//
-// Library: Net
-// Package: HTTPServer
-// Module: HTTPServerConnectionFactory
-//
-// Definition of the HTTPServerConnectionFactory class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_HTTPServerConnectionFactory_INCLUDED
-#define Net_HTTPServerConnectionFactory_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/TCPServerConnectionFactory.h"
-#include "Poco/Net/HTTPRequestHandlerFactory.h"
-#include "Poco/Net/HTTPServerParams.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API HTTPServerConnectionFactory: public TCPServerConnectionFactory
- /// This implementation of a TCPServerConnectionFactory
- /// is used by HTTPServer to create HTTPServerConnection objects.
-{
-public:
- HTTPServerConnectionFactory(HTTPServerParams::Ptr pParams, HTTPRequestHandlerFactory::Ptr pFactory);
- /// Creates the HTTPServerConnectionFactory.
-
- ~HTTPServerConnectionFactory();
- /// Destroys the HTTPServerConnectionFactory.
-
- TCPServerConnection* createConnection(const StreamSocket& socket);
- /// Creates an instance of HTTPServerConnection
- /// using the given StreamSocket.
-
-private:
- HTTPServerParams::Ptr _pParams;
- HTTPRequestHandlerFactory::Ptr _pFactory;
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_HTTPServerConnectionFactory_INCLUDED
+//
+// HTTPServerConnectionFactory.h
+//
+// Library: Net
+// Package: HTTPServer
+// Module: HTTPServerConnectionFactory
+//
+// Definition of the HTTPServerConnectionFactory class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_HTTPServerConnectionFactory_INCLUDED
+#define Net_HTTPServerConnectionFactory_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/TCPServerConnectionFactory.h"
+#include "Poco/Net/HTTPRequestHandlerFactory.h"
+#include "Poco/Net/HTTPServerParams.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API HTTPServerConnectionFactory: public TCPServerConnectionFactory
+ /// This implementation of a TCPServerConnectionFactory
+ /// is used by HTTPServer to create HTTPServerConnection objects.
+{
+public:
+ HTTPServerConnectionFactory(HTTPServerParams::Ptr pParams, HTTPRequestHandlerFactory::Ptr pFactory);
+ /// Creates the HTTPServerConnectionFactory.
+
+ ~HTTPServerConnectionFactory();
+ /// Destroys the HTTPServerConnectionFactory.
+
+ TCPServerConnection* createConnection(const StreamSocket& socket);
+ /// Creates an instance of HTTPServerConnection
+ /// using the given StreamSocket.
+
+private:
+ HTTPServerParams::Ptr _pParams;
+ HTTPRequestHandlerFactory::Ptr _pFactory;
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_HTTPServerConnectionFactory_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/HTTPServerParams.h b/contrib/libs/poco/Net/include/Poco/Net/HTTPServerParams.h
index 10da477742..0fb86aaca1 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/HTTPServerParams.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/HTTPServerParams.h
@@ -1,154 +1,154 @@
-//
-// HTTPServerParams.h
-//
-// Library: Net
-// Package: HTTPServer
-// Module: HTTPServerParams
-//
-// Definition of the HTTPServerParams class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_HTTPServerParams_INCLUDED
-#define Net_HTTPServerParams_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/TCPServerParams.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API HTTPServerParams: public TCPServerParams
- /// This class is used to specify parameters to both the
- /// HTTPServer, as well as to HTTPRequestHandler objects.
- ///
- /// Subclasses may add new parameters to the class.
-{
-public:
- typedef Poco::AutoPtr<HTTPServerParams> Ptr;
-
- HTTPServerParams();
- /// Creates the HTTPServerParams.
- ///
- /// Sets the following default values:
- /// - timeout: 60 seconds
- /// - keepAlive: true
- /// - maxKeepAliveRequests: 0
- /// - keepAliveTimeout: 10 seconds
-
- void setServerName(const std::string& serverName);
- /// Sets the name and port (name:port) that the server uses to identify itself.
- ///
- /// If this is not set to valid DNS name for your host, server-generated
- /// redirections will not work.
-
- const std::string& getServerName() const;
- /// Returns the name and port (name:port) that the server uses to identify itself.
-
- void setSoftwareVersion(const std::string& softwareVersion);
- /// Sets the server software name and version that the server uses to identify
- /// itself. If this is set to a non-empty string, the server will
- /// automatically include a Server header field with the value given
- /// here in every response it sends.
- ///
- /// The format of the softwareVersion string should be name/version
- /// (e.g. MyHTTPServer/1.0).
-
- const std::string& getSoftwareVersion() const;
- /// Returns the server software name and version that the server uses to
- /// identify itself.
-
- void setTimeout(const Poco::Timespan& timeout);
- /// Sets the connection timeout for HTTP connections.
-
- const Poco::Timespan& getTimeout() const;
- /// Returns the connection timeout for HTTP connections.
-
- void setKeepAlive(bool keepAlive);
- /// Enables (keepAlive == true) or disables (keepAlive == false)
- /// persistent connections.
-
- bool getKeepAlive() const;
- /// Returns true iff persistent connections are enabled.
-
- void setKeepAliveTimeout(const Poco::Timespan& timeout);
- /// Sets the connection timeout for HTTP connections.
-
- const Poco::Timespan& getKeepAliveTimeout() const;
- /// Returns the connection timeout for HTTP connections.
-
- void setMaxKeepAliveRequests(int maxKeepAliveRequests);
- /// Specifies the maximum number of requests allowed
- /// during a persistent connection. 0 means unlimited
- /// connections.
-
- int getMaxKeepAliveRequests() const;
- /// Returns the maximum number of requests allowed
- /// during a persistent connection, or 0 if
- /// unlimited connections are allowed.
-
-protected:
- virtual ~HTTPServerParams();
- /// Destroys the HTTPServerParams.
-
-private:
- std::string _serverName;
- std::string _softwareVersion;
- Poco::Timespan _timeout;
- bool _keepAlive;
- int _maxKeepAliveRequests;
- Poco::Timespan _keepAliveTimeout;
-};
-
-
-//
-// inlines
-//
-inline const std::string& HTTPServerParams::getServerName() const
-{
- return _serverName;
-}
-
-
-inline const std::string& HTTPServerParams::getSoftwareVersion() const
-{
- return _softwareVersion;
-}
-
-
-inline const Poco::Timespan& HTTPServerParams::getTimeout() const
-{
- return _timeout;
-}
-
-
-inline bool HTTPServerParams::getKeepAlive() const
-{
- return _keepAlive;
-}
-
-
-inline int HTTPServerParams::getMaxKeepAliveRequests() const
-{
- return _maxKeepAliveRequests;
-}
-
-
-inline const Poco::Timespan& HTTPServerParams::getKeepAliveTimeout() const
-{
- return _keepAliveTimeout;
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_HTTPServerParams_INCLUDED
+//
+// HTTPServerParams.h
+//
+// Library: Net
+// Package: HTTPServer
+// Module: HTTPServerParams
+//
+// Definition of the HTTPServerParams class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_HTTPServerParams_INCLUDED
+#define Net_HTTPServerParams_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/TCPServerParams.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API HTTPServerParams: public TCPServerParams
+ /// This class is used to specify parameters to both the
+ /// HTTPServer, as well as to HTTPRequestHandler objects.
+ ///
+ /// Subclasses may add new parameters to the class.
+{
+public:
+ typedef Poco::AutoPtr<HTTPServerParams> Ptr;
+
+ HTTPServerParams();
+ /// Creates the HTTPServerParams.
+ ///
+ /// Sets the following default values:
+ /// - timeout: 60 seconds
+ /// - keepAlive: true
+ /// - maxKeepAliveRequests: 0
+ /// - keepAliveTimeout: 10 seconds
+
+ void setServerName(const std::string& serverName);
+ /// Sets the name and port (name:port) that the server uses to identify itself.
+ ///
+ /// If this is not set to valid DNS name for your host, server-generated
+ /// redirections will not work.
+
+ const std::string& getServerName() const;
+ /// Returns the name and port (name:port) that the server uses to identify itself.
+
+ void setSoftwareVersion(const std::string& softwareVersion);
+ /// Sets the server software name and version that the server uses to identify
+ /// itself. If this is set to a non-empty string, the server will
+ /// automatically include a Server header field with the value given
+ /// here in every response it sends.
+ ///
+ /// The format of the softwareVersion string should be name/version
+ /// (e.g. MyHTTPServer/1.0).
+
+ const std::string& getSoftwareVersion() const;
+ /// Returns the server software name and version that the server uses to
+ /// identify itself.
+
+ void setTimeout(const Poco::Timespan& timeout);
+ /// Sets the connection timeout for HTTP connections.
+
+ const Poco::Timespan& getTimeout() const;
+ /// Returns the connection timeout for HTTP connections.
+
+ void setKeepAlive(bool keepAlive);
+ /// Enables (keepAlive == true) or disables (keepAlive == false)
+ /// persistent connections.
+
+ bool getKeepAlive() const;
+ /// Returns true iff persistent connections are enabled.
+
+ void setKeepAliveTimeout(const Poco::Timespan& timeout);
+ /// Sets the connection timeout for HTTP connections.
+
+ const Poco::Timespan& getKeepAliveTimeout() const;
+ /// Returns the connection timeout for HTTP connections.
+
+ void setMaxKeepAliveRequests(int maxKeepAliveRequests);
+ /// Specifies the maximum number of requests allowed
+ /// during a persistent connection. 0 means unlimited
+ /// connections.
+
+ int getMaxKeepAliveRequests() const;
+ /// Returns the maximum number of requests allowed
+ /// during a persistent connection, or 0 if
+ /// unlimited connections are allowed.
+
+protected:
+ virtual ~HTTPServerParams();
+ /// Destroys the HTTPServerParams.
+
+private:
+ std::string _serverName;
+ std::string _softwareVersion;
+ Poco::Timespan _timeout;
+ bool _keepAlive;
+ int _maxKeepAliveRequests;
+ Poco::Timespan _keepAliveTimeout;
+};
+
+
+//
+// inlines
+//
+inline const std::string& HTTPServerParams::getServerName() const
+{
+ return _serverName;
+}
+
+
+inline const std::string& HTTPServerParams::getSoftwareVersion() const
+{
+ return _softwareVersion;
+}
+
+
+inline const Poco::Timespan& HTTPServerParams::getTimeout() const
+{
+ return _timeout;
+}
+
+
+inline bool HTTPServerParams::getKeepAlive() const
+{
+ return _keepAlive;
+}
+
+
+inline int HTTPServerParams::getMaxKeepAliveRequests() const
+{
+ return _maxKeepAliveRequests;
+}
+
+
+inline const Poco::Timespan& HTTPServerParams::getKeepAliveTimeout() const
+{
+ return _keepAliveTimeout;
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_HTTPServerParams_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/HTTPServerRequest.h b/contrib/libs/poco/Net/include/Poco/Net/HTTPServerRequest.h
index 84ad4bcd83..69ffeaec08 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/HTTPServerRequest.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/HTTPServerRequest.h
@@ -1,80 +1,80 @@
-//
-// HTTPServerRequest.h
-//
-// Library: Net
-// Package: HTTPServer
-// Module: HTTPServerRequest
-//
-// Definition of the HTTPServerRequest class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_HTTPServerRequest_INCLUDED
-#define Net_HTTPServerRequest_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/HTTPRequest.h"
-#include "Poco/Net/SocketAddress.h"
-#include <istream>
-
-
-namespace Poco {
-namespace Net {
-
-
-class HTTPServerSession;
-class HTTPServerResponse;
-class HTTPServerParams;
-
-
-class Net_API HTTPServerRequest: public HTTPRequest
- /// This abstract subclass of HTTPRequest is used for
- /// representing server-side HTTP requests.
- ///
- /// A HTTPServerRequest is passed to the
- /// handleRequest() method of HTTPRequestHandler.
-{
-public:
- HTTPServerRequest();
- /// Creates the HTTPServerRequest
-
- ~HTTPServerRequest();
- /// Destroys the HTTPServerRequest.
-
- virtual std::istream& stream() = 0;
- /// Returns the input stream for reading
- /// the request body.
- ///
- /// The stream must be valid until the HTTPServerRequest
- /// object is destroyed.
-
- virtual const SocketAddress& clientAddress() const = 0;
- /// Returns the client's address.
-
- virtual const SocketAddress& serverAddress() const = 0;
- /// Returns the server's address.
-
- virtual const HTTPServerParams& serverParams() const = 0;
- /// Returns a reference to the server parameters.
-
- virtual HTTPServerResponse& response() const = 0;
- /// Returns a reference to the associated response.
-
- virtual bool secure() const = 0;
- /// Returns true if the request is using a secure
- /// connection. Returns false if no secure connection
- /// is used, or if it is not known whether a secure
- /// connection is used.
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_HTTPServerRequest_INCLUDED
+//
+// HTTPServerRequest.h
+//
+// Library: Net
+// Package: HTTPServer
+// Module: HTTPServerRequest
+//
+// Definition of the HTTPServerRequest class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_HTTPServerRequest_INCLUDED
+#define Net_HTTPServerRequest_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/HTTPRequest.h"
+#include "Poco/Net/SocketAddress.h"
+#include <istream>
+
+
+namespace Poco {
+namespace Net {
+
+
+class HTTPServerSession;
+class HTTPServerResponse;
+class HTTPServerParams;
+
+
+class Net_API HTTPServerRequest: public HTTPRequest
+ /// This abstract subclass of HTTPRequest is used for
+ /// representing server-side HTTP requests.
+ ///
+ /// A HTTPServerRequest is passed to the
+ /// handleRequest() method of HTTPRequestHandler.
+{
+public:
+ HTTPServerRequest();
+ /// Creates the HTTPServerRequest
+
+ ~HTTPServerRequest();
+ /// Destroys the HTTPServerRequest.
+
+ virtual std::istream& stream() = 0;
+ /// Returns the input stream for reading
+ /// the request body.
+ ///
+ /// The stream must be valid until the HTTPServerRequest
+ /// object is destroyed.
+
+ virtual const SocketAddress& clientAddress() const = 0;
+ /// Returns the client's address.
+
+ virtual const SocketAddress& serverAddress() const = 0;
+ /// Returns the server's address.
+
+ virtual const HTTPServerParams& serverParams() const = 0;
+ /// Returns a reference to the server parameters.
+
+ virtual HTTPServerResponse& response() const = 0;
+ /// Returns a reference to the associated response.
+
+ virtual bool secure() const = 0;
+ /// Returns true if the request is using a secure
+ /// connection. Returns false if no secure connection
+ /// is used, or if it is not known whether a secure
+ /// connection is used.
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_HTTPServerRequest_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/HTTPServerRequestImpl.h b/contrib/libs/poco/Net/include/Poco/Net/HTTPServerRequestImpl.h
index fdc329be14..419adbb5e4 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/HTTPServerRequestImpl.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/HTTPServerRequestImpl.h
@@ -1,142 +1,142 @@
-//
-// HTTPServerRequestImpl.h
-//
-// Library: Net
-// Package: HTTPServer
-// Module: HTTPServerRequestImpl
-//
-// Definition of the HTTPServerRequestImpl class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_HTTPServerRequestImpl_INCLUDED
-#define Net_HTTPServerRequestImpl_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/HTTPServerRequest.h"
-#include "Poco/Net/HTTPServerResponseImpl.h"
-#include "Poco/Net/SocketAddress.h"
-#include "Poco/AutoPtr.h"
-#include <istream>
-
-
-namespace Poco {
-namespace Net {
-
-
-class HTTPServerSession;
-class HTTPServerParams;
-class StreamSocket;
-
-
-class Net_API HTTPServerRequestImpl: public HTTPServerRequest
- /// This subclass of HTTPServerRequest is used for
- /// representing server-side HTTP requests.
- ///
- /// A HTTPServerRequest is passed to the
- /// handleRequest() method of HTTPRequestHandler.
-{
-public:
- HTTPServerRequestImpl(HTTPServerResponseImpl& response, HTTPServerSession& session, HTTPServerParams* pParams);
- /// Creates the HTTPServerRequestImpl, using the
- /// given HTTPServerSession.
-
- ~HTTPServerRequestImpl();
- /// Destroys the HTTPServerRequestImpl.
-
- std::istream& stream();
- /// Returns the input stream for reading
- /// the request body.
- ///
- /// The stream is valid until the HTTPServerRequestImpl
- /// object is destroyed.
-
- const SocketAddress& clientAddress() const;
- /// Returns the client's address.
-
- const SocketAddress& serverAddress() const;
- /// Returns the server's address.
-
- const HTTPServerParams& serverParams() const;
- /// Returns a reference to the server parameters.
-
- HTTPServerResponse& response() const;
- /// Returns a reference to the associated response.
-
- bool secure() const;
- /// Returns true if the request is using a secure
- /// connection. Returns false if no secure connection
- /// is used, or if it is not known whether a secure
- /// connection is used.
-
- StreamSocket& socket();
- /// Returns a reference to the underlying socket.
-
- StreamSocket detachSocket();
- /// Returns the underlying socket after detaching
- /// it from the server session.
-
- HTTPServerSession& session();
- /// Returns the underlying HTTPServerSession.
-
-private:
- HTTPServerResponseImpl& _response;
- HTTPServerSession& _session;
- std::istream* _pStream;
- Poco::AutoPtr<HTTPServerParams> _pParams;
- SocketAddress _clientAddress;
- SocketAddress _serverAddress;
-};
-
-
-//
-// inlines
-//
-inline std::istream& HTTPServerRequestImpl::stream()
-{
- poco_check_ptr (_pStream);
-
- return *_pStream;
-}
-
-
-inline const SocketAddress& HTTPServerRequestImpl::clientAddress() const
-{
- return _clientAddress;
-}
-
-
-inline const SocketAddress& HTTPServerRequestImpl::serverAddress() const
-{
- return _serverAddress;
-}
-
-
-inline const HTTPServerParams& HTTPServerRequestImpl::serverParams() const
-{
- return *_pParams;
-}
-
-
-inline HTTPServerResponse& HTTPServerRequestImpl::response() const
-{
- return _response;
-}
-
-
-inline HTTPServerSession& HTTPServerRequestImpl::session()
-{
- return _session;
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_HTTPServerRequestImpl_INCLUDED
+//
+// HTTPServerRequestImpl.h
+//
+// Library: Net
+// Package: HTTPServer
+// Module: HTTPServerRequestImpl
+//
+// Definition of the HTTPServerRequestImpl class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_HTTPServerRequestImpl_INCLUDED
+#define Net_HTTPServerRequestImpl_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/HTTPServerRequest.h"
+#include "Poco/Net/HTTPServerResponseImpl.h"
+#include "Poco/Net/SocketAddress.h"
+#include "Poco/AutoPtr.h"
+#include <istream>
+
+
+namespace Poco {
+namespace Net {
+
+
+class HTTPServerSession;
+class HTTPServerParams;
+class StreamSocket;
+
+
+class Net_API HTTPServerRequestImpl: public HTTPServerRequest
+ /// This subclass of HTTPServerRequest is used for
+ /// representing server-side HTTP requests.
+ ///
+ /// A HTTPServerRequest is passed to the
+ /// handleRequest() method of HTTPRequestHandler.
+{
+public:
+ HTTPServerRequestImpl(HTTPServerResponseImpl& response, HTTPServerSession& session, HTTPServerParams* pParams);
+ /// Creates the HTTPServerRequestImpl, using the
+ /// given HTTPServerSession.
+
+ ~HTTPServerRequestImpl();
+ /// Destroys the HTTPServerRequestImpl.
+
+ std::istream& stream();
+ /// Returns the input stream for reading
+ /// the request body.
+ ///
+ /// The stream is valid until the HTTPServerRequestImpl
+ /// object is destroyed.
+
+ const SocketAddress& clientAddress() const;
+ /// Returns the client's address.
+
+ const SocketAddress& serverAddress() const;
+ /// Returns the server's address.
+
+ const HTTPServerParams& serverParams() const;
+ /// Returns a reference to the server parameters.
+
+ HTTPServerResponse& response() const;
+ /// Returns a reference to the associated response.
+
+ bool secure() const;
+ /// Returns true if the request is using a secure
+ /// connection. Returns false if no secure connection
+ /// is used, or if it is not known whether a secure
+ /// connection is used.
+
+ StreamSocket& socket();
+ /// Returns a reference to the underlying socket.
+
+ StreamSocket detachSocket();
+ /// Returns the underlying socket after detaching
+ /// it from the server session.
+
+ HTTPServerSession& session();
+ /// Returns the underlying HTTPServerSession.
+
+private:
+ HTTPServerResponseImpl& _response;
+ HTTPServerSession& _session;
+ std::istream* _pStream;
+ Poco::AutoPtr<HTTPServerParams> _pParams;
+ SocketAddress _clientAddress;
+ SocketAddress _serverAddress;
+};
+
+
+//
+// inlines
+//
+inline std::istream& HTTPServerRequestImpl::stream()
+{
+ poco_check_ptr (_pStream);
+
+ return *_pStream;
+}
+
+
+inline const SocketAddress& HTTPServerRequestImpl::clientAddress() const
+{
+ return _clientAddress;
+}
+
+
+inline const SocketAddress& HTTPServerRequestImpl::serverAddress() const
+{
+ return _serverAddress;
+}
+
+
+inline const HTTPServerParams& HTTPServerRequestImpl::serverParams() const
+{
+ return *_pParams;
+}
+
+
+inline HTTPServerResponse& HTTPServerRequestImpl::response() const
+{
+ return _response;
+}
+
+
+inline HTTPServerSession& HTTPServerRequestImpl::session()
+{
+ return _session;
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_HTTPServerRequestImpl_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/HTTPServerResponse.h b/contrib/libs/poco/Net/include/Poco/Net/HTTPServerResponse.h
index ca6f9293e5..7d89ffbb7e 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/HTTPServerResponse.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/HTTPServerResponse.h
@@ -1,127 +1,127 @@
-//
-// HTTPServerResponse.h
-//
-// Library: Net
-// Package: HTTPServer
-// Module: HTTPServerResponse
-//
-// Definition of the HTTPServerResponse class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_HTTPServerResponse_INCLUDED
-#define Net_HTTPServerResponse_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/HTTPResponse.h"
-#include <cstddef>
-#include <ostream>
-
-
-namespace Poco {
-namespace Net {
-
-
-class HTTPServerSession;
-class HTTPCookie;
-
-
-class Net_API HTTPServerResponse: public HTTPResponse
- /// This subclass of HTTPResponse is used for
- /// representing server-side HTTP responses.
- ///
- /// A HTTPServerResponse is passed to the
- /// handleRequest() method of HTTPRequestHandler.
- ///
- /// handleRequest() must set a status code
- /// and optional reason phrase, set headers
- /// as necessary, and provide a message body.
-{
-public:
- HTTPServerResponse();
- /// Creates the HTTPServerResponse.
-
- ~HTTPServerResponse();
- /// Destroys the HTTPServerResponse.
-
- virtual void sendContinue() = 0;
- /// Sends a 100 Continue response to the
- /// client.
-
- virtual std::ostream& send() = 0;
- /// Sends the response header to the client and
- /// returns an output stream for sending the
- /// response body.
- ///
- /// The returned stream is valid until the response
- /// object is destroyed.
- ///
- /// Must not be called after beginSend(), sendFile(), sendBuffer()
- /// or redirect() has been called.
-
- virtual std::pair<std::ostream *, std::ostream *> beginSend() = 0;
- /// Sends the response headers to the client
- /// but do not finish headers with \r\n,
- /// allowing to continue sending additional header fields.
- ///
- /// Returns an output streams for sending the remaining headers
- /// and response body.
- ///
- /// Must not be called after send(), sendFile(), sendBuffer()
- /// or redirect() has been called.
-
- virtual void sendFile(const std::string& path, const std::string& mediaType) = 0;
- /// Sends the response header to the client, followed
- /// by the content of the given file.
- ///
- /// Must not be called after send(), sendBuffer()
- /// or redirect() has been called.
- ///
- /// Throws a FileNotFoundException if the file
- /// cannot be found, or an OpenFileException if
- /// the file cannot be opened.
-
- virtual void sendBuffer(const void* pBuffer, std::size_t length) = 0;
- /// Sends the response header to the client, followed
- /// by the contents of the given buffer.
- ///
- /// The Content-Length header of the response is set
- /// to length and chunked transfer encoding is disabled.
- ///
- /// If both the HTTP message header and body (from the
- /// given buffer) fit into one single network packet, the
- /// complete response can be sent in one network packet.
- ///
- /// Must not be called after send(), sendFile()
- /// or redirect() has been called.
-
- virtual void redirect(const std::string& uri, HTTPStatus status = HTTP_FOUND) = 0;
- /// Sets the status code, which must be one of
- /// HTTP_MOVED_PERMANENTLY (301), HTTP_FOUND (302),
- /// or HTTP_SEE_OTHER (303),
- /// and sets the "Location" header field
- /// to the given URI, which according to
- /// the HTTP specification, must be absolute.
- ///
- /// Must not be called after send() has been called.
-
- virtual void requireAuthentication(const std::string& realm) = 0;
- /// Sets the status code to 401 (Unauthorized)
- /// and sets the "WWW-Authenticate" header field
- /// according to the given realm.
-
- virtual bool sent() const = 0;
- /// Returns true if the response (header) has been sent.
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_HTTPServerResponse_INCLUDED
+//
+// HTTPServerResponse.h
+//
+// Library: Net
+// Package: HTTPServer
+// Module: HTTPServerResponse
+//
+// Definition of the HTTPServerResponse class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_HTTPServerResponse_INCLUDED
+#define Net_HTTPServerResponse_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/HTTPResponse.h"
+#include <cstddef>
+#include <ostream>
+
+
+namespace Poco {
+namespace Net {
+
+
+class HTTPServerSession;
+class HTTPCookie;
+
+
+class Net_API HTTPServerResponse: public HTTPResponse
+ /// This subclass of HTTPResponse is used for
+ /// representing server-side HTTP responses.
+ ///
+ /// A HTTPServerResponse is passed to the
+ /// handleRequest() method of HTTPRequestHandler.
+ ///
+ /// handleRequest() must set a status code
+ /// and optional reason phrase, set headers
+ /// as necessary, and provide a message body.
+{
+public:
+ HTTPServerResponse();
+ /// Creates the HTTPServerResponse.
+
+ ~HTTPServerResponse();
+ /// Destroys the HTTPServerResponse.
+
+ virtual void sendContinue() = 0;
+ /// Sends a 100 Continue response to the
+ /// client.
+
+ virtual std::ostream& send() = 0;
+ /// Sends the response header to the client and
+ /// returns an output stream for sending the
+ /// response body.
+ ///
+ /// The returned stream is valid until the response
+ /// object is destroyed.
+ ///
+ /// Must not be called after beginSend(), sendFile(), sendBuffer()
+ /// or redirect() has been called.
+
+ virtual std::pair<std::ostream *, std::ostream *> beginSend() = 0;
+ /// Sends the response headers to the client
+ /// but do not finish headers with \r\n,
+ /// allowing to continue sending additional header fields.
+ ///
+ /// Returns an output streams for sending the remaining headers
+ /// and response body.
+ ///
+ /// Must not be called after send(), sendFile(), sendBuffer()
+ /// or redirect() has been called.
+
+ virtual void sendFile(const std::string& path, const std::string& mediaType) = 0;
+ /// Sends the response header to the client, followed
+ /// by the content of the given file.
+ ///
+ /// Must not be called after send(), sendBuffer()
+ /// or redirect() has been called.
+ ///
+ /// Throws a FileNotFoundException if the file
+ /// cannot be found, or an OpenFileException if
+ /// the file cannot be opened.
+
+ virtual void sendBuffer(const void* pBuffer, std::size_t length) = 0;
+ /// Sends the response header to the client, followed
+ /// by the contents of the given buffer.
+ ///
+ /// The Content-Length header of the response is set
+ /// to length and chunked transfer encoding is disabled.
+ ///
+ /// If both the HTTP message header and body (from the
+ /// given buffer) fit into one single network packet, the
+ /// complete response can be sent in one network packet.
+ ///
+ /// Must not be called after send(), sendFile()
+ /// or redirect() has been called.
+
+ virtual void redirect(const std::string& uri, HTTPStatus status = HTTP_FOUND) = 0;
+ /// Sets the status code, which must be one of
+ /// HTTP_MOVED_PERMANENTLY (301), HTTP_FOUND (302),
+ /// or HTTP_SEE_OTHER (303),
+ /// and sets the "Location" header field
+ /// to the given URI, which according to
+ /// the HTTP specification, must be absolute.
+ ///
+ /// Must not be called after send() has been called.
+
+ virtual void requireAuthentication(const std::string& realm) = 0;
+ /// Sets the status code to 401 (Unauthorized)
+ /// and sets the "WWW-Authenticate" header field
+ /// according to the given realm.
+
+ virtual bool sent() const = 0;
+ /// Returns true if the response (header) has been sent.
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_HTTPServerResponse_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/HTTPServerResponseImpl.h b/contrib/libs/poco/Net/include/Poco/Net/HTTPServerResponseImpl.h
index 3adfbfb7db..0210cb830f 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/HTTPServerResponseImpl.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/HTTPServerResponseImpl.h
@@ -1,151 +1,151 @@
-//
-// HTTPServerResponseImpl.h
-//
-// Library: Net
-// Package: HTTPServer
-// Module: HTTPServerResponseImpl
-//
-// Definition of the HTTPServerResponseImpl class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_HTTPServerResponseImpl_INCLUDED
-#define Net_HTTPServerResponseImpl_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/HTTPServerResponse.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class HTTPServerSession;
-class HTTPServerRequestImpl;
-
-
-class Net_API HTTPServerResponseImpl: public HTTPServerResponse
- /// This subclass of HTTPServerResponse is used for
- /// representing server-side HTTP responses.
- ///
- /// A HTTPServerResponse is passed to the
- /// handleRequest() method of HTTPRequestHandler.
- ///
- /// handleRequest() must set a status code
- /// and optional reason phrase, set headers
- /// as necessary, and provide a message body.
-{
-public:
- HTTPServerResponseImpl(HTTPServerSession& session);
- /// Creates the HTTPServerResponseImpl.
-
- ~HTTPServerResponseImpl();
- /// Destroys the HTTPServerResponseImpl.
-
- void sendContinue();
- /// Sends a 100 Continue response to the
- /// client.
-
- std::ostream& send();
- /// Sends the response header to the client and
- /// returns an output stream for sending the
- /// response body.
- ///
- /// The returned stream is valid until the response
- /// object is destroyed.
- ///
- /// Must not be called after beginSend(), sendFile(), sendBuffer()
- /// or redirect() has been called.
-
- std::pair<std::ostream *, std::ostream *> beginSend();
- /// Sends the response headers to the client
- /// but do not finish headers with \r\n,
- /// allowing to continue sending additional header fields.
- ///
- /// Returns an output streams for sending the remaining headers
- /// and response body.
- ///
- /// Must not be called after send(), sendFile(), sendBuffer()
- /// or redirect() has been called.
-
- void sendFile(const std::string& path, const std::string& mediaType);
- /// Sends the response header to the client, followed
- /// by the content of the given file.
- ///
- /// Must not be called after send(), sendBuffer()
- /// or redirect() has been called.
- ///
- /// Throws a FileNotFoundException if the file
- /// cannot be found, or an OpenFileException if
- /// the file cannot be opened.
-
- void sendBuffer(const void* pBuffer, std::size_t length);
- /// Sends the response header to the client, followed
- /// by the contents of the given buffer.
- ///
- /// The Content-Length header of the response is set
- /// to length and chunked transfer encoding is disabled.
- ///
- /// If both the HTTP message header and body (from the
- /// given buffer) fit into one single network packet, the
- /// complete response can be sent in one network packet.
- ///
- /// Must not be called after send(), sendFile()
- /// or redirect() has been called.
-
- void redirect(const std::string& uri, HTTPStatus status = HTTP_FOUND);
- /// Sets the status code, which must be one of
- /// HTTP_MOVED_PERMANENTLY (301), HTTP_FOUND (302),
- /// or HTTP_SEE_OTHER (303),
- /// and sets the "Location" header field
- /// to the given URI, which according to
- /// the HTTP specification, must be absolute.
- ///
- /// Must not be called after send() has been called.
-
- void requireAuthentication(const std::string& realm);
- /// Sets the status code to 401 (Unauthorized)
- /// and sets the "WWW-Authenticate" header field
- /// according to the given realm.
-
- bool sent() const;
- /// Returns true if the response (header) has been sent.
-
-protected:
- void attachRequest(HTTPServerRequestImpl* pRequest);
-
-private:
- HTTPServerSession& _session;
- HTTPServerRequestImpl* _pRequest;
- std::ostream* _pStream;
- std::ostream* _pHeaderStream;
-
- friend class HTTPServerRequestImpl;
-};
-
-
-//
-// inlines
-//
-inline bool HTTPServerResponseImpl::sent() const
-{
- return _pStream != 0;
-}
-
-
-inline void HTTPServerResponseImpl::attachRequest(HTTPServerRequestImpl* pRequest)
-{
- _pRequest = pRequest;
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_HTTPServerResponseImpl_INCLUDED
+//
+// HTTPServerResponseImpl.h
+//
+// Library: Net
+// Package: HTTPServer
+// Module: HTTPServerResponseImpl
+//
+// Definition of the HTTPServerResponseImpl class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_HTTPServerResponseImpl_INCLUDED
+#define Net_HTTPServerResponseImpl_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/HTTPServerResponse.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class HTTPServerSession;
+class HTTPServerRequestImpl;
+
+
+class Net_API HTTPServerResponseImpl: public HTTPServerResponse
+ /// This subclass of HTTPServerResponse is used for
+ /// representing server-side HTTP responses.
+ ///
+ /// A HTTPServerResponse is passed to the
+ /// handleRequest() method of HTTPRequestHandler.
+ ///
+ /// handleRequest() must set a status code
+ /// and optional reason phrase, set headers
+ /// as necessary, and provide a message body.
+{
+public:
+ HTTPServerResponseImpl(HTTPServerSession& session);
+ /// Creates the HTTPServerResponseImpl.
+
+ ~HTTPServerResponseImpl();
+ /// Destroys the HTTPServerResponseImpl.
+
+ void sendContinue();
+ /// Sends a 100 Continue response to the
+ /// client.
+
+ std::ostream& send();
+ /// Sends the response header to the client and
+ /// returns an output stream for sending the
+ /// response body.
+ ///
+ /// The returned stream is valid until the response
+ /// object is destroyed.
+ ///
+ /// Must not be called after beginSend(), sendFile(), sendBuffer()
+ /// or redirect() has been called.
+
+ std::pair<std::ostream *, std::ostream *> beginSend();
+ /// Sends the response headers to the client
+ /// but do not finish headers with \r\n,
+ /// allowing to continue sending additional header fields.
+ ///
+ /// Returns an output streams for sending the remaining headers
+ /// and response body.
+ ///
+ /// Must not be called after send(), sendFile(), sendBuffer()
+ /// or redirect() has been called.
+
+ void sendFile(const std::string& path, const std::string& mediaType);
+ /// Sends the response header to the client, followed
+ /// by the content of the given file.
+ ///
+ /// Must not be called after send(), sendBuffer()
+ /// or redirect() has been called.
+ ///
+ /// Throws a FileNotFoundException if the file
+ /// cannot be found, or an OpenFileException if
+ /// the file cannot be opened.
+
+ void sendBuffer(const void* pBuffer, std::size_t length);
+ /// Sends the response header to the client, followed
+ /// by the contents of the given buffer.
+ ///
+ /// The Content-Length header of the response is set
+ /// to length and chunked transfer encoding is disabled.
+ ///
+ /// If both the HTTP message header and body (from the
+ /// given buffer) fit into one single network packet, the
+ /// complete response can be sent in one network packet.
+ ///
+ /// Must not be called after send(), sendFile()
+ /// or redirect() has been called.
+
+ void redirect(const std::string& uri, HTTPStatus status = HTTP_FOUND);
+ /// Sets the status code, which must be one of
+ /// HTTP_MOVED_PERMANENTLY (301), HTTP_FOUND (302),
+ /// or HTTP_SEE_OTHER (303),
+ /// and sets the "Location" header field
+ /// to the given URI, which according to
+ /// the HTTP specification, must be absolute.
+ ///
+ /// Must not be called after send() has been called.
+
+ void requireAuthentication(const std::string& realm);
+ /// Sets the status code to 401 (Unauthorized)
+ /// and sets the "WWW-Authenticate" header field
+ /// according to the given realm.
+
+ bool sent() const;
+ /// Returns true if the response (header) has been sent.
+
+protected:
+ void attachRequest(HTTPServerRequestImpl* pRequest);
+
+private:
+ HTTPServerSession& _session;
+ HTTPServerRequestImpl* _pRequest;
+ std::ostream* _pStream;
+ std::ostream* _pHeaderStream;
+
+ friend class HTTPServerRequestImpl;
+};
+
+
+//
+// inlines
+//
+inline bool HTTPServerResponseImpl::sent() const
+{
+ return _pStream != 0;
+}
+
+
+inline void HTTPServerResponseImpl::attachRequest(HTTPServerRequestImpl* pRequest)
+{
+ _pRequest = pRequest;
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_HTTPServerResponseImpl_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/HTTPServerSession.h b/contrib/libs/poco/Net/include/Poco/Net/HTTPServerSession.h
index 092c1329b2..8b169bf556 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/HTTPServerSession.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/HTTPServerSession.h
@@ -1,76 +1,76 @@
-//
-// HTTPServerSession.h
-//
-// Library: Net
-// Package: HTTPServer
-// Module: HTTPServerSession
-//
-// Definition of the HTTPServerSession class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_HTTPServerSession_INCLUDED
-#define Net_HTTPServerSession_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/HTTPSession.h"
-#include "Poco/Net/SocketAddress.h"
-#include "Poco/Net/HTTPServerSession.h"
-#include "Poco/Net/HTTPServerParams.h"
-#include "Poco/Timespan.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API HTTPServerSession: public HTTPSession
- /// This class handles the server side of a
- /// HTTP session. It is used internally by
- /// HTTPServer.
-{
-public:
- HTTPServerSession(const StreamSocket& socket, HTTPServerParams::Ptr pParams);
- /// Creates the HTTPServerSession.
-
- virtual ~HTTPServerSession();
- /// Destroys the HTTPServerSession.
-
- bool hasMoreRequests();
- /// Returns true if there are requests available.
-
- bool canKeepAlive() const;
- /// Returns true if the session can be kept alive.
-
- SocketAddress clientAddress();
- /// Returns the client's address.
-
- SocketAddress serverAddress();
- /// Returns the server's address.
-
-private:
- bool _firstRequest;
- Poco::Timespan _keepAliveTimeout;
- int _maxKeepAliveRequests;
-};
-
-
-//
-// inlines
-//
-inline bool HTTPServerSession::canKeepAlive() const
-{
- return _maxKeepAliveRequests != 0;
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_HTTPServerSession_INCLUDED
+//
+// HTTPServerSession.h
+//
+// Library: Net
+// Package: HTTPServer
+// Module: HTTPServerSession
+//
+// Definition of the HTTPServerSession class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_HTTPServerSession_INCLUDED
+#define Net_HTTPServerSession_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/HTTPSession.h"
+#include "Poco/Net/SocketAddress.h"
+#include "Poco/Net/HTTPServerSession.h"
+#include "Poco/Net/HTTPServerParams.h"
+#include "Poco/Timespan.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API HTTPServerSession: public HTTPSession
+ /// This class handles the server side of a
+ /// HTTP session. It is used internally by
+ /// HTTPServer.
+{
+public:
+ HTTPServerSession(const StreamSocket& socket, HTTPServerParams::Ptr pParams);
+ /// Creates the HTTPServerSession.
+
+ virtual ~HTTPServerSession();
+ /// Destroys the HTTPServerSession.
+
+ bool hasMoreRequests();
+ /// Returns true if there are requests available.
+
+ bool canKeepAlive() const;
+ /// Returns true if the session can be kept alive.
+
+ SocketAddress clientAddress();
+ /// Returns the client's address.
+
+ SocketAddress serverAddress();
+ /// Returns the server's address.
+
+private:
+ bool _firstRequest;
+ Poco::Timespan _keepAliveTimeout;
+ int _maxKeepAliveRequests;
+};
+
+
+//
+// inlines
+//
+inline bool HTTPServerSession::canKeepAlive() const
+{
+ return _maxKeepAliveRequests != 0;
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_HTTPServerSession_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/HTTPSession.h b/contrib/libs/poco/Net/include/Poco/Net/HTTPSession.h
index 79f0f374f2..666f6f6267 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/HTTPSession.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/HTTPSession.h
@@ -1,251 +1,251 @@
-//
-// HTTPSession.h
-//
-// Library: Net
-// Package: HTTP
-// Module: HTTPSession
-//
-// Definition of the HTTPSession class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_HTTPSession_INCLUDED
-#define Net_HTTPSession_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/StreamSocket.h"
-#include "Poco/Timespan.h"
-#include "Poco/Exception.h"
-#include "Poco/Any.h"
-#include "Poco/Buffer.h"
-#include <ios>
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API HTTPSession
- /// HTTPSession implements basic HTTP session management
- /// for both HTTP clients and HTTP servers.
- ///
- /// HTTPSession implements buffering for HTTP connections, as well
- /// as specific support for the various HTTP stream classes.
- ///
- /// This class can not be instantiated. HTTPClientSession or
- /// HTTPServerSession must be used instead.
-{
-public:
- void setKeepAlive(bool keepAlive);
- /// Sets the keep-alive flag for this session.
+//
+// HTTPSession.h
+//
+// Library: Net
+// Package: HTTP
+// Module: HTTPSession
+//
+// Definition of the HTTPSession class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_HTTPSession_INCLUDED
+#define Net_HTTPSession_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/StreamSocket.h"
+#include "Poco/Timespan.h"
+#include "Poco/Exception.h"
+#include "Poco/Any.h"
+#include "Poco/Buffer.h"
+#include <ios>
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API HTTPSession
+ /// HTTPSession implements basic HTTP session management
+ /// for both HTTP clients and HTTP servers.
+ ///
+ /// HTTPSession implements buffering for HTTP connections, as well
+ /// as specific support for the various HTTP stream classes.
+ ///
+ /// This class can not be instantiated. HTTPClientSession or
+ /// HTTPServerSession must be used instead.
+{
+public:
+ void setKeepAlive(bool keepAlive);
+ /// Sets the keep-alive flag for this session.
+ ///
+ /// If the keep-alive flag is enabled, persistent
+ /// HTTP/1.1 connections are supported.
+
+ bool getKeepAlive() const;
+ /// Returns the value of the keep-alive flag for
+ /// this session.
+
+ void setTimeout(const Poco::Timespan& timeout);
+ /// Sets the timeout for the HTTP session.
+
+ void setTimeout(const Poco::Timespan& connectionTimeout, const Poco::Timespan& sendTimeout, const Poco::Timespan& receiveTimeout);
+ /// Sets different timeouts for the HTTP session.
+
+ Poco::Timespan getTimeout() const;
+ /// Returns the timeout for the HTTP session.
+
+ bool connected() const;
+ /// Returns true if the underlying socket is connected.
+
+ virtual void abort();
+ /// Aborts a session in progress by shutting down
+ /// and closing the underlying socket.
+
+ const Poco::Exception* networkException() const;
+ /// If sending or receiving data over the underlying
+ /// socket connection resulted in an exception, a
+ /// pointer to this exception is returned.
///
- /// If the keep-alive flag is enabled, persistent
- /// HTTP/1.1 connections are supported.
-
- bool getKeepAlive() const;
- /// Returns the value of the keep-alive flag for
- /// this session.
-
- void setTimeout(const Poco::Timespan& timeout);
- /// Sets the timeout for the HTTP session.
-
- void setTimeout(const Poco::Timespan& connectionTimeout, const Poco::Timespan& sendTimeout, const Poco::Timespan& receiveTimeout);
- /// Sets different timeouts for the HTTP session.
-
- Poco::Timespan getTimeout() const;
- /// Returns the timeout for the HTTP session.
-
- bool connected() const;
- /// Returns true if the underlying socket is connected.
-
- virtual void abort();
- /// Aborts a session in progress by shutting down
- /// and closing the underlying socket.
-
- const Poco::Exception* networkException() const;
- /// If sending or receiving data over the underlying
- /// socket connection resulted in an exception, a
- /// pointer to this exception is returned.
- ///
- /// Otherwise, NULL is returned.
-
- void attachSessionData(const Poco::Any& data);
- /// Allows to attach an application-specific data
- /// item to the session.
- ///
- /// On the server side, this can be used to manage
- /// data that must be maintained over the entire
- /// lifetime of a persistent connection (that is,
- /// multiple requests sent over the same connection).
-
- const Poco::Any& sessionData() const;
- /// Returns the data attached with attachSessionData(),
- /// or an empty Poco::Any if no user data has been
- /// attached.
-
- enum
- {
- HTTP_PORT = 80
- };
-
- StreamSocket detachSocket();
- /// Detaches the socket from the session.
- ///
- /// The socket is returned, and a new, uninitialized socket is
- /// attached to the session.
-
- StreamSocket& socket();
- /// Returns a reference to the underlying socket.
-
- void drainBuffer(Poco::Buffer<char>& buffer);
- /// Copies all bytes remaining in the internal buffer to the
- /// given Poco::Buffer, resizing it as necessary.
- ///
- /// This is usually used together with detachSocket() to
- /// obtain any data already read from the socket, but not
- /// yet processed.
-
-protected:
- HTTPSession();
- /// Creates a HTTP session using an
- /// unconnected stream socket.
-
- HTTPSession(const StreamSocket& socket);
- /// Creates a HTTP session using the
- /// given socket. The session takes ownership
- /// of the socket and closes it when it's no
- /// longer used.
-
- HTTPSession(const StreamSocket& socket, bool keepAlive);
- /// Creates a HTTP session using the
- /// given socket. The session takes ownership
- /// of the socket and closes it when it's no
- /// longer used.
-
- virtual ~HTTPSession();
- /// Destroys the HTTPSession and closes the
- /// underlying socket.
-
- int get();
- /// Returns the next byte in the buffer.
- /// Reads more data from the socket if there are
- /// no bytes left in the buffer.
-
- int peek();
- /// Peeks at the next character in the buffer.
- /// Reads more data from the socket if there are
- /// no bytes left in the buffer.
-
- virtual int read(char* buffer, std::streamsize length);
- /// Reads up to length bytes.
- ///
- /// If there is data in the buffer, this data
- /// is returned. Otherwise, data is read from
- /// the socket to avoid unnecessary buffering.
-
- virtual int write(const char* buffer, std::streamsize length);
- /// Writes data to the socket.
-
- int receive(char* buffer, int length);
- /// Reads up to length bytes.
-
- int buffered() const;
- /// Returns the number of bytes in the buffer.
-
- void refill();
- /// Refills the internal buffer.
-
- virtual void connect(const SocketAddress& address);
- /// Connects the underlying socket to the given address
- /// and sets the socket's receive timeout.
-
- void attachSocket(const StreamSocket& socket);
- /// Attaches a socket to the session, replacing the
- /// previously attached socket.
-
- void close();
- /// Closes the underlying socket.
-
- void setException(const Poco::Exception& exc);
- /// Stores a clone of the exception.
-
- void clearException();
- /// Clears the stored exception.
-
-private:
- enum
- {
- HTTP_DEFAULT_TIMEOUT = 60000000,
- HTTP_DEFAULT_CONNECTION_TIMEOUT = 30000000
- };
-
- HTTPSession(const HTTPSession&);
- HTTPSession& operator = (const HTTPSession&);
-
- StreamSocket _socket;
- char* _pBuffer;
- char* _pCurrent;
- char* _pEnd;
- bool _keepAlive;
- Poco::Timespan _connectionTimeout;
- Poco::Timespan _receiveTimeout;
- Poco::Timespan _sendTimeout;
- Poco::Exception* _pException;
- Poco::Any _data;
-
- friend class HTTPStreamBuf;
- friend class HTTPHeaderStreamBuf;
- friend class HTTPFixedLengthStreamBuf;
- friend class HTTPChunkedStreamBuf;
-};
-
-
-//
-// inlines
-//
-inline bool HTTPSession::getKeepAlive() const
-{
- return _keepAlive;
-}
-
-
-inline Poco::Timespan HTTPSession::getTimeout() const
-{
- return _receiveTimeout;
-}
-
-
-inline StreamSocket& HTTPSession::socket()
-{
- return _socket;
-}
-
-
-inline const Poco::Exception* HTTPSession::networkException() const
-{
- return _pException;
-}
-
-
-inline int HTTPSession::buffered() const
-{
- return static_cast<int>(_pEnd - _pCurrent);
-}
-
-
-inline const Poco::Any& HTTPSession::sessionData() const
-{
- return _data;
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_HTTPSession_INCLUDED
+ /// Otherwise, NULL is returned.
+
+ void attachSessionData(const Poco::Any& data);
+ /// Allows to attach an application-specific data
+ /// item to the session.
+ ///
+ /// On the server side, this can be used to manage
+ /// data that must be maintained over the entire
+ /// lifetime of a persistent connection (that is,
+ /// multiple requests sent over the same connection).
+
+ const Poco::Any& sessionData() const;
+ /// Returns the data attached with attachSessionData(),
+ /// or an empty Poco::Any if no user data has been
+ /// attached.
+
+ enum
+ {
+ HTTP_PORT = 80
+ };
+
+ StreamSocket detachSocket();
+ /// Detaches the socket from the session.
+ ///
+ /// The socket is returned, and a new, uninitialized socket is
+ /// attached to the session.
+
+ StreamSocket& socket();
+ /// Returns a reference to the underlying socket.
+
+ void drainBuffer(Poco::Buffer<char>& buffer);
+ /// Copies all bytes remaining in the internal buffer to the
+ /// given Poco::Buffer, resizing it as necessary.
+ ///
+ /// This is usually used together with detachSocket() to
+ /// obtain any data already read from the socket, but not
+ /// yet processed.
+
+protected:
+ HTTPSession();
+ /// Creates a HTTP session using an
+ /// unconnected stream socket.
+
+ HTTPSession(const StreamSocket& socket);
+ /// Creates a HTTP session using the
+ /// given socket. The session takes ownership
+ /// of the socket and closes it when it's no
+ /// longer used.
+
+ HTTPSession(const StreamSocket& socket, bool keepAlive);
+ /// Creates a HTTP session using the
+ /// given socket. The session takes ownership
+ /// of the socket and closes it when it's no
+ /// longer used.
+
+ virtual ~HTTPSession();
+ /// Destroys the HTTPSession and closes the
+ /// underlying socket.
+
+ int get();
+ /// Returns the next byte in the buffer.
+ /// Reads more data from the socket if there are
+ /// no bytes left in the buffer.
+
+ int peek();
+ /// Peeks at the next character in the buffer.
+ /// Reads more data from the socket if there are
+ /// no bytes left in the buffer.
+
+ virtual int read(char* buffer, std::streamsize length);
+ /// Reads up to length bytes.
+ ///
+ /// If there is data in the buffer, this data
+ /// is returned. Otherwise, data is read from
+ /// the socket to avoid unnecessary buffering.
+
+ virtual int write(const char* buffer, std::streamsize length);
+ /// Writes data to the socket.
+
+ int receive(char* buffer, int length);
+ /// Reads up to length bytes.
+
+ int buffered() const;
+ /// Returns the number of bytes in the buffer.
+
+ void refill();
+ /// Refills the internal buffer.
+
+ virtual void connect(const SocketAddress& address);
+ /// Connects the underlying socket to the given address
+ /// and sets the socket's receive timeout.
+
+ void attachSocket(const StreamSocket& socket);
+ /// Attaches a socket to the session, replacing the
+ /// previously attached socket.
+
+ void close();
+ /// Closes the underlying socket.
+
+ void setException(const Poco::Exception& exc);
+ /// Stores a clone of the exception.
+
+ void clearException();
+ /// Clears the stored exception.
+
+private:
+ enum
+ {
+ HTTP_DEFAULT_TIMEOUT = 60000000,
+ HTTP_DEFAULT_CONNECTION_TIMEOUT = 30000000
+ };
+
+ HTTPSession(const HTTPSession&);
+ HTTPSession& operator = (const HTTPSession&);
+
+ StreamSocket _socket;
+ char* _pBuffer;
+ char* _pCurrent;
+ char* _pEnd;
+ bool _keepAlive;
+ Poco::Timespan _connectionTimeout;
+ Poco::Timespan _receiveTimeout;
+ Poco::Timespan _sendTimeout;
+ Poco::Exception* _pException;
+ Poco::Any _data;
+
+ friend class HTTPStreamBuf;
+ friend class HTTPHeaderStreamBuf;
+ friend class HTTPFixedLengthStreamBuf;
+ friend class HTTPChunkedStreamBuf;
+};
+
+
+//
+// inlines
+//
+inline bool HTTPSession::getKeepAlive() const
+{
+ return _keepAlive;
+}
+
+
+inline Poco::Timespan HTTPSession::getTimeout() const
+{
+ return _receiveTimeout;
+}
+
+
+inline StreamSocket& HTTPSession::socket()
+{
+ return _socket;
+}
+
+
+inline const Poco::Exception* HTTPSession::networkException() const
+{
+ return _pException;
+}
+
+
+inline int HTTPSession::buffered() const
+{
+ return static_cast<int>(_pEnd - _pCurrent);
+}
+
+
+inline const Poco::Any& HTTPSession::sessionData() const
+{
+ return _data;
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_HTTPSession_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/HTTPSessionFactory.h b/contrib/libs/poco/Net/include/Poco/Net/HTTPSessionFactory.h
index 3da31f375e..3bc7d15d2c 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/HTTPSessionFactory.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/HTTPSessionFactory.h
@@ -1,155 +1,155 @@
-//
-// HTTPSessionFactory.h
-//
-// Library: Net
-// Package: HTTPClient
-// Module: HTTPSessionFactory
-//
-// Definition of the HTTPSessionFactory class.
-//
-// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_HTTPSessionFactoryMgr_INCLUDED
-#define Net_HTTPSessionFactoryMgr_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Mutex.h"
-#include "Poco/URI.h"
-#include "Poco/SingletonHolder.h"
-#include "Poco/SharedPtr.h"
-#include <map>
-
-
-namespace Poco {
-namespace Net {
-
-
-class HTTPSessionInstantiator;
-class HTTPClientSession;
-
-
-class Net_API HTTPSessionFactory
- /// A factory for HTTPClientSession objects.
- ///
- /// Given a URI, this class creates a HTTPClientSession
- /// (for http) or a HTTPSClientSession (for https) for
- /// accessing the URI.
- ///
- /// The actual work of creating the session is done by
- /// HTTPSessionInstantiator objects that must be registered
- /// with a HTTPSessionFactory.
-{
-public:
- HTTPSessionFactory();
- /// Creates the HTTPSessionFactory.
-
- HTTPSessionFactory(const std::string& proxyHost, Poco::UInt16 proxyPort);
- /// Creates the HTTPSessionFactory and sets the proxy host and port.
-
- ~HTTPSessionFactory();
- /// Destroys the HTTPSessionFactory.
-
- void registerProtocol(const std::string& protocol, HTTPSessionInstantiator* pSessionInstantiator);
- /// Registers the session instantiator for the given protocol.
- /// The factory takes ownership of the SessionInstantiator.
- ///
- /// A protocol can be registered more than once. However, only the instantiator
- /// that has been registered first is used. Also, for each call to
- /// registerProtocol(), a corresponding call to unregisterProtocol() must
- /// be made.
-
- void unregisterProtocol(const std::string& protocol);
- /// Removes the registration of a protocol.
- ///
- /// Throws a NotFoundException if no instantiator has been registered
- /// for the given protocol.
-
- bool supportsProtocol(const std::string& protocol);
- /// Returns true if a session instantiator for the given protocol has been registered.
-
- HTTPClientSession* createClientSession(const Poco::URI& uri);
- /// Creates a client session for the given uri scheme. Throws exception if no factory is registered for the given scheme
-
- const std::string& proxyHost() const;
- /// Returns the proxy host, if one has been set, or an empty string otherwise.
-
- Poco::UInt16 proxyPort() const;
- /// Returns the proxy port number, if one has been set, or zero otherwise.
-
- void setProxy(const std::string& proxyHost, Poco::UInt16 proxyPort);
- /// Sets the proxy host and port number.
-
- void setProxyCredentials(const std::string& username, const std::string& password);
- /// Sets the username and password for proxy authorization (Basic auth only).
-
- const std::string& proxyUsername() const;
- /// Returns the username for proxy authorization.
-
- const std::string& proxyPassword() const;
- /// Returns the password for proxy authorization.
-
- static HTTPSessionFactory& defaultFactory();
- /// Returns the default HTTPSessionFactory.
-
-private:
- struct InstantiatorInfo
- {
- HTTPSessionInstantiator* pIn;
- int cnt;
- InstantiatorInfo(HTTPSessionInstantiator* pInst);
- // no destructor!!! this is by purpose, don't add one!
- };
-
-
- HTTPSessionFactory(const HTTPSessionFactory&);
- HTTPSessionFactory& operator = (const HTTPSessionFactory&);
-
- typedef std::map<std::string, InstantiatorInfo> Instantiators;
-
- Instantiators _instantiators;
- std::string _proxyHost;
- Poco::UInt16 _proxyPort;
- std::string _proxyUsername;
- std::string _proxyPassword;
-
- mutable Poco::FastMutex _mutex;
-};
-
-
-//
-// inlines
-//
-inline const std::string& HTTPSessionFactory::proxyHost() const
-{
- return _proxyHost;
-}
-
-
-inline Poco::UInt16 HTTPSessionFactory::proxyPort() const
-{
- return _proxyPort;
-}
-
-
-inline const std::string& HTTPSessionFactory::proxyUsername() const
-{
- return _proxyUsername;
-}
-
-
-inline const std::string& HTTPSessionFactory::proxyPassword() const
-{
- return _proxyPassword;
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_HTTPSessionFactoryMgr_INCLUDED
+//
+// HTTPSessionFactory.h
+//
+// Library: Net
+// Package: HTTPClient
+// Module: HTTPSessionFactory
+//
+// Definition of the HTTPSessionFactory class.
+//
+// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_HTTPSessionFactoryMgr_INCLUDED
+#define Net_HTTPSessionFactoryMgr_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Mutex.h"
+#include "Poco/URI.h"
+#include "Poco/SingletonHolder.h"
+#include "Poco/SharedPtr.h"
+#include <map>
+
+
+namespace Poco {
+namespace Net {
+
+
+class HTTPSessionInstantiator;
+class HTTPClientSession;
+
+
+class Net_API HTTPSessionFactory
+ /// A factory for HTTPClientSession objects.
+ ///
+ /// Given a URI, this class creates a HTTPClientSession
+ /// (for http) or a HTTPSClientSession (for https) for
+ /// accessing the URI.
+ ///
+ /// The actual work of creating the session is done by
+ /// HTTPSessionInstantiator objects that must be registered
+ /// with a HTTPSessionFactory.
+{
+public:
+ HTTPSessionFactory();
+ /// Creates the HTTPSessionFactory.
+
+ HTTPSessionFactory(const std::string& proxyHost, Poco::UInt16 proxyPort);
+ /// Creates the HTTPSessionFactory and sets the proxy host and port.
+
+ ~HTTPSessionFactory();
+ /// Destroys the HTTPSessionFactory.
+
+ void registerProtocol(const std::string& protocol, HTTPSessionInstantiator* pSessionInstantiator);
+ /// Registers the session instantiator for the given protocol.
+ /// The factory takes ownership of the SessionInstantiator.
+ ///
+ /// A protocol can be registered more than once. However, only the instantiator
+ /// that has been registered first is used. Also, for each call to
+ /// registerProtocol(), a corresponding call to unregisterProtocol() must
+ /// be made.
+
+ void unregisterProtocol(const std::string& protocol);
+ /// Removes the registration of a protocol.
+ ///
+ /// Throws a NotFoundException if no instantiator has been registered
+ /// for the given protocol.
+
+ bool supportsProtocol(const std::string& protocol);
+ /// Returns true if a session instantiator for the given protocol has been registered.
+
+ HTTPClientSession* createClientSession(const Poco::URI& uri);
+ /// Creates a client session for the given uri scheme. Throws exception if no factory is registered for the given scheme
+
+ const std::string& proxyHost() const;
+ /// Returns the proxy host, if one has been set, or an empty string otherwise.
+
+ Poco::UInt16 proxyPort() const;
+ /// Returns the proxy port number, if one has been set, or zero otherwise.
+
+ void setProxy(const std::string& proxyHost, Poco::UInt16 proxyPort);
+ /// Sets the proxy host and port number.
+
+ void setProxyCredentials(const std::string& username, const std::string& password);
+ /// Sets the username and password for proxy authorization (Basic auth only).
+
+ const std::string& proxyUsername() const;
+ /// Returns the username for proxy authorization.
+
+ const std::string& proxyPassword() const;
+ /// Returns the password for proxy authorization.
+
+ static HTTPSessionFactory& defaultFactory();
+ /// Returns the default HTTPSessionFactory.
+
+private:
+ struct InstantiatorInfo
+ {
+ HTTPSessionInstantiator* pIn;
+ int cnt;
+ InstantiatorInfo(HTTPSessionInstantiator* pInst);
+ // no destructor!!! this is by purpose, don't add one!
+ };
+
+
+ HTTPSessionFactory(const HTTPSessionFactory&);
+ HTTPSessionFactory& operator = (const HTTPSessionFactory&);
+
+ typedef std::map<std::string, InstantiatorInfo> Instantiators;
+
+ Instantiators _instantiators;
+ std::string _proxyHost;
+ Poco::UInt16 _proxyPort;
+ std::string _proxyUsername;
+ std::string _proxyPassword;
+
+ mutable Poco::FastMutex _mutex;
+};
+
+
+//
+// inlines
+//
+inline const std::string& HTTPSessionFactory::proxyHost() const
+{
+ return _proxyHost;
+}
+
+
+inline Poco::UInt16 HTTPSessionFactory::proxyPort() const
+{
+ return _proxyPort;
+}
+
+
+inline const std::string& HTTPSessionFactory::proxyUsername() const
+{
+ return _proxyUsername;
+}
+
+
+inline const std::string& HTTPSessionFactory::proxyPassword() const
+{
+ return _proxyPassword;
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_HTTPSessionFactoryMgr_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/HTTPSessionInstantiator.h b/contrib/libs/poco/Net/include/Poco/Net/HTTPSessionInstantiator.h
index d58ad2688c..cbb6ee82f2 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/HTTPSessionInstantiator.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/HTTPSessionInstantiator.h
@@ -1,117 +1,117 @@
-//
-// HTTPSessionInstantiator.h
-//
-// Library: Net
-// Package: HTTPClient
-// Module: HTTPSessionInstantiator
-//
-// Definition of the HTTPSessionInstantiator class.
-//
-// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_HTTPSessionInstantiator_INCLUDED
-#define Net_HTTPSessionInstantiator_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/HTTPSession.h"
-#include "Poco/URI.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class HTTPClientSession;
-
-
-class Net_API HTTPSessionInstantiator
- /// A factory for HTTPClientSession objects.
- ///
- /// Creates a HTTP session for a given URI.
- /// A HTTPSessionInstantiator is not used directly.
- /// Instances are registered with a HTTPSessionFactory,
- /// and used through it.
-{
-public:
- HTTPSessionInstantiator();
- /// Creates the HTTPSessionInstantiator.
-
- virtual ~HTTPSessionInstantiator();
- /// Destroys the HTTPSessionInstantiator.
-
- virtual HTTPClientSession* createClientSession(const Poco::URI& uri);
- /// Creates a HTTPClientSession for the given URI.
-
- static void registerInstantiator();
- /// Registers the instantiator with the global HTTPSessionFactory.
-
- static void unregisterInstantiator();
- /// Unregisters the factory with the global HTTPSessionFactory.
-
-protected:
- void setProxy(const std::string& host, Poco::UInt16 port);
- /// Sets the proxy host and port.
- /// Called by HTTPSessionFactory.
-
- const std::string& proxyHost() const;
- /// Returns the proxy post.
-
- Poco::UInt16 proxyPort() const;
- /// Returns the proxy port.
-
- void setProxyCredentials(const std::string& username, const std::string& password);
- /// Sets the username and password for proxy authorization (Basic auth only).
-
- const std::string& proxyUsername() const;
- /// Returns the username for proxy authorization.
-
- const std::string& proxyPassword() const;
- /// Returns the password for proxy authorization.
-
-private:
- std::string _proxyHost;
- Poco::UInt16 _proxyPort;
- std::string _proxyUsername;
- std::string _proxyPassword;
-
- friend class HTTPSessionFactory;
-};
-
-
-//
-// inlines
-//
-inline const std::string& HTTPSessionInstantiator::proxyHost() const
-{
- return _proxyHost;
-}
-
-
-inline Poco::UInt16 HTTPSessionInstantiator::proxyPort() const
-{
- return _proxyPort;
-}
-
-
-inline const std::string& HTTPSessionInstantiator::proxyUsername() const
-{
- return _proxyUsername;
-}
-
-
-inline const std::string& HTTPSessionInstantiator::proxyPassword() const
-{
- return _proxyPassword;
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_HTTPSessionInstantiator_INCLUDED
+//
+// HTTPSessionInstantiator.h
+//
+// Library: Net
+// Package: HTTPClient
+// Module: HTTPSessionInstantiator
+//
+// Definition of the HTTPSessionInstantiator class.
+//
+// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_HTTPSessionInstantiator_INCLUDED
+#define Net_HTTPSessionInstantiator_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/HTTPSession.h"
+#include "Poco/URI.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class HTTPClientSession;
+
+
+class Net_API HTTPSessionInstantiator
+ /// A factory for HTTPClientSession objects.
+ ///
+ /// Creates a HTTP session for a given URI.
+ /// A HTTPSessionInstantiator is not used directly.
+ /// Instances are registered with a HTTPSessionFactory,
+ /// and used through it.
+{
+public:
+ HTTPSessionInstantiator();
+ /// Creates the HTTPSessionInstantiator.
+
+ virtual ~HTTPSessionInstantiator();
+ /// Destroys the HTTPSessionInstantiator.
+
+ virtual HTTPClientSession* createClientSession(const Poco::URI& uri);
+ /// Creates a HTTPClientSession for the given URI.
+
+ static void registerInstantiator();
+ /// Registers the instantiator with the global HTTPSessionFactory.
+
+ static void unregisterInstantiator();
+ /// Unregisters the factory with the global HTTPSessionFactory.
+
+protected:
+ void setProxy(const std::string& host, Poco::UInt16 port);
+ /// Sets the proxy host and port.
+ /// Called by HTTPSessionFactory.
+
+ const std::string& proxyHost() const;
+ /// Returns the proxy post.
+
+ Poco::UInt16 proxyPort() const;
+ /// Returns the proxy port.
+
+ void setProxyCredentials(const std::string& username, const std::string& password);
+ /// Sets the username and password for proxy authorization (Basic auth only).
+
+ const std::string& proxyUsername() const;
+ /// Returns the username for proxy authorization.
+
+ const std::string& proxyPassword() const;
+ /// Returns the password for proxy authorization.
+
+private:
+ std::string _proxyHost;
+ Poco::UInt16 _proxyPort;
+ std::string _proxyUsername;
+ std::string _proxyPassword;
+
+ friend class HTTPSessionFactory;
+};
+
+
+//
+// inlines
+//
+inline const std::string& HTTPSessionInstantiator::proxyHost() const
+{
+ return _proxyHost;
+}
+
+
+inline Poco::UInt16 HTTPSessionInstantiator::proxyPort() const
+{
+ return _proxyPort;
+}
+
+
+inline const std::string& HTTPSessionInstantiator::proxyUsername() const
+{
+ return _proxyUsername;
+}
+
+
+inline const std::string& HTTPSessionInstantiator::proxyPassword() const
+{
+ return _proxyPassword;
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_HTTPSessionInstantiator_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/HTTPStream.h b/contrib/libs/poco/Net/include/Poco/Net/HTTPStream.h
index 314bd707a3..94d52095c5 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/HTTPStream.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/HTTPStream.h
@@ -1,103 +1,103 @@
-//
-// HTTPStream.h
-//
-// Library: Net
-// Package: HTTP
-// Module: HTTPStream
-//
-// Definition of the HTTPStream class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_HTTPStream_INCLUDED
-#define Net_HTTPStream_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/HTTPBasicStreamBuf.h"
-#include "Poco/MemoryPool.h"
-#include <cstddef>
-#include <istream>
-#include <ostream>
-
-
-namespace Poco {
-namespace Net {
-
-
-class HTTPSession;
-
-
-class Net_API HTTPStreamBuf: public HTTPBasicStreamBuf
- /// This is the streambuf class used for reading and writing
- /// HTTP message bodies.
-{
-public:
- typedef HTTPBasicStreamBuf::openmode openmode;
-
- HTTPStreamBuf(HTTPSession& session, openmode mode);
- ~HTTPStreamBuf();
- void close();
-
-protected:
- int readFromDevice(char* buffer, std::streamsize length);
- int writeToDevice(const char* buffer, std::streamsize length);
-
-private:
- HTTPSession& _session;
- openmode _mode;
-};
-
-
-class Net_API HTTPIOS: public virtual std::ios
- /// The base class for HTTPInputStream.
-{
-public:
- HTTPIOS(HTTPSession& session, HTTPStreamBuf::openmode mode);
- ~HTTPIOS();
- HTTPStreamBuf* rdbuf();
-
-protected:
- HTTPStreamBuf _buf;
-};
-
-
-class Net_API HTTPInputStream: public HTTPIOS, public std::istream
- /// This class is for internal use by HTTPSession only.
-{
-public:
- HTTPInputStream(HTTPSession& session);
- ~HTTPInputStream();
-
- void* operator new(std::size_t size);
- void operator delete(void* ptr);
-
-private:
- static Poco::MemoryPool _pool;
-};
-
-
-class Net_API HTTPOutputStream: public HTTPIOS, public std::ostream
- /// This class is for internal use by HTTPSession only.
-{
-public:
- HTTPOutputStream(HTTPSession& session);
- ~HTTPOutputStream();
-
- void* operator new(std::size_t size);
- void operator delete(void* ptr);
-
-private:
- static Poco::MemoryPool _pool;
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_HTTPStream_INCLUDED
+//
+// HTTPStream.h
+//
+// Library: Net
+// Package: HTTP
+// Module: HTTPStream
+//
+// Definition of the HTTPStream class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_HTTPStream_INCLUDED
+#define Net_HTTPStream_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/HTTPBasicStreamBuf.h"
+#include "Poco/MemoryPool.h"
+#include <cstddef>
+#include <istream>
+#include <ostream>
+
+
+namespace Poco {
+namespace Net {
+
+
+class HTTPSession;
+
+
+class Net_API HTTPStreamBuf: public HTTPBasicStreamBuf
+ /// This is the streambuf class used for reading and writing
+ /// HTTP message bodies.
+{
+public:
+ typedef HTTPBasicStreamBuf::openmode openmode;
+
+ HTTPStreamBuf(HTTPSession& session, openmode mode);
+ ~HTTPStreamBuf();
+ void close();
+
+protected:
+ int readFromDevice(char* buffer, std::streamsize length);
+ int writeToDevice(const char* buffer, std::streamsize length);
+
+private:
+ HTTPSession& _session;
+ openmode _mode;
+};
+
+
+class Net_API HTTPIOS: public virtual std::ios
+ /// The base class for HTTPInputStream.
+{
+public:
+ HTTPIOS(HTTPSession& session, HTTPStreamBuf::openmode mode);
+ ~HTTPIOS();
+ HTTPStreamBuf* rdbuf();
+
+protected:
+ HTTPStreamBuf _buf;
+};
+
+
+class Net_API HTTPInputStream: public HTTPIOS, public std::istream
+ /// This class is for internal use by HTTPSession only.
+{
+public:
+ HTTPInputStream(HTTPSession& session);
+ ~HTTPInputStream();
+
+ void* operator new(std::size_t size);
+ void operator delete(void* ptr);
+
+private:
+ static Poco::MemoryPool _pool;
+};
+
+
+class Net_API HTTPOutputStream: public HTTPIOS, public std::ostream
+ /// This class is for internal use by HTTPSession only.
+{
+public:
+ HTTPOutputStream(HTTPSession& session);
+ ~HTTPOutputStream();
+
+ void* operator new(std::size_t size);
+ void operator delete(void* ptr);
+
+private:
+ static Poco::MemoryPool _pool;
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_HTTPStream_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/HTTPStreamFactory.h b/contrib/libs/poco/Net/include/Poco/Net/HTTPStreamFactory.h
index 951cb5cbc7..df4a5f3336 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/HTTPStreamFactory.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/HTTPStreamFactory.h
@@ -1,92 +1,92 @@
-//
-// HTTPStreamFactory.h
-//
-// Library: Net
-// Package: HTTP
-// Module: HTTPStreamFactory
-//
-// Definition of the HTTPStreamFactory class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_HTTPStreamFactory_INCLUDED
-#define Net_HTTPStreamFactory_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/HTTPSession.h"
-#include "Poco/URIStreamFactory.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API HTTPStreamFactory: public Poco::URIStreamFactory
- /// An implementation of the URIStreamFactory interface
- /// that handles Hyper-Text Transfer Protocol (http) URIs.
-{
-public:
- HTTPStreamFactory();
- /// Creates the HTTPStreamFactory.
-
- HTTPStreamFactory(const std::string& proxyHost, Poco::UInt16 proxyPort = HTTPSession::HTTP_PORT);
- /// Creates the HTTPStreamFactory.
- ///
- /// HTTP connections will use the given proxy.
-
- HTTPStreamFactory(const std::string& proxyHost, Poco::UInt16 proxyPort, const std::string& proxyUsername, const std::string& proxyPassword);
- /// Creates the HTTPStreamFactory.
- ///
- /// HTTP connections will use the given proxy and
- /// will be authorized against the proxy using Basic authentication
- /// with the given proxyUsername and proxyPassword.
-
- virtual ~HTTPStreamFactory();
- /// Destroys the HTTPStreamFactory.
-
- virtual std::istream* open(const Poco::URI& uri);
- /// Creates and opens a HTTP stream for the given URI.
- /// The URI must be a http://... URI.
- ///
- /// Throws a NetException if anything goes wrong.
- ///
- /// Redirect responses are handled and the redirect
- /// location is automatically resolved, as long
- /// as the redirect location is still accessible
- /// via the HTTP protocol. If a redirection to
- /// a non http://... URI is received, a
- /// UnsupportedRedirectException exception is thrown.
- /// The offending URI can then be obtained via the message()
- /// method of UnsupportedRedirectException.
-
- static void registerFactory();
- /// Registers the HTTPStreamFactory with the
- /// default URIStreamOpener instance.
-
- static void unregisterFactory();
- /// Unregisters the HTTPStreamFactory with the
- /// default URIStreamOpener instance.
-
-private:
- enum
- {
- MAX_REDIRECTS = 10
- };
-
- std::string _proxyHost;
- Poco::UInt16 _proxyPort;
- std::string _proxyUsername;
- std::string _proxyPassword;
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_HTTPStreamFactory_INCLUDED
+//
+// HTTPStreamFactory.h
+//
+// Library: Net
+// Package: HTTP
+// Module: HTTPStreamFactory
+//
+// Definition of the HTTPStreamFactory class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_HTTPStreamFactory_INCLUDED
+#define Net_HTTPStreamFactory_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/HTTPSession.h"
+#include "Poco/URIStreamFactory.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API HTTPStreamFactory: public Poco::URIStreamFactory
+ /// An implementation of the URIStreamFactory interface
+ /// that handles Hyper-Text Transfer Protocol (http) URIs.
+{
+public:
+ HTTPStreamFactory();
+ /// Creates the HTTPStreamFactory.
+
+ HTTPStreamFactory(const std::string& proxyHost, Poco::UInt16 proxyPort = HTTPSession::HTTP_PORT);
+ /// Creates the HTTPStreamFactory.
+ ///
+ /// HTTP connections will use the given proxy.
+
+ HTTPStreamFactory(const std::string& proxyHost, Poco::UInt16 proxyPort, const std::string& proxyUsername, const std::string& proxyPassword);
+ /// Creates the HTTPStreamFactory.
+ ///
+ /// HTTP connections will use the given proxy and
+ /// will be authorized against the proxy using Basic authentication
+ /// with the given proxyUsername and proxyPassword.
+
+ virtual ~HTTPStreamFactory();
+ /// Destroys the HTTPStreamFactory.
+
+ virtual std::istream* open(const Poco::URI& uri);
+ /// Creates and opens a HTTP stream for the given URI.
+ /// The URI must be a http://... URI.
+ ///
+ /// Throws a NetException if anything goes wrong.
+ ///
+ /// Redirect responses are handled and the redirect
+ /// location is automatically resolved, as long
+ /// as the redirect location is still accessible
+ /// via the HTTP protocol. If a redirection to
+ /// a non http://... URI is received, a
+ /// UnsupportedRedirectException exception is thrown.
+ /// The offending URI can then be obtained via the message()
+ /// method of UnsupportedRedirectException.
+
+ static void registerFactory();
+ /// Registers the HTTPStreamFactory with the
+ /// default URIStreamOpener instance.
+
+ static void unregisterFactory();
+ /// Unregisters the HTTPStreamFactory with the
+ /// default URIStreamOpener instance.
+
+private:
+ enum
+ {
+ MAX_REDIRECTS = 10
+ };
+
+ std::string _proxyHost;
+ Poco::UInt16 _proxyPort;
+ std::string _proxyUsername;
+ std::string _proxyPassword;
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_HTTPStreamFactory_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/HostEntry.h b/contrib/libs/poco/Net/include/Poco/Net/HostEntry.h
index 1093201861..23cccdffb5 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/HostEntry.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/HostEntry.h
@@ -1,115 +1,115 @@
-//
-// HostEntry.h
-//
-// Library: Net
-// Package: NetCore
-// Module: HostEntry
-//
-// Definition of the HostEntry class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_HostEntry_INCLUDED
-#define Net_HostEntry_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/SocketDefs.h"
-#include "Poco/Net/IPAddress.h"
-#include <vector>
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API HostEntry
- /// This class stores information about a host
- /// such as host name, alias names and a list
- /// of IP addresses.
-{
-public:
- typedef std::vector<std::string> AliasList;
- typedef std::vector<IPAddress> AddressList;
-
- HostEntry();
- /// Creates an empty HostEntry.
-
- HostEntry(struct hostent* entry);
- /// Creates the HostEntry from the data in a hostent structure.
-
-#if defined(POCO_HAVE_IPv6) || defined(POCO_HAVE_ADDRINFO)
- HostEntry(struct addrinfo* info);
- /// Creates the HostEntry from the data in an addrinfo structure.
-#endif
-
-#if defined(POCO_VXWORKS)
- HostEntry(const std::string& name, const IPAddress& addr);
-#endif
-
- HostEntry(const HostEntry& entry);
- /// Creates the HostEntry by copying another one.
-
- HostEntry& operator = (const HostEntry& entry);
- /// Assigns another HostEntry.
-
- void swap(HostEntry& hostEntry);
- /// Swaps the HostEntry with another one.
-
- ~HostEntry();
- /// Destroys the HostEntry.
-
- const std::string& name() const;
- /// Returns the canonical host name.
-
- const AliasList& aliases() const;
- /// Returns a vector containing alias names for
- /// the host name.
-
- const AddressList& addresses() const;
- /// Returns a vector containing the IPAddresses
- /// for the host.
-
-private:
- std::string _name;
- AliasList _aliases;
- AddressList _addresses;
-};
-
-
-//
-// inlines
-//
-inline const std::string& HostEntry::name() const
-{
- return _name;
-}
-
-
-inline const HostEntry::AliasList& HostEntry::aliases() const
-{
- return _aliases;
-}
-
-
-inline const HostEntry::AddressList& HostEntry::addresses() const
-{
- return _addresses;
-}
-
-
-inline void swap(HostEntry& h1, HostEntry& h2)
-{
- h1.swap(h2);
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_HostEntry_INCLUDED
+//
+// HostEntry.h
+//
+// Library: Net
+// Package: NetCore
+// Module: HostEntry
+//
+// Definition of the HostEntry class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_HostEntry_INCLUDED
+#define Net_HostEntry_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/SocketDefs.h"
+#include "Poco/Net/IPAddress.h"
+#include <vector>
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API HostEntry
+ /// This class stores information about a host
+ /// such as host name, alias names and a list
+ /// of IP addresses.
+{
+public:
+ typedef std::vector<std::string> AliasList;
+ typedef std::vector<IPAddress> AddressList;
+
+ HostEntry();
+ /// Creates an empty HostEntry.
+
+ HostEntry(struct hostent* entry);
+ /// Creates the HostEntry from the data in a hostent structure.
+
+#if defined(POCO_HAVE_IPv6) || defined(POCO_HAVE_ADDRINFO)
+ HostEntry(struct addrinfo* info);
+ /// Creates the HostEntry from the data in an addrinfo structure.
+#endif
+
+#if defined(POCO_VXWORKS)
+ HostEntry(const std::string& name, const IPAddress& addr);
+#endif
+
+ HostEntry(const HostEntry& entry);
+ /// Creates the HostEntry by copying another one.
+
+ HostEntry& operator = (const HostEntry& entry);
+ /// Assigns another HostEntry.
+
+ void swap(HostEntry& hostEntry);
+ /// Swaps the HostEntry with another one.
+
+ ~HostEntry();
+ /// Destroys the HostEntry.
+
+ const std::string& name() const;
+ /// Returns the canonical host name.
+
+ const AliasList& aliases() const;
+ /// Returns a vector containing alias names for
+ /// the host name.
+
+ const AddressList& addresses() const;
+ /// Returns a vector containing the IPAddresses
+ /// for the host.
+
+private:
+ std::string _name;
+ AliasList _aliases;
+ AddressList _addresses;
+};
+
+
+//
+// inlines
+//
+inline const std::string& HostEntry::name() const
+{
+ return _name;
+}
+
+
+inline const HostEntry::AliasList& HostEntry::aliases() const
+{
+ return _aliases;
+}
+
+
+inline const HostEntry::AddressList& HostEntry::addresses() const
+{
+ return _addresses;
+}
+
+
+inline void swap(HostEntry& h1, HostEntry& h2)
+{
+ h1.swap(h2);
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_HostEntry_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/ICMPClient.h b/contrib/libs/poco/Net/include/Poco/Net/ICMPClient.h
index 333f4de58c..31fb5202af 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/ICMPClient.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/ICMPClient.h
@@ -1,97 +1,97 @@
-//
-// ICMPClient.h
-//
-// Library: Net
-// Package: ICMP
-// Module: ICMPClient
-//
-// Definition of the ICMPClient class.
-//
-// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_ICMPClient_INCLUDED
-#define Net_ICMPClient_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/ICMPSocket.h"
-#include "Poco/Net/ICMPEventArgs.h"
-#include "Poco/Net/SocketAddress.h"
-#include "Poco/BasicEvent.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API ICMPClient
- /// This class provides ICMP Ping functionality.
+//
+// ICMPClient.h
+//
+// Library: Net
+// Package: ICMP
+// Module: ICMPClient
+//
+// Definition of the ICMPClient class.
+//
+// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_ICMPClient_INCLUDED
+#define Net_ICMPClient_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/ICMPSocket.h"
+#include "Poco/Net/ICMPEventArgs.h"
+#include "Poco/Net/SocketAddress.h"
+#include "Poco/BasicEvent.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API ICMPClient
+ /// This class provides ICMP Ping functionality.
+ ///
+ /// The events are available when class is instantiated
+ /// and non-static member functions are called.
///
- /// The events are available when class is instantiated
- /// and non-static member functions are called.
- ///
- /// A "lightweight" alternative is direct (without instantiation)
- /// use of static member functions.
-{
-public:
- mutable Poco::BasicEvent<ICMPEventArgs> pingBegin;
- mutable Poco::BasicEvent<ICMPEventArgs> pingReply;
- mutable Poco::BasicEvent<ICMPEventArgs> pingError;
- mutable Poco::BasicEvent<ICMPEventArgs> pingEnd;
-
- explicit ICMPClient(SocketAddress::Family family, int dataSize = 48, int ttl = 128, int timeout = 50000);
- /// Creates an ICMP client.
-
- ~ICMPClient();
- /// Destroys the ICMP client.
-
- int ping(SocketAddress& address, int repeat = 1) const;
- /// Pings the specified address [repeat] times.
- /// Notifications are posted for events.
- ///
- /// Returns the number of valid replies.
-
- int ping(const std::string& address, int repeat = 1) const;
- /// Calls ICMPClient::ping(SocketAddress&, int) and
- /// returns the result.
- ///
- /// Returns the number of valid replies.
-
- static int ping(SocketAddress& address,
- SocketAddress::Family family,
- int repeat = 1,
- int dataSize = 48,
- int ttl = 128,
- int timeout = 50000);
- /// Pings the specified address [repeat] times.
- /// Notifications are not posted for events.
- ///
- /// Returns the number of valid replies.
-
- static int pingIPv4(const std::string& address,
- int repeat = 1,
- int dataSize = 48,
- int ttl = 128,
- int timeout = 50000);
- /// Calls ICMPClient::ping(SocketAddress&, int) and
- /// returns the result.
- ///
- /// Returns the number of valid replies.
-
-private:
- mutable SocketAddress::Family _family;
- int _dataSize;
- int _ttl;
- int _timeout;
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_ICMPClient_INCLUDED
+ /// A "lightweight" alternative is direct (without instantiation)
+ /// use of static member functions.
+{
+public:
+ mutable Poco::BasicEvent<ICMPEventArgs> pingBegin;
+ mutable Poco::BasicEvent<ICMPEventArgs> pingReply;
+ mutable Poco::BasicEvent<ICMPEventArgs> pingError;
+ mutable Poco::BasicEvent<ICMPEventArgs> pingEnd;
+
+ explicit ICMPClient(SocketAddress::Family family, int dataSize = 48, int ttl = 128, int timeout = 50000);
+ /// Creates an ICMP client.
+
+ ~ICMPClient();
+ /// Destroys the ICMP client.
+
+ int ping(SocketAddress& address, int repeat = 1) const;
+ /// Pings the specified address [repeat] times.
+ /// Notifications are posted for events.
+ ///
+ /// Returns the number of valid replies.
+
+ int ping(const std::string& address, int repeat = 1) const;
+ /// Calls ICMPClient::ping(SocketAddress&, int) and
+ /// returns the result.
+ ///
+ /// Returns the number of valid replies.
+
+ static int ping(SocketAddress& address,
+ SocketAddress::Family family,
+ int repeat = 1,
+ int dataSize = 48,
+ int ttl = 128,
+ int timeout = 50000);
+ /// Pings the specified address [repeat] times.
+ /// Notifications are not posted for events.
+ ///
+ /// Returns the number of valid replies.
+
+ static int pingIPv4(const std::string& address,
+ int repeat = 1,
+ int dataSize = 48,
+ int ttl = 128,
+ int timeout = 50000);
+ /// Calls ICMPClient::ping(SocketAddress&, int) and
+ /// returns the result.
+ ///
+ /// Returns the number of valid replies.
+
+private:
+ mutable SocketAddress::Family _family;
+ int _dataSize;
+ int _ttl;
+ int _timeout;
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_ICMPClient_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/ICMPEventArgs.h b/contrib/libs/poco/Net/include/Poco/Net/ICMPEventArgs.h
index ea2de2047c..2a663eb32f 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/ICMPEventArgs.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/ICMPEventArgs.h
@@ -1,163 +1,163 @@
-//
-// ICMPEventArgs.h
-//
-// Library: Net
-// Package: ICMP
-// Module: ICMPEventArgs
-//
-// Definition of ICMPEventArgs.
-//
-// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_ICMPEventArgs_INCLUDED
-#define Net_ICMPEventArgs_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/SocketAddress.h"
-#include <vector>
-#include <algorithm>
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API ICMPEventArgs
- /// The purpose of the ICMPEventArgs class is to be used as template parameter
- /// to instantiate event members in ICMPClient class.
- /// When clients register for an event notification, the reference to the class is
- /// passed to the handler function to provide information about the event.
-{
-public:
- ICMPEventArgs(const SocketAddress& address, int repetitions, int dataSize, int ttl);
- /// Creates ICMPEventArgs.
-
- virtual ~ICMPEventArgs();
- /// Destroys ICMPEventArgs.
-
- std::string hostName() const;
- /// Tries to resolve the target IP address into host name.
- /// If unsuccessful, all exceptions are silently ignored and
- /// the IP address is returned.
-
- std::string hostAddress() const;
- /// Returns the target IP address.
-
- int repetitions() const;
- /// Returns the number of repetitions for the ping operation.
-
- int dataSize() const;
- /// Returns the packet data size in bytes.
-
- int ttl() const;
- /// Returns time to live.
-
- int sent() const;
- /// Returns the number of packets sent.
-
- int received() const;
- /// Returns the number of packets received.
-
- int replyTime(int index = -1) const;
- /// Returns the reply time for the request specified with index.
- /// If index == -1 (default), returns the most recent reply time.
-
- const std::string& error(int index = -1) const;
- /// Returns the error string for the request specified with index.
- /// If index == -1 (default), returns the most recent error string.
-
- int minRTT() const;
- /// Returns the minimum round trip time for a sequence of requests.
-
- int maxRTT() const;
- /// Returns the maximum round trip time for a sequence of requests.
-
- int avgRTT() const;
- /// Returns the average round trip time for a sequence of requests.
-
- float percent() const;
- /// Returns the success percentage for a sequence of requests.
-
-private:
- ICMPEventArgs();
-
- void setRepetitions(int repetitions);
- void setDataSize(int sz);
- void setTTL(int timeToLive);
- void setReplyTime(int index, int time);
- void setError(int index, const std::string& text);
- ICMPEventArgs& operator ++ ();
- ICMPEventArgs operator ++ (int);
-
- SocketAddress _address;
- int _sent;
- int _dataSize;
- int _ttl;
- std::vector<int> _rtt;
- std::vector<std::string> _errors;
-
- friend class ICMPClient;
-};
-
-
-//
-// inlines
-//
-inline int ICMPEventArgs::repetitions() const
-{
- return (int) _rtt.size();
-}
-
-
-inline void ICMPEventArgs::setDataSize(int sz)
-{
- _dataSize = sz;
-}
-
-
-inline int ICMPEventArgs::dataSize() const
-{
- return _dataSize;
-}
-
-
-inline void ICMPEventArgs::setTTL(int timeToLive)
-{
- _ttl = timeToLive;
-}
-
-
-inline int ICMPEventArgs::ttl() const
-{
- return _ttl;
-}
-
-
-inline int ICMPEventArgs::sent() const
-{
- return _sent;
-}
-
-
-inline int ICMPEventArgs::minRTT() const
-{
- return *std::min_element(_rtt.begin(), _rtt.end());
-}
-
-
-inline int ICMPEventArgs::maxRTT() const
-{
- return *std::max_element(_rtt.begin(), _rtt.end());
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif
+//
+// ICMPEventArgs.h
+//
+// Library: Net
+// Package: ICMP
+// Module: ICMPEventArgs
+//
+// Definition of ICMPEventArgs.
+//
+// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_ICMPEventArgs_INCLUDED
+#define Net_ICMPEventArgs_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/SocketAddress.h"
+#include <vector>
+#include <algorithm>
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API ICMPEventArgs
+ /// The purpose of the ICMPEventArgs class is to be used as template parameter
+ /// to instantiate event members in ICMPClient class.
+ /// When clients register for an event notification, the reference to the class is
+ /// passed to the handler function to provide information about the event.
+{
+public:
+ ICMPEventArgs(const SocketAddress& address, int repetitions, int dataSize, int ttl);
+ /// Creates ICMPEventArgs.
+
+ virtual ~ICMPEventArgs();
+ /// Destroys ICMPEventArgs.
+
+ std::string hostName() const;
+ /// Tries to resolve the target IP address into host name.
+ /// If unsuccessful, all exceptions are silently ignored and
+ /// the IP address is returned.
+
+ std::string hostAddress() const;
+ /// Returns the target IP address.
+
+ int repetitions() const;
+ /// Returns the number of repetitions for the ping operation.
+
+ int dataSize() const;
+ /// Returns the packet data size in bytes.
+
+ int ttl() const;
+ /// Returns time to live.
+
+ int sent() const;
+ /// Returns the number of packets sent.
+
+ int received() const;
+ /// Returns the number of packets received.
+
+ int replyTime(int index = -1) const;
+ /// Returns the reply time for the request specified with index.
+ /// If index == -1 (default), returns the most recent reply time.
+
+ const std::string& error(int index = -1) const;
+ /// Returns the error string for the request specified with index.
+ /// If index == -1 (default), returns the most recent error string.
+
+ int minRTT() const;
+ /// Returns the minimum round trip time for a sequence of requests.
+
+ int maxRTT() const;
+ /// Returns the maximum round trip time for a sequence of requests.
+
+ int avgRTT() const;
+ /// Returns the average round trip time for a sequence of requests.
+
+ float percent() const;
+ /// Returns the success percentage for a sequence of requests.
+
+private:
+ ICMPEventArgs();
+
+ void setRepetitions(int repetitions);
+ void setDataSize(int sz);
+ void setTTL(int timeToLive);
+ void setReplyTime(int index, int time);
+ void setError(int index, const std::string& text);
+ ICMPEventArgs& operator ++ ();
+ ICMPEventArgs operator ++ (int);
+
+ SocketAddress _address;
+ int _sent;
+ int _dataSize;
+ int _ttl;
+ std::vector<int> _rtt;
+ std::vector<std::string> _errors;
+
+ friend class ICMPClient;
+};
+
+
+//
+// inlines
+//
+inline int ICMPEventArgs::repetitions() const
+{
+ return (int) _rtt.size();
+}
+
+
+inline void ICMPEventArgs::setDataSize(int sz)
+{
+ _dataSize = sz;
+}
+
+
+inline int ICMPEventArgs::dataSize() const
+{
+ return _dataSize;
+}
+
+
+inline void ICMPEventArgs::setTTL(int timeToLive)
+{
+ _ttl = timeToLive;
+}
+
+
+inline int ICMPEventArgs::ttl() const
+{
+ return _ttl;
+}
+
+
+inline int ICMPEventArgs::sent() const
+{
+ return _sent;
+}
+
+
+inline int ICMPEventArgs::minRTT() const
+{
+ return *std::min_element(_rtt.begin(), _rtt.end());
+}
+
+
+inline int ICMPEventArgs::maxRTT() const
+{
+ return *std::max_element(_rtt.begin(), _rtt.end());
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif
diff --git a/contrib/libs/poco/Net/include/Poco/Net/ICMPPacket.h b/contrib/libs/poco/Net/include/Poco/Net/ICMPPacket.h
index 6859506c01..52d0e87f87 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/ICMPPacket.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/ICMPPacket.h
@@ -1,89 +1,89 @@
-//
-// ICMPPacket.h
-//
-// Library: Net
-// Package: ICMP
-// Module: ICMPPacket
-//
-// Definition of the ICMPPacket class.
-//
-// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_ICMPPacket_INCLUDED
-#define Net_ICMPPacket_INCLUDED
-
-
-#include "Poco/Foundation.h"
-#include "Poco/Net/Socket.h"
-#include "Poco/Net/ICMPPacketImpl.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API ICMPPacket
- /// This class is the ICMP packet abstraction.
-{
-public:
- ICMPPacket(SocketAddress::Family family, int dataSize = 48);
- /// Creates an ICMPPacket of specified family.
-
- ~ICMPPacket();
- /// Destroys the ICMPPacket.
-
- const Poco::UInt8* packet();
- /// Returns raw ICMP packet. ICMP header and data are included in the returned packet.
-
- int packetSize() const;
- /// Returns the total length of packet (header + data);
-
- Poco::UInt16 sequence() const;
- /// Returns the most recent sequence number generated.
-
- void setDataSize(int dataSize);
- /// Sets data size.
-
- int getDataSize() const;
- /// Returns data size.
-
- int maxPacketSize() const;
- /// Returns the total length of packet (header + data);
-
- struct timeval time(Poco::UInt8* buffer = 0, int length = 0) const;
- /// Returns current epoch time if either buffer or length are equal to zero.
- /// Otherwise, it extracts the time value from the supplied buffer and
- /// returns the extracted value.
- ///
- /// Supplied buffer includes IP header, ICMP header and data.
-
- bool validReplyID(Poco::UInt8* buffer, int length) const;
- /// Returns true if the extracted id is recognized
- /// (equals the process id).
- ///
- /// Supplied buffer includes IP header, ICMP header and data.
-
- std::string errorDescription(Poco::UInt8* buffer, int length);
- /// Returns error description string.
- /// If supplied buffer contains an ICMP echo reply packet, an
- /// empty string is returned indicating the absence of error.
- ///
- /// Supplied buffer includes IP header, ICMP header and data.
-
- std::string typeDescription(int typeId);
- /// Returns the description of the packet type.
-
-private:
- ICMPPacketImpl* _pImpl;
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_ICMPPacket_INCLUDED
+//
+// ICMPPacket.h
+//
+// Library: Net
+// Package: ICMP
+// Module: ICMPPacket
+//
+// Definition of the ICMPPacket class.
+//
+// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_ICMPPacket_INCLUDED
+#define Net_ICMPPacket_INCLUDED
+
+
+#include "Poco/Foundation.h"
+#include "Poco/Net/Socket.h"
+#include "Poco/Net/ICMPPacketImpl.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API ICMPPacket
+ /// This class is the ICMP packet abstraction.
+{
+public:
+ ICMPPacket(SocketAddress::Family family, int dataSize = 48);
+ /// Creates an ICMPPacket of specified family.
+
+ ~ICMPPacket();
+ /// Destroys the ICMPPacket.
+
+ const Poco::UInt8* packet();
+ /// Returns raw ICMP packet. ICMP header and data are included in the returned packet.
+
+ int packetSize() const;
+ /// Returns the total length of packet (header + data);
+
+ Poco::UInt16 sequence() const;
+ /// Returns the most recent sequence number generated.
+
+ void setDataSize(int dataSize);
+ /// Sets data size.
+
+ int getDataSize() const;
+ /// Returns data size.
+
+ int maxPacketSize() const;
+ /// Returns the total length of packet (header + data);
+
+ struct timeval time(Poco::UInt8* buffer = 0, int length = 0) const;
+ /// Returns current epoch time if either buffer or length are equal to zero.
+ /// Otherwise, it extracts the time value from the supplied buffer and
+ /// returns the extracted value.
+ ///
+ /// Supplied buffer includes IP header, ICMP header and data.
+
+ bool validReplyID(Poco::UInt8* buffer, int length) const;
+ /// Returns true if the extracted id is recognized
+ /// (equals the process id).
+ ///
+ /// Supplied buffer includes IP header, ICMP header and data.
+
+ std::string errorDescription(Poco::UInt8* buffer, int length);
+ /// Returns error description string.
+ /// If supplied buffer contains an ICMP echo reply packet, an
+ /// empty string is returned indicating the absence of error.
+ ///
+ /// Supplied buffer includes IP header, ICMP header and data.
+
+ std::string typeDescription(int typeId);
+ /// Returns the description of the packet type.
+
+private:
+ ICMPPacketImpl* _pImpl;
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_ICMPPacket_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/ICMPPacketImpl.h b/contrib/libs/poco/Net/include/Poco/Net/ICMPPacketImpl.h
index 66e74fe1a7..da6bf46484 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/ICMPPacketImpl.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/ICMPPacketImpl.h
@@ -1,141 +1,141 @@
-//
-// ICMPPacketImpl.h
-//
-// Library: Net
-// Package: ICMP
-// Module: ICMPPacketImpl
-//
-// Definition of the ICMPPacketImpl class.
-//
-// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_ICMPPacketImpl_INCLUDED
-#define Net_ICMPPacketImpl_INCLUDED
-
-
-#include "Poco/Foundation.h"
-#include "Poco/Net/Socket.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API ICMPPacketImpl
- /// This is the abstract class for ICMP packet implementations.
-{
-public:
- ICMPPacketImpl(int dataSize = 48);
- /// Constructor. Creates an ICMPPacketImpl.
-
- virtual ~ICMPPacketImpl();
- /// Destructor.
-
- const Poco::UInt8* packet(bool init = true);
- /// Returns raw ICMP packet.
- /// ICMP header and data are included in the packet.
- /// If init is true, initPacket() is called.
-
- virtual int packetSize() const = 0;
- /// Returns the total size of packet (ICMP header + data) in number of octets.
- /// Must be overriden.
-
- virtual int maxPacketSize() const;
- /// Returns the maximum permitted size of packet in number of octets.
-
- Poco::UInt16 sequence() const;
- /// Returns the most recent sequence number generated.
-
- void setDataSize(int dataSize);
- /// Sets data size.
-
- int getDataSize() const;
- /// Returns data size.
-
- virtual struct timeval time(Poco::UInt8* buffer = 0, int length = 0) const = 0;
- /// Returns current epoch time if either argument is equal to zero.
- /// Otherwise, it extracts the time value from the supplied buffer.
- ///
- /// Supplied buffer includes IP header, ICMP header and data.
- /// Must be overriden.
-
- virtual bool validReplyID(unsigned char* buffer, int length) const = 0;
- /// Returns true if the extracted id is recognized
- /// (i.e. equals the process id).
- ///
- /// Supplied buffer includes IP header, ICMP header and data.
- /// Must be overriden.
-
- virtual std::string errorDescription(Poco::UInt8* buffer, int length) = 0;
- /// Returns error description string.
- /// If supplied buffer contains an ICMP echo reply packet, an
- /// empty string is returned indicating the absence of error.
- ///
- /// Supplied buffer includes IP header, ICMP header and data.
- /// Must be overriden.
-
- virtual std::string typeDescription(int typeId) = 0;
- /// Returns the description of the packet type.
- /// Must be overriden.
-
- static const Poco::UInt16 MAX_PACKET_SIZE;
- static const Poco::UInt16 MAX_SEQ_VALUE;
-
-protected:
- Poco::UInt16 nextSequence();
- /// Increments sequence number and returns the new value.
-
- void resetSequence();
- /// Resets the sequence to zero.
-
- virtual void initPacket() = 0;
- /// (Re)assembles the packet.
- /// Must be overriden.
-
- Poco::UInt16 checksum(Poco::UInt16 *addr, Poco::Int32 len);
- /// Calculates the checksum for supplied buffer.
-
-private:
- Poco::UInt16 _seq;
- Poco::UInt8* _pPacket;
- int _dataSize;
-
-};
-
-
-//
-// inlines
-//
-inline Poco::UInt16 ICMPPacketImpl::sequence() const
-{
- return _seq;
-}
-
-
-inline Poco::UInt16 ICMPPacketImpl::nextSequence()
-{
- return ++_seq;
-}
-
-
-inline void ICMPPacketImpl::resetSequence()
-{
- _seq = 0;
-}
-
-
-inline int ICMPPacketImpl::maxPacketSize() const
-{
- return MAX_PACKET_SIZE;
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_ICMPPacketImpl_INCLUDED
+//
+// ICMPPacketImpl.h
+//
+// Library: Net
+// Package: ICMP
+// Module: ICMPPacketImpl
+//
+// Definition of the ICMPPacketImpl class.
+//
+// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_ICMPPacketImpl_INCLUDED
+#define Net_ICMPPacketImpl_INCLUDED
+
+
+#include "Poco/Foundation.h"
+#include "Poco/Net/Socket.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API ICMPPacketImpl
+ /// This is the abstract class for ICMP packet implementations.
+{
+public:
+ ICMPPacketImpl(int dataSize = 48);
+ /// Constructor. Creates an ICMPPacketImpl.
+
+ virtual ~ICMPPacketImpl();
+ /// Destructor.
+
+ const Poco::UInt8* packet(bool init = true);
+ /// Returns raw ICMP packet.
+ /// ICMP header and data are included in the packet.
+ /// If init is true, initPacket() is called.
+
+ virtual int packetSize() const = 0;
+ /// Returns the total size of packet (ICMP header + data) in number of octets.
+ /// Must be overriden.
+
+ virtual int maxPacketSize() const;
+ /// Returns the maximum permitted size of packet in number of octets.
+
+ Poco::UInt16 sequence() const;
+ /// Returns the most recent sequence number generated.
+
+ void setDataSize(int dataSize);
+ /// Sets data size.
+
+ int getDataSize() const;
+ /// Returns data size.
+
+ virtual struct timeval time(Poco::UInt8* buffer = 0, int length = 0) const = 0;
+ /// Returns current epoch time if either argument is equal to zero.
+ /// Otherwise, it extracts the time value from the supplied buffer.
+ ///
+ /// Supplied buffer includes IP header, ICMP header and data.
+ /// Must be overriden.
+
+ virtual bool validReplyID(unsigned char* buffer, int length) const = 0;
+ /// Returns true if the extracted id is recognized
+ /// (i.e. equals the process id).
+ ///
+ /// Supplied buffer includes IP header, ICMP header and data.
+ /// Must be overriden.
+
+ virtual std::string errorDescription(Poco::UInt8* buffer, int length) = 0;
+ /// Returns error description string.
+ /// If supplied buffer contains an ICMP echo reply packet, an
+ /// empty string is returned indicating the absence of error.
+ ///
+ /// Supplied buffer includes IP header, ICMP header and data.
+ /// Must be overriden.
+
+ virtual std::string typeDescription(int typeId) = 0;
+ /// Returns the description of the packet type.
+ /// Must be overriden.
+
+ static const Poco::UInt16 MAX_PACKET_SIZE;
+ static const Poco::UInt16 MAX_SEQ_VALUE;
+
+protected:
+ Poco::UInt16 nextSequence();
+ /// Increments sequence number and returns the new value.
+
+ void resetSequence();
+ /// Resets the sequence to zero.
+
+ virtual void initPacket() = 0;
+ /// (Re)assembles the packet.
+ /// Must be overriden.
+
+ Poco::UInt16 checksum(Poco::UInt16 *addr, Poco::Int32 len);
+ /// Calculates the checksum for supplied buffer.
+
+private:
+ Poco::UInt16 _seq;
+ Poco::UInt8* _pPacket;
+ int _dataSize;
+
+};
+
+
+//
+// inlines
+//
+inline Poco::UInt16 ICMPPacketImpl::sequence() const
+{
+ return _seq;
+}
+
+
+inline Poco::UInt16 ICMPPacketImpl::nextSequence()
+{
+ return ++_seq;
+}
+
+
+inline void ICMPPacketImpl::resetSequence()
+{
+ _seq = 0;
+}
+
+
+inline int ICMPPacketImpl::maxPacketSize() const
+{
+ return MAX_PACKET_SIZE;
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_ICMPPacketImpl_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/ICMPSocket.h b/contrib/libs/poco/Net/include/Poco/Net/ICMPSocket.h
index 048fb295f9..75e049b382 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/ICMPSocket.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/ICMPSocket.h
@@ -1,91 +1,91 @@
-//
-// ICMPSocket.h
-//
-// Library: Net
-// Package: ICMP
-// Module: ICMPSocket
-//
-// Definition of the ICMPSocket class.
-//
-// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_ICMPSocket_INCLUDED
-#define Net_ICMPSocket_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/Socket.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API ICMPSocket: public Socket
- /// This class provides an interface to an
- /// ICMP client socket.
-{
-public:
- ICMPSocket(SocketAddress::Family family, int dataSize = 48, int ttl = 128, int timeout = 5000000);
- /// Creates an unconnected ICMP socket.
- ///
- /// The socket will be created for the
- /// given address family.
-
- ICMPSocket(const Socket& socket);
- /// Creates the ICMPSocket with the SocketImpl
- /// from another socket. The SocketImpl must be
- /// a ICMPSocketImpl, otherwise an InvalidArgumentException
- /// will be thrown.
-
- ~ICMPSocket();
- /// Destroys the ICMPSocket.
-
- ICMPSocket& operator = (const Socket& socket);
- /// Assignment operator.
- ///
- /// Releases the socket's SocketImpl and
- /// attaches the SocketImpl from the other socket and
- /// increments the reference count of the SocketImpl.
-
- int sendTo(const SocketAddress& address, int flags = 0);
- /// Sends an ICMP request through
- /// the socket to the given address.
- ///
- /// Returns the number of bytes sent.
-
- int receiveFrom(SocketAddress& address, int flags = 0);
- /// Receives data from the socket.
- /// Stores the address of the sender in address.
- ///
- /// Returns the time elapsed since the originating
- /// request was sent.
-
- int dataSize() const;
- /// Returns the data size in bytes.
-
- int ttl() const;
- /// Returns the Time-To-Live value.
-
- int timeout() const;
- /// Returns the socket timeout value.
-
-protected:
- ICMPSocket(SocketImpl* pImpl);
- /// Creates the Socket and attaches the given SocketImpl.
- /// The socket takes ownership of the SocketImpl.
- ///
- /// The SocketImpl must be a ICMPSocketImpl, otherwise
- /// an InvalidArgumentException will be thrown.
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_ICMPSocket_INCLUDED
+//
+// ICMPSocket.h
+//
+// Library: Net
+// Package: ICMP
+// Module: ICMPSocket
+//
+// Definition of the ICMPSocket class.
+//
+// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_ICMPSocket_INCLUDED
+#define Net_ICMPSocket_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/Socket.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API ICMPSocket: public Socket
+ /// This class provides an interface to an
+ /// ICMP client socket.
+{
+public:
+ ICMPSocket(SocketAddress::Family family, int dataSize = 48, int ttl = 128, int timeout = 5000000);
+ /// Creates an unconnected ICMP socket.
+ ///
+ /// The socket will be created for the
+ /// given address family.
+
+ ICMPSocket(const Socket& socket);
+ /// Creates the ICMPSocket with the SocketImpl
+ /// from another socket. The SocketImpl must be
+ /// a ICMPSocketImpl, otherwise an InvalidArgumentException
+ /// will be thrown.
+
+ ~ICMPSocket();
+ /// Destroys the ICMPSocket.
+
+ ICMPSocket& operator = (const Socket& socket);
+ /// Assignment operator.
+ ///
+ /// Releases the socket's SocketImpl and
+ /// attaches the SocketImpl from the other socket and
+ /// increments the reference count of the SocketImpl.
+
+ int sendTo(const SocketAddress& address, int flags = 0);
+ /// Sends an ICMP request through
+ /// the socket to the given address.
+ ///
+ /// Returns the number of bytes sent.
+
+ int receiveFrom(SocketAddress& address, int flags = 0);
+ /// Receives data from the socket.
+ /// Stores the address of the sender in address.
+ ///
+ /// Returns the time elapsed since the originating
+ /// request was sent.
+
+ int dataSize() const;
+ /// Returns the data size in bytes.
+
+ int ttl() const;
+ /// Returns the Time-To-Live value.
+
+ int timeout() const;
+ /// Returns the socket timeout value.
+
+protected:
+ ICMPSocket(SocketImpl* pImpl);
+ /// Creates the Socket and attaches the given SocketImpl.
+ /// The socket takes ownership of the SocketImpl.
+ ///
+ /// The SocketImpl must be a ICMPSocketImpl, otherwise
+ /// an InvalidArgumentException will be thrown.
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_ICMPSocket_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/ICMPSocketImpl.h b/contrib/libs/poco/Net/include/Poco/Net/ICMPSocketImpl.h
index 911487c0d0..98ba9a2259 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/ICMPSocketImpl.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/ICMPSocketImpl.h
@@ -1,94 +1,94 @@
-//
-// ICMPSocketImpl.h
-//
-// Library: Net
-// Package: ICMP
-// Module: ICMPSocketImpl
-//
-// Definition of the ICMPSocketImpl class.
-//
-// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_ICMPSocketImpl_INCLUDED
-#define Net_ICMPSocketImpl_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/RawSocketImpl.h"
-#include "Poco/Net/ICMPPacket.h"
-#include "Poco/Timestamp.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API ICMPSocketImpl: public RawSocketImpl
- /// This class implements an ICMP socket.
-{
-public:
- ICMPSocketImpl(SocketAddress::Family family, int dataSize, int ttl, int timeout);
- /// Creates an unconnected ICMP socket.
- ///
- /// The socket will be created for the given address family.
-
- int sendTo(const void*, int, const SocketAddress& address, int flags = 0);
- /// Sends an ICMP request through the socket to the given address.
- ///
- /// Returns the number of bytes sent.
-
- int receiveFrom(void*, int, SocketAddress& address, int flags = 0);
- /// Receives data from the socket.
- /// Stores the address of the sender in address.
- ///
- /// Returns the time elapsed since the originating request was sent.
-
- int dataSize() const;
- /// Returns the data size in bytes.
-
- int ttl() const;
- /// Returns the Time-To-Live value.
-
- int timeout() const;
- /// Returns the socket timeout value.
-
-protected:
- ~ICMPSocketImpl();
-
-private:
- ICMPPacket _icmpPacket;
- int _ttl;
- int _timeout;
-};
-
-
-//
-// inlines
-//
-inline int ICMPSocketImpl::dataSize() const
-{
- return _icmpPacket.getDataSize();
-}
-
-
-inline int ICMPSocketImpl::ttl() const
-{
- return _ttl;
-}
-
-
-inline int ICMPSocketImpl::timeout() const
-{
- return _timeout;
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_ICMPSocketImpl_INCLUDED
+//
+// ICMPSocketImpl.h
+//
+// Library: Net
+// Package: ICMP
+// Module: ICMPSocketImpl
+//
+// Definition of the ICMPSocketImpl class.
+//
+// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_ICMPSocketImpl_INCLUDED
+#define Net_ICMPSocketImpl_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/RawSocketImpl.h"
+#include "Poco/Net/ICMPPacket.h"
+#include "Poco/Timestamp.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API ICMPSocketImpl: public RawSocketImpl
+ /// This class implements an ICMP socket.
+{
+public:
+ ICMPSocketImpl(SocketAddress::Family family, int dataSize, int ttl, int timeout);
+ /// Creates an unconnected ICMP socket.
+ ///
+ /// The socket will be created for the given address family.
+
+ int sendTo(const void*, int, const SocketAddress& address, int flags = 0);
+ /// Sends an ICMP request through the socket to the given address.
+ ///
+ /// Returns the number of bytes sent.
+
+ int receiveFrom(void*, int, SocketAddress& address, int flags = 0);
+ /// Receives data from the socket.
+ /// Stores the address of the sender in address.
+ ///
+ /// Returns the time elapsed since the originating request was sent.
+
+ int dataSize() const;
+ /// Returns the data size in bytes.
+
+ int ttl() const;
+ /// Returns the Time-To-Live value.
+
+ int timeout() const;
+ /// Returns the socket timeout value.
+
+protected:
+ ~ICMPSocketImpl();
+
+private:
+ ICMPPacket _icmpPacket;
+ int _ttl;
+ int _timeout;
+};
+
+
+//
+// inlines
+//
+inline int ICMPSocketImpl::dataSize() const
+{
+ return _icmpPacket.getDataSize();
+}
+
+
+inline int ICMPSocketImpl::ttl() const
+{
+ return _ttl;
+}
+
+
+inline int ICMPSocketImpl::timeout() const
+{
+ return _timeout;
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_ICMPSocketImpl_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/ICMPv4PacketImpl.h b/contrib/libs/poco/Net/include/Poco/Net/ICMPv4PacketImpl.h
index eaca5a9f99..116f8c7617 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/ICMPv4PacketImpl.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/ICMPv4PacketImpl.h
@@ -1,173 +1,173 @@
-//
-// ICMPv4PacketImpl.h
-//
-// Library: Net
-// Package: ICMP
-// Module: ICMPv4PacketImpl
-//
-// Definition of the ICMPv4PacketImpl class.
-//
-// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_ICMPv4PacketImpl_INCLUDED
-#define Net_ICMPv4PacketImpl_INCLUDED
-
-
-#include "Poco/Foundation.h"
-#include "Poco/Net/Socket.h"
-#include "Poco/Net/ICMPPacketImpl.h"
-#include <cstddef>
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API ICMPv4PacketImpl : public ICMPPacketImpl
- /// This class implements the ICMPv4 packet.
- /// Parts are based on original ICMP code by
- /// Mike Muuss
- /// U. S. Army Ballistic Research Laboratory
- /// December, 1983
-{
-public:
- // ICMPv4 header
- struct Header
- {
- Poco::UInt8 type; // ICMP packet type
- Poco::UInt8 code; // Type sub code
- Poco::UInt16 checksum;
- Poco::UInt16 id;
- Poco::UInt16 seq;
- };
-
- // compile-time shield against misalignment
-#if POCO_OS != POCO_OS_ANDROID
- poco_static_assert (offsetof(Header, code) == 0x01);
- poco_static_assert (offsetof(Header, checksum) == 0x02);
- poco_static_assert (offsetof(Header, id) == 0x04);
- poco_static_assert (offsetof(Header, seq) == 0x06);
-#endif
-
- enum MessageType
- {
- ECHO_REPLY,
- ICMP_1,
- ICMP_2,
- DESTINATION_UNREACHABLE,
- SOURCE_QUENCH,
- REDIRECT,
- ICMP_6,
- ICMP_7,
- ECHO_REQUEST,
- ICMP_9,
- ICMP_10,
- TIME_EXCEEDED,
- PARAMETER_PROBLEM,
- TIMESTAMP_REQUEST,
- TIMESTAMP_REPLY,
- INFORMATION_REQUEST,
- INFORMATION_REPLY,
- MESSAGE_TYPE_UNKNOWN, // non-standard default, must remain last but one
- MESSAGE_TYPE_LENGTH // length indicator, must remain last
- };
-
- enum DestinationUnreachableCode
- {
- NET_UNREACHABLE,
- HOST_UNREACHABLE,
- PROTOCOL_UNREACHABLE,
- PORT_UNREACHABLE,
- FRAGMENTATION_NEEDED_AND_DF_SET,
- SOURCE_ROUTE_FAILED,
- DESTINATION_UNREACHABLE_UNKNOWN, // non-standard default, must remain last but one
- DESTINATION_UNREACHABLE_LENGTH // length indicator, must remain last
- };
-
- enum RedirectMessageCode
- {
- REDIRECT_NETWORK,
- REDIRECT_HOST,
- REDIRECT_SERVICE_NETWORK,
- REDIRECT_SERVICE_HOST,
- REDIRECT_MESSAGE_UNKNOWN, // non-standard default, must remain last but one
- REDIRECT_MESSAGE_LENGTH // length indicator, must remain last
- };
-
- enum TimeExceededCode
- {
- TIME_TO_LIVE,
- FRAGMENT_REASSEMBLY,
- TIME_EXCEEDED_UNKNOWN, // non-standard default, must remain last but one
- TIME_EXCEEDED_LENGTH // length indicator, must remain last
- };
-
- enum ParameterProblemCode
- {
- POINTER_INDICATES_THE_ERROR,
- PARAMETER_PROBLEM_UNKNOWN, // non-standard default, must remain last but one
- PARAMETER_PROBLEM_LENGTH // length indicator, must remain last
- };
-
- ICMPv4PacketImpl(int dataSize = 48);
- /// Constructor. Creates an ICMPv4PacketImpl.
-
- ~ICMPv4PacketImpl();
- /// Destructor.
-
- int packetSize() const;
- /// Returns the total length of packet (header + data);
-
- struct timeval time(Poco::UInt8* buffer = 0, int length = 0) const;
- /// Returns current epoch time if either buffer or length are equal to zero.
- /// Otherwise, it extracts the time value from the supplied buffer.
- ///
- /// Buffer includes IP header, ICMP header and data.
-
- bool validReplyID(Poco::UInt8* buffer, int length) const;
- /// Returns true if the extracted id is recognized
- /// (i.e. equals the process id).
- ///
- /// Buffer includes IP header, ICMP header and data.
-
- virtual std::string errorDescription(Poco::UInt8* buffer, int length);
- /// Returns error description string.
- /// If supplied buffer contains ICMPv4 echo reply packet, an
- /// empty string is returned indicating the absence of error.
- ///
- /// Buffer includes IP header, ICMP header and data.
-
- virtual std::string typeDescription(int typeId);
- /// Returns the description of the packet type.
-
- static const Poco::UInt16 MAX_PACKET_SIZE;
- static const std::string MESSAGE_TYPE[MESSAGE_TYPE_LENGTH];
- static const Poco::UInt8 DESTINATION_UNREACHABLE_TYPE; // 3
- static const Poco::UInt8 SOURCE_QUENCH_TYPE; // 4
- static const Poco::UInt8 REDIRECT_MESSAGE_TYPE; // 5
- static const Poco::UInt8 TIME_EXCEEDED_TYPE; // 11
- static const Poco::UInt8 PARAMETER_PROBLEM_TYPE; // 12
-
-private:
- void initPacket();
- Header* header(Poco::UInt8* buffer, int length) const;
- Poco::UInt8* data(Poco::UInt8* buffer, int length) const;
-
- static const std::string DESTINATION_UNREACHABLE_CODE[DESTINATION_UNREACHABLE_LENGTH];
- static const std::string REDIRECT_MESSAGE_CODE[REDIRECT_MESSAGE_LENGTH];
- static const std::string TIME_EXCEEDED_CODE[TIME_EXCEEDED_LENGTH];
- static const std::string PARAMETER_PROBLEM_CODE[PARAMETER_PROBLEM_LENGTH];
-
- Poco::UInt16 _seq;
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_ICMPv4PacketImpl_INCLUDED
+//
+// ICMPv4PacketImpl.h
+//
+// Library: Net
+// Package: ICMP
+// Module: ICMPv4PacketImpl
+//
+// Definition of the ICMPv4PacketImpl class.
+//
+// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_ICMPv4PacketImpl_INCLUDED
+#define Net_ICMPv4PacketImpl_INCLUDED
+
+
+#include "Poco/Foundation.h"
+#include "Poco/Net/Socket.h"
+#include "Poco/Net/ICMPPacketImpl.h"
+#include <cstddef>
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API ICMPv4PacketImpl : public ICMPPacketImpl
+ /// This class implements the ICMPv4 packet.
+ /// Parts are based on original ICMP code by
+ /// Mike Muuss
+ /// U. S. Army Ballistic Research Laboratory
+ /// December, 1983
+{
+public:
+ // ICMPv4 header
+ struct Header
+ {
+ Poco::UInt8 type; // ICMP packet type
+ Poco::UInt8 code; // Type sub code
+ Poco::UInt16 checksum;
+ Poco::UInt16 id;
+ Poco::UInt16 seq;
+ };
+
+ // compile-time shield against misalignment
+#if POCO_OS != POCO_OS_ANDROID
+ poco_static_assert (offsetof(Header, code) == 0x01);
+ poco_static_assert (offsetof(Header, checksum) == 0x02);
+ poco_static_assert (offsetof(Header, id) == 0x04);
+ poco_static_assert (offsetof(Header, seq) == 0x06);
+#endif
+
+ enum MessageType
+ {
+ ECHO_REPLY,
+ ICMP_1,
+ ICMP_2,
+ DESTINATION_UNREACHABLE,
+ SOURCE_QUENCH,
+ REDIRECT,
+ ICMP_6,
+ ICMP_7,
+ ECHO_REQUEST,
+ ICMP_9,
+ ICMP_10,
+ TIME_EXCEEDED,
+ PARAMETER_PROBLEM,
+ TIMESTAMP_REQUEST,
+ TIMESTAMP_REPLY,
+ INFORMATION_REQUEST,
+ INFORMATION_REPLY,
+ MESSAGE_TYPE_UNKNOWN, // non-standard default, must remain last but one
+ MESSAGE_TYPE_LENGTH // length indicator, must remain last
+ };
+
+ enum DestinationUnreachableCode
+ {
+ NET_UNREACHABLE,
+ HOST_UNREACHABLE,
+ PROTOCOL_UNREACHABLE,
+ PORT_UNREACHABLE,
+ FRAGMENTATION_NEEDED_AND_DF_SET,
+ SOURCE_ROUTE_FAILED,
+ DESTINATION_UNREACHABLE_UNKNOWN, // non-standard default, must remain last but one
+ DESTINATION_UNREACHABLE_LENGTH // length indicator, must remain last
+ };
+
+ enum RedirectMessageCode
+ {
+ REDIRECT_NETWORK,
+ REDIRECT_HOST,
+ REDIRECT_SERVICE_NETWORK,
+ REDIRECT_SERVICE_HOST,
+ REDIRECT_MESSAGE_UNKNOWN, // non-standard default, must remain last but one
+ REDIRECT_MESSAGE_LENGTH // length indicator, must remain last
+ };
+
+ enum TimeExceededCode
+ {
+ TIME_TO_LIVE,
+ FRAGMENT_REASSEMBLY,
+ TIME_EXCEEDED_UNKNOWN, // non-standard default, must remain last but one
+ TIME_EXCEEDED_LENGTH // length indicator, must remain last
+ };
+
+ enum ParameterProblemCode
+ {
+ POINTER_INDICATES_THE_ERROR,
+ PARAMETER_PROBLEM_UNKNOWN, // non-standard default, must remain last but one
+ PARAMETER_PROBLEM_LENGTH // length indicator, must remain last
+ };
+
+ ICMPv4PacketImpl(int dataSize = 48);
+ /// Constructor. Creates an ICMPv4PacketImpl.
+
+ ~ICMPv4PacketImpl();
+ /// Destructor.
+
+ int packetSize() const;
+ /// Returns the total length of packet (header + data);
+
+ struct timeval time(Poco::UInt8* buffer = 0, int length = 0) const;
+ /// Returns current epoch time if either buffer or length are equal to zero.
+ /// Otherwise, it extracts the time value from the supplied buffer.
+ ///
+ /// Buffer includes IP header, ICMP header and data.
+
+ bool validReplyID(Poco::UInt8* buffer, int length) const;
+ /// Returns true if the extracted id is recognized
+ /// (i.e. equals the process id).
+ ///
+ /// Buffer includes IP header, ICMP header and data.
+
+ virtual std::string errorDescription(Poco::UInt8* buffer, int length);
+ /// Returns error description string.
+ /// If supplied buffer contains ICMPv4 echo reply packet, an
+ /// empty string is returned indicating the absence of error.
+ ///
+ /// Buffer includes IP header, ICMP header and data.
+
+ virtual std::string typeDescription(int typeId);
+ /// Returns the description of the packet type.
+
+ static const Poco::UInt16 MAX_PACKET_SIZE;
+ static const std::string MESSAGE_TYPE[MESSAGE_TYPE_LENGTH];
+ static const Poco::UInt8 DESTINATION_UNREACHABLE_TYPE; // 3
+ static const Poco::UInt8 SOURCE_QUENCH_TYPE; // 4
+ static const Poco::UInt8 REDIRECT_MESSAGE_TYPE; // 5
+ static const Poco::UInt8 TIME_EXCEEDED_TYPE; // 11
+ static const Poco::UInt8 PARAMETER_PROBLEM_TYPE; // 12
+
+private:
+ void initPacket();
+ Header* header(Poco::UInt8* buffer, int length) const;
+ Poco::UInt8* data(Poco::UInt8* buffer, int length) const;
+
+ static const std::string DESTINATION_UNREACHABLE_CODE[DESTINATION_UNREACHABLE_LENGTH];
+ static const std::string REDIRECT_MESSAGE_CODE[REDIRECT_MESSAGE_LENGTH];
+ static const std::string TIME_EXCEEDED_CODE[TIME_EXCEEDED_LENGTH];
+ static const std::string PARAMETER_PROBLEM_CODE[PARAMETER_PROBLEM_LENGTH];
+
+ Poco::UInt16 _seq;
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_ICMPv4PacketImpl_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/IPAddress.h b/contrib/libs/poco/Net/include/Poco/Net/IPAddress.h
index 254cf69604..7d9cb6fa83 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/IPAddress.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/IPAddress.h
@@ -1,450 +1,450 @@
-//
-// IPAddress.h
-//
-// Library: Net
-// Package: NetCore
-// Module: IPAddress
-//
-// Definition of the IPAddress class.
-//
-// Copyright (c) 2005-2011, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_IPAddress_INCLUDED
-#define Net_IPAddress_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/SocketDefs.h"
-#include "Poco/Net/IPAddressImpl.h"
-#include "Poco/AutoPtr.h"
-#include "Poco/Exception.h"
-#include <vector>
-#include <ostream>
-
-
-namespace Poco {
-
-class BinaryReader;
-class BinaryWriter;
-
-namespace Net {
-
-
-class Net_API IPAddress
- /// This class represents an internet (IP) host
- /// address. The address can belong either to the
- /// IPv4 or the IPv6 address family.
- ///
- /// Relational operators (==, !=, <, <=, >, >=) are
- /// supported. However, you must not interpret any
- /// special meaning into the result of these
- /// operations, other than that the results are
- /// consistent.
- ///
- /// Especially, an IPv4 address is never equal to
- /// an IPv6 address, even if the IPv6 address is
- /// IPv4 compatible and the addresses are the same.
- ///
- /// IPv6 addresses are supported only if the target platform
- /// supports IPv6.
-{
-public:
- typedef std::vector<IPAddress> List;
-
- // The following declarations keep the Family type
- // backwards compatible with the previously used
- // enum declaration.
- typedef AddressFamily::Family Family;
- static const Family IPv4 = AddressFamily::IPv4;
-#if defined(POCO_HAVE_IPv6)
- static const Family IPv6 = AddressFamily::IPv6;
-#endif
-
- IPAddress();
- /// Creates a wildcard (zero) IPv4 IPAddress.
-
- IPAddress(const IPAddress& addr);
- /// Creates an IPAddress by copying another one.
-
- explicit IPAddress(Family family);
- /// Creates a wildcard (zero) IPAddress for the
- /// given address family.
-
- explicit IPAddress(const std::string& addr);
- /// Creates an IPAddress from the string containing
- /// an IP address in presentation format (dotted decimal
- /// for IPv4, hex string for IPv6).
- ///
- /// Depending on the format of addr, either an IPv4 or
- /// an IPv6 address is created.
- ///
- /// See toString() for details on the supported formats.
- ///
- /// Throws an InvalidAddressException if the address cannot be parsed.
-
- IPAddress(const std::string& addr, Family family);
- /// Creates an IPAddress from the string containing
- /// an IP address in presentation format (dotted decimal
- /// for IPv4, hex string for IPv6).
-
- IPAddress(const void* addr, poco_socklen_t length);
- /// Creates an IPAddress from a native internet address.
- /// A pointer to a in_addr or a in6_addr structure may be
- /// passed.
-
- IPAddress(const void* addr, poco_socklen_t length, Poco::UInt32 scope);
- /// Creates an IPAddress from a native internet address.
- /// A pointer to a in_addr or a in6_addr structure may be
- /// passed. Additionally, for an IPv6 address, a scope ID
- /// may be specified. The scope ID will be ignored if an IPv4
- /// address is specified.
-
- IPAddress(unsigned prefix, Family family);
- /// Creates an IPAddress mask with the given length of prefix.
-
-#if defined(_WIN32)
- IPAddress(const SOCKET_ADDRESS& socket_address);
- /// Creates an IPAddress from Windows SOCKET_ADDRESS structure.
-#endif
-
- IPAddress(const struct sockaddr& sockaddr);
- /// Same for struct sock_addr on POSIX.
-
-
- ~IPAddress();
- /// Destroys the IPAddress.
-
- IPAddress& operator = (const IPAddress& addr);
- /// Assigns an IPAddress.
-
- Family family() const;
- /// Returns the address family (IPv4 or IPv6) of the address.
-
- Poco::UInt32 scope() const;
- /// Returns the IPv6 scope identifier of the address. Returns 0 if
- /// the address is an IPv4 address, or the address is an
- /// IPv6 address but does not have a scope identifier.
-
- std::string toString() const;
- /// Returns a string containing a representation of the address
- /// in presentation format.
- ///
- /// For IPv4 addresses the result will be in dotted-decimal
- /// (d.d.d.d) notation.
- ///
- /// Textual representation of IPv6 address is one of the following forms:
- ///
- /// The preferred form is x:x:x:x:x:x:x:x, where the 'x's are the hexadecimal
- /// values of the eight 16-bit pieces of the address. This is the full form.
- /// Example: 1080:0:0:0:8:600:200A:425C
- ///
- /// It is not necessary to write the leading zeros in an individual field.
- /// However, there must be at least one numeral in every field, except as described below.
- ///
- /// It is common for IPv6 addresses to contain long strings of zero bits.
- /// In order to make writing addresses containing zero bits easier, a special syntax is
- /// available to compress the zeros. The use of "::" indicates multiple groups of 16-bits of zeros.
- /// The "::" can only appear once in an address. The "::" can also be used to compress the leading
- /// and/or trailing zeros in an address. Example: 1080::8:600:200A:425C
- ///
- /// For dealing with IPv4 compatible addresses in a mixed environment,
- /// a special syntax is available: x:x:x:x:x:x:d.d.d.d, where the 'x's are the
- /// hexadecimal values of the six high-order 16-bit pieces of the address,
- /// and the 'd's are the decimal values of the four low-order 8-bit pieces of the
- /// standard IPv4 representation address. Example: ::FFFF:192.168.1.120
- ///
- /// If an IPv6 address contains a non-zero scope identifier, it is added
- /// to the string, delimited by a percent character. On Windows platforms,
- /// the numeric value (which specifies an interface index) is directly
- /// appended. On Unix platforms, the name of the interface corresponding
- /// to the index (interpretation of the scope identifier) is added.
-
- bool isWildcard() const;
- /// Returns true iff the address is a wildcard (all zero)
- /// address.
-
- bool isBroadcast() const;
- /// Returns true iff the address is a broadcast address.
- ///
- /// Only IPv4 addresses can be broadcast addresses. In a broadcast
- /// address, all bits are one.
- ///
- /// For an IPv6 address, returns always false.
-
- bool isLoopback() const;
- /// Returns true iff the address is a loopback address.
- ///
- /// For IPv4, the loopback address is 127.0.0.1.
- ///
- /// For IPv6, the loopback address is ::1.
-
- bool isMulticast() const;
- /// Returns true iff the address is a multicast address.
- ///
- /// IPv4 multicast addresses are in the
- /// 224.0.0.0 to 239.255.255.255 range
- /// (the first four bits have the value 1110).
- ///
- /// IPv6 multicast addresses are in the
- /// FFxx:x:x:x:x:x:x:x range.
-
- bool isUnicast() const;
- /// Returns true iff the address is a unicast address.
- ///
- /// An address is unicast if it is neither a wildcard,
- /// broadcast or multicast address.
-
- bool isLinkLocal() const;
- /// Returns true iff the address is a link local unicast address.
- ///
- /// IPv4 link local addresses are in the 169.254.0.0/16 range,
- /// according to RFC 3927.
- ///
- /// IPv6 link local addresses have 1111 1110 10 as the first
- /// 10 bits, followed by 54 zeros.
-
- bool isSiteLocal() const;
- /// Returns true iff the address is a site local unicast address.
- ///
- /// IPv4 site local addresses are in on of the 10.0.0.0/24,
- /// 192.168.0.0/16 or 172.16.0.0 to 172.31.255.255 ranges.
- ///
- /// Originally, IPv6 site-local addresses had FEC0/10 (1111 1110 11)
- /// prefix (RFC 4291), followed by 38 zeros. Interfaces using
- /// this mask are supported, but obsolete; RFC 4193 prescribes
- /// fc00::/7 (1111 110) as local unicast prefix.
-
- bool isIPv4Compatible() const;
- /// Returns true iff the address is IPv4 compatible.
- ///
- /// For IPv4 addresses, this is always true.
- ///
- /// For IPv6, the address must be in the ::x:x range (the
- /// first 96 bits are zero).
-
- bool isIPv4Mapped() const;
- /// Returns true iff the address is an IPv4 mapped IPv6 address.
- ///
- /// For IPv4 addresses, this is always true.
- ///
- /// For IPv6, the address must be in the ::FFFF:x:x range.
-
- bool isWellKnownMC() const;
- /// Returns true iff the address is a well-known multicast address.
- ///
- /// For IPv4, well-known multicast addresses are in the
- /// 224.0.0.0/8 range.
- ///
- /// For IPv6, well-known multicast addresses are in the
- /// FF0x:x:x:x:x:x:x:x range.
-
- bool isNodeLocalMC() const;
- /// Returns true iff the address is a node-local multicast address.
- ///
- /// IPv4 does not support node-local addresses, thus the result is
- /// always false for an IPv4 address.
- ///
- /// For IPv6, node-local multicast addresses are in the
- /// FFx1:x:x:x:x:x:x:x range.
-
- bool isLinkLocalMC() const;
- /// Returns true iff the address is a link-local multicast address.
- ///
- /// For IPv4, link-local multicast addresses are in the
- /// 224.0.0.0/24 range. Note that this overlaps with the range for well-known
- /// multicast addresses.
- ///
- /// For IPv6, link-local multicast addresses are in the
- /// FFx2:x:x:x:x:x:x:x range.
-
- bool isSiteLocalMC() const;
- /// Returns true iff the address is a site-local multicast address.
- ///
- /// For IPv4, site local multicast addresses are in the
- /// 239.255.0.0/16 range.
- ///
- /// For IPv6, site-local multicast addresses are in the
- /// FFx5:x:x:x:x:x:x:x range.
-
- bool isOrgLocalMC() const;
- /// Returns true iff the address is a organization-local multicast address.
- ///
- /// For IPv4, organization-local multicast addresses are in the
- /// 239.192.0.0/16 range.
- ///
- /// For IPv6, organization-local multicast addresses are in the
- /// FFx8:x:x:x:x:x:x:x range.
-
- bool isGlobalMC() const;
- /// Returns true iff the address is a global multicast address.
- ///
- /// For IPv4, global multicast addresses are in the
- /// 224.0.1.0 to 238.255.255.255 range.
- ///
- /// For IPv6, global multicast addresses are in the
- /// FFxF:x:x:x:x:x:x:x range.
-
- bool operator == (const IPAddress& addr) const;
- bool operator != (const IPAddress& addr) const;
- bool operator < (const IPAddress& addr) const;
- bool operator <= (const IPAddress& addr) const;
- bool operator > (const IPAddress& addr) const;
- bool operator >= (const IPAddress& addr) const;
- IPAddress operator & (const IPAddress& addr) const;
- IPAddress operator | (const IPAddress& addr) const;
- IPAddress operator ^ (const IPAddress& addr) const;
- IPAddress operator ~ () const;
-
- poco_socklen_t length() const;
- /// Returns the length in bytes of the internal socket address structure.
-
- const void* addr() const;
- /// Returns the internal address structure.
-
- int af() const;
- /// Returns the address family (AF_INET or AF_INET6) of the address.
-
- unsigned prefixLength() const;
- /// Returns the prefix length.
-
- void mask(const IPAddress& mask);
- /// Masks the IP address using the given netmask, which is usually
- /// a IPv4 subnet mask. Only supported for IPv4 addresses.
- ///
- /// The new address is (address & mask).
-
- void mask(const IPAddress& mask, const IPAddress& set);
- /// Masks the IP address using the given netmask, which is usually
- /// a IPv4 subnet mask. Only supported for IPv4 addresses.
- ///
- /// The new address is (address & mask) | (set & ~mask).
-
- static IPAddress parse(const std::string& addr);
- /// Creates an IPAddress from the string containing
- /// an IP address in presentation format (dotted decimal
- /// for IPv4, hex string for IPv6).
- ///
- /// Depending on the format of addr, either an IPv4 or
- /// an IPv6 address is created.
- ///
- /// See toString() for details on the supported formats.
- ///
- /// Throws an InvalidAddressException if the address cannot be parsed.
-
- static bool tryParse(const std::string& addr, IPAddress& result);
- /// Tries to interpret the given address string as an
- /// IP address in presentation format (dotted decimal
- /// for IPv4, hex string for IPv6).
- ///
- /// Returns true and stores the IPAddress in result if the
- /// string contains a valid address.
- ///
- /// Returns false and leaves result unchanged otherwise.
-
- static IPAddress wildcard(Family family = IPv4);
- /// Returns a wildcard IPv4 or IPv6 address (0.0.0.0).
-
- static IPAddress broadcast();
- /// Returns a broadcast IPv4 address (255.255.255.255).
-
- enum
- {
- MAX_ADDRESS_LENGTH =
-#if defined(POCO_HAVE_IPv6)
- sizeof(struct in6_addr)
-#else
- sizeof(struct in_addr)
-#endif
- /// Maximum length in bytes of a socket address.
- };
-
-private:
- typedef Poco::Net::Impl::IPAddressImpl Impl;
- typedef Poco::AutoPtr<Impl> Ptr;
-
- Ptr pImpl() const;
- void newIPv4();
- void newIPv4(const void* hostAddr);
- void newIPv4(unsigned prefix);
-#if defined(POCO_HAVE_IPv6)
- void newIPv6();
- void newIPv6(const void* hostAddr);
- void newIPv6(const void* hostAddr, Poco::UInt32 scope);
- void newIPv6(unsigned prefix);
-#endif
- Ptr _pImpl;
-};
-
-
-//
-// inlines
-//
-inline IPAddress::Ptr IPAddress::pImpl() const
-{
- if (_pImpl) return _pImpl;
- throw NullPointerException("IPaddress implementation pointer is NULL.");
-}
-
-
-inline void IPAddress::newIPv4()
-{
- _pImpl = new Poco::Net::Impl::IPv4AddressImpl;
-}
-
-
-inline void IPAddress::newIPv4(const void* hostAddr)
-{
- _pImpl = new Poco::Net::Impl::IPv4AddressImpl(hostAddr);
-}
-
-
-inline void IPAddress::newIPv4(unsigned prefix)
-{
- _pImpl = new Poco::Net::Impl::IPv4AddressImpl(prefix);
-}
-
-
-#if defined(POCO_HAVE_IPv6)
-
-
-inline void IPAddress::newIPv6()
-{
- _pImpl = new Poco::Net::Impl::IPv6AddressImpl;
-}
-
-
-inline void IPAddress::newIPv6(const void* hostAddr)
-{
- _pImpl = new Poco::Net::Impl::IPv6AddressImpl(hostAddr);
-}
-
-
-inline void IPAddress::newIPv6(const void* hostAddr, Poco::UInt32 scope)
-{
- _pImpl = new Poco::Net::Impl::IPv6AddressImpl(hostAddr, scope);
-}
-
-
-inline void IPAddress::newIPv6(unsigned prefix)
-{
- _pImpl = new Poco::Net::Impl::IPv6AddressImpl(prefix);
-}
-
-
-#endif // POCO_HAVE_IPv6
-
-
-} } // namespace Poco::Net
-
-
-Net_API Poco::BinaryWriter& operator << (Poco::BinaryWriter& writer, const Poco::Net::IPAddress& value);
-Net_API Poco::BinaryReader& operator >> (Poco::BinaryReader& reader, Poco::Net::IPAddress& value);
-Net_API std::ostream& operator << (std::ostream& ostr, const Poco::Net::IPAddress& addr);
-
-
-#endif // Net_IPAddress_INCLUDED
+//
+// IPAddress.h
+//
+// Library: Net
+// Package: NetCore
+// Module: IPAddress
+//
+// Definition of the IPAddress class.
+//
+// Copyright (c) 2005-2011, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_IPAddress_INCLUDED
+#define Net_IPAddress_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/SocketDefs.h"
+#include "Poco/Net/IPAddressImpl.h"
+#include "Poco/AutoPtr.h"
+#include "Poco/Exception.h"
+#include <vector>
+#include <ostream>
+
+
+namespace Poco {
+
+class BinaryReader;
+class BinaryWriter;
+
+namespace Net {
+
+
+class Net_API IPAddress
+ /// This class represents an internet (IP) host
+ /// address. The address can belong either to the
+ /// IPv4 or the IPv6 address family.
+ ///
+ /// Relational operators (==, !=, <, <=, >, >=) are
+ /// supported. However, you must not interpret any
+ /// special meaning into the result of these
+ /// operations, other than that the results are
+ /// consistent.
+ ///
+ /// Especially, an IPv4 address is never equal to
+ /// an IPv6 address, even if the IPv6 address is
+ /// IPv4 compatible and the addresses are the same.
+ ///
+ /// IPv6 addresses are supported only if the target platform
+ /// supports IPv6.
+{
+public:
+ typedef std::vector<IPAddress> List;
+
+ // The following declarations keep the Family type
+ // backwards compatible with the previously used
+ // enum declaration.
+ typedef AddressFamily::Family Family;
+ static const Family IPv4 = AddressFamily::IPv4;
+#if defined(POCO_HAVE_IPv6)
+ static const Family IPv6 = AddressFamily::IPv6;
+#endif
+
+ IPAddress();
+ /// Creates a wildcard (zero) IPv4 IPAddress.
+
+ IPAddress(const IPAddress& addr);
+ /// Creates an IPAddress by copying another one.
+
+ explicit IPAddress(Family family);
+ /// Creates a wildcard (zero) IPAddress for the
+ /// given address family.
+
+ explicit IPAddress(const std::string& addr);
+ /// Creates an IPAddress from the string containing
+ /// an IP address in presentation format (dotted decimal
+ /// for IPv4, hex string for IPv6).
+ ///
+ /// Depending on the format of addr, either an IPv4 or
+ /// an IPv6 address is created.
+ ///
+ /// See toString() for details on the supported formats.
+ ///
+ /// Throws an InvalidAddressException if the address cannot be parsed.
+
+ IPAddress(const std::string& addr, Family family);
+ /// Creates an IPAddress from the string containing
+ /// an IP address in presentation format (dotted decimal
+ /// for IPv4, hex string for IPv6).
+
+ IPAddress(const void* addr, poco_socklen_t length);
+ /// Creates an IPAddress from a native internet address.
+ /// A pointer to a in_addr or a in6_addr structure may be
+ /// passed.
+
+ IPAddress(const void* addr, poco_socklen_t length, Poco::UInt32 scope);
+ /// Creates an IPAddress from a native internet address.
+ /// A pointer to a in_addr or a in6_addr structure may be
+ /// passed. Additionally, for an IPv6 address, a scope ID
+ /// may be specified. The scope ID will be ignored if an IPv4
+ /// address is specified.
+
+ IPAddress(unsigned prefix, Family family);
+ /// Creates an IPAddress mask with the given length of prefix.
+
+#if defined(_WIN32)
+ IPAddress(const SOCKET_ADDRESS& socket_address);
+ /// Creates an IPAddress from Windows SOCKET_ADDRESS structure.
+#endif
+
+ IPAddress(const struct sockaddr& sockaddr);
+ /// Same for struct sock_addr on POSIX.
+
+
+ ~IPAddress();
+ /// Destroys the IPAddress.
+
+ IPAddress& operator = (const IPAddress& addr);
+ /// Assigns an IPAddress.
+
+ Family family() const;
+ /// Returns the address family (IPv4 or IPv6) of the address.
+
+ Poco::UInt32 scope() const;
+ /// Returns the IPv6 scope identifier of the address. Returns 0 if
+ /// the address is an IPv4 address, or the address is an
+ /// IPv6 address but does not have a scope identifier.
+
+ std::string toString() const;
+ /// Returns a string containing a representation of the address
+ /// in presentation format.
+ ///
+ /// For IPv4 addresses the result will be in dotted-decimal
+ /// (d.d.d.d) notation.
+ ///
+ /// Textual representation of IPv6 address is one of the following forms:
+ ///
+ /// The preferred form is x:x:x:x:x:x:x:x, where the 'x's are the hexadecimal
+ /// values of the eight 16-bit pieces of the address. This is the full form.
+ /// Example: 1080:0:0:0:8:600:200A:425C
+ ///
+ /// It is not necessary to write the leading zeros in an individual field.
+ /// However, there must be at least one numeral in every field, except as described below.
+ ///
+ /// It is common for IPv6 addresses to contain long strings of zero bits.
+ /// In order to make writing addresses containing zero bits easier, a special syntax is
+ /// available to compress the zeros. The use of "::" indicates multiple groups of 16-bits of zeros.
+ /// The "::" can only appear once in an address. The "::" can also be used to compress the leading
+ /// and/or trailing zeros in an address. Example: 1080::8:600:200A:425C
+ ///
+ /// For dealing with IPv4 compatible addresses in a mixed environment,
+ /// a special syntax is available: x:x:x:x:x:x:d.d.d.d, where the 'x's are the
+ /// hexadecimal values of the six high-order 16-bit pieces of the address,
+ /// and the 'd's are the decimal values of the four low-order 8-bit pieces of the
+ /// standard IPv4 representation address. Example: ::FFFF:192.168.1.120
+ ///
+ /// If an IPv6 address contains a non-zero scope identifier, it is added
+ /// to the string, delimited by a percent character. On Windows platforms,
+ /// the numeric value (which specifies an interface index) is directly
+ /// appended. On Unix platforms, the name of the interface corresponding
+ /// to the index (interpretation of the scope identifier) is added.
+
+ bool isWildcard() const;
+ /// Returns true iff the address is a wildcard (all zero)
+ /// address.
+
+ bool isBroadcast() const;
+ /// Returns true iff the address is a broadcast address.
+ ///
+ /// Only IPv4 addresses can be broadcast addresses. In a broadcast
+ /// address, all bits are one.
+ ///
+ /// For an IPv6 address, returns always false.
+
+ bool isLoopback() const;
+ /// Returns true iff the address is a loopback address.
+ ///
+ /// For IPv4, the loopback address is 127.0.0.1.
+ ///
+ /// For IPv6, the loopback address is ::1.
+
+ bool isMulticast() const;
+ /// Returns true iff the address is a multicast address.
+ ///
+ /// IPv4 multicast addresses are in the
+ /// 224.0.0.0 to 239.255.255.255 range
+ /// (the first four bits have the value 1110).
+ ///
+ /// IPv6 multicast addresses are in the
+ /// FFxx:x:x:x:x:x:x:x range.
+
+ bool isUnicast() const;
+ /// Returns true iff the address is a unicast address.
+ ///
+ /// An address is unicast if it is neither a wildcard,
+ /// broadcast or multicast address.
+
+ bool isLinkLocal() const;
+ /// Returns true iff the address is a link local unicast address.
+ ///
+ /// IPv4 link local addresses are in the 169.254.0.0/16 range,
+ /// according to RFC 3927.
+ ///
+ /// IPv6 link local addresses have 1111 1110 10 as the first
+ /// 10 bits, followed by 54 zeros.
+
+ bool isSiteLocal() const;
+ /// Returns true iff the address is a site local unicast address.
+ ///
+ /// IPv4 site local addresses are in on of the 10.0.0.0/24,
+ /// 192.168.0.0/16 or 172.16.0.0 to 172.31.255.255 ranges.
+ ///
+ /// Originally, IPv6 site-local addresses had FEC0/10 (1111 1110 11)
+ /// prefix (RFC 4291), followed by 38 zeros. Interfaces using
+ /// this mask are supported, but obsolete; RFC 4193 prescribes
+ /// fc00::/7 (1111 110) as local unicast prefix.
+
+ bool isIPv4Compatible() const;
+ /// Returns true iff the address is IPv4 compatible.
+ ///
+ /// For IPv4 addresses, this is always true.
+ ///
+ /// For IPv6, the address must be in the ::x:x range (the
+ /// first 96 bits are zero).
+
+ bool isIPv4Mapped() const;
+ /// Returns true iff the address is an IPv4 mapped IPv6 address.
+ ///
+ /// For IPv4 addresses, this is always true.
+ ///
+ /// For IPv6, the address must be in the ::FFFF:x:x range.
+
+ bool isWellKnownMC() const;
+ /// Returns true iff the address is a well-known multicast address.
+ ///
+ /// For IPv4, well-known multicast addresses are in the
+ /// 224.0.0.0/8 range.
+ ///
+ /// For IPv6, well-known multicast addresses are in the
+ /// FF0x:x:x:x:x:x:x:x range.
+
+ bool isNodeLocalMC() const;
+ /// Returns true iff the address is a node-local multicast address.
+ ///
+ /// IPv4 does not support node-local addresses, thus the result is
+ /// always false for an IPv4 address.
+ ///
+ /// For IPv6, node-local multicast addresses are in the
+ /// FFx1:x:x:x:x:x:x:x range.
+
+ bool isLinkLocalMC() const;
+ /// Returns true iff the address is a link-local multicast address.
+ ///
+ /// For IPv4, link-local multicast addresses are in the
+ /// 224.0.0.0/24 range. Note that this overlaps with the range for well-known
+ /// multicast addresses.
+ ///
+ /// For IPv6, link-local multicast addresses are in the
+ /// FFx2:x:x:x:x:x:x:x range.
+
+ bool isSiteLocalMC() const;
+ /// Returns true iff the address is a site-local multicast address.
+ ///
+ /// For IPv4, site local multicast addresses are in the
+ /// 239.255.0.0/16 range.
+ ///
+ /// For IPv6, site-local multicast addresses are in the
+ /// FFx5:x:x:x:x:x:x:x range.
+
+ bool isOrgLocalMC() const;
+ /// Returns true iff the address is a organization-local multicast address.
+ ///
+ /// For IPv4, organization-local multicast addresses are in the
+ /// 239.192.0.0/16 range.
+ ///
+ /// For IPv6, organization-local multicast addresses are in the
+ /// FFx8:x:x:x:x:x:x:x range.
+
+ bool isGlobalMC() const;
+ /// Returns true iff the address is a global multicast address.
+ ///
+ /// For IPv4, global multicast addresses are in the
+ /// 224.0.1.0 to 238.255.255.255 range.
+ ///
+ /// For IPv6, global multicast addresses are in the
+ /// FFxF:x:x:x:x:x:x:x range.
+
+ bool operator == (const IPAddress& addr) const;
+ bool operator != (const IPAddress& addr) const;
+ bool operator < (const IPAddress& addr) const;
+ bool operator <= (const IPAddress& addr) const;
+ bool operator > (const IPAddress& addr) const;
+ bool operator >= (const IPAddress& addr) const;
+ IPAddress operator & (const IPAddress& addr) const;
+ IPAddress operator | (const IPAddress& addr) const;
+ IPAddress operator ^ (const IPAddress& addr) const;
+ IPAddress operator ~ () const;
+
+ poco_socklen_t length() const;
+ /// Returns the length in bytes of the internal socket address structure.
+
+ const void* addr() const;
+ /// Returns the internal address structure.
+
+ int af() const;
+ /// Returns the address family (AF_INET or AF_INET6) of the address.
+
+ unsigned prefixLength() const;
+ /// Returns the prefix length.
+
+ void mask(const IPAddress& mask);
+ /// Masks the IP address using the given netmask, which is usually
+ /// a IPv4 subnet mask. Only supported for IPv4 addresses.
+ ///
+ /// The new address is (address & mask).
+
+ void mask(const IPAddress& mask, const IPAddress& set);
+ /// Masks the IP address using the given netmask, which is usually
+ /// a IPv4 subnet mask. Only supported for IPv4 addresses.
+ ///
+ /// The new address is (address & mask) | (set & ~mask).
+
+ static IPAddress parse(const std::string& addr);
+ /// Creates an IPAddress from the string containing
+ /// an IP address in presentation format (dotted decimal
+ /// for IPv4, hex string for IPv6).
+ ///
+ /// Depending on the format of addr, either an IPv4 or
+ /// an IPv6 address is created.
+ ///
+ /// See toString() for details on the supported formats.
+ ///
+ /// Throws an InvalidAddressException if the address cannot be parsed.
+
+ static bool tryParse(const std::string& addr, IPAddress& result);
+ /// Tries to interpret the given address string as an
+ /// IP address in presentation format (dotted decimal
+ /// for IPv4, hex string for IPv6).
+ ///
+ /// Returns true and stores the IPAddress in result if the
+ /// string contains a valid address.
+ ///
+ /// Returns false and leaves result unchanged otherwise.
+
+ static IPAddress wildcard(Family family = IPv4);
+ /// Returns a wildcard IPv4 or IPv6 address (0.0.0.0).
+
+ static IPAddress broadcast();
+ /// Returns a broadcast IPv4 address (255.255.255.255).
+
+ enum
+ {
+ MAX_ADDRESS_LENGTH =
+#if defined(POCO_HAVE_IPv6)
+ sizeof(struct in6_addr)
+#else
+ sizeof(struct in_addr)
+#endif
+ /// Maximum length in bytes of a socket address.
+ };
+
+private:
+ typedef Poco::Net::Impl::IPAddressImpl Impl;
+ typedef Poco::AutoPtr<Impl> Ptr;
+
+ Ptr pImpl() const;
+ void newIPv4();
+ void newIPv4(const void* hostAddr);
+ void newIPv4(unsigned prefix);
+#if defined(POCO_HAVE_IPv6)
+ void newIPv6();
+ void newIPv6(const void* hostAddr);
+ void newIPv6(const void* hostAddr, Poco::UInt32 scope);
+ void newIPv6(unsigned prefix);
+#endif
+ Ptr _pImpl;
+};
+
+
+//
+// inlines
+//
+inline IPAddress::Ptr IPAddress::pImpl() const
+{
+ if (_pImpl) return _pImpl;
+ throw NullPointerException("IPaddress implementation pointer is NULL.");
+}
+
+
+inline void IPAddress::newIPv4()
+{
+ _pImpl = new Poco::Net::Impl::IPv4AddressImpl;
+}
+
+
+inline void IPAddress::newIPv4(const void* hostAddr)
+{
+ _pImpl = new Poco::Net::Impl::IPv4AddressImpl(hostAddr);
+}
+
+
+inline void IPAddress::newIPv4(unsigned prefix)
+{
+ _pImpl = new Poco::Net::Impl::IPv4AddressImpl(prefix);
+}
+
+
+#if defined(POCO_HAVE_IPv6)
+
+
+inline void IPAddress::newIPv6()
+{
+ _pImpl = new Poco::Net::Impl::IPv6AddressImpl;
+}
+
+
+inline void IPAddress::newIPv6(const void* hostAddr)
+{
+ _pImpl = new Poco::Net::Impl::IPv6AddressImpl(hostAddr);
+}
+
+
+inline void IPAddress::newIPv6(const void* hostAddr, Poco::UInt32 scope)
+{
+ _pImpl = new Poco::Net::Impl::IPv6AddressImpl(hostAddr, scope);
+}
+
+
+inline void IPAddress::newIPv6(unsigned prefix)
+{
+ _pImpl = new Poco::Net::Impl::IPv6AddressImpl(prefix);
+}
+
+
+#endif // POCO_HAVE_IPv6
+
+
+} } // namespace Poco::Net
+
+
+Net_API Poco::BinaryWriter& operator << (Poco::BinaryWriter& writer, const Poco::Net::IPAddress& value);
+Net_API Poco::BinaryReader& operator >> (Poco::BinaryReader& reader, Poco::Net::IPAddress& value);
+Net_API std::ostream& operator << (std::ostream& ostr, const Poco::Net::IPAddress& addr);
+
+
+#endif // Net_IPAddress_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/IPAddressImpl.h b/contrib/libs/poco/Net/include/Poco/Net/IPAddressImpl.h
index 4bdbd2f45d..e43d685509 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/IPAddressImpl.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/IPAddressImpl.h
@@ -1,179 +1,179 @@
-//
-// IPAddressImpl.h
-//
-// Library: Net
-// Package: NetCore
-// Module: IPAddressImpl
-//
-// Definition of the IPAddressImpl class.
-//
-// Copyright (c) 2005-2011, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_IPAddressImpl_INCLUDED
-#define Net_IPAddressImpl_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/SocketDefs.h"
-#include "Poco/RefCountedObject.h"
-#include <vector>
-
-
-namespace Poco {
-namespace Net {
-namespace Impl {
-
-
-class IPAddressImpl : public Poco::RefCountedObject
-{
-public:
- typedef AddressFamily::Family Family;
-
- virtual ~IPAddressImpl();
-
- virtual IPAddressImpl* clone() const = 0;
- virtual std::string toString() const = 0;
- virtual poco_socklen_t length() const = 0;
- virtual const void* addr() const = 0;
- virtual Family family() const = 0;
- virtual int af() const = 0;
- virtual Poco::UInt32 scope() const = 0;
- virtual bool isWildcard() const = 0;
- virtual bool isBroadcast() const = 0;
- virtual bool isLoopback() const = 0;
- virtual bool isMulticast() const = 0;
- virtual bool isLinkLocal() const = 0;
- virtual bool isSiteLocal() const = 0;
- virtual bool isIPv4Mapped() const = 0;
- virtual bool isIPv4Compatible() const = 0;
- virtual bool isWellKnownMC() const = 0;
- virtual bool isNodeLocalMC() const = 0;
- virtual bool isLinkLocalMC() const = 0;
- virtual bool isSiteLocalMC() const = 0;
- virtual bool isOrgLocalMC() const = 0;
- virtual bool isGlobalMC() const = 0;
- virtual void mask(const IPAddressImpl* pMask, const IPAddressImpl* pSet) = 0;
- virtual unsigned prefixLength() const = 0;
-
-protected:
- IPAddressImpl();
-
-private:
- IPAddressImpl(const IPAddressImpl&);
- IPAddressImpl& operator = (const IPAddressImpl&);
-};
-
-
-//
-// IPv4AddressImpl
-//
-
-class IPv4AddressImpl: public IPAddressImpl
-{
-public:
- IPv4AddressImpl();
- IPv4AddressImpl(const void* addr);
- IPv4AddressImpl(unsigned prefix);
- IPv4AddressImpl(const IPv4AddressImpl& addr);
- IPv4AddressImpl& operator = (const IPv4AddressImpl&);
- std::string toString() const;
- poco_socklen_t length() const;
- const void* addr() const;
- Family family() const;
- int af() const;
- unsigned prefixLength() const;
- Poco::UInt32 scope() const;
- bool isWildcard() const;
- bool isBroadcast() const;
- bool isLoopback() const;
- bool isMulticast() const;
- bool isLinkLocal() const;
- bool isSiteLocal() const;
- bool isIPv4Compatible() const;
- bool isIPv4Mapped() const;
- bool isWellKnownMC() const;
- bool isNodeLocalMC() const;
- bool isLinkLocalMC() const;
- bool isSiteLocalMC() const;
- bool isOrgLocalMC() const;
- bool isGlobalMC() const;
- static IPv4AddressImpl parse(const std::string& addr);
- void mask(const IPAddressImpl* pMask, const IPAddressImpl* pSet);
- IPAddressImpl* clone() const;
- IPv4AddressImpl operator & (const IPv4AddressImpl& addr) const;
- IPv4AddressImpl operator | (const IPv4AddressImpl& addr) const;
- IPv4AddressImpl operator ^ (const IPv4AddressImpl& addr) const;
- IPv4AddressImpl operator ~ () const;
- bool operator == (const IPv4AddressImpl& addr) const;
- bool operator != (const IPv4AddressImpl& addr) const;
-
-private:
- struct in_addr _addr;
-};
-
-
-#if defined(POCO_HAVE_IPv6)
-
-
-//
-// IPv6AddressImpl
-//
-
-class IPv6AddressImpl: public IPAddressImpl
-{
-public:
- IPv6AddressImpl();
- IPv6AddressImpl(const void* addr);
- IPv6AddressImpl(const void* addr, Poco::UInt32 scope);
- IPv6AddressImpl(unsigned prefix);
- std::string toString() const;
- poco_socklen_t length() const;
- const void* addr() const;
- Family family() const;
- int af() const;
- unsigned prefixLength() const;
- Poco::UInt32 scope() const;
- bool isWildcard() const;
- bool isBroadcast() const;
- bool isLoopback() const;
- bool isMulticast() const;
- bool isLinkLocal() const;
- bool isSiteLocal() const;
- bool isIPv4Compatible() const;
- bool isIPv4Mapped() const;
- bool isWellKnownMC() const;
- bool isNodeLocalMC() const;
- bool isLinkLocalMC() const;
- bool isSiteLocalMC() const;
- bool isOrgLocalMC() const;
- bool isGlobalMC() const;
- static IPv6AddressImpl parse(const std::string& addr);
- void mask(const IPAddressImpl* pMask, const IPAddressImpl* pSet);
- IPAddressImpl* clone() const;
- IPv6AddressImpl operator & (const IPv6AddressImpl& addr) const;
- IPv6AddressImpl operator | (const IPv6AddressImpl& addr) const;
- IPv6AddressImpl operator ^ (const IPv6AddressImpl& addr) const;
- IPv6AddressImpl operator ~ () const;
- bool operator == (const IPv6AddressImpl& addr) const;
- bool operator != (const IPv6AddressImpl& addr) const;
- IPv6AddressImpl(const IPv6AddressImpl& addr);
- IPv6AddressImpl& operator = (const IPv6AddressImpl&);
-
-private:
- struct in6_addr _addr;
- unsigned int _scope;
-};
-
-
-#endif // POCO_HAVE_IPv6
-
-
-} } } // namespace Poco::Net::Impl
-
-
-#endif // Net_IPAddressImpl_INCLUDED
+//
+// IPAddressImpl.h
+//
+// Library: Net
+// Package: NetCore
+// Module: IPAddressImpl
+//
+// Definition of the IPAddressImpl class.
+//
+// Copyright (c) 2005-2011, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_IPAddressImpl_INCLUDED
+#define Net_IPAddressImpl_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/SocketDefs.h"
+#include "Poco/RefCountedObject.h"
+#include <vector>
+
+
+namespace Poco {
+namespace Net {
+namespace Impl {
+
+
+class IPAddressImpl : public Poco::RefCountedObject
+{
+public:
+ typedef AddressFamily::Family Family;
+
+ virtual ~IPAddressImpl();
+
+ virtual IPAddressImpl* clone() const = 0;
+ virtual std::string toString() const = 0;
+ virtual poco_socklen_t length() const = 0;
+ virtual const void* addr() const = 0;
+ virtual Family family() const = 0;
+ virtual int af() const = 0;
+ virtual Poco::UInt32 scope() const = 0;
+ virtual bool isWildcard() const = 0;
+ virtual bool isBroadcast() const = 0;
+ virtual bool isLoopback() const = 0;
+ virtual bool isMulticast() const = 0;
+ virtual bool isLinkLocal() const = 0;
+ virtual bool isSiteLocal() const = 0;
+ virtual bool isIPv4Mapped() const = 0;
+ virtual bool isIPv4Compatible() const = 0;
+ virtual bool isWellKnownMC() const = 0;
+ virtual bool isNodeLocalMC() const = 0;
+ virtual bool isLinkLocalMC() const = 0;
+ virtual bool isSiteLocalMC() const = 0;
+ virtual bool isOrgLocalMC() const = 0;
+ virtual bool isGlobalMC() const = 0;
+ virtual void mask(const IPAddressImpl* pMask, const IPAddressImpl* pSet) = 0;
+ virtual unsigned prefixLength() const = 0;
+
+protected:
+ IPAddressImpl();
+
+private:
+ IPAddressImpl(const IPAddressImpl&);
+ IPAddressImpl& operator = (const IPAddressImpl&);
+};
+
+
+//
+// IPv4AddressImpl
+//
+
+class IPv4AddressImpl: public IPAddressImpl
+{
+public:
+ IPv4AddressImpl();
+ IPv4AddressImpl(const void* addr);
+ IPv4AddressImpl(unsigned prefix);
+ IPv4AddressImpl(const IPv4AddressImpl& addr);
+ IPv4AddressImpl& operator = (const IPv4AddressImpl&);
+ std::string toString() const;
+ poco_socklen_t length() const;
+ const void* addr() const;
+ Family family() const;
+ int af() const;
+ unsigned prefixLength() const;
+ Poco::UInt32 scope() const;
+ bool isWildcard() const;
+ bool isBroadcast() const;
+ bool isLoopback() const;
+ bool isMulticast() const;
+ bool isLinkLocal() const;
+ bool isSiteLocal() const;
+ bool isIPv4Compatible() const;
+ bool isIPv4Mapped() const;
+ bool isWellKnownMC() const;
+ bool isNodeLocalMC() const;
+ bool isLinkLocalMC() const;
+ bool isSiteLocalMC() const;
+ bool isOrgLocalMC() const;
+ bool isGlobalMC() const;
+ static IPv4AddressImpl parse(const std::string& addr);
+ void mask(const IPAddressImpl* pMask, const IPAddressImpl* pSet);
+ IPAddressImpl* clone() const;
+ IPv4AddressImpl operator & (const IPv4AddressImpl& addr) const;
+ IPv4AddressImpl operator | (const IPv4AddressImpl& addr) const;
+ IPv4AddressImpl operator ^ (const IPv4AddressImpl& addr) const;
+ IPv4AddressImpl operator ~ () const;
+ bool operator == (const IPv4AddressImpl& addr) const;
+ bool operator != (const IPv4AddressImpl& addr) const;
+
+private:
+ struct in_addr _addr;
+};
+
+
+#if defined(POCO_HAVE_IPv6)
+
+
+//
+// IPv6AddressImpl
+//
+
+class IPv6AddressImpl: public IPAddressImpl
+{
+public:
+ IPv6AddressImpl();
+ IPv6AddressImpl(const void* addr);
+ IPv6AddressImpl(const void* addr, Poco::UInt32 scope);
+ IPv6AddressImpl(unsigned prefix);
+ std::string toString() const;
+ poco_socklen_t length() const;
+ const void* addr() const;
+ Family family() const;
+ int af() const;
+ unsigned prefixLength() const;
+ Poco::UInt32 scope() const;
+ bool isWildcard() const;
+ bool isBroadcast() const;
+ bool isLoopback() const;
+ bool isMulticast() const;
+ bool isLinkLocal() const;
+ bool isSiteLocal() const;
+ bool isIPv4Compatible() const;
+ bool isIPv4Mapped() const;
+ bool isWellKnownMC() const;
+ bool isNodeLocalMC() const;
+ bool isLinkLocalMC() const;
+ bool isSiteLocalMC() const;
+ bool isOrgLocalMC() const;
+ bool isGlobalMC() const;
+ static IPv6AddressImpl parse(const std::string& addr);
+ void mask(const IPAddressImpl* pMask, const IPAddressImpl* pSet);
+ IPAddressImpl* clone() const;
+ IPv6AddressImpl operator & (const IPv6AddressImpl& addr) const;
+ IPv6AddressImpl operator | (const IPv6AddressImpl& addr) const;
+ IPv6AddressImpl operator ^ (const IPv6AddressImpl& addr) const;
+ IPv6AddressImpl operator ~ () const;
+ bool operator == (const IPv6AddressImpl& addr) const;
+ bool operator != (const IPv6AddressImpl& addr) const;
+ IPv6AddressImpl(const IPv6AddressImpl& addr);
+ IPv6AddressImpl& operator = (const IPv6AddressImpl&);
+
+private:
+ struct in6_addr _addr;
+ unsigned int _scope;
+};
+
+
+#endif // POCO_HAVE_IPv6
+
+
+} } } // namespace Poco::Net::Impl
+
+
+#endif // Net_IPAddressImpl_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/MailMessage.h b/contrib/libs/poco/Net/include/Poco/Net/MailMessage.h
index 472284316f..474186036e 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/MailMessage.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/MailMessage.h
@@ -1,314 +1,314 @@
-//
-// MailMessage.h
-//
-// Library: Net
-// Package: Mail
-// Module: MailMessage
-//
-// Definition of the MailMessage class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_MailMessage_INCLUDED
-#define Net_MailMessage_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/MessageHeader.h"
-#include "Poco/Net/MailRecipient.h"
-#include "Poco/Net/PartStore.h"
-#include "Poco/Timestamp.h"
-#include <vector>
-
-
-namespace Poco {
-namespace Net {
-
-
-class MediaType;
-class PartSource;
-class PartHandler;
-class MultipartWriter;
-
-
-class Net_API MailMessage: public MessageHeader
- /// This class represents an e-mail message for
- /// use with the SMTPClientSession and POPClientSession
- /// classes.
- ///
- /// MailMessage supports both old-style plain text messages,
- /// as well as MIME multipart mail messages with attachments.
- ///
- /// For multi-part messages, the following content transfer
- /// encodings are supported: 7bit, 8bit, quoted-printable
- /// and base64.
-{
-public:
- typedef std::vector<MailRecipient> Recipients;
-
- enum ContentDisposition
- {
- CONTENT_INLINE,
- CONTENT_ATTACHMENT
- };
-
- enum ContentTransferEncoding
- {
- ENCODING_7BIT,
- ENCODING_8BIT,
- ENCODING_QUOTED_PRINTABLE,
- ENCODING_BASE64
- };
-
- struct Part
- {
- std::string name;
- PartSource* pSource;
- ContentDisposition disposition;
- ContentTransferEncoding encoding;
- };
-
- typedef std::vector<Part> PartVec;
-
- MailMessage(PartStoreFactory* pStoreFactory = 0);
- /// Creates an empty MailMessage.
- ///
- /// If pStoreFactory is not null, message attachments will be
- /// handled by the object created by the factory. Most
- /// common reason is to temporarily save attachments to
- /// the file system in order to avoid potential memory
- /// exhaustion when attachment files are very large.
-
- virtual ~MailMessage();
- /// Destroys the MailMessage.
-
- void addRecipient(const MailRecipient& recipient);
- /// Adds a recipient for the message.
-
- void setRecipients(const Recipients& recipient);
- /// Clears existing and sets new recipient list for the message.
-
- const Recipients& recipients() const;
- /// Returns the recipients of the message.
-
- void setSubject(const std::string& subject);
- /// Sets the subject of the message.
- ///
- /// The subject must not contain any non-ASCII
- /// characters. To include non-ASCII characters
- /// in the subject, use RFC 2047 word encoding
- /// (see encodeWord()).
-
- const std::string& getSubject() const;
- /// Returns the subject of the message.
-
- void setSender(const std::string& sender);
- /// Sets the sender of the message (which
- /// ends up in the From header field).
- ///
- /// The sender must either be a valid email
- /// address, or a real name followed by
- /// an email address enclosed in < and >.
- ///
- /// The sender must not contain any non-ASCII
- /// characters. To include non-ASCII characters
- /// in the sender, use RFC 2047 word encoding
- /// (see encodeWord()).
-
- const std::string& getSender() const;
- /// Returns the sender of the message (taken
- /// from the From header field).
-
- void setContent(const std::string& content, ContentTransferEncoding encoding = ENCODING_QUOTED_PRINTABLE);
- /// Sets the content of the mail message.
- ///
- /// If the content transfer encoding is ENCODING_7BIT or
- /// ENCODING_8BIT, the content string must be formatted
- /// according to the rules of an internet email message.
- ///
- /// The message will be sent as a single-part
- /// message.
- ///
- /// Note that single CR or LF characters as line delimiters must
- /// not be used. Content lines always should be terminated with a
- /// proper CRLF sequence.
-
- const std::string& getContent() const;
- /// Returns the content of the mail message.
- ///
- /// A content will only be returned for single-part
- /// messages. The content of multi-part mail messages
- /// will be reported through the registered PartHandler.
-
- void setContentType(const std::string& mediaType);
- /// Sets the content type for the message.
-
- void setContentType(const MediaType& mediaType);
- /// Sets the content type for the message.
-
- const std::string& getContentType() const;
- /// Returns the content type for the message.
-
- void setDate(const Poco::Timestamp& dateTime);
- /// Sets the Date header to the given date/time value.
-
- Poco::Timestamp getDate() const;
- /// Returns the value of the Date header.
-
- bool isMultipart() const;
- /// Returns true iff the message is a multipart message.
-
- void addPart(const std::string& name,
- PartSource* pSource,
- ContentDisposition disposition,
- ContentTransferEncoding encoding);
- /// Adds a part/attachment to the mail message.
- ///
- /// The MailMessage takes ownership of the PartSource and deletes it
- /// when it is no longer needed.
- ///
- /// The MailMessage will be converted to a multipart message
- /// if it is not already one.
- ///
- /// The part name, and the filename specified in the part source
- /// must not contain any non-ASCII characters.
- /// To include non-ASCII characters in the part name or filename,
- /// use RFC 2047 word encoding (see encodeWord()).
-
- void addContent(PartSource* pSource,
- ContentTransferEncoding encoding = ENCODING_QUOTED_PRINTABLE);
- /// Adds a part to the mail message by calling
- /// addPart("", pSource, CONTENT_INLINE, encoding);
- ///
- /// The part name, and the filename specified in the part source
- /// must not contain any non-ASCII characters.
- /// To include non-ASCII characters in the part name or filename,
- /// use RFC 2047 word encoding (see encodeWord()).
-
- void addAttachment(const std::string& name,
- PartSource* pSource,
- ContentTransferEncoding encoding = ENCODING_BASE64);
- /// Adds an attachment to the mail message by calling
- /// addPart(name, pSource, CONTENT_ATTACHMENT, encoding);
- ///
- /// The part name, and the filename specified in the part source
- /// must not contain any non-ASCII characters.
- /// To include non-ASCII characters in the part name or filename,
- /// use RFC 2047 word encoding (see encodeWord()).
-
- PartSource* createPartStore(const std::string& content,
- const std::string& mediaType,
- const std::string& filename = "");
- /// Returns either default StringPartSource part store or,
- /// if the part store factory was provided during construction,
- /// the one created by PartStoreFactory.
- /// Returned part store is allocated on the heap; it is caller's
- /// responsibility to delete it after use. Typical use is handler
- /// passing it back to MailMessage, which takes care of the cleanup.
-
- const PartVec& parts() const;
- /// Returns const reference to the vector containing part stores.
-
- void read(std::istream& istr, PartHandler& handler);
- /// Reads the MailMessage from the given input stream.
- ///
- /// If the message has multiple parts, the parts
- /// are reported to the PartHandler. If the message
- /// is not a multi-part message, the content is stored
- /// in a string available by calling getContent().
-
- void read(std::istream& istr);
- /// Reads the MailMessage from the given input stream.
- ///
- /// The raw message (including all MIME parts) is stored
- /// in a string and available by calling getContent().
-
- void write(std::ostream& ostr) const;
- /// Writes the mail message to the given output stream.
-
- static std::string encodeWord(const std::string& text, const std::string& charset = "UTF-8");
- /// If the given string contains non-ASCII characters,
- /// encodes the given string using RFC 2047 "Q" word encoding.
- ///
- /// The given text must already be encoded in the character set
- /// given in charset (default is UTF-8).
- ///
- /// Returns the encoded string, or the original string if it
- /// consists only of ASCII characters.
-
- static const std::string HEADER_SUBJECT;
- static const std::string HEADER_FROM;
- static const std::string HEADER_TO;
- static const std::string HEADER_CC;
- static const std::string HEADER_BCC;
- static const std::string HEADER_DATE;
- static const std::string HEADER_CONTENT_TYPE;
- static const std::string HEADER_CONTENT_TRANSFER_ENCODING;
- static const std::string HEADER_CONTENT_DISPOSITION;
- static const std::string HEADER_CONTENT_ID;
- static const std::string HEADER_MIME_VERSION;
- static const std::string EMPTY_HEADER;
- static const std::string TEXT_PLAIN;
- static const std::string CTE_7BIT;
- static const std::string CTE_8BIT;
- static const std::string CTE_QUOTED_PRINTABLE;
- static const std::string CTE_BASE64;
-
-protected:
- void makeMultipart();
- void writeHeader(const MessageHeader& header, std::ostream& ostr) const;
- void writeMultipart(MessageHeader& header, std::ostream& ostr) const;
- void writePart(MultipartWriter& writer, const Part& part) const;
- void writeEncoded(std::istream& istr, std::ostream& ostr, ContentTransferEncoding encoding) const;
- void setRecipientHeaders(MessageHeader& headers) const;
- void readHeader(std::istream& istr);
- void readMultipart(std::istream& istr, PartHandler& handler);
- void readPart(std::istream& istr, const MessageHeader& header, PartHandler& handler);
- void handlePart(std::istream& istr, const MessageHeader& header, PartHandler& handler);
- static const std::string& contentTransferEncodingToString(ContentTransferEncoding encoding);
- static int lineLength(const std::string& str);
- static void appendRecipient(const MailRecipient& recipient, std::string& str);
-
-private:
- MailMessage(const MailMessage&);
- MailMessage& operator = (const MailMessage&);
-
- Recipients _recipients;
- PartVec _parts;
- std::string _content;
- ContentTransferEncoding _encoding;
- mutable std::string _boundary;
- PartStoreFactory* _pStoreFactory;
-};
-
-
-//
-// inlines
-//
-inline const MailMessage::Recipients& MailMessage::recipients() const
-{
- return _recipients;
-}
-
-
-inline const std::string& MailMessage::getContent() const
-{
- return _content;
-}
-
-
-inline const MailMessage::PartVec& MailMessage::parts() const
-{
- return _parts;
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_MailMessage_INCLUDED
+//
+// MailMessage.h
+//
+// Library: Net
+// Package: Mail
+// Module: MailMessage
+//
+// Definition of the MailMessage class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_MailMessage_INCLUDED
+#define Net_MailMessage_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/MessageHeader.h"
+#include "Poco/Net/MailRecipient.h"
+#include "Poco/Net/PartStore.h"
+#include "Poco/Timestamp.h"
+#include <vector>
+
+
+namespace Poco {
+namespace Net {
+
+
+class MediaType;
+class PartSource;
+class PartHandler;
+class MultipartWriter;
+
+
+class Net_API MailMessage: public MessageHeader
+ /// This class represents an e-mail message for
+ /// use with the SMTPClientSession and POPClientSession
+ /// classes.
+ ///
+ /// MailMessage supports both old-style plain text messages,
+ /// as well as MIME multipart mail messages with attachments.
+ ///
+ /// For multi-part messages, the following content transfer
+ /// encodings are supported: 7bit, 8bit, quoted-printable
+ /// and base64.
+{
+public:
+ typedef std::vector<MailRecipient> Recipients;
+
+ enum ContentDisposition
+ {
+ CONTENT_INLINE,
+ CONTENT_ATTACHMENT
+ };
+
+ enum ContentTransferEncoding
+ {
+ ENCODING_7BIT,
+ ENCODING_8BIT,
+ ENCODING_QUOTED_PRINTABLE,
+ ENCODING_BASE64
+ };
+
+ struct Part
+ {
+ std::string name;
+ PartSource* pSource;
+ ContentDisposition disposition;
+ ContentTransferEncoding encoding;
+ };
+
+ typedef std::vector<Part> PartVec;
+
+ MailMessage(PartStoreFactory* pStoreFactory = 0);
+ /// Creates an empty MailMessage.
+ ///
+ /// If pStoreFactory is not null, message attachments will be
+ /// handled by the object created by the factory. Most
+ /// common reason is to temporarily save attachments to
+ /// the file system in order to avoid potential memory
+ /// exhaustion when attachment files are very large.
+
+ virtual ~MailMessage();
+ /// Destroys the MailMessage.
+
+ void addRecipient(const MailRecipient& recipient);
+ /// Adds a recipient for the message.
+
+ void setRecipients(const Recipients& recipient);
+ /// Clears existing and sets new recipient list for the message.
+
+ const Recipients& recipients() const;
+ /// Returns the recipients of the message.
+
+ void setSubject(const std::string& subject);
+ /// Sets the subject of the message.
+ ///
+ /// The subject must not contain any non-ASCII
+ /// characters. To include non-ASCII characters
+ /// in the subject, use RFC 2047 word encoding
+ /// (see encodeWord()).
+
+ const std::string& getSubject() const;
+ /// Returns the subject of the message.
+
+ void setSender(const std::string& sender);
+ /// Sets the sender of the message (which
+ /// ends up in the From header field).
+ ///
+ /// The sender must either be a valid email
+ /// address, or a real name followed by
+ /// an email address enclosed in < and >.
+ ///
+ /// The sender must not contain any non-ASCII
+ /// characters. To include non-ASCII characters
+ /// in the sender, use RFC 2047 word encoding
+ /// (see encodeWord()).
+
+ const std::string& getSender() const;
+ /// Returns the sender of the message (taken
+ /// from the From header field).
+
+ void setContent(const std::string& content, ContentTransferEncoding encoding = ENCODING_QUOTED_PRINTABLE);
+ /// Sets the content of the mail message.
+ ///
+ /// If the content transfer encoding is ENCODING_7BIT or
+ /// ENCODING_8BIT, the content string must be formatted
+ /// according to the rules of an internet email message.
+ ///
+ /// The message will be sent as a single-part
+ /// message.
+ ///
+ /// Note that single CR or LF characters as line delimiters must
+ /// not be used. Content lines always should be terminated with a
+ /// proper CRLF sequence.
+
+ const std::string& getContent() const;
+ /// Returns the content of the mail message.
+ ///
+ /// A content will only be returned for single-part
+ /// messages. The content of multi-part mail messages
+ /// will be reported through the registered PartHandler.
+
+ void setContentType(const std::string& mediaType);
+ /// Sets the content type for the message.
+
+ void setContentType(const MediaType& mediaType);
+ /// Sets the content type for the message.
+
+ const std::string& getContentType() const;
+ /// Returns the content type for the message.
+
+ void setDate(const Poco::Timestamp& dateTime);
+ /// Sets the Date header to the given date/time value.
+
+ Poco::Timestamp getDate() const;
+ /// Returns the value of the Date header.
+
+ bool isMultipart() const;
+ /// Returns true iff the message is a multipart message.
+
+ void addPart(const std::string& name,
+ PartSource* pSource,
+ ContentDisposition disposition,
+ ContentTransferEncoding encoding);
+ /// Adds a part/attachment to the mail message.
+ ///
+ /// The MailMessage takes ownership of the PartSource and deletes it
+ /// when it is no longer needed.
+ ///
+ /// The MailMessage will be converted to a multipart message
+ /// if it is not already one.
+ ///
+ /// The part name, and the filename specified in the part source
+ /// must not contain any non-ASCII characters.
+ /// To include non-ASCII characters in the part name or filename,
+ /// use RFC 2047 word encoding (see encodeWord()).
+
+ void addContent(PartSource* pSource,
+ ContentTransferEncoding encoding = ENCODING_QUOTED_PRINTABLE);
+ /// Adds a part to the mail message by calling
+ /// addPart("", pSource, CONTENT_INLINE, encoding);
+ ///
+ /// The part name, and the filename specified in the part source
+ /// must not contain any non-ASCII characters.
+ /// To include non-ASCII characters in the part name or filename,
+ /// use RFC 2047 word encoding (see encodeWord()).
+
+ void addAttachment(const std::string& name,
+ PartSource* pSource,
+ ContentTransferEncoding encoding = ENCODING_BASE64);
+ /// Adds an attachment to the mail message by calling
+ /// addPart(name, pSource, CONTENT_ATTACHMENT, encoding);
+ ///
+ /// The part name, and the filename specified in the part source
+ /// must not contain any non-ASCII characters.
+ /// To include non-ASCII characters in the part name or filename,
+ /// use RFC 2047 word encoding (see encodeWord()).
+
+ PartSource* createPartStore(const std::string& content,
+ const std::string& mediaType,
+ const std::string& filename = "");
+ /// Returns either default StringPartSource part store or,
+ /// if the part store factory was provided during construction,
+ /// the one created by PartStoreFactory.
+ /// Returned part store is allocated on the heap; it is caller's
+ /// responsibility to delete it after use. Typical use is handler
+ /// passing it back to MailMessage, which takes care of the cleanup.
+
+ const PartVec& parts() const;
+ /// Returns const reference to the vector containing part stores.
+
+ void read(std::istream& istr, PartHandler& handler);
+ /// Reads the MailMessage from the given input stream.
+ ///
+ /// If the message has multiple parts, the parts
+ /// are reported to the PartHandler. If the message
+ /// is not a multi-part message, the content is stored
+ /// in a string available by calling getContent().
+
+ void read(std::istream& istr);
+ /// Reads the MailMessage from the given input stream.
+ ///
+ /// The raw message (including all MIME parts) is stored
+ /// in a string and available by calling getContent().
+
+ void write(std::ostream& ostr) const;
+ /// Writes the mail message to the given output stream.
+
+ static std::string encodeWord(const std::string& text, const std::string& charset = "UTF-8");
+ /// If the given string contains non-ASCII characters,
+ /// encodes the given string using RFC 2047 "Q" word encoding.
+ ///
+ /// The given text must already be encoded in the character set
+ /// given in charset (default is UTF-8).
+ ///
+ /// Returns the encoded string, or the original string if it
+ /// consists only of ASCII characters.
+
+ static const std::string HEADER_SUBJECT;
+ static const std::string HEADER_FROM;
+ static const std::string HEADER_TO;
+ static const std::string HEADER_CC;
+ static const std::string HEADER_BCC;
+ static const std::string HEADER_DATE;
+ static const std::string HEADER_CONTENT_TYPE;
+ static const std::string HEADER_CONTENT_TRANSFER_ENCODING;
+ static const std::string HEADER_CONTENT_DISPOSITION;
+ static const std::string HEADER_CONTENT_ID;
+ static const std::string HEADER_MIME_VERSION;
+ static const std::string EMPTY_HEADER;
+ static const std::string TEXT_PLAIN;
+ static const std::string CTE_7BIT;
+ static const std::string CTE_8BIT;
+ static const std::string CTE_QUOTED_PRINTABLE;
+ static const std::string CTE_BASE64;
+
+protected:
+ void makeMultipart();
+ void writeHeader(const MessageHeader& header, std::ostream& ostr) const;
+ void writeMultipart(MessageHeader& header, std::ostream& ostr) const;
+ void writePart(MultipartWriter& writer, const Part& part) const;
+ void writeEncoded(std::istream& istr, std::ostream& ostr, ContentTransferEncoding encoding) const;
+ void setRecipientHeaders(MessageHeader& headers) const;
+ void readHeader(std::istream& istr);
+ void readMultipart(std::istream& istr, PartHandler& handler);
+ void readPart(std::istream& istr, const MessageHeader& header, PartHandler& handler);
+ void handlePart(std::istream& istr, const MessageHeader& header, PartHandler& handler);
+ static const std::string& contentTransferEncodingToString(ContentTransferEncoding encoding);
+ static int lineLength(const std::string& str);
+ static void appendRecipient(const MailRecipient& recipient, std::string& str);
+
+private:
+ MailMessage(const MailMessage&);
+ MailMessage& operator = (const MailMessage&);
+
+ Recipients _recipients;
+ PartVec _parts;
+ std::string _content;
+ ContentTransferEncoding _encoding;
+ mutable std::string _boundary;
+ PartStoreFactory* _pStoreFactory;
+};
+
+
+//
+// inlines
+//
+inline const MailMessage::Recipients& MailMessage::recipients() const
+{
+ return _recipients;
+}
+
+
+inline const std::string& MailMessage::getContent() const
+{
+ return _content;
+}
+
+
+inline const MailMessage::PartVec& MailMessage::parts() const
+{
+ return _parts;
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_MailMessage_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/MailRecipient.h b/contrib/libs/poco/Net/include/Poco/Net/MailRecipient.h
index da2faedc0c..7b146141af 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/MailRecipient.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/MailRecipient.h
@@ -1,120 +1,120 @@
-//
-// MailRecipient.h
-//
-// Library: Net
-// Package: Mail
-// Module: MailRecipient
-//
-// Definition of the MailRecipient class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_MailRecipient_INCLUDED
-#define Net_MailRecipient_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API MailRecipient
- /// The recipient of an e-mail message.
- ///
- /// A recipient has a type (primary recipient,
- /// carbon-copy recipient, blind-carbon-copy
- /// recipient), an e-mail address and an optional
- /// real name.
-{
-public:
- enum RecipientType
- {
- PRIMARY_RECIPIENT,
- CC_RECIPIENT,
- BCC_RECIPIENT
- };
-
- MailRecipient();
- /// Creates an empty MailRecipient.
-
- MailRecipient(const MailRecipient& recipient);
- /// Creates a MailRecipient by copying another one.
-
- MailRecipient(RecipientType type, const std::string& address);
- /// Creates a MailRecipient of the given type.
-
- MailRecipient(RecipientType type, const std::string& address, const std::string& realName);
- /// Creates a MailRecipient of the given type.
-
- ~MailRecipient();
- /// Destroys the MailRecipient.
-
- MailRecipient& operator = (const MailRecipient& recipient);
- /// Assigns another recipient.
-
- void swap(MailRecipient& recipient);
- /// Exchanges the content of two recipients.
-
- RecipientType getType() const;
- /// Returns the type of the recipient.
-
- void setType(RecipientType type);
- /// Sets the type of the recipient.
-
- const std::string& getAddress() const;
- /// Returns the address of the recipient.
-
- void setAddress(const std::string& address);
- /// Sets the address of the recipient.
-
- const std::string& getRealName() const;
- /// Returns the real name of the recipient.
-
- void setRealName(const std::string& realName);
- /// Sets the real name of the recipient.
-
-private:
- std::string _address;
- std::string _realName;
- RecipientType _type;
-};
-
-
-//
-// inlines
-//
-inline MailRecipient::RecipientType MailRecipient::getType() const
-{
- return _type;
-}
-
-
-inline const std::string& MailRecipient::getAddress() const
-{
- return _address;
-}
-
-
-inline const std::string& MailRecipient::getRealName() const
-{
- return _realName;
-}
-
-
-inline void swap(MailRecipient& r1, MailRecipient& r2)
-{
- r1.swap(r2);
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_MailRecipient_INCLUDED
+//
+// MailRecipient.h
+//
+// Library: Net
+// Package: Mail
+// Module: MailRecipient
+//
+// Definition of the MailRecipient class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_MailRecipient_INCLUDED
+#define Net_MailRecipient_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API MailRecipient
+ /// The recipient of an e-mail message.
+ ///
+ /// A recipient has a type (primary recipient,
+ /// carbon-copy recipient, blind-carbon-copy
+ /// recipient), an e-mail address and an optional
+ /// real name.
+{
+public:
+ enum RecipientType
+ {
+ PRIMARY_RECIPIENT,
+ CC_RECIPIENT,
+ BCC_RECIPIENT
+ };
+
+ MailRecipient();
+ /// Creates an empty MailRecipient.
+
+ MailRecipient(const MailRecipient& recipient);
+ /// Creates a MailRecipient by copying another one.
+
+ MailRecipient(RecipientType type, const std::string& address);
+ /// Creates a MailRecipient of the given type.
+
+ MailRecipient(RecipientType type, const std::string& address, const std::string& realName);
+ /// Creates a MailRecipient of the given type.
+
+ ~MailRecipient();
+ /// Destroys the MailRecipient.
+
+ MailRecipient& operator = (const MailRecipient& recipient);
+ /// Assigns another recipient.
+
+ void swap(MailRecipient& recipient);
+ /// Exchanges the content of two recipients.
+
+ RecipientType getType() const;
+ /// Returns the type of the recipient.
+
+ void setType(RecipientType type);
+ /// Sets the type of the recipient.
+
+ const std::string& getAddress() const;
+ /// Returns the address of the recipient.
+
+ void setAddress(const std::string& address);
+ /// Sets the address of the recipient.
+
+ const std::string& getRealName() const;
+ /// Returns the real name of the recipient.
+
+ void setRealName(const std::string& realName);
+ /// Sets the real name of the recipient.
+
+private:
+ std::string _address;
+ std::string _realName;
+ RecipientType _type;
+};
+
+
+//
+// inlines
+//
+inline MailRecipient::RecipientType MailRecipient::getType() const
+{
+ return _type;
+}
+
+
+inline const std::string& MailRecipient::getAddress() const
+{
+ return _address;
+}
+
+
+inline const std::string& MailRecipient::getRealName() const
+{
+ return _realName;
+}
+
+
+inline void swap(MailRecipient& r1, MailRecipient& r2)
+{
+ r1.swap(r2);
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_MailRecipient_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/MailStream.h b/contrib/libs/poco/Net/include/Poco/Net/MailStream.h
index e9e7a7e65d..bc674b014d 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/MailStream.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/MailStream.h
@@ -1,146 +1,146 @@
-//
-// MailStream.h
-//
-// Library: Net
-// Package: Mail
-// Module: MailStream
-//
-// Definition of the MailStream class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_MailStream_INCLUDED
-#define Net_MailStream_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/UnbufferedStreamBuf.h"
-#include <istream>
-#include <ostream>
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API MailStreamBuf: public Poco::UnbufferedStreamBuf
- /// The sole purpose of this stream buffer is to replace
- /// a "\r\n.\r\n" character sequence with a "\r\n..\r\n" sequence for
- /// output streams and vice-versa for input streams.
- ///
- /// This is used when sending mail messages to SMTP servers, or
- /// receiving mail messages from POP servers.
- ///
- /// See RFC 2181 (Simple Mail Transfer Protocol) and RFC 1939
- /// (Post Office Protocol - Version 3) for more information.
-{
-public:
- MailStreamBuf(std::istream& istr);
- /// Creates the MailStreamBuf and connects it
- /// to the given input stream.
-
- MailStreamBuf(std::ostream& ostr);
- /// Creates the MailStreamBuf and connects it
- /// to the given output stream.
-
- ~MailStreamBuf();
- /// Destroys the MailStreamBuf.
-
- void close();
- /// Writes the terminating period, followed by
- /// CR-LF.
-
-protected:
- int readFromDevice();
- int writeToDevice(char c);
- int readOne();
-
-private:
- enum State
- {
- ST_DATA,
- ST_CR,
- ST_CR_LF,
- ST_CR_LF_DOT,
- ST_CR_LF_DOT_DOT,
- ST_CR_LF_DOT_CR,
- ST_CR_LF_DOT_CR_LF
- };
-
- std::istream* _pIstr;
- std::ostream* _pOstr;
- std::string _buffer;
- State _state;
-};
-
-
-class Net_API MailIOS: public virtual std::ios
- /// The base class for MailInputStream and MailOutputStream.
- ///
- /// This class provides common methods and is also needed to ensure
- /// the correct initialization order of the stream buffer and base classes.
-{
-public:
- MailIOS(std::istream& istr);
- /// Creates the MailIOS and connects it
- /// to the given input stream.
-
- MailIOS(std::ostream& ostr);
- /// Creates the MailIOS and connects it
- /// to the given output stream.
-
- ~MailIOS();
- /// Destroys the stream.
-
- void close();
- /// Writes the terminating period, followed by
- /// CR-LF.
-
- MailStreamBuf* rdbuf();
- /// Returns a pointer to the underlying streambuf.
-
-protected:
- MailStreamBuf _buf;
-};
-
-
-class Net_API MailInputStream: public MailIOS, public std::istream
- /// This class is used for reading E-Mail messages from a
- /// POP3 server. All occurrences of "\r\n..\r\n" are replaced with
- /// "\r\n.\r\n". The first occurrence of "\r\n.\r\n" denotes the end
- /// of the stream.
-{
-public:
- MailInputStream(std::istream& istr);
- /// Creates the MailInputStream and connects it
- /// to the given input stream.
-
- ~MailInputStream();
- /// Destroys the MailInputStream.
-};
-
-
-class Net_API MailOutputStream: public MailIOS, public std::ostream
- /// This class is used for writing E-Mail messages to a
- /// SMTP server. All occurrences of "\r\n.\r\n" are replaced with
- /// "\r\n..\r\n".
-{
-public:
- MailOutputStream(std::ostream& ostr);
- /// Creates the MailOutputStream and connects it
- /// to the given input stream.
-
- ~MailOutputStream();
- /// Destroys the MailOutputStream.
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_MailStream_INCLUDED
+//
+// MailStream.h
+//
+// Library: Net
+// Package: Mail
+// Module: MailStream
+//
+// Definition of the MailStream class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_MailStream_INCLUDED
+#define Net_MailStream_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/UnbufferedStreamBuf.h"
+#include <istream>
+#include <ostream>
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API MailStreamBuf: public Poco::UnbufferedStreamBuf
+ /// The sole purpose of this stream buffer is to replace
+ /// a "\r\n.\r\n" character sequence with a "\r\n..\r\n" sequence for
+ /// output streams and vice-versa for input streams.
+ ///
+ /// This is used when sending mail messages to SMTP servers, or
+ /// receiving mail messages from POP servers.
+ ///
+ /// See RFC 2181 (Simple Mail Transfer Protocol) and RFC 1939
+ /// (Post Office Protocol - Version 3) for more information.
+{
+public:
+ MailStreamBuf(std::istream& istr);
+ /// Creates the MailStreamBuf and connects it
+ /// to the given input stream.
+
+ MailStreamBuf(std::ostream& ostr);
+ /// Creates the MailStreamBuf and connects it
+ /// to the given output stream.
+
+ ~MailStreamBuf();
+ /// Destroys the MailStreamBuf.
+
+ void close();
+ /// Writes the terminating period, followed by
+ /// CR-LF.
+
+protected:
+ int readFromDevice();
+ int writeToDevice(char c);
+ int readOne();
+
+private:
+ enum State
+ {
+ ST_DATA,
+ ST_CR,
+ ST_CR_LF,
+ ST_CR_LF_DOT,
+ ST_CR_LF_DOT_DOT,
+ ST_CR_LF_DOT_CR,
+ ST_CR_LF_DOT_CR_LF
+ };
+
+ std::istream* _pIstr;
+ std::ostream* _pOstr;
+ std::string _buffer;
+ State _state;
+};
+
+
+class Net_API MailIOS: public virtual std::ios
+ /// The base class for MailInputStream and MailOutputStream.
+ ///
+ /// This class provides common methods and is also needed to ensure
+ /// the correct initialization order of the stream buffer and base classes.
+{
+public:
+ MailIOS(std::istream& istr);
+ /// Creates the MailIOS and connects it
+ /// to the given input stream.
+
+ MailIOS(std::ostream& ostr);
+ /// Creates the MailIOS and connects it
+ /// to the given output stream.
+
+ ~MailIOS();
+ /// Destroys the stream.
+
+ void close();
+ /// Writes the terminating period, followed by
+ /// CR-LF.
+
+ MailStreamBuf* rdbuf();
+ /// Returns a pointer to the underlying streambuf.
+
+protected:
+ MailStreamBuf _buf;
+};
+
+
+class Net_API MailInputStream: public MailIOS, public std::istream
+ /// This class is used for reading E-Mail messages from a
+ /// POP3 server. All occurrences of "\r\n..\r\n" are replaced with
+ /// "\r\n.\r\n". The first occurrence of "\r\n.\r\n" denotes the end
+ /// of the stream.
+{
+public:
+ MailInputStream(std::istream& istr);
+ /// Creates the MailInputStream and connects it
+ /// to the given input stream.
+
+ ~MailInputStream();
+ /// Destroys the MailInputStream.
+};
+
+
+class Net_API MailOutputStream: public MailIOS, public std::ostream
+ /// This class is used for writing E-Mail messages to a
+ /// SMTP server. All occurrences of "\r\n.\r\n" are replaced with
+ /// "\r\n..\r\n".
+{
+public:
+ MailOutputStream(std::ostream& ostr);
+ /// Creates the MailOutputStream and connects it
+ /// to the given input stream.
+
+ ~MailOutputStream();
+ /// Destroys the MailOutputStream.
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_MailStream_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/MediaType.h b/contrib/libs/poco/Net/include/Poco/Net/MediaType.h
index a99cc03bb8..8440cb6245 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/MediaType.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/MediaType.h
@@ -1,169 +1,169 @@
-//
-// MediaType.h
-//
-// Library: Net
-// Package: Messages
-// Module: MediaType
-//
-// Definition of the MediaType class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_MediaType_INCLUDED
-#define Net_MediaType_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/NameValueCollection.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API MediaType
- /// This class represents a MIME media type, consisting of
- /// a top-level type, a subtype and an optional set of
- /// parameters.
- ///
- /// The implementation conforms with RFC 2045 and RFC 2046.
-{
-public:
- MediaType(const std::string& mediaType);
- /// Creates the MediaType from the given string, which
- /// must have the format <type>/<subtype>{;<parameter>=<value>}.
-
- MediaType(const std::string& type, const std::string& subType);
- /// Creates the MediaType, using the given type and subtype.
-
- MediaType(const MediaType& mediaType);
- /// Creates a MediaType from another one.
-
- ~MediaType();
- /// Destroys the MediaType.
-
- MediaType& operator = (const MediaType& mediaType);
- /// Assigns another media type.
-
- MediaType& operator = (const std::string& mediaType);
- /// Assigns another media type.
-
- void swap(MediaType& mediaType);
- /// Swaps the MediaType with another one.
-
- void setType(const std::string& type);
- /// Sets the top-level type.
-
- const std::string& getType() const;
- /// Returns the top-level type.
-
- void setSubType(const std::string& subType);
- /// Sets the sub type.
-
- const std::string& getSubType() const;
- /// Returns the sub type.
-
- void setParameter(const std::string& name, const std::string& value);
- /// Sets the parameter with the given name.
-
- const std::string& getParameter(const std::string& name) const;
- /// Returns the parameter with the given name.
- ///
- /// Throws a NotFoundException if the parameter does not exist.
-
- bool hasParameter(const std::string& name) const;
- /// Returns true iff a parameter with the given name exists.
-
- void removeParameter(const std::string& name);
- /// Removes the parameter with the given name.
-
- const NameValueCollection& parameters() const;
- /// Returns the parameters.
-
- std::string toString() const;
- /// Returns the string representation of the media type
- /// which is <type>/<subtype>{;<parameter>=<value>}
-
- bool matches(const MediaType& mediaType) const;
- /// Returns true iff the type and subtype match
- /// the type and subtype of the given media type.
- /// Matching is case insensitive.
-
- bool matches(const std::string& type, const std::string& subType) const;
- /// Returns true iff the type and subtype match
- /// the given type and subtype.
- /// Matching is case insensitive.
-
- bool matches(const std::string& type) const;
- /// Returns true iff the type matches the given type.
- /// Matching is case insensitive.
-
- bool matchesRange(const MediaType& mediaType) const;
- /// Returns true if the type and subtype match
- /// the type and subtype of the given media type.
- /// If the MIME type is a range of types it matches
- /// any media type within the range (e.g. "image/*" matches
- /// any image media type, "*/*" matches anything).
- /// Matching is case insensitive.
-
- bool matchesRange(const std::string& type, const std::string& subType) const;
- /// Returns true if the type and subtype match
- /// the given type and subtype.
- /// If the MIME type is a range of types it matches
- /// any media type within the range (e.g. "image/*" matches
- /// any image media type, "*/*" matches anything).
- /// Matching is case insensitive.
-
- bool matchesRange(const std::string& type) const;
- /// Returns true if the type matches the given type or
- /// the type is a range of types denoted by "*".
- /// Matching is case insensitive.
-
-protected:
- void parse(const std::string& mediaType);
-
-private:
- MediaType();
-
- std::string _type;
- std::string _subType;
- NameValueCollection _parameters;
-};
-
-
-//
-// inlines
-//
-inline const std::string& MediaType::getType() const
-{
- return _type;
-}
-
-
-inline const std::string& MediaType::getSubType() const
-{
- return _subType;
-}
-
-
-inline const NameValueCollection& MediaType::parameters() const
-{
- return _parameters;
-}
-
-
-inline void swap(MediaType& m1, MediaType& m2)
-{
- m1.swap(m2);
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_MediaType_INCLUDED
+//
+// MediaType.h
+//
+// Library: Net
+// Package: Messages
+// Module: MediaType
+//
+// Definition of the MediaType class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_MediaType_INCLUDED
+#define Net_MediaType_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/NameValueCollection.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API MediaType
+ /// This class represents a MIME media type, consisting of
+ /// a top-level type, a subtype and an optional set of
+ /// parameters.
+ ///
+ /// The implementation conforms with RFC 2045 and RFC 2046.
+{
+public:
+ MediaType(const std::string& mediaType);
+ /// Creates the MediaType from the given string, which
+ /// must have the format <type>/<subtype>{;<parameter>=<value>}.
+
+ MediaType(const std::string& type, const std::string& subType);
+ /// Creates the MediaType, using the given type and subtype.
+
+ MediaType(const MediaType& mediaType);
+ /// Creates a MediaType from another one.
+
+ ~MediaType();
+ /// Destroys the MediaType.
+
+ MediaType& operator = (const MediaType& mediaType);
+ /// Assigns another media type.
+
+ MediaType& operator = (const std::string& mediaType);
+ /// Assigns another media type.
+
+ void swap(MediaType& mediaType);
+ /// Swaps the MediaType with another one.
+
+ void setType(const std::string& type);
+ /// Sets the top-level type.
+
+ const std::string& getType() const;
+ /// Returns the top-level type.
+
+ void setSubType(const std::string& subType);
+ /// Sets the sub type.
+
+ const std::string& getSubType() const;
+ /// Returns the sub type.
+
+ void setParameter(const std::string& name, const std::string& value);
+ /// Sets the parameter with the given name.
+
+ const std::string& getParameter(const std::string& name) const;
+ /// Returns the parameter with the given name.
+ ///
+ /// Throws a NotFoundException if the parameter does not exist.
+
+ bool hasParameter(const std::string& name) const;
+ /// Returns true iff a parameter with the given name exists.
+
+ void removeParameter(const std::string& name);
+ /// Removes the parameter with the given name.
+
+ const NameValueCollection& parameters() const;
+ /// Returns the parameters.
+
+ std::string toString() const;
+ /// Returns the string representation of the media type
+ /// which is <type>/<subtype>{;<parameter>=<value>}
+
+ bool matches(const MediaType& mediaType) const;
+ /// Returns true iff the type and subtype match
+ /// the type and subtype of the given media type.
+ /// Matching is case insensitive.
+
+ bool matches(const std::string& type, const std::string& subType) const;
+ /// Returns true iff the type and subtype match
+ /// the given type and subtype.
+ /// Matching is case insensitive.
+
+ bool matches(const std::string& type) const;
+ /// Returns true iff the type matches the given type.
+ /// Matching is case insensitive.
+
+ bool matchesRange(const MediaType& mediaType) const;
+ /// Returns true if the type and subtype match
+ /// the type and subtype of the given media type.
+ /// If the MIME type is a range of types it matches
+ /// any media type within the range (e.g. "image/*" matches
+ /// any image media type, "*/*" matches anything).
+ /// Matching is case insensitive.
+
+ bool matchesRange(const std::string& type, const std::string& subType) const;
+ /// Returns true if the type and subtype match
+ /// the given type and subtype.
+ /// If the MIME type is a range of types it matches
+ /// any media type within the range (e.g. "image/*" matches
+ /// any image media type, "*/*" matches anything).
+ /// Matching is case insensitive.
+
+ bool matchesRange(const std::string& type) const;
+ /// Returns true if the type matches the given type or
+ /// the type is a range of types denoted by "*".
+ /// Matching is case insensitive.
+
+protected:
+ void parse(const std::string& mediaType);
+
+private:
+ MediaType();
+
+ std::string _type;
+ std::string _subType;
+ NameValueCollection _parameters;
+};
+
+
+//
+// inlines
+//
+inline const std::string& MediaType::getType() const
+{
+ return _type;
+}
+
+
+inline const std::string& MediaType::getSubType() const
+{
+ return _subType;
+}
+
+
+inline const NameValueCollection& MediaType::parameters() const
+{
+ return _parameters;
+}
+
+
+inline void swap(MediaType& m1, MediaType& m2)
+{
+ m1.swap(m2);
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_MediaType_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/MessageHeader.h b/contrib/libs/poco/Net/include/Poco/Net/MessageHeader.h
index 72221b7618..9b05ccb279 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/MessageHeader.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/MessageHeader.h
@@ -1,169 +1,169 @@
-//
-// MessageHeader.h
-//
-// Library: Net
-// Package: Messages
-// Module: MessageHeader
-//
-// Definition of the MessageHeader class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_MessageHeader_INCLUDED
-#define Net_MessageHeader_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/NameValueCollection.h"
-#include <ostream>
-#include <istream>
-#include <vector>
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API MessageHeader: public NameValueCollection
- /// A collection of name-value pairs that are used in
- /// various internet protocols like HTTP and SMTP.
- ///
- /// The name is case-insensitive.
- ///
- /// There can be more than one name-value pair with the
- /// same name.
- ///
- /// MessageHeader supports writing and reading the
- /// header data in RFC 2822 format.
- ///
- /// The maximum number of fields can be restricted
- /// by calling setFieldLimit(). This is useful to
- /// defend against certain kinds of denial-of-service
- /// attacks. The limit is only enforced when parsing
- /// header fields from a stream, not when programmatically
- /// adding them. The default limit is 100.
-{
-public:
- MessageHeader();
- /// Creates the MessageHeader.
-
- MessageHeader(const MessageHeader& messageHeader);
- /// Creates the MessageHeader by copying
- /// another one.
-
- virtual ~MessageHeader();
- /// Destroys the MessageHeader.
-
- MessageHeader& operator = (const MessageHeader& messageHeader);
- /// Assigns the content of another MessageHeader.
-
- virtual void write(std::ostream& ostr) const;
- /// Writes the message header to the given output stream.
- ///
- /// The format is one name-value pair per line, with
- /// name and value separated by a colon and lines
- /// delimited by a carriage return and a linefeed
- /// character. See RFC 2822 for details.
-
- virtual void read(std::istream& istr);
- /// Reads the message header from the given input stream.
- ///
- /// See write() for the expected format.
- /// Also supported is folding of field content, according
- /// to section 2.2.3 of RFC 2822.
- ///
- /// Reading stops at the first empty line (a line only
- /// containing \r\n or \n), as well as at the end of
- /// the stream.
- ///
- /// Some basic sanity checking of the input stream is
- /// performed.
- ///
- /// Throws a MessageException if the input stream is
- /// malformed.
-
- int getFieldLimit() const;
- /// Returns the maximum number of header fields
- /// allowed.
- ///
- /// See setFieldLimit() for more information.
-
- void setFieldLimit(int limit);
- /// Sets the maximum number of header fields
- /// allowed. This limit is used to defend certain
- /// kinds of denial-of-service attacks.
- /// Specify 0 for unlimited (not recommended).
- ///
- /// The default limit is 100.
-
- bool hasToken(const std::string& fieldName, const std::string& token) const;
- /// Returns true iff the field with the given fieldName contains
- /// the given token. Tokens in a header field are expected to be
- /// comma-separated and are case insensitive.
-
- static void splitElements(const std::string& s, std::vector<std::string>& elements, bool ignoreEmpty = true);
- /// Splits the given string into separate elements. Elements are expected
- /// to be separated by commas.
- ///
- /// For example, the string
- /// text/plain; q=0.5, text/html, text/x-dvi; q=0.8
- /// is split into the elements
- /// text/plain; q=0.5
- /// text/html
- /// text/x-dvi; q=0.8
- ///
- /// Commas enclosed in double quotes do not split elements.
- ///
- /// If ignoreEmpty is true, empty elements are not returned.
-
- static void splitParameters(const std::string& s, std::string& value, NameValueCollection& parameters);
- /// Splits the given string into a value and a collection of parameters.
- /// Parameters are expected to be separated by semicolons.
- ///
- /// Enclosing quotes of parameter values are removed.
- ///
+//
+// MessageHeader.h
+//
+// Library: Net
+// Package: Messages
+// Module: MessageHeader
+//
+// Definition of the MessageHeader class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_MessageHeader_INCLUDED
+#define Net_MessageHeader_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/NameValueCollection.h"
+#include <ostream>
+#include <istream>
+#include <vector>
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API MessageHeader: public NameValueCollection
+ /// A collection of name-value pairs that are used in
+ /// various internet protocols like HTTP and SMTP.
+ ///
+ /// The name is case-insensitive.
+ ///
+ /// There can be more than one name-value pair with the
+ /// same name.
+ ///
+ /// MessageHeader supports writing and reading the
+ /// header data in RFC 2822 format.
+ ///
+ /// The maximum number of fields can be restricted
+ /// by calling setFieldLimit(). This is useful to
+ /// defend against certain kinds of denial-of-service
+ /// attacks. The limit is only enforced when parsing
+ /// header fields from a stream, not when programmatically
+ /// adding them. The default limit is 100.
+{
+public:
+ MessageHeader();
+ /// Creates the MessageHeader.
+
+ MessageHeader(const MessageHeader& messageHeader);
+ /// Creates the MessageHeader by copying
+ /// another one.
+
+ virtual ~MessageHeader();
+ /// Destroys the MessageHeader.
+
+ MessageHeader& operator = (const MessageHeader& messageHeader);
+ /// Assigns the content of another MessageHeader.
+
+ virtual void write(std::ostream& ostr) const;
+ /// Writes the message header to the given output stream.
+ ///
+ /// The format is one name-value pair per line, with
+ /// name and value separated by a colon and lines
+ /// delimited by a carriage return and a linefeed
+ /// character. See RFC 2822 for details.
+
+ virtual void read(std::istream& istr);
+ /// Reads the message header from the given input stream.
+ ///
+ /// See write() for the expected format.
+ /// Also supported is folding of field content, according
+ /// to section 2.2.3 of RFC 2822.
+ ///
+ /// Reading stops at the first empty line (a line only
+ /// containing \r\n or \n), as well as at the end of
+ /// the stream.
+ ///
+ /// Some basic sanity checking of the input stream is
+ /// performed.
+ ///
+ /// Throws a MessageException if the input stream is
+ /// malformed.
+
+ int getFieldLimit() const;
+ /// Returns the maximum number of header fields
+ /// allowed.
+ ///
+ /// See setFieldLimit() for more information.
+
+ void setFieldLimit(int limit);
+ /// Sets the maximum number of header fields
+ /// allowed. This limit is used to defend certain
+ /// kinds of denial-of-service attacks.
+ /// Specify 0 for unlimited (not recommended).
+ ///
+ /// The default limit is 100.
+
+ bool hasToken(const std::string& fieldName, const std::string& token) const;
+ /// Returns true iff the field with the given fieldName contains
+ /// the given token. Tokens in a header field are expected to be
+ /// comma-separated and are case insensitive.
+
+ static void splitElements(const std::string& s, std::vector<std::string>& elements, bool ignoreEmpty = true);
+ /// Splits the given string into separate elements. Elements are expected
+ /// to be separated by commas.
+ ///
/// For example, the string
- /// multipart/mixed; boundary="MIME_boundary_01234567"
- /// is split into the value
- /// multipart/mixed
- /// and the parameter
- /// boundary -> MIME_boundary_01234567
-
- static void splitParameters(const std::string::const_iterator& begin, const std::string::const_iterator& end, NameValueCollection& parameters);
- /// Splits the given string into a collection of parameters.
- /// Parameters are expected to be separated by semicolons.
- ///
- /// Enclosing quotes of parameter values are removed.
-
- static void quote(const std::string& value, std::string& result, bool allowSpace = false);
- /// Checks if the value must be quoted. If so, the value is
- /// appended to result, enclosed in double-quotes.
- /// Otherwise, the value is appended to result as-is.
-
- static void decodeRFC2047(const std::string& ins, std::string& outs, const std::string& charset = "UTF-8");
- static std::string decodeWord(const std::string& text, const std::string& charset = "UTF-8");
- /// Decode RFC2047 string.
-
-
-private:
- enum Limits
- /// Limits for basic sanity checks when reading a header
- {
- MAX_NAME_LENGTH = 256,
+ /// text/plain; q=0.5, text/html, text/x-dvi; q=0.8
+ /// is split into the elements
+ /// text/plain; q=0.5
+ /// text/html
+ /// text/x-dvi; q=0.8
+ ///
+ /// Commas enclosed in double quotes do not split elements.
+ ///
+ /// If ignoreEmpty is true, empty elements are not returned.
+
+ static void splitParameters(const std::string& s, std::string& value, NameValueCollection& parameters);
+ /// Splits the given string into a value and a collection of parameters.
+ /// Parameters are expected to be separated by semicolons.
+ ///
+ /// Enclosing quotes of parameter values are removed.
+ ///
+ /// For example, the string
+ /// multipart/mixed; boundary="MIME_boundary_01234567"
+ /// is split into the value
+ /// multipart/mixed
+ /// and the parameter
+ /// boundary -> MIME_boundary_01234567
+
+ static void splitParameters(const std::string::const_iterator& begin, const std::string::const_iterator& end, NameValueCollection& parameters);
+ /// Splits the given string into a collection of parameters.
+ /// Parameters are expected to be separated by semicolons.
+ ///
+ /// Enclosing quotes of parameter values are removed.
+
+ static void quote(const std::string& value, std::string& result, bool allowSpace = false);
+ /// Checks if the value must be quoted. If so, the value is
+ /// appended to result, enclosed in double-quotes.
+ /// Otherwise, the value is appended to result as-is.
+
+ static void decodeRFC2047(const std::string& ins, std::string& outs, const std::string& charset = "UTF-8");
+ static std::string decodeWord(const std::string& text, const std::string& charset = "UTF-8");
+ /// Decode RFC2047 string.
+
+
+private:
+ enum Limits
+ /// Limits for basic sanity checks when reading a header
+ {
+ MAX_NAME_LENGTH = 256,
MAX_VALUE_LENGTH = 16384,
- DFL_FIELD_LIMIT = 100
- };
-
- int _fieldLimit;
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_MessageHeader_INCLUDED
+ DFL_FIELD_LIMIT = 100
+ };
+
+ int _fieldLimit;
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_MessageHeader_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/MulticastSocket.h b/contrib/libs/poco/Net/include/Poco/Net/MulticastSocket.h
index d056156651..6ae465775f 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/MulticastSocket.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/MulticastSocket.h
@@ -1,135 +1,135 @@
-//
-// MulticastSocket.h
-//
-// Library: Net
-// Package: Sockets
-// Module: MulticastSocket
-//
-// Definition of the MulticastSocket class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_MulticastSocket_INCLUDED
-#define Net_MulticastSocket_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-
-
-#ifdef POCO_NET_HAS_INTERFACE
-
-
-#include "Poco/Net/DatagramSocket.h"
-#include "Poco/Net/NetworkInterface.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API MulticastSocket: public DatagramSocket
- /// A MulticastSocket is a special DatagramSocket
- /// that can be used to send packets to and receive
- /// packets from multicast groups.
-{
-public:
- MulticastSocket();
- /// Creates an unconnected, unbound multicast socket.
- ///
- /// Before the multicast socket can be used, bind(),
- /// bind6() or connect() must be called.
- ///
- /// Notice: The behavior of this constructor has changed
- /// in release 2.0. Previously, the constructor created
- /// an unbound IPv4 multicast socket.
-
- explicit MulticastSocket(SocketAddress::Family family);
- /// Creates an unconnected datagram socket.
- ///
- /// The socket will be created for the
- /// given address family.
-
- MulticastSocket(const SocketAddress& address, bool reuseAddress = false);
- /// Creates a datagram socket and binds it
- /// to the given address.
- ///
- /// Depending on the address family, the socket
- /// will be either an IPv4 or an IPv6 socket.
-
- MulticastSocket(const Socket& socket);
- /// Creates the DatagramSocket with the SocketImpl
- /// from another socket. The SocketImpl must be
- /// a DatagramSocketImpl, otherwise an InvalidArgumentException
- /// will be thrown.
-
- ~MulticastSocket();
- /// Destroys the DatagramSocket.
-
- MulticastSocket& operator = (const Socket& socket);
- /// Assignment operator.
- ///
- /// Releases the socket's SocketImpl and
- /// attaches the SocketImpl from the other socket and
- /// increments the reference count of the SocketImpl.
-
- void setInterface(const NetworkInterface& interfc);
- /// Sets the interface used for sending multicast packets.
- ///
- /// To select the default interface, specify an empty
- /// interface.
- ///
- /// This is done by setting the IP_MULTICAST_IF/IPV6_MULTICAST_IF
- /// socket option.
-
- NetworkInterface getInterface() const;
- /// Returns the interface used for sending multicast packets.
-
- void setLoopback(bool flag);
- /// Enable or disable loopback for multicast packets.
- ///
- /// Sets the value of the IP_MULTICAST_LOOP/IPV6_MULTICAST_LOOP
- /// socket option.
-
- bool getLoopback() const;
- /// Returns true iff loopback for multicast packets is enabled,
- /// false otherwise.
-
- void setTimeToLive(unsigned value);
- /// Specifies the TTL/hop limit for outgoing packets.
- ///
- /// Sets the value of the IP_MULTICAST_TTL/IPV6_MULTICAST_HOPS
- /// socket option.
-
- unsigned getTimeToLive() const;
- /// Returns the TTL/hop limit for outgoing packets.
-
- void joinGroup(const IPAddress& groupAddress);
- /// Joins the specified multicast group at the default interface.
-
- void joinGroup(const IPAddress& groupAddress, const NetworkInterface& interfc);
- /// Joins the specified multicast group at the given interface.
-
- void leaveGroup(const IPAddress& groupAddress);
- /// Leaves the specified multicast group at the default interface.
-
- void leaveGroup(const IPAddress& groupAddress, const NetworkInterface& interfc);
- /// Leaves the specified multicast group at the given interface.
-
-private:
- static NetworkInterface findFirstInterface(const IPAddress& groupAddress);
- /// Returns first multicast-eligible network interface.
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // POCO_NET_HAS_INTERFACE
-
-
-#endif // Net_MulticastSocket_INCLUDED
+//
+// MulticastSocket.h
+//
+// Library: Net
+// Package: Sockets
+// Module: MulticastSocket
+//
+// Definition of the MulticastSocket class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_MulticastSocket_INCLUDED
+#define Net_MulticastSocket_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+
+
+#ifdef POCO_NET_HAS_INTERFACE
+
+
+#include "Poco/Net/DatagramSocket.h"
+#include "Poco/Net/NetworkInterface.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API MulticastSocket: public DatagramSocket
+ /// A MulticastSocket is a special DatagramSocket
+ /// that can be used to send packets to and receive
+ /// packets from multicast groups.
+{
+public:
+ MulticastSocket();
+ /// Creates an unconnected, unbound multicast socket.
+ ///
+ /// Before the multicast socket can be used, bind(),
+ /// bind6() or connect() must be called.
+ ///
+ /// Notice: The behavior of this constructor has changed
+ /// in release 2.0. Previously, the constructor created
+ /// an unbound IPv4 multicast socket.
+
+ explicit MulticastSocket(SocketAddress::Family family);
+ /// Creates an unconnected datagram socket.
+ ///
+ /// The socket will be created for the
+ /// given address family.
+
+ MulticastSocket(const SocketAddress& address, bool reuseAddress = false);
+ /// Creates a datagram socket and binds it
+ /// to the given address.
+ ///
+ /// Depending on the address family, the socket
+ /// will be either an IPv4 or an IPv6 socket.
+
+ MulticastSocket(const Socket& socket);
+ /// Creates the DatagramSocket with the SocketImpl
+ /// from another socket. The SocketImpl must be
+ /// a DatagramSocketImpl, otherwise an InvalidArgumentException
+ /// will be thrown.
+
+ ~MulticastSocket();
+ /// Destroys the DatagramSocket.
+
+ MulticastSocket& operator = (const Socket& socket);
+ /// Assignment operator.
+ ///
+ /// Releases the socket's SocketImpl and
+ /// attaches the SocketImpl from the other socket and
+ /// increments the reference count of the SocketImpl.
+
+ void setInterface(const NetworkInterface& interfc);
+ /// Sets the interface used for sending multicast packets.
+ ///
+ /// To select the default interface, specify an empty
+ /// interface.
+ ///
+ /// This is done by setting the IP_MULTICAST_IF/IPV6_MULTICAST_IF
+ /// socket option.
+
+ NetworkInterface getInterface() const;
+ /// Returns the interface used for sending multicast packets.
+
+ void setLoopback(bool flag);
+ /// Enable or disable loopback for multicast packets.
+ ///
+ /// Sets the value of the IP_MULTICAST_LOOP/IPV6_MULTICAST_LOOP
+ /// socket option.
+
+ bool getLoopback() const;
+ /// Returns true iff loopback for multicast packets is enabled,
+ /// false otherwise.
+
+ void setTimeToLive(unsigned value);
+ /// Specifies the TTL/hop limit for outgoing packets.
+ ///
+ /// Sets the value of the IP_MULTICAST_TTL/IPV6_MULTICAST_HOPS
+ /// socket option.
+
+ unsigned getTimeToLive() const;
+ /// Returns the TTL/hop limit for outgoing packets.
+
+ void joinGroup(const IPAddress& groupAddress);
+ /// Joins the specified multicast group at the default interface.
+
+ void joinGroup(const IPAddress& groupAddress, const NetworkInterface& interfc);
+ /// Joins the specified multicast group at the given interface.
+
+ void leaveGroup(const IPAddress& groupAddress);
+ /// Leaves the specified multicast group at the default interface.
+
+ void leaveGroup(const IPAddress& groupAddress, const NetworkInterface& interfc);
+ /// Leaves the specified multicast group at the given interface.
+
+private:
+ static NetworkInterface findFirstInterface(const IPAddress& groupAddress);
+ /// Returns first multicast-eligible network interface.
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // POCO_NET_HAS_INTERFACE
+
+
+#endif // Net_MulticastSocket_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/MultipartReader.h b/contrib/libs/poco/Net/include/Poco/Net/MultipartReader.h
index 648fa427c9..5f972dcba2 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/MultipartReader.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/MultipartReader.h
@@ -1,160 +1,160 @@
-//
-// MultipartReader.h
-//
-// Library: Net
-// Package: Messages
-// Module: MultipartReader
-//
-// Definition of the MultipartReader class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_MultipartReader_INCLUDED
-#define Net_MultipartReader_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/BufferedStreamBuf.h"
-#include <istream>
-
-
-namespace Poco {
-namespace Net {
-
-
-class MessageHeader;
-
-
-class Net_API MultipartStreamBuf: public Poco::BufferedStreamBuf
- /// This is the streambuf class used for reading from a multipart message stream.
-{
-public:
- MultipartStreamBuf(std::istream& istr, const std::string& boundary);
- ~MultipartStreamBuf();
- bool lastPart() const;
-
-protected:
- int readFromDevice(char* buffer, std::streamsize length);
-
-private:
- enum
- {
- STREAM_BUFFER_SIZE = 1024
- };
-
- std::istream& _istr;
- std::string _boundary;
- bool _lastPart;
-};
-
-
-class Net_API MultipartIOS: public virtual std::ios
- /// The base class for MultipartInputStream.
-{
-public:
- MultipartIOS(std::istream& istr, const std::string& boundary);
- ~MultipartIOS();
- MultipartStreamBuf* rdbuf();
- bool lastPart() const;
-
-protected:
- MultipartStreamBuf _buf;
-};
-
-
-class Net_API MultipartInputStream: public MultipartIOS, public std::istream
- /// This class is for internal use by MultipartReader only.
-{
-public:
- MultipartInputStream(std::istream& istr, const std::string& boundary);
- ~MultipartInputStream();
-};
-
-
-
-class Net_API MultipartReader
- /// This class is used to split a MIME multipart
- /// message into its single parts.
- ///
- /// The format of multipart messages is described
- /// in section 5.1 of RFC 2046.
- ///
- /// To split a multipart message into its parts,
- /// do the following:
- /// - Create a MultipartReader object, passing it
- /// an input stream and optionally a boundary string.
- /// - while hasNextPart() returns true, call nextPart()
- /// and read the part from stream().
- ///
- /// Always ensure that you read all data from the part
- /// stream, otherwise the MultipartReader will fail to
- /// find the next part.
-{
-public:
- explicit MultipartReader(std::istream& istr);
- /// Creates the MultipartReader and attaches it to the
- /// given input stream.
- ///
- /// The boundary string is determined from the input
- /// stream. The message must not contain a preamble
- /// preceding the first encapsulation boundary.
-
- MultipartReader(std::istream& istr, const std::string& boundary);
- /// Creates the MultipartReader and attaches it to the
- /// given input stream. The given boundary string is
- /// used to find message boundaries.
-
- ~MultipartReader();
- /// Destroys the MultipartReader.
-
- void nextPart(MessageHeader& messageHeader);
- /// Moves to the next part in the message and stores the
- /// part's header fields in messageHeader.
- ///
- /// Throws an MultipartException if there are no more parts
- /// available, or if no boundary line can be found in
- /// the input stream.
-
- bool hasNextPart();
- /// Returns true iff more parts are available.
- ///
- /// Before the first call to nextPart(), returns
- /// always true.
-
- std::istream& stream() const;
- /// Returns a reference to the reader's stream that
- /// can be used to read the current part.
- ///
- /// The returned reference will be valid until
- /// nextPart() is called or the MultipartReader
- /// object is destroyed.
-
- const std::string& boundary() const;
- /// Returns the multipart boundary used by this reader.
-
-protected:
- void findFirstBoundary();
- void guessBoundary();
- void parseHeader(MessageHeader& messageHeader);
- bool readLine(std::string& line, std::string::size_type n);
-
-private:
- MultipartReader();
- MultipartReader(const MultipartReader&);
- MultipartReader& operator = (const MultipartReader&);
-
- std::istream& _istr;
- std::string _boundary;
- MultipartInputStream* _pMPI;
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_MultipartReader_INCLUDED
+//
+// MultipartReader.h
+//
+// Library: Net
+// Package: Messages
+// Module: MultipartReader
+//
+// Definition of the MultipartReader class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_MultipartReader_INCLUDED
+#define Net_MultipartReader_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/BufferedStreamBuf.h"
+#include <istream>
+
+
+namespace Poco {
+namespace Net {
+
+
+class MessageHeader;
+
+
+class Net_API MultipartStreamBuf: public Poco::BufferedStreamBuf
+ /// This is the streambuf class used for reading from a multipart message stream.
+{
+public:
+ MultipartStreamBuf(std::istream& istr, const std::string& boundary);
+ ~MultipartStreamBuf();
+ bool lastPart() const;
+
+protected:
+ int readFromDevice(char* buffer, std::streamsize length);
+
+private:
+ enum
+ {
+ STREAM_BUFFER_SIZE = 1024
+ };
+
+ std::istream& _istr;
+ std::string _boundary;
+ bool _lastPart;
+};
+
+
+class Net_API MultipartIOS: public virtual std::ios
+ /// The base class for MultipartInputStream.
+{
+public:
+ MultipartIOS(std::istream& istr, const std::string& boundary);
+ ~MultipartIOS();
+ MultipartStreamBuf* rdbuf();
+ bool lastPart() const;
+
+protected:
+ MultipartStreamBuf _buf;
+};
+
+
+class Net_API MultipartInputStream: public MultipartIOS, public std::istream
+ /// This class is for internal use by MultipartReader only.
+{
+public:
+ MultipartInputStream(std::istream& istr, const std::string& boundary);
+ ~MultipartInputStream();
+};
+
+
+
+class Net_API MultipartReader
+ /// This class is used to split a MIME multipart
+ /// message into its single parts.
+ ///
+ /// The format of multipart messages is described
+ /// in section 5.1 of RFC 2046.
+ ///
+ /// To split a multipart message into its parts,
+ /// do the following:
+ /// - Create a MultipartReader object, passing it
+ /// an input stream and optionally a boundary string.
+ /// - while hasNextPart() returns true, call nextPart()
+ /// and read the part from stream().
+ ///
+ /// Always ensure that you read all data from the part
+ /// stream, otherwise the MultipartReader will fail to
+ /// find the next part.
+{
+public:
+ explicit MultipartReader(std::istream& istr);
+ /// Creates the MultipartReader and attaches it to the
+ /// given input stream.
+ ///
+ /// The boundary string is determined from the input
+ /// stream. The message must not contain a preamble
+ /// preceding the first encapsulation boundary.
+
+ MultipartReader(std::istream& istr, const std::string& boundary);
+ /// Creates the MultipartReader and attaches it to the
+ /// given input stream. The given boundary string is
+ /// used to find message boundaries.
+
+ ~MultipartReader();
+ /// Destroys the MultipartReader.
+
+ void nextPart(MessageHeader& messageHeader);
+ /// Moves to the next part in the message and stores the
+ /// part's header fields in messageHeader.
+ ///
+ /// Throws an MultipartException if there are no more parts
+ /// available, or if no boundary line can be found in
+ /// the input stream.
+
+ bool hasNextPart();
+ /// Returns true iff more parts are available.
+ ///
+ /// Before the first call to nextPart(), returns
+ /// always true.
+
+ std::istream& stream() const;
+ /// Returns a reference to the reader's stream that
+ /// can be used to read the current part.
+ ///
+ /// The returned reference will be valid until
+ /// nextPart() is called or the MultipartReader
+ /// object is destroyed.
+
+ const std::string& boundary() const;
+ /// Returns the multipart boundary used by this reader.
+
+protected:
+ void findFirstBoundary();
+ void guessBoundary();
+ void parseHeader(MessageHeader& messageHeader);
+ bool readLine(std::string& line, std::string::size_type n);
+
+private:
+ MultipartReader();
+ MultipartReader(const MultipartReader&);
+ MultipartReader& operator = (const MultipartReader&);
+
+ std::istream& _istr;
+ std::string _boundary;
+ MultipartInputStream* _pMPI;
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_MultipartReader_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/MultipartWriter.h b/contrib/libs/poco/Net/include/Poco/Net/MultipartWriter.h
index 81e4cf86fd..97b3fd2356 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/MultipartWriter.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/MultipartWriter.h
@@ -1,109 +1,109 @@
-//
-// MultipartWriter.h
-//
-// Library: Net
-// Package: Messages
-// Module: MultipartWriter
-//
-// Definition of the MultipartWriter class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_MultipartWriter_INCLUDED
-#define Net_MultipartWriter_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include <ostream>
-
-
-namespace Poco {
-namespace Net {
-
-
-class MessageHeader;
-
-
-class Net_API MultipartWriter
- /// This class is used to write MIME multipart
- /// messages to an output stream.
- ///
- /// The format of multipart messages is described
- /// in section 5.1 of RFC 2046.
- ///
- /// To create a multipart message, first create
- /// a MultipartWriter object.
- /// Then, for each part, call nextPart() and
- /// write the content to the output stream.
- /// Repeat for all parts.
- /// After the last part has been written,
- /// call close() to finish the multipart message.
-{
-public:
- explicit MultipartWriter(std::ostream& ostr);
- /// Creates the MultipartWriter, using the
- /// given output stream.
- ///
- /// Creates a random boundary string.
-
- MultipartWriter(std::ostream& ostr, const std::string& boundary);
- /// Creates the MultipartWriter, using the
- /// given output stream and boundary string.
-
- ~MultipartWriter();
- /// Destroys the MultipartWriter.
-
- void nextPart(const MessageHeader& header);
- /// Opens a new message part and writes
- /// the message boundary string, followed
- /// by the message header to the stream.
-
- void close();
- /// Closes the multipart message and writes
- /// the terminating boundary string.
- ///
- /// Does not close the underlying stream.
-
- std::ostream& stream();
- /// Returns the writer's stream.
-
- const std::string& boundary() const;
- /// Returns the multipart boundary used by this writer.
-
- static std::string createBoundary();
- /// Creates a random boundary string.
- ///
- /// The string always has the form
- /// MIME_boundary_XXXXXXXXXXXX, where
- /// XXXXXXXXXXXX is a random hexadecimal
- /// number.
-
-private:
- MultipartWriter();
- MultipartWriter(const MultipartWriter&);
- MultipartWriter& operator = (const MultipartWriter&);
-
- std::ostream& _ostr;
- std::string _boundary;
- bool _firstPart;
-};
-
-
-//
-// inlines
-//
-inline std::ostream& MultipartWriter::stream()
-{
- return _ostr;
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_MultipartWriter_INCLUDED
+//
+// MultipartWriter.h
+//
+// Library: Net
+// Package: Messages
+// Module: MultipartWriter
+//
+// Definition of the MultipartWriter class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_MultipartWriter_INCLUDED
+#define Net_MultipartWriter_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include <ostream>
+
+
+namespace Poco {
+namespace Net {
+
+
+class MessageHeader;
+
+
+class Net_API MultipartWriter
+ /// This class is used to write MIME multipart
+ /// messages to an output stream.
+ ///
+ /// The format of multipart messages is described
+ /// in section 5.1 of RFC 2046.
+ ///
+ /// To create a multipart message, first create
+ /// a MultipartWriter object.
+ /// Then, for each part, call nextPart() and
+ /// write the content to the output stream.
+ /// Repeat for all parts.
+ /// After the last part has been written,
+ /// call close() to finish the multipart message.
+{
+public:
+ explicit MultipartWriter(std::ostream& ostr);
+ /// Creates the MultipartWriter, using the
+ /// given output stream.
+ ///
+ /// Creates a random boundary string.
+
+ MultipartWriter(std::ostream& ostr, const std::string& boundary);
+ /// Creates the MultipartWriter, using the
+ /// given output stream and boundary string.
+
+ ~MultipartWriter();
+ /// Destroys the MultipartWriter.
+
+ void nextPart(const MessageHeader& header);
+ /// Opens a new message part and writes
+ /// the message boundary string, followed
+ /// by the message header to the stream.
+
+ void close();
+ /// Closes the multipart message and writes
+ /// the terminating boundary string.
+ ///
+ /// Does not close the underlying stream.
+
+ std::ostream& stream();
+ /// Returns the writer's stream.
+
+ const std::string& boundary() const;
+ /// Returns the multipart boundary used by this writer.
+
+ static std::string createBoundary();
+ /// Creates a random boundary string.
+ ///
+ /// The string always has the form
+ /// MIME_boundary_XXXXXXXXXXXX, where
+ /// XXXXXXXXXXXX is a random hexadecimal
+ /// number.
+
+private:
+ MultipartWriter();
+ MultipartWriter(const MultipartWriter&);
+ MultipartWriter& operator = (const MultipartWriter&);
+
+ std::ostream& _ostr;
+ std::string _boundary;
+ bool _firstPart;
+};
+
+
+//
+// inlines
+//
+inline std::ostream& MultipartWriter::stream()
+{
+ return _ostr;
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_MultipartWriter_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/NTPClient.h b/contrib/libs/poco/Net/include/Poco/Net/NTPClient.h
index 741ecd7cc2..044a486a73 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/NTPClient.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/NTPClient.h
@@ -1,64 +1,64 @@
-//
-// NTPClient.h
-//
-// Library: Net
-// Package: NTP
-// Module: NTPClient
-//
-// Definition of the NTPClient class.
-//
-// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_NTPClient_INCLUDED
-#define Net_NTPClient_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/NTPEventArgs.h"
-#include "Poco/Net/SocketAddress.h"
-#include "Poco/BasicEvent.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API NTPClient
- /// This class provides NTP (Network Time Protocol) client functionality.
-{
-public:
- mutable Poco::BasicEvent<NTPEventArgs> response;
-
- explicit NTPClient(SocketAddress::Family family, int timeout = 3000000);
- /// Creates an NTP client.
-
- ~NTPClient();
- /// Destroys the NTP client.
-
- int request(SocketAddress& address) const;
- /// Request the time from the server at address.
- /// Notifications are posted for events.
- ///
- /// Returns the number of valid replies.
-
- int request(const std::string& address) const;
- /// Request the time from the server at address.
- /// Notifications are posted for events.
- ///
- /// Returns the number of valid replies.
-
-private:
- mutable SocketAddress::Family _family;
- int _timeout;
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_NTPClient_INCLUDED
+//
+// NTPClient.h
+//
+// Library: Net
+// Package: NTP
+// Module: NTPClient
+//
+// Definition of the NTPClient class.
+//
+// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_NTPClient_INCLUDED
+#define Net_NTPClient_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/NTPEventArgs.h"
+#include "Poco/Net/SocketAddress.h"
+#include "Poco/BasicEvent.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API NTPClient
+ /// This class provides NTP (Network Time Protocol) client functionality.
+{
+public:
+ mutable Poco::BasicEvent<NTPEventArgs> response;
+
+ explicit NTPClient(SocketAddress::Family family, int timeout = 3000000);
+ /// Creates an NTP client.
+
+ ~NTPClient();
+ /// Destroys the NTP client.
+
+ int request(SocketAddress& address) const;
+ /// Request the time from the server at address.
+ /// Notifications are posted for events.
+ ///
+ /// Returns the number of valid replies.
+
+ int request(const std::string& address) const;
+ /// Request the time from the server at address.
+ /// Notifications are posted for events.
+ ///
+ /// Returns the number of valid replies.
+
+private:
+ mutable SocketAddress::Family _family;
+ int _timeout;
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_NTPClient_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/NTPEventArgs.h b/contrib/libs/poco/Net/include/Poco/Net/NTPEventArgs.h
index 84d638293a..89c12751c3 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/NTPEventArgs.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/NTPEventArgs.h
@@ -1,84 +1,84 @@
-//
-// NTPEventArgs.h
-//
-// Library: Net
-// Package: NTP
-// Module: NTPEventArgs
-//
-// Definition of NTPEventArgs.
-//
-// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_NTPEventArgs_INCLUDED
-#define Net_NTPEventArgs_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/SocketAddress.h"
-#include "Poco/Net/NTPPacket.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API NTPEventArgs
- /// The purpose of the NTPEventArgs class is to be used as template parameter
- /// to instantiate event members in NTPClient class.
- /// When clients register for an event notification, the reference to the class is
- /// passed to the handler function to provide information about the event.
-{
-public:
- NTPEventArgs(const SocketAddress& address);
- /// Creates NTPEventArgs.
-
- virtual ~NTPEventArgs();
- /// Destroys NTPEventArgs.
-
- std::string hostName() const;
- /// Tries to resolve the target IP address into host name.
- /// If unsuccessful, all exceptions are silently ignored and
- /// the IP address is returned.
-
- std::string hostAddress() const;
- /// Returns the target IP address.
-
- const NTPPacket &packet();
- /// Returns the NTP packet.
-
-private:
- NTPEventArgs();
-
- void setPacket(NTPPacket &packet);
-
- SocketAddress _address;
- NTPPacket _packet;
-
- friend class NTPClient;
-};
-
-
-//
-// inlines
-//
-inline const NTPPacket &NTPEventArgs::packet()
-{
- return _packet;
-}
-
-
-inline void NTPEventArgs::setPacket(NTPPacket &packet)
-{
- _packet = packet;
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif
+//
+// NTPEventArgs.h
+//
+// Library: Net
+// Package: NTP
+// Module: NTPEventArgs
+//
+// Definition of NTPEventArgs.
+//
+// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_NTPEventArgs_INCLUDED
+#define Net_NTPEventArgs_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/SocketAddress.h"
+#include "Poco/Net/NTPPacket.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API NTPEventArgs
+ /// The purpose of the NTPEventArgs class is to be used as template parameter
+ /// to instantiate event members in NTPClient class.
+ /// When clients register for an event notification, the reference to the class is
+ /// passed to the handler function to provide information about the event.
+{
+public:
+ NTPEventArgs(const SocketAddress& address);
+ /// Creates NTPEventArgs.
+
+ virtual ~NTPEventArgs();
+ /// Destroys NTPEventArgs.
+
+ std::string hostName() const;
+ /// Tries to resolve the target IP address into host name.
+ /// If unsuccessful, all exceptions are silently ignored and
+ /// the IP address is returned.
+
+ std::string hostAddress() const;
+ /// Returns the target IP address.
+
+ const NTPPacket &packet();
+ /// Returns the NTP packet.
+
+private:
+ NTPEventArgs();
+
+ void setPacket(NTPPacket &packet);
+
+ SocketAddress _address;
+ NTPPacket _packet;
+
+ friend class NTPClient;
+};
+
+
+//
+// inlines
+//
+inline const NTPPacket &NTPEventArgs::packet()
+{
+ return _packet;
+}
+
+
+inline void NTPEventArgs::setPacket(NTPPacket &packet)
+{
+ _packet = packet;
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif
diff --git a/contrib/libs/poco/Net/include/Poco/Net/NTPPacket.h b/contrib/libs/poco/Net/include/Poco/Net/NTPPacket.h
index de3298e917..4dae347888 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/NTPPacket.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/NTPPacket.h
@@ -1,207 +1,207 @@
-//
-// NTPPacket.h
-//
-// Library: Net
-// Package: NTP
-// Module: NTPPacket
-//
-// Definition of the NTPPacket class.
-//
-// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_NTPPacket_INCLUDED
-#define Net_NTPPacket_INCLUDED
-
-
-#include "Poco/Foundation.h"
-#include "Poco/Net/Net.h"
-#include "Poco/Timestamp.h"
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API NTPPacket
- /// This class is the NTP packet abstraction.
-{
-public:
- NTPPacket();
- /// Creates an NTPPacket.
-
- NTPPacket(Poco::UInt8 *packet);
- /// Creates an NTPPacket.
- ///
- /// Assumed to have at least 48 bytes.
-
- ~NTPPacket();
- /// Destroys the NTPPacket.
-
- void packet(Poco::UInt8 *packet) const;
- /// Returns the NTP packet.
- ///
- /// Assumed to have at least 48 bytes.
-
- void setPacket(Poco::UInt8 *packet);
- /// Returns the NTP packet.
- ///
- /// Assumed to have exactly 48 bytes.
-
- Poco::Int8 leapIndicator() const;
- /// Returns the leap indicator.
-
- Poco::Int8 version() const;
- /// Returns the version.
-
- Poco::Int8 mode() const;
- /// Returns the mode.
-
- Poco::Int8 stratum() const;
- /// Returns the stratum.
-
- Poco::Int8 pool() const;
- /// Returns the pool.
-
- Poco::Int8 precision() const;
- /// Returns the precision
-
- Poco::Int32 rootDelay() const;
- /// Returns the root delay
-
- Poco::Int32 rootDispersion() const;
- /// Returns the root dispersion
-
- Poco::Int32 referenceId() const;
- /// Returns the reference id
-
- Poco::Int64 referenceTimestamp() const;
- /// Returns the reference timestamp
-
- Poco::Int64 originateTimestamp() const;
- /// Returns the originate timestamp
-
- Poco::Int64 receiveTimestamp() const;
- /// Returns the receive timestamp
-
- Poco::Int64 transmitTimestamp() const;
- /// Returns the transmit timestamp
-
- Poco::Timestamp referenceTime() const;
- /// Returns the reference time
-
- Poco::Timestamp originateTime() const;
- /// Returns the originate time
-
- Poco::Timestamp receiveTime() const;
- /// Returns the receive time
-
- Poco::Timestamp transmitTime() const;
- /// Returns the transmit time
-private:
- Poco::Timestamp convertTime(Poco::Int64 tm) const;
-
- Poco::Int8 _leapIndicator;
- Poco::Int8 _version;
- Poco::Int8 _mode;
- Poco::Int8 _stratum;
- Poco::Int8 _pool;
- Poco::Int8 _precision;
- Poco::Int32 _rootDelay;
- Poco::Int32 _rootDispersion;
- Poco::Int32 _referenceId;
- Poco::Int64 _referenceTimestamp;
- Poco::Int64 _originateTimestamp;
- Poco::Int64 _receiveTimestamp;
- Poco::Int64 _transmitTimestamp;
-};
-
-
-//
-// inlines
-//
-inline Poco::Int8 NTPPacket::leapIndicator() const
-{
- return _leapIndicator;
-}
-
-
-inline Poco::Int8 NTPPacket::version() const
-{
- return _version;
-}
-
-
-inline Poco::Int8 NTPPacket::mode() const
-{
- return _mode;
-}
-
-
-inline Poco::Int8 NTPPacket::stratum() const
-{
- return _stratum;
-}
-
-
-inline Poco::Int8 NTPPacket::pool() const
-{
- return _pool;
-}
-
-
-inline Poco::Int8 NTPPacket::precision() const
-{
- return _precision;
-}
-
-
-inline Poco::Int32 NTPPacket::rootDelay() const
-{
- return _rootDelay;
-}
-
-
-inline Poco::Int32 NTPPacket::rootDispersion() const
-{
- return _rootDispersion;
-}
-
-
-inline Poco::Int32 NTPPacket::referenceId() const
-{
- return _referenceId;
-}
-
-
-inline Poco::Int64 NTPPacket::referenceTimestamp() const
-{
- return _referenceTimestamp;
-}
-
-
-inline Poco::Int64 NTPPacket::originateTimestamp() const
-{
- return _originateTimestamp;
-}
-
-
-inline Poco::Int64 NTPPacket::receiveTimestamp() const
-{
- return _receiveTimestamp;
-}
-
-
-inline Poco::Int64 NTPPacket::transmitTimestamp() const
-{
- return _transmitTimestamp;
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_NTPPacket_INCLUDED
+//
+// NTPPacket.h
+//
+// Library: Net
+// Package: NTP
+// Module: NTPPacket
+//
+// Definition of the NTPPacket class.
+//
+// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_NTPPacket_INCLUDED
+#define Net_NTPPacket_INCLUDED
+
+
+#include "Poco/Foundation.h"
+#include "Poco/Net/Net.h"
+#include "Poco/Timestamp.h"
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API NTPPacket
+ /// This class is the NTP packet abstraction.
+{
+public:
+ NTPPacket();
+ /// Creates an NTPPacket.
+
+ NTPPacket(Poco::UInt8 *packet);
+ /// Creates an NTPPacket.
+ ///
+ /// Assumed to have at least 48 bytes.
+
+ ~NTPPacket();
+ /// Destroys the NTPPacket.
+
+ void packet(Poco::UInt8 *packet) const;
+ /// Returns the NTP packet.
+ ///
+ /// Assumed to have at least 48 bytes.
+
+ void setPacket(Poco::UInt8 *packet);
+ /// Returns the NTP packet.
+ ///
+ /// Assumed to have exactly 48 bytes.
+
+ Poco::Int8 leapIndicator() const;
+ /// Returns the leap indicator.
+
+ Poco::Int8 version() const;
+ /// Returns the version.
+
+ Poco::Int8 mode() const;
+ /// Returns the mode.
+
+ Poco::Int8 stratum() const;
+ /// Returns the stratum.
+
+ Poco::Int8 pool() const;
+ /// Returns the pool.
+
+ Poco::Int8 precision() const;
+ /// Returns the precision
+
+ Poco::Int32 rootDelay() const;
+ /// Returns the root delay
+
+ Poco::Int32 rootDispersion() const;
+ /// Returns the root dispersion
+
+ Poco::Int32 referenceId() const;
+ /// Returns the reference id
+
+ Poco::Int64 referenceTimestamp() const;
+ /// Returns the reference timestamp
+
+ Poco::Int64 originateTimestamp() const;
+ /// Returns the originate timestamp
+
+ Poco::Int64 receiveTimestamp() const;
+ /// Returns the receive timestamp
+
+ Poco::Int64 transmitTimestamp() const;
+ /// Returns the transmit timestamp
+
+ Poco::Timestamp referenceTime() const;
+ /// Returns the reference time
+
+ Poco::Timestamp originateTime() const;
+ /// Returns the originate time
+
+ Poco::Timestamp receiveTime() const;
+ /// Returns the receive time
+
+ Poco::Timestamp transmitTime() const;
+ /// Returns the transmit time
+private:
+ Poco::Timestamp convertTime(Poco::Int64 tm) const;
+
+ Poco::Int8 _leapIndicator;
+ Poco::Int8 _version;
+ Poco::Int8 _mode;
+ Poco::Int8 _stratum;
+ Poco::Int8 _pool;
+ Poco::Int8 _precision;
+ Poco::Int32 _rootDelay;
+ Poco::Int32 _rootDispersion;
+ Poco::Int32 _referenceId;
+ Poco::Int64 _referenceTimestamp;
+ Poco::Int64 _originateTimestamp;
+ Poco::Int64 _receiveTimestamp;
+ Poco::Int64 _transmitTimestamp;
+};
+
+
+//
+// inlines
+//
+inline Poco::Int8 NTPPacket::leapIndicator() const
+{
+ return _leapIndicator;
+}
+
+
+inline Poco::Int8 NTPPacket::version() const
+{
+ return _version;
+}
+
+
+inline Poco::Int8 NTPPacket::mode() const
+{
+ return _mode;
+}
+
+
+inline Poco::Int8 NTPPacket::stratum() const
+{
+ return _stratum;
+}
+
+
+inline Poco::Int8 NTPPacket::pool() const
+{
+ return _pool;
+}
+
+
+inline Poco::Int8 NTPPacket::precision() const
+{
+ return _precision;
+}
+
+
+inline Poco::Int32 NTPPacket::rootDelay() const
+{
+ return _rootDelay;
+}
+
+
+inline Poco::Int32 NTPPacket::rootDispersion() const
+{
+ return _rootDispersion;
+}
+
+
+inline Poco::Int32 NTPPacket::referenceId() const
+{
+ return _referenceId;
+}
+
+
+inline Poco::Int64 NTPPacket::referenceTimestamp() const
+{
+ return _referenceTimestamp;
+}
+
+
+inline Poco::Int64 NTPPacket::originateTimestamp() const
+{
+ return _originateTimestamp;
+}
+
+
+inline Poco::Int64 NTPPacket::receiveTimestamp() const
+{
+ return _receiveTimestamp;
+}
+
+
+inline Poco::Int64 NTPPacket::transmitTimestamp() const
+{
+ return _transmitTimestamp;
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_NTPPacket_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/NameValueCollection.h b/contrib/libs/poco/Net/include/Poco/Net/NameValueCollection.h
index 9ffa9e9a30..e2edce3408 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/NameValueCollection.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/NameValueCollection.h
@@ -1,126 +1,126 @@
-//
-// NameValueCollection.h
-//
-// Library: Net
-// Package: Messages
-// Module: NameValueCollection
-//
-// Definition of the NameValueCollection class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_NameValueCollection_INCLUDED
-#define Net_NameValueCollection_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/String.h"
-#include "Poco/ListMap.h"
-#include <cstddef>
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API NameValueCollection
- /// A collection of name-value pairs that are used in
- /// various internet protocols like HTTP and SMTP.
- ///
- /// The name is case-insensitive.
- ///
- /// There can be more than one name-value pair with the
- /// same name.
-{
-public:
- typedef Poco::ListMap<std::string, std::string> HeaderMap;
- typedef HeaderMap::Iterator Iterator;
- typedef HeaderMap::ConstIterator ConstIterator;
-
- NameValueCollection();
- /// Creates an empty NameValueCollection.
-
- NameValueCollection(const NameValueCollection& nvc);
- /// Creates a NameValueCollection by copying another one.
-
- virtual ~NameValueCollection();
- /// Destroys the NameValueCollection.
-
- NameValueCollection& operator = (const NameValueCollection& nvc);
- /// Assigns the name-value pairs of another NameValueCollection to this one.
-
- void swap(NameValueCollection& nvc);
- /// Swaps the NameValueCollection with another one.
-
- const std::string& operator [] (const std::string& name) const;
- /// Returns the value of the (first) name-value pair with the given name.
- ///
- /// Throws a NotFoundException if the name-value pair does not exist.
-
- void set(const std::string& name, const std::string& value);
- /// Sets the value of the (first) name-value pair with the given name.
-
- void add(const std::string& name, const std::string& value);
- /// Adds a new name-value pair with the given name and value.
-
- const std::string& get(const std::string& name) const;
- /// Returns the value of the first name-value pair with the given name.
- ///
- /// Throws a NotFoundException if the name-value pair does not exist.
-
- const std::string& get(const std::string& name, const std::string& defaultValue) const;
- /// Returns the value of the first name-value pair with the given name.
- /// If no value with the given name has been found, the defaultValue is returned.
-
- bool has(const std::string& name) const;
- /// Returns true if there is at least one name-value pair
- /// with the given name.
-
- ConstIterator find(const std::string& name) const;
- /// Returns an iterator pointing to the first name-value pair
- /// with the given name.
-
- ConstIterator begin() const;
- /// Returns an iterator pointing to the begin of
- /// the name-value pair collection.
-
- ConstIterator end() const;
- /// Returns an iterator pointing to the end of
- /// the name-value pair collection.
-
- bool empty() const;
- /// Returns true iff the header does not have any content.
-
- std::size_t size() const;
- /// Returns the number of name-value pairs in the
- /// collection.
-
- void erase(const std::string& name);
- /// Removes all name-value pairs with the given name.
-
- void clear();
- /// Removes all name-value pairs and their values.
-
-private:
- HeaderMap _map;
-};
-
-
-//
-// inlines
-//
-inline void swap(NameValueCollection& nvc1, NameValueCollection& nvc2)
-{
- nvc1.swap(nvc2);
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_NameValueCollection_INCLUDED
+//
+// NameValueCollection.h
+//
+// Library: Net
+// Package: Messages
+// Module: NameValueCollection
+//
+// Definition of the NameValueCollection class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_NameValueCollection_INCLUDED
+#define Net_NameValueCollection_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/String.h"
+#include "Poco/ListMap.h"
+#include <cstddef>
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API NameValueCollection
+ /// A collection of name-value pairs that are used in
+ /// various internet protocols like HTTP and SMTP.
+ ///
+ /// The name is case-insensitive.
+ ///
+ /// There can be more than one name-value pair with the
+ /// same name.
+{
+public:
+ typedef Poco::ListMap<std::string, std::string> HeaderMap;
+ typedef HeaderMap::Iterator Iterator;
+ typedef HeaderMap::ConstIterator ConstIterator;
+
+ NameValueCollection();
+ /// Creates an empty NameValueCollection.
+
+ NameValueCollection(const NameValueCollection& nvc);
+ /// Creates a NameValueCollection by copying another one.
+
+ virtual ~NameValueCollection();
+ /// Destroys the NameValueCollection.
+
+ NameValueCollection& operator = (const NameValueCollection& nvc);
+ /// Assigns the name-value pairs of another NameValueCollection to this one.
+
+ void swap(NameValueCollection& nvc);
+ /// Swaps the NameValueCollection with another one.
+
+ const std::string& operator [] (const std::string& name) const;
+ /// Returns the value of the (first) name-value pair with the given name.
+ ///
+ /// Throws a NotFoundException if the name-value pair does not exist.
+
+ void set(const std::string& name, const std::string& value);
+ /// Sets the value of the (first) name-value pair with the given name.
+
+ void add(const std::string& name, const std::string& value);
+ /// Adds a new name-value pair with the given name and value.
+
+ const std::string& get(const std::string& name) const;
+ /// Returns the value of the first name-value pair with the given name.
+ ///
+ /// Throws a NotFoundException if the name-value pair does not exist.
+
+ const std::string& get(const std::string& name, const std::string& defaultValue) const;
+ /// Returns the value of the first name-value pair with the given name.
+ /// If no value with the given name has been found, the defaultValue is returned.
+
+ bool has(const std::string& name) const;
+ /// Returns true if there is at least one name-value pair
+ /// with the given name.
+
+ ConstIterator find(const std::string& name) const;
+ /// Returns an iterator pointing to the first name-value pair
+ /// with the given name.
+
+ ConstIterator begin() const;
+ /// Returns an iterator pointing to the begin of
+ /// the name-value pair collection.
+
+ ConstIterator end() const;
+ /// Returns an iterator pointing to the end of
+ /// the name-value pair collection.
+
+ bool empty() const;
+ /// Returns true iff the header does not have any content.
+
+ std::size_t size() const;
+ /// Returns the number of name-value pairs in the
+ /// collection.
+
+ void erase(const std::string& name);
+ /// Removes all name-value pairs with the given name.
+
+ void clear();
+ /// Removes all name-value pairs and their values.
+
+private:
+ HeaderMap _map;
+};
+
+
+//
+// inlines
+//
+inline void swap(NameValueCollection& nvc1, NameValueCollection& nvc2)
+{
+ nvc1.swap(nvc2);
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_NameValueCollection_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/Net.h b/contrib/libs/poco/Net/include/Poco/Net/Net.h
index d93d024e40..4ec0203515 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/Net.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/Net.h
@@ -1,122 +1,122 @@
-//
-// Net.h
-//
-// Library: Net
-// Package: NetCore
-// Module: Net
-//
-// Basic definitions for the Poco Net library.
-// This file must be the first file included by every other Net
-// header file.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_Net_INCLUDED
-#define Net_Net_INCLUDED
-
-
-#include "Poco/Foundation.h"
-
-
-//
-// The following block is the standard way of creating macros which make exporting
-// from a DLL simpler. All files within this DLL are compiled with the Net_EXPORTS
-// symbol defined on the command line. this symbol should not be defined on any project
-// that uses this DLL. This way any other project whose source files include this file see
-// Net_API functions as being imported from a DLL, wheras this DLL sees symbols
-// defined with this macro as being exported.
-//
-#if defined(_WIN32) && defined(POCO_DLL)
- #if defined(Net_EXPORTS)
- #define Net_API __declspec(dllexport)
- #else
- #define Net_API __declspec(dllimport)
- #endif
-#endif
-
-
-#if !defined(Net_API)
- #if !defined(POCO_NO_GCC_API_ATTRIBUTE) && defined (__GNUC__) && (__GNUC__ >= 4)
- #define Net_API __attribute__ ((visibility ("default")))
- #else
- #define Net_API
- #endif
-#endif
-
-
-//
-// Automatically link Net library.
-//
-#if defined(_MSC_VER)
- #if !defined(POCO_NO_AUTOMATIC_LIBS) && !defined(Net_EXPORTS)
- #pragma comment(lib, "PocoNet" POCO_LIB_SUFFIX)
- #endif
-#endif
-
-
-// Default to enabled IPv6 support if not explicitly disabled
-#if !defined(POCO_NET_NO_IPv6) && !defined (POCO_HAVE_IPv6)
- #define POCO_HAVE_IPv6
-#elif defined(POCO_NET_NO_IPv6) && defined (POCO_HAVE_IPv6)
- #undef POCO_HAVE_IPv6
-#endif // POCO_NET_NO_IPv6, POCO_HAVE_IPv6
-
-
-namespace Poco {
-namespace Net {
-
-
-void Net_API initializeNetwork();
- /// Initialize the network subsystem.
- /// (Windows only, no-op elsewhere)
-
-
-void Net_API uninitializeNetwork();
- /// Uninitialize the network subsystem.
- /// (Windows only, no-op elsewhere)
-
-
-}} // namespace Poco::Net
-
-
-//
-// Automate network initialization (only relevant on Windows).
-//
-
-#if defined(POCO_OS_FAMILY_WINDOWS) && !defined(POCO_NO_AUTOMATIC_LIB_INIT) && !defined(__GNUC__)
-
-extern "C" const struct Net_API NetworkInitializer pocoNetworkInitializer;
-
-#if defined(Net_EXPORTS)
- #if defined(_WIN64) || defined(_WIN32_WCE)
- #define POCO_NET_FORCE_SYMBOL(s) __pragma(comment (linker, "/export:"#s))
- #elif defined(_WIN32)
- #define POCO_NET_FORCE_SYMBOL(s) __pragma(comment (linker, "/export:_"#s))
- #endif
-#else // !Net_EXPORTS
- #if defined(_WIN64) || defined(_WIN32_WCE)
- #define POCO_NET_FORCE_SYMBOL(s) __pragma(comment (linker, "/include:"#s))
- #elif defined(_WIN32)
- #define POCO_NET_FORCE_SYMBOL(s) __pragma(comment (linker, "/include:_"#s))
- #endif
-#endif // Net_EXPORTS
-
-POCO_NET_FORCE_SYMBOL(pocoNetworkInitializer)
-
-#endif // POCO_OS_FAMILY_WINDOWS
-
-
-//
-// Define POCO_NET_HAS_INTERFACE for platforms that have network interface detection implemented.
-//
-#if defined(POCO_OS_FAMILY_WINDOWS) || (POCO_OS == POCO_OS_LINUX) || (POCO_OS == POCO_OS_ANDROID) || defined(POCO_OS_FAMILY_BSD) || (POCO_OS == POCO_OS_SOLARIS) || (POCO_OS == POCO_OS_QNX)
- #define POCO_NET_HAS_INTERFACE
-#endif
-
-
-#endif // Net_Net_INCLUDED
+//
+// Net.h
+//
+// Library: Net
+// Package: NetCore
+// Module: Net
+//
+// Basic definitions for the Poco Net library.
+// This file must be the first file included by every other Net
+// header file.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_Net_INCLUDED
+#define Net_Net_INCLUDED
+
+
+#include "Poco/Foundation.h"
+
+
+//
+// The following block is the standard way of creating macros which make exporting
+// from a DLL simpler. All files within this DLL are compiled with the Net_EXPORTS
+// symbol defined on the command line. this symbol should not be defined on any project
+// that uses this DLL. This way any other project whose source files include this file see
+// Net_API functions as being imported from a DLL, wheras this DLL sees symbols
+// defined with this macro as being exported.
+//
+#if defined(_WIN32) && defined(POCO_DLL)
+ #if defined(Net_EXPORTS)
+ #define Net_API __declspec(dllexport)
+ #else
+ #define Net_API __declspec(dllimport)
+ #endif
+#endif
+
+
+#if !defined(Net_API)
+ #if !defined(POCO_NO_GCC_API_ATTRIBUTE) && defined (__GNUC__) && (__GNUC__ >= 4)
+ #define Net_API __attribute__ ((visibility ("default")))
+ #else
+ #define Net_API
+ #endif
+#endif
+
+
+//
+// Automatically link Net library.
+//
+#if defined(_MSC_VER)
+ #if !defined(POCO_NO_AUTOMATIC_LIBS) && !defined(Net_EXPORTS)
+ #pragma comment(lib, "PocoNet" POCO_LIB_SUFFIX)
+ #endif
+#endif
+
+
+// Default to enabled IPv6 support if not explicitly disabled
+#if !defined(POCO_NET_NO_IPv6) && !defined (POCO_HAVE_IPv6)
+ #define POCO_HAVE_IPv6
+#elif defined(POCO_NET_NO_IPv6) && defined (POCO_HAVE_IPv6)
+ #undef POCO_HAVE_IPv6
+#endif // POCO_NET_NO_IPv6, POCO_HAVE_IPv6
+
+
+namespace Poco {
+namespace Net {
+
+
+void Net_API initializeNetwork();
+ /// Initialize the network subsystem.
+ /// (Windows only, no-op elsewhere)
+
+
+void Net_API uninitializeNetwork();
+ /// Uninitialize the network subsystem.
+ /// (Windows only, no-op elsewhere)
+
+
+}} // namespace Poco::Net
+
+
+//
+// Automate network initialization (only relevant on Windows).
+//
+
+#if defined(POCO_OS_FAMILY_WINDOWS) && !defined(POCO_NO_AUTOMATIC_LIB_INIT) && !defined(__GNUC__)
+
+extern "C" const struct Net_API NetworkInitializer pocoNetworkInitializer;
+
+#if defined(Net_EXPORTS)
+ #if defined(_WIN64) || defined(_WIN32_WCE)
+ #define POCO_NET_FORCE_SYMBOL(s) __pragma(comment (linker, "/export:"#s))
+ #elif defined(_WIN32)
+ #define POCO_NET_FORCE_SYMBOL(s) __pragma(comment (linker, "/export:_"#s))
+ #endif
+#else // !Net_EXPORTS
+ #if defined(_WIN64) || defined(_WIN32_WCE)
+ #define POCO_NET_FORCE_SYMBOL(s) __pragma(comment (linker, "/include:"#s))
+ #elif defined(_WIN32)
+ #define POCO_NET_FORCE_SYMBOL(s) __pragma(comment (linker, "/include:_"#s))
+ #endif
+#endif // Net_EXPORTS
+
+POCO_NET_FORCE_SYMBOL(pocoNetworkInitializer)
+
+#endif // POCO_OS_FAMILY_WINDOWS
+
+
+//
+// Define POCO_NET_HAS_INTERFACE for platforms that have network interface detection implemented.
+//
+#if defined(POCO_OS_FAMILY_WINDOWS) || (POCO_OS == POCO_OS_LINUX) || (POCO_OS == POCO_OS_ANDROID) || defined(POCO_OS_FAMILY_BSD) || (POCO_OS == POCO_OS_SOLARIS) || (POCO_OS == POCO_OS_QNX)
+ #define POCO_NET_HAS_INTERFACE
+#endif
+
+
+#endif // Net_Net_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/NetException.h b/contrib/libs/poco/Net/include/Poco/Net/NetException.h
index 82acac93df..92bb3ed912 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/NetException.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/NetException.h
@@ -1,60 +1,60 @@
-//
-// NetException.h
-//
-// Library: Net
-// Package: NetCore
-// Module: NetException
-//
-// Definition of the NetException class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_NetException_INCLUDED
-#define Net_NetException_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Exception.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-POCO_DECLARE_EXCEPTION(Net_API, NetException, Poco::IOException)
-POCO_DECLARE_EXCEPTION(Net_API, InvalidAddressException, NetException)
-POCO_DECLARE_EXCEPTION(Net_API, InvalidSocketException, NetException)
-POCO_DECLARE_EXCEPTION(Net_API, ServiceNotFoundException, NetException)
-POCO_DECLARE_EXCEPTION(Net_API, ConnectionAbortedException, NetException)
-POCO_DECLARE_EXCEPTION(Net_API, ConnectionResetException, NetException)
-POCO_DECLARE_EXCEPTION(Net_API, ConnectionRefusedException, NetException)
-POCO_DECLARE_EXCEPTION(Net_API, DNSException, NetException)
-POCO_DECLARE_EXCEPTION(Net_API, HostNotFoundException, DNSException)
-POCO_DECLARE_EXCEPTION(Net_API, NoAddressFoundException, DNSException)
-POCO_DECLARE_EXCEPTION(Net_API, InterfaceNotFoundException, NetException)
-POCO_DECLARE_EXCEPTION(Net_API, NoMessageException, NetException)
-POCO_DECLARE_EXCEPTION(Net_API, MessageException, NetException)
-POCO_DECLARE_EXCEPTION(Net_API, MultipartException, MessageException)
-POCO_DECLARE_EXCEPTION(Net_API, HTTPException, NetException)
-POCO_DECLARE_EXCEPTION(Net_API, NotAuthenticatedException, HTTPException)
-POCO_DECLARE_EXCEPTION(Net_API, UnsupportedRedirectException, HTTPException)
-POCO_DECLARE_EXCEPTION(Net_API, FTPException, NetException)
-POCO_DECLARE_EXCEPTION(Net_API, SMTPException, NetException)
-POCO_DECLARE_EXCEPTION(Net_API, POP3Exception, NetException)
-POCO_DECLARE_EXCEPTION(Net_API, ICMPException, NetException)
-POCO_DECLARE_EXCEPTION(Net_API, NTPException, NetException)
-POCO_DECLARE_EXCEPTION(Net_API, HTMLFormException, NetException)
-POCO_DECLARE_EXCEPTION(Net_API, WebSocketException, NetException)
-POCO_DECLARE_EXCEPTION(Net_API, UnsupportedFamilyException, NetException)
-POCO_DECLARE_EXCEPTION(Net_API, AddressFamilyMismatchException, NetException)
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_NetException_INCLUDED
+//
+// NetException.h
+//
+// Library: Net
+// Package: NetCore
+// Module: NetException
+//
+// Definition of the NetException class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_NetException_INCLUDED
+#define Net_NetException_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Exception.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+POCO_DECLARE_EXCEPTION(Net_API, NetException, Poco::IOException)
+POCO_DECLARE_EXCEPTION(Net_API, InvalidAddressException, NetException)
+POCO_DECLARE_EXCEPTION(Net_API, InvalidSocketException, NetException)
+POCO_DECLARE_EXCEPTION(Net_API, ServiceNotFoundException, NetException)
+POCO_DECLARE_EXCEPTION(Net_API, ConnectionAbortedException, NetException)
+POCO_DECLARE_EXCEPTION(Net_API, ConnectionResetException, NetException)
+POCO_DECLARE_EXCEPTION(Net_API, ConnectionRefusedException, NetException)
+POCO_DECLARE_EXCEPTION(Net_API, DNSException, NetException)
+POCO_DECLARE_EXCEPTION(Net_API, HostNotFoundException, DNSException)
+POCO_DECLARE_EXCEPTION(Net_API, NoAddressFoundException, DNSException)
+POCO_DECLARE_EXCEPTION(Net_API, InterfaceNotFoundException, NetException)
+POCO_DECLARE_EXCEPTION(Net_API, NoMessageException, NetException)
+POCO_DECLARE_EXCEPTION(Net_API, MessageException, NetException)
+POCO_DECLARE_EXCEPTION(Net_API, MultipartException, MessageException)
+POCO_DECLARE_EXCEPTION(Net_API, HTTPException, NetException)
+POCO_DECLARE_EXCEPTION(Net_API, NotAuthenticatedException, HTTPException)
+POCO_DECLARE_EXCEPTION(Net_API, UnsupportedRedirectException, HTTPException)
+POCO_DECLARE_EXCEPTION(Net_API, FTPException, NetException)
+POCO_DECLARE_EXCEPTION(Net_API, SMTPException, NetException)
+POCO_DECLARE_EXCEPTION(Net_API, POP3Exception, NetException)
+POCO_DECLARE_EXCEPTION(Net_API, ICMPException, NetException)
+POCO_DECLARE_EXCEPTION(Net_API, NTPException, NetException)
+POCO_DECLARE_EXCEPTION(Net_API, HTMLFormException, NetException)
+POCO_DECLARE_EXCEPTION(Net_API, WebSocketException, NetException)
+POCO_DECLARE_EXCEPTION(Net_API, UnsupportedFamilyException, NetException)
+POCO_DECLARE_EXCEPTION(Net_API, AddressFamilyMismatchException, NetException)
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_NetException_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/NetworkInterface.h b/contrib/libs/poco/Net/include/Poco/Net/NetworkInterface.h
index 4f2ade2783..17e10fdf6c 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/NetworkInterface.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/NetworkInterface.h
@@ -1,352 +1,352 @@
-//
-// NetworkInterface.h
-//
-// Library: Net
-// Package: Sockets
-// Module: NetworkInterface
-//
-// Definition of the NetworkInterface class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_NetworkInterface_INCLUDED
-#define Net_NetworkInterface_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-
-
-#ifdef POCO_NET_HAS_INTERFACE
-
-
-#include "Poco/Net/IPAddress.h"
-#include "Poco/Mutex.h"
-#include "Poco/Tuple.h"
-#include <map>
-#include <ostream>
-
-
-namespace Poco {
-namespace Net {
-
-
-class NetworkInterfaceImpl;
-
-
-class Net_API NetworkInterface
- /// This class represents a network interface.
- ///
- /// NetworkInterface is used with MulticastSocket to specify
- /// multicast interfaces for sending and receiving multicast
- /// messages.
- ///
- /// The class also provides static member functions for
- /// enumerating or searching network interfaces and their
- /// respective configuration values.
+//
+// NetworkInterface.h
+//
+// Library: Net
+// Package: Sockets
+// Module: NetworkInterface
+//
+// Definition of the NetworkInterface class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_NetworkInterface_INCLUDED
+#define Net_NetworkInterface_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+
+
+#ifdef POCO_NET_HAS_INTERFACE
+
+
+#include "Poco/Net/IPAddress.h"
+#include "Poco/Mutex.h"
+#include "Poco/Tuple.h"
+#include <map>
+#include <ostream>
+
+
+namespace Poco {
+namespace Net {
+
+
+class NetworkInterfaceImpl;
+
+
+class Net_API NetworkInterface
+ /// This class represents a network interface.
///
- /// On Windows, detection capabilities vary depending on the
- /// OS version/service pack. Although the best effort is made
- /// not to attempt access to non-existent features through a
- /// combination of compile/runtime checks, when running binaries
- /// compiled on a newer version of the OS on an older one
- /// problems may occur; if possible, it is best to run
- /// binaries on the OS version where they were compiled.
- /// This particularly applies to OS versions older than Vista
- /// and XP.
-{
-public:
- typedef std::vector<NetworkInterface> List;
- typedef List NetworkInterfaceList;//@deprecated
- typedef std::map<unsigned, NetworkInterface> Map;
- typedef Poco::Tuple<IPAddress, IPAddress, IPAddress> AddressTuple;
- typedef std::vector<AddressTuple> AddressList;
- typedef AddressList::iterator AddressIterator;
- typedef AddressList::const_iterator ConstAddressIterator;
- typedef std::vector<unsigned char> MACAddress;
-
- enum AddressType
- {
- IP_ADDRESS,
- SUBNET_MASK,
- BROADCAST_ADDRESS
- };
-
- enum Type
- {
- NI_TYPE_ETHERNET_CSMACD,
- NI_TYPE_ISO88025_TOKENRING,
- NI_TYPE_FRAMERELAY,
- NI_TYPE_PPP,
- NI_TYPE_SOFTWARE_LOOPBACK,
- NI_TYPE_ATM,
- NI_TYPE_IEEE80211,
- NI_TYPE_TUNNEL,
- NI_TYPE_IEEE1394,
- NI_TYPE_OTHER
- };
-
- enum IPVersion
- {
- IPv4_ONLY, /// Return interfaces with IPv4 address only
- IPv6_ONLY, /// Return interfaces with IPv6 address only
- IPv4_OR_IPv6 /// Return interfaces with IPv4 or IPv6 address
- };
-
- static const unsigned NO_INDEX = ~0;
-#if defined(POCO_OS_FAMILY_WINDOWS)
- static const char MAC_SEPARATOR = '-';
-#else
- static const char MAC_SEPARATOR = ':';
-#endif
-
- NetworkInterface(unsigned index = NO_INDEX);
- /// Creates a NetworkInterface representing the
- /// default interface.
- ///
- /// The name is empty, the IP address is the wildcard
- /// address and the index is max value of unsigned integer.
-
- NetworkInterface(const NetworkInterface& interfc);
- /// Creates the NetworkInterface by copying another one.
-
- ~NetworkInterface();
- /// Destroys the NetworkInterface.
-
- NetworkInterface& operator = (const NetworkInterface& interfc);
- /// Assigns another NetworkInterface.
-
- bool operator < (const NetworkInterface& other) const;
- /// Operator less-than.
-
- bool operator == (const NetworkInterface& other) const;
- /// Operator equal. Compares interface indices.
-
- void swap(NetworkInterface& other);
- /// Swaps the NetworkInterface with another one.
-
- unsigned index() const;
- /// Returns the interface OS index.
-
- const std::string& name() const;
- /// Returns the interface name.
-
- const std::string& displayName() const;
- /// Returns the interface display name.
- ///
- /// On Windows platforms, this is currently the network adapter
- /// name. This may change to the "friendly name" of the network
- /// connection in a future version, however.
- ///
- /// On other platforms this is the same as name().
-
- const std::string& adapterName() const;
- /// Returns the interface adapter name.
- ///
- /// On Windows platforms, this is the network adapter LUID.
- /// The adapter name is used by some Windows Net APIs like DHCP.
- ///
- /// On other platforms this is the same as name().
-
- const IPAddress& firstAddress(IPAddress::Family family) const;
- /// Returns the first IP address bound to the interface.
- /// Throws NotFoundException if the address family is not
- /// configured on the interface.
-
- void firstAddress(IPAddress& addr, IPAddress::Family family = IPAddress::IPv4) const;
- /// Returns the first IP address bound to the interface.
- /// If the address family is not configured on the interface,
- /// the address returned in addr will be unspecified (wildcard).
-
- const IPAddress& address(unsigned index = 0) const;
- /// Returns the IP address bound to the interface at index position.
-
- void addAddress(const IPAddress& address);
- /// Adds address to the interface.
-
- void addAddress(const IPAddress& address, const IPAddress& subnetMask, const IPAddress& broadcastAddress);
- /// Adds address to the interface.
-
- const AddressList& addressList() const;
- /// Returns the list of IP addresses bound to the interface.
-
- const IPAddress& subnetMask(unsigned index = 0) const;
- /// Returns the subnet mask for this network interface.
-
- const IPAddress& broadcastAddress(unsigned index = 0) const;
- /// Returns the broadcast address for this network interface.
-
- const IPAddress& destAddress(unsigned index = 0) const;
- /// Returns the IPv4 point-to-point destination address for this network interface.
-
- const MACAddress& macAddress() const;
- /// Returns MAC (Media Access Control) address for the interface.
-
- unsigned mtu() const;
- /// Returns the MTU for this interface.
-
- NetworkInterface::Type type() const;
- /// returns the MIB IfType of the interface.
-
- bool supportsIP() const;
- /// Returns true if the interface supports IP.
-
- bool supportsIPv4() const;
- /// Returns true if the interface supports IPv4.
-
- bool supportsIPv6() const;
- /// Returns true if the interface supports IPv6.
-
- bool supportsBroadcast() const;
- /// Returns true if the interface supports broadcast.
-
- bool supportsMulticast() const;
- /// Returns true if the interface supports multicast.
-
- bool isLoopback() const;
- /// Returns true if the interface is loopback.
-
- bool isPointToPoint() const;
- /// Returns true if the interface is point-to-point.
-
- bool isRunning() const;
- /// Returns true if the interface is running.
-
- bool isUp() const;
- /// Returns true if the interface is up.
-
- static NetworkInterface forName(const std::string& name, bool requireIPv6 = false);
- /// Returns the NetworkInterface for the given name.
- ///
- /// If requireIPv6 is false, an IPv4 interface is returned.
- /// Otherwise, an IPv6 interface is returned.
- ///
- /// Throws an InterfaceNotFoundException if an interface
- /// with the give name does not exist.
-
- static NetworkInterface forName(const std::string& name, IPVersion ipVersion);
- /// Returns the NetworkInterface for the given name.
- ///
- /// The ipVersion argument can be used to specify whether
- /// an IPv4 (IPv4_ONLY) or IPv6 (IPv6_ONLY) interface is required,
- /// or whether the caller does not care (IPv4_OR_IPv6).
- ///
- /// Throws an InterfaceNotFoundException if an interface
- /// with the give name does not exist.
-
- static NetworkInterface forAddress(const IPAddress& address);
- /// Returns the NetworkInterface for the given IP address.
- ///
- /// Throws an InterfaceNotFoundException if an interface
- /// with the give address does not exist.
-
- static NetworkInterface forIndex(unsigned index);
- /// Returns the NetworkInterface for the given interface index.
- ///
- /// Throws an InterfaceNotFoundException if an interface
- /// with the given index does not exist.
-
- static List list(bool ipOnly = true, bool upOnly = true);
- /// Returns a list with all network interfaces
- /// on the system.
- ///
- /// If ipOnly is true, only interfaces supporting IP
- /// are returned. Otherwise, all system network interfaces
- /// are returned.
- ///
- /// If upOnly is true, only interfaces being up are returned.
- /// Otherwise, both interfaces being up and down are returned.
- ///
- /// If there are multiple addresses bound to one interface,
- /// multiple NetworkInterface entries are listed for
- /// the same interface.
-
- static Map map(bool ipOnly = true, bool upOnly = true);
- /// Returns a map containing system network interfaces
- /// Map is keyed by interface system indices.
- ///
- /// If ipOnly is true, only interfaces supporting IP
- /// are returned. Otherwise, all system network interfaces
- /// are returned.
+ /// NetworkInterface is used with MulticastSocket to specify
+ /// multicast interfaces for sending and receiving multicast
+ /// messages.
+ ///
+ /// The class also provides static member functions for
+ /// enumerating or searching network interfaces and their
+ /// respective configuration values.
+ ///
+ /// On Windows, detection capabilities vary depending on the
+ /// OS version/service pack. Although the best effort is made
+ /// not to attempt access to non-existent features through a
+ /// combination of compile/runtime checks, when running binaries
+ /// compiled on a newer version of the OS on an older one
+ /// problems may occur; if possible, it is best to run
+ /// binaries on the OS version where they were compiled.
+ /// This particularly applies to OS versions older than Vista
+ /// and XP.
+{
+public:
+ typedef std::vector<NetworkInterface> List;
+ typedef List NetworkInterfaceList;//@deprecated
+ typedef std::map<unsigned, NetworkInterface> Map;
+ typedef Poco::Tuple<IPAddress, IPAddress, IPAddress> AddressTuple;
+ typedef std::vector<AddressTuple> AddressList;
+ typedef AddressList::iterator AddressIterator;
+ typedef AddressList::const_iterator ConstAddressIterator;
+ typedef std::vector<unsigned char> MACAddress;
+
+ enum AddressType
+ {
+ IP_ADDRESS,
+ SUBNET_MASK,
+ BROADCAST_ADDRESS
+ };
+
+ enum Type
+ {
+ NI_TYPE_ETHERNET_CSMACD,
+ NI_TYPE_ISO88025_TOKENRING,
+ NI_TYPE_FRAMERELAY,
+ NI_TYPE_PPP,
+ NI_TYPE_SOFTWARE_LOOPBACK,
+ NI_TYPE_ATM,
+ NI_TYPE_IEEE80211,
+ NI_TYPE_TUNNEL,
+ NI_TYPE_IEEE1394,
+ NI_TYPE_OTHER
+ };
+
+ enum IPVersion
+ {
+ IPv4_ONLY, /// Return interfaces with IPv4 address only
+ IPv6_ONLY, /// Return interfaces with IPv6 address only
+ IPv4_OR_IPv6 /// Return interfaces with IPv4 or IPv6 address
+ };
+
+ static const unsigned NO_INDEX = ~0;
+#if defined(POCO_OS_FAMILY_WINDOWS)
+ static const char MAC_SEPARATOR = '-';
+#else
+ static const char MAC_SEPARATOR = ':';
+#endif
+
+ NetworkInterface(unsigned index = NO_INDEX);
+ /// Creates a NetworkInterface representing the
+ /// default interface.
+ ///
+ /// The name is empty, the IP address is the wildcard
+ /// address and the index is max value of unsigned integer.
+
+ NetworkInterface(const NetworkInterface& interfc);
+ /// Creates the NetworkInterface by copying another one.
+
+ ~NetworkInterface();
+ /// Destroys the NetworkInterface.
+
+ NetworkInterface& operator = (const NetworkInterface& interfc);
+ /// Assigns another NetworkInterface.
+
+ bool operator < (const NetworkInterface& other) const;
+ /// Operator less-than.
+
+ bool operator == (const NetworkInterface& other) const;
+ /// Operator equal. Compares interface indices.
+
+ void swap(NetworkInterface& other);
+ /// Swaps the NetworkInterface with another one.
+
+ unsigned index() const;
+ /// Returns the interface OS index.
+
+ const std::string& name() const;
+ /// Returns the interface name.
+
+ const std::string& displayName() const;
+ /// Returns the interface display name.
+ ///
+ /// On Windows platforms, this is currently the network adapter
+ /// name. This may change to the "friendly name" of the network
+ /// connection in a future version, however.
+ ///
+ /// On other platforms this is the same as name().
+
+ const std::string& adapterName() const;
+ /// Returns the interface adapter name.
+ ///
+ /// On Windows platforms, this is the network adapter LUID.
+ /// The adapter name is used by some Windows Net APIs like DHCP.
+ ///
+ /// On other platforms this is the same as name().
+
+ const IPAddress& firstAddress(IPAddress::Family family) const;
+ /// Returns the first IP address bound to the interface.
+ /// Throws NotFoundException if the address family is not
+ /// configured on the interface.
+
+ void firstAddress(IPAddress& addr, IPAddress::Family family = IPAddress::IPv4) const;
+ /// Returns the first IP address bound to the interface.
+ /// If the address family is not configured on the interface,
+ /// the address returned in addr will be unspecified (wildcard).
+
+ const IPAddress& address(unsigned index = 0) const;
+ /// Returns the IP address bound to the interface at index position.
+
+ void addAddress(const IPAddress& address);
+ /// Adds address to the interface.
+
+ void addAddress(const IPAddress& address, const IPAddress& subnetMask, const IPAddress& broadcastAddress);
+ /// Adds address to the interface.
+
+ const AddressList& addressList() const;
+ /// Returns the list of IP addresses bound to the interface.
+
+ const IPAddress& subnetMask(unsigned index = 0) const;
+ /// Returns the subnet mask for this network interface.
+
+ const IPAddress& broadcastAddress(unsigned index = 0) const;
+ /// Returns the broadcast address for this network interface.
+
+ const IPAddress& destAddress(unsigned index = 0) const;
+ /// Returns the IPv4 point-to-point destination address for this network interface.
+
+ const MACAddress& macAddress() const;
+ /// Returns MAC (Media Access Control) address for the interface.
+
+ unsigned mtu() const;
+ /// Returns the MTU for this interface.
+
+ NetworkInterface::Type type() const;
+ /// returns the MIB IfType of the interface.
+
+ bool supportsIP() const;
+ /// Returns true if the interface supports IP.
+
+ bool supportsIPv4() const;
+ /// Returns true if the interface supports IPv4.
+
+ bool supportsIPv6() const;
+ /// Returns true if the interface supports IPv6.
+
+ bool supportsBroadcast() const;
+ /// Returns true if the interface supports broadcast.
+
+ bool supportsMulticast() const;
+ /// Returns true if the interface supports multicast.
+
+ bool isLoopback() const;
+ /// Returns true if the interface is loopback.
+
+ bool isPointToPoint() const;
+ /// Returns true if the interface is point-to-point.
+
+ bool isRunning() const;
+ /// Returns true if the interface is running.
+
+ bool isUp() const;
+ /// Returns true if the interface is up.
+
+ static NetworkInterface forName(const std::string& name, bool requireIPv6 = false);
+ /// Returns the NetworkInterface for the given name.
///
- /// If upOnly is true, only interfaces being up are returned.
- /// Otherwise, both interfaces being up and down are returned.
+ /// If requireIPv6 is false, an IPv4 interface is returned.
+ /// Otherwise, an IPv6 interface is returned.
+ ///
+ /// Throws an InterfaceNotFoundException if an interface
+ /// with the give name does not exist.
+
+ static NetworkInterface forName(const std::string& name, IPVersion ipVersion);
+ /// Returns the NetworkInterface for the given name.
///
- /// If there are multiple addresses bound to one interface,
- /// they are contained within the NetworkInterface (second)
- /// member of the pair.
-
-protected:
- NetworkInterface(const std::string& name, const std::string& displayName, const std::string& adapterName, const IPAddress& address, unsigned index, MACAddress* pMACAddress = 0);
- /// Creates the NetworkInterface.
-
- NetworkInterface(const std::string& name, const std::string& displayName, const std::string& adapterName, unsigned index, MACAddress* pMACAddress = 0);
- /// Creates the NetworkInterface.
-
- NetworkInterface(const std::string& name, const IPAddress& address, unsigned index, MACAddress* pMACAddress = 0);
- /// Creates the NetworkInterface.
-
- NetworkInterface(const std::string& name,
- const std::string& displayName,
- const std::string& adapterName,
- const IPAddress& address,
- const IPAddress& subnetMask,
- const IPAddress& broadcastAddress,
- unsigned index,
- MACAddress* pMACAddress = 0);
- /// Creates the NetworkInterface.
-
- NetworkInterface(const std::string& name,
- const IPAddress& address,
- const IPAddress& subnetMask,
- const IPAddress& broadcastAddress,
- unsigned index,
- MACAddress* pMACAddress = 0);
- /// Creates the NetworkInterface.
-
- IPAddress interfaceNameToAddress(const std::string& interfaceName) const;
- /// Determines the IPAddress bound to the interface with the given name.
-
- unsigned interfaceNameToIndex(const std::string& interfaceName) const;
- /// Determines the interface index of the interface with the given name.
-
- NetworkInterfaceImpl& impl() { return *_pImpl; };
-
-private:
- NetworkInterfaceImpl* _pImpl;
-
- static Poco::FastMutex _mutex;
-};
-
-
-///
-/// inlines
-///
-
-
-inline bool NetworkInterface::operator < (const NetworkInterface& other) const
-{
- return this->index() < other.index();
-}
-
-
-inline bool NetworkInterface::operator == (const NetworkInterface& other) const
-{
- return this->index() == other.index();
-}
-
-
-} } // namespace Poco::Net
-
-
-Net_API std::ostream& operator << (std::ostream& ostr, const Poco::Net::NetworkInterface::MACAddress& addr);
-
-
-#endif // POCO_NET_HAS_INTERFACE
-
-
-#endif // Net_NetworkInterface_INCLUDED
+ /// The ipVersion argument can be used to specify whether
+ /// an IPv4 (IPv4_ONLY) or IPv6 (IPv6_ONLY) interface is required,
+ /// or whether the caller does not care (IPv4_OR_IPv6).
+ ///
+ /// Throws an InterfaceNotFoundException if an interface
+ /// with the give name does not exist.
+
+ static NetworkInterface forAddress(const IPAddress& address);
+ /// Returns the NetworkInterface for the given IP address.
+ ///
+ /// Throws an InterfaceNotFoundException if an interface
+ /// with the give address does not exist.
+
+ static NetworkInterface forIndex(unsigned index);
+ /// Returns the NetworkInterface for the given interface index.
+ ///
+ /// Throws an InterfaceNotFoundException if an interface
+ /// with the given index does not exist.
+
+ static List list(bool ipOnly = true, bool upOnly = true);
+ /// Returns a list with all network interfaces
+ /// on the system.
+ ///
+ /// If ipOnly is true, only interfaces supporting IP
+ /// are returned. Otherwise, all system network interfaces
+ /// are returned.
+ ///
+ /// If upOnly is true, only interfaces being up are returned.
+ /// Otherwise, both interfaces being up and down are returned.
+ ///
+ /// If there are multiple addresses bound to one interface,
+ /// multiple NetworkInterface entries are listed for
+ /// the same interface.
+
+ static Map map(bool ipOnly = true, bool upOnly = true);
+ /// Returns a map containing system network interfaces
+ /// Map is keyed by interface system indices.
+ ///
+ /// If ipOnly is true, only interfaces supporting IP
+ /// are returned. Otherwise, all system network interfaces
+ /// are returned.
+ ///
+ /// If upOnly is true, only interfaces being up are returned.
+ /// Otherwise, both interfaces being up and down are returned.
+ ///
+ /// If there are multiple addresses bound to one interface,
+ /// they are contained within the NetworkInterface (second)
+ /// member of the pair.
+
+protected:
+ NetworkInterface(const std::string& name, const std::string& displayName, const std::string& adapterName, const IPAddress& address, unsigned index, MACAddress* pMACAddress = 0);
+ /// Creates the NetworkInterface.
+
+ NetworkInterface(const std::string& name, const std::string& displayName, const std::string& adapterName, unsigned index, MACAddress* pMACAddress = 0);
+ /// Creates the NetworkInterface.
+
+ NetworkInterface(const std::string& name, const IPAddress& address, unsigned index, MACAddress* pMACAddress = 0);
+ /// Creates the NetworkInterface.
+
+ NetworkInterface(const std::string& name,
+ const std::string& displayName,
+ const std::string& adapterName,
+ const IPAddress& address,
+ const IPAddress& subnetMask,
+ const IPAddress& broadcastAddress,
+ unsigned index,
+ MACAddress* pMACAddress = 0);
+ /// Creates the NetworkInterface.
+
+ NetworkInterface(const std::string& name,
+ const IPAddress& address,
+ const IPAddress& subnetMask,
+ const IPAddress& broadcastAddress,
+ unsigned index,
+ MACAddress* pMACAddress = 0);
+ /// Creates the NetworkInterface.
+
+ IPAddress interfaceNameToAddress(const std::string& interfaceName) const;
+ /// Determines the IPAddress bound to the interface with the given name.
+
+ unsigned interfaceNameToIndex(const std::string& interfaceName) const;
+ /// Determines the interface index of the interface with the given name.
+
+ NetworkInterfaceImpl& impl() { return *_pImpl; };
+
+private:
+ NetworkInterfaceImpl* _pImpl;
+
+ static Poco::FastMutex _mutex;
+};
+
+
+///
+/// inlines
+///
+
+
+inline bool NetworkInterface::operator < (const NetworkInterface& other) const
+{
+ return this->index() < other.index();
+}
+
+
+inline bool NetworkInterface::operator == (const NetworkInterface& other) const
+{
+ return this->index() == other.index();
+}
+
+
+} } // namespace Poco::Net
+
+
+Net_API std::ostream& operator << (std::ostream& ostr, const Poco::Net::NetworkInterface::MACAddress& addr);
+
+
+#endif // POCO_NET_HAS_INTERFACE
+
+
+#endif // Net_NetworkInterface_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/NullPartHandler.h b/contrib/libs/poco/Net/include/Poco/Net/NullPartHandler.h
index ce9ed0c40d..21c45c6805 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/NullPartHandler.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/NullPartHandler.h
@@ -1,47 +1,47 @@
-//
-// NullPartHandler.h
-//
-// Library: Net
-// Package: Messages
-// Module: NullPartHandler
-//
-// Definition of the NullPartHandler class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_NullPartHandler_INCLUDED
-#define Net_NullPartHandler_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/PartHandler.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API NullPartHandler: public PartHandler
- /// A very special PartHandler that simply discards all data.
-{
-public:
- NullPartHandler();
- /// Creates the NullPartHandler.
-
- ~NullPartHandler();
- /// Destroys the NullPartHandler.
-
- void handlePart(const MessageHeader& header, std::istream& stream);
- /// Reads and discards all data from the stream.
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_NullPartHandler_INCLUDED
+//
+// NullPartHandler.h
+//
+// Library: Net
+// Package: Messages
+// Module: NullPartHandler
+//
+// Definition of the NullPartHandler class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_NullPartHandler_INCLUDED
+#define Net_NullPartHandler_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/PartHandler.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API NullPartHandler: public PartHandler
+ /// A very special PartHandler that simply discards all data.
+{
+public:
+ NullPartHandler();
+ /// Creates the NullPartHandler.
+
+ ~NullPartHandler();
+ /// Destroys the NullPartHandler.
+
+ void handlePart(const MessageHeader& header, std::istream& stream);
+ /// Reads and discards all data from the stream.
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_NullPartHandler_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/OAuth10Credentials.h b/contrib/libs/poco/Net/include/Poco/Net/OAuth10Credentials.h
index e0d06e7f0b..1402d40d5b 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/OAuth10Credentials.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/OAuth10Credentials.h
@@ -1,274 +1,274 @@
-//
-// OAuth10Credentials.h
-//
-// Library: Net
-// Package: OAuth
-// Module: OAuth10Credentials
-//
-// Definition of the OAuth10Credentials class.
-//
-// Copyright (c) 2014, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_OAuth10Credentials_INCLUDED
-#define Net_OAuth10Credentials_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/URI.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class HTTPRequest;
-class HTMLForm;
-
-
-class Net_API OAuth10Credentials
- /// This class implements OAuth 1.0A authentication for HTTP requests,
- /// according to RFC 5849.
- ///
- /// Only PLAINTEXT and HMAC-SHA1 signature methods are
- /// supported. The RSA-SHA1 signature method is not supported.
+//
+// OAuth10Credentials.h
+//
+// Library: Net
+// Package: OAuth
+// Module: OAuth10Credentials
+//
+// Definition of the OAuth10Credentials class.
+//
+// Copyright (c) 2014, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_OAuth10Credentials_INCLUDED
+#define Net_OAuth10Credentials_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/URI.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class HTTPRequest;
+class HTMLForm;
+
+
+class Net_API OAuth10Credentials
+ /// This class implements OAuth 1.0A authentication for HTTP requests,
+ /// according to RFC 5849.
///
- /// The OAuth10Credentials can be used to sign a client request, as
- /// well as to verify the signature of a request on the server.
- ///
- /// To sign a client request, using a known consumer (client) key, consumer (client) secret,
- /// OAuth token and token secret:
- ///
- /// 1. Create an OAuth10Credentials object using all four credentials, either using
- /// the four argument constructor, or by using the default constructor and setting
- /// the credentials using the setter methods.
- /// 2. Create a URI containing the full request URI.
- /// 3. Create an appropriate HTTPRequest object.
- /// 4. Optionally, create a HTMLForm object containing additional parameters to sign.
- /// 5. Sign the request by calling authenticate(). This will add an OAuth
- /// Authorization header to the request.
- /// 6. Send the request using a HTTPClientSession.
- ///
- /// To request the OAuth request token from a server, using only the consumer (client) key
- /// and consumer (client) secret:
- ///
- /// 1. Create an OAuth10Credentials object using the two consumer credentials, either using
- /// the two argument constructor, or by using the default constructor and setting
- /// the credentials using the setter methods.
- /// 2. Specify the callback URI using setCallback().
- /// 3. Create a URI containing the full request URI to obtain the token.
- /// 4. Create an appropriate HTTPRequest object.
- /// 5. Sign the request by calling authenticate(). This will add an OAuth
- /// Authorization header to the request.
- /// 6. Send the request using a HTTPClientSession.
- /// 7. The response will contain the request token and request token secret.
- /// These can be extracted from the response body using a HTMLForm object.
- ///
- /// Requesting the access token and secret (temporary credentials) from the server
- /// is analogous to signing a client request using consumer key, consumer secret,
- /// request token and request token secret.
- /// The server response will contain the access token and access token secret,
- /// which can again be extracted from the response body using a HTMLForm object.
- ///
- /// To verify a request on the server:
- ///
- /// 1. Create an OAuth10Credentials object using the constructor taking a
- /// HTTPRequest object. This will extract the consumer key and token (if
- /// provided).
- /// 2. Provide the consumer secret and token secret (if required) matching the
- /// consumer key and token to the OAuth10Credentials object using the
- /// setter methods.
- /// 3. Create an URI object containing the full request URI.
- /// 4. Call verify() to verify the signature.
- /// 5. If verification was successful, and the request was a request for
- /// a request (temporary) token, call getCallback() to
- /// obtain the callback URI provided by the client.
-{
-public:
- enum SignatureMethod
- /// OAuth 1.0A Signature Method.
- {
- SIGN_PLAINTEXT, /// OAuth 1.0A PLAINTEXT signature method
- SIGN_HMAC_SHA1 /// OAuth 1.0A HMAC-SHA1 signature method
- };
-
- OAuth10Credentials();
- /// Creates an empty OAuth10Credentials object.
-
- OAuth10Credentials(const std::string& consumerKey, const std::string& consumerSecret);
- /// Creates an OAuth10Credentials object with the given consumer key and consumer secret.
- ///
- /// The token and tokenSecret will be left empty.
-
- OAuth10Credentials(const std::string& consumerKey, const std::string& consumerSecret, const std::string& token, const std::string& tokenSecret);
- /// Creates an OAuth10Credentials object with the given consumer key and
- /// consumer secret, as well as token and token secret.
-
- explicit OAuth10Credentials(const HTTPRequest& request);
- /// Creates an OAuth10Credentials object from a HTTPRequest object.
- ///
- /// Extracts consumer key and token (if available) from the Authorization header.
- ///
- /// Throws a NotAuthenticatedException if the request does
- /// not contain OAuth 1.0 credentials.
-
- ~OAuth10Credentials();
- /// Destroys the OAuth10Credentials.
-
- void setConsumerKey(const std::string& consumerKey);
- /// Sets the consumer key.
-
- const std::string& getConsumerKey() const;
- /// Returns the consumer key.
-
- void setConsumerSecret(const std::string& consumerSecret);
- /// Sets the consumer secret.
-
- const std::string& getConsumerSecret() const;
- /// Returns the consumer secret.
-
- void setToken(const std::string& token);
- /// Sets the token.
-
- const std::string& getToken() const;
- /// Returns the token.
-
- void setTokenSecret(const std::string& tokenSecret);
- /// Sets the token.
-
- const std::string& getTokenSecret() const;
- /// Returns the token secret.
-
- void setRealm(const std::string& realm);
- /// Sets the optional realm to be included in the Authorization header.
-
- const std::string& getRealm() const;
- /// Returns the optional realm to be included in the Authorization header.
-
- void setCallback(const std::string& uri);
- /// Sets the callback URI.
-
- const std::string& getCallback() const;
- /// Returns the callback URI.
-
- void authenticate(HTTPRequest& request, const Poco::URI& uri, SignatureMethod method = SIGN_HMAC_SHA1);
- /// Adds an OAuth 1.0A Authentication header to the given request, using
- /// the given signature method.
-
- void authenticate(HTTPRequest& request, const Poco::URI& uri, const Poco::Net::HTMLForm& params, SignatureMethod method = SIGN_HMAC_SHA1);
- /// Adds an OAuth 1.0A Authentication header to the given request, using
- /// the given signature method.
-
- bool verify(const HTTPRequest& request, const Poco::URI& uri);
- /// Verifies the signature of the given request.
- ///
- /// The consumer key, consumer secret, token and token secret must have been set.
- ///
- /// Returns true if the signature is valid, otherwise false.
- ///
- /// Throws a NotAuthenticatedException if the request does not contain OAuth
- /// credentials, or in case of an unsupported OAuth version or signature method.
-
- bool verify(const HTTPRequest& request, const Poco::URI& uri, const Poco::Net::HTMLForm& params);
- /// Verifies the signature of the given request.
- ///
- /// The consumer key, consumer secret, token and token secret must have been set.
- ///
- /// Returns true if the signature is valid, otherwise false.
- ///
- /// Throws a NotAuthenticatedException if the request does not contain OAuth
- /// credentials, or in case of an unsupported OAuth version or signature method.
-
- void nonceAndTimestampForTesting(const std::string& nonce, const std::string& timestamp);
- /// Sets the nonce and timestamp to a wellknown value.
- ///
- /// For use by testsuite only, to test the signature
- /// algorithm with wellknown inputs.
- ///
- /// In normal operation, the nonce is a random value
- /// computed by createNonce() and the timestamp is taken
- /// from the system time.
-
- static const std::string SCHEME;
-
-protected:
- void signPlaintext(Poco::Net::HTTPRequest& request) const;
- /// Signs the given HTTP request according to OAuth 1.0A PLAINTEXT signature method.
-
- void signHMACSHA1(Poco::Net::HTTPRequest& request, const std::string& uri, const Poco::Net::HTMLForm& params) const;
- /// Signs the given HTTP request according to OAuth 1.0A HMAC-SHA1 signature method.
-
- std::string createNonce() const;
- /// Creates a nonce, which is basically a Base64-encoded 32 character random
- /// string, with non-alphanumeric characters removed.
-
- std::string createSignature(const Poco::Net::HTTPRequest& request, const std::string& uri, const Poco::Net::HTMLForm& params, const std::string& nonce, const std::string& timestamp) const;
- /// Creates a OAuth signature for the given request and its parameters, according
- /// to <https://dev.twitter.com/docs/auth/creating-signature>.
-
- static std::string percentEncode(const std::string& str);
- /// Percent-encodes the given string according to Twitter API's rules,
- /// given in <https://dev.twitter.com/docs/auth/percent-encoding-parameters>.
-
-private:
- OAuth10Credentials(const OAuth10Credentials&);
- OAuth10Credentials& operator = (const OAuth10Credentials&);
-
- std::string _consumerKey;
- std::string _consumerSecret;
- std::string _token;
- std::string _tokenSecret;
- std::string _callback;
- std::string _realm;
- std::string _nonce;
- std::string _timestamp;
-};
-
-
-//
-// inlines
-//
-inline const std::string& OAuth10Credentials::getConsumerKey() const
-{
- return _consumerKey;
-}
-
-
-inline const std::string& OAuth10Credentials::getConsumerSecret() const
-{
- return _consumerSecret;
-}
-
-
-inline const std::string& OAuth10Credentials::getToken() const
-{
- return _token;
-}
-
-
-inline const std::string& OAuth10Credentials::getTokenSecret() const
-{
- return _tokenSecret;
-}
-
-
-inline const std::string& OAuth10Credentials::getRealm() const
-{
- return _realm;
-}
-
-
-inline const std::string& OAuth10Credentials::getCallback() const
-{
- return _callback;
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_OAuth10Credentials_INCLUDED
+ /// Only PLAINTEXT and HMAC-SHA1 signature methods are
+ /// supported. The RSA-SHA1 signature method is not supported.
+ ///
+ /// The OAuth10Credentials can be used to sign a client request, as
+ /// well as to verify the signature of a request on the server.
+ ///
+ /// To sign a client request, using a known consumer (client) key, consumer (client) secret,
+ /// OAuth token and token secret:
+ ///
+ /// 1. Create an OAuth10Credentials object using all four credentials, either using
+ /// the four argument constructor, or by using the default constructor and setting
+ /// the credentials using the setter methods.
+ /// 2. Create a URI containing the full request URI.
+ /// 3. Create an appropriate HTTPRequest object.
+ /// 4. Optionally, create a HTMLForm object containing additional parameters to sign.
+ /// 5. Sign the request by calling authenticate(). This will add an OAuth
+ /// Authorization header to the request.
+ /// 6. Send the request using a HTTPClientSession.
+ ///
+ /// To request the OAuth request token from a server, using only the consumer (client) key
+ /// and consumer (client) secret:
+ ///
+ /// 1. Create an OAuth10Credentials object using the two consumer credentials, either using
+ /// the two argument constructor, or by using the default constructor and setting
+ /// the credentials using the setter methods.
+ /// 2. Specify the callback URI using setCallback().
+ /// 3. Create a URI containing the full request URI to obtain the token.
+ /// 4. Create an appropriate HTTPRequest object.
+ /// 5. Sign the request by calling authenticate(). This will add an OAuth
+ /// Authorization header to the request.
+ /// 6. Send the request using a HTTPClientSession.
+ /// 7. The response will contain the request token and request token secret.
+ /// These can be extracted from the response body using a HTMLForm object.
+ ///
+ /// Requesting the access token and secret (temporary credentials) from the server
+ /// is analogous to signing a client request using consumer key, consumer secret,
+ /// request token and request token secret.
+ /// The server response will contain the access token and access token secret,
+ /// which can again be extracted from the response body using a HTMLForm object.
+ ///
+ /// To verify a request on the server:
+ ///
+ /// 1. Create an OAuth10Credentials object using the constructor taking a
+ /// HTTPRequest object. This will extract the consumer key and token (if
+ /// provided).
+ /// 2. Provide the consumer secret and token secret (if required) matching the
+ /// consumer key and token to the OAuth10Credentials object using the
+ /// setter methods.
+ /// 3. Create an URI object containing the full request URI.
+ /// 4. Call verify() to verify the signature.
+ /// 5. If verification was successful, and the request was a request for
+ /// a request (temporary) token, call getCallback() to
+ /// obtain the callback URI provided by the client.
+{
+public:
+ enum SignatureMethod
+ /// OAuth 1.0A Signature Method.
+ {
+ SIGN_PLAINTEXT, /// OAuth 1.0A PLAINTEXT signature method
+ SIGN_HMAC_SHA1 /// OAuth 1.0A HMAC-SHA1 signature method
+ };
+
+ OAuth10Credentials();
+ /// Creates an empty OAuth10Credentials object.
+
+ OAuth10Credentials(const std::string& consumerKey, const std::string& consumerSecret);
+ /// Creates an OAuth10Credentials object with the given consumer key and consumer secret.
+ ///
+ /// The token and tokenSecret will be left empty.
+
+ OAuth10Credentials(const std::string& consumerKey, const std::string& consumerSecret, const std::string& token, const std::string& tokenSecret);
+ /// Creates an OAuth10Credentials object with the given consumer key and
+ /// consumer secret, as well as token and token secret.
+
+ explicit OAuth10Credentials(const HTTPRequest& request);
+ /// Creates an OAuth10Credentials object from a HTTPRequest object.
+ ///
+ /// Extracts consumer key and token (if available) from the Authorization header.
+ ///
+ /// Throws a NotAuthenticatedException if the request does
+ /// not contain OAuth 1.0 credentials.
+
+ ~OAuth10Credentials();
+ /// Destroys the OAuth10Credentials.
+
+ void setConsumerKey(const std::string& consumerKey);
+ /// Sets the consumer key.
+
+ const std::string& getConsumerKey() const;
+ /// Returns the consumer key.
+
+ void setConsumerSecret(const std::string& consumerSecret);
+ /// Sets the consumer secret.
+
+ const std::string& getConsumerSecret() const;
+ /// Returns the consumer secret.
+
+ void setToken(const std::string& token);
+ /// Sets the token.
+
+ const std::string& getToken() const;
+ /// Returns the token.
+
+ void setTokenSecret(const std::string& tokenSecret);
+ /// Sets the token.
+
+ const std::string& getTokenSecret() const;
+ /// Returns the token secret.
+
+ void setRealm(const std::string& realm);
+ /// Sets the optional realm to be included in the Authorization header.
+
+ const std::string& getRealm() const;
+ /// Returns the optional realm to be included in the Authorization header.
+
+ void setCallback(const std::string& uri);
+ /// Sets the callback URI.
+
+ const std::string& getCallback() const;
+ /// Returns the callback URI.
+
+ void authenticate(HTTPRequest& request, const Poco::URI& uri, SignatureMethod method = SIGN_HMAC_SHA1);
+ /// Adds an OAuth 1.0A Authentication header to the given request, using
+ /// the given signature method.
+
+ void authenticate(HTTPRequest& request, const Poco::URI& uri, const Poco::Net::HTMLForm& params, SignatureMethod method = SIGN_HMAC_SHA1);
+ /// Adds an OAuth 1.0A Authentication header to the given request, using
+ /// the given signature method.
+
+ bool verify(const HTTPRequest& request, const Poco::URI& uri);
+ /// Verifies the signature of the given request.
+ ///
+ /// The consumer key, consumer secret, token and token secret must have been set.
+ ///
+ /// Returns true if the signature is valid, otherwise false.
+ ///
+ /// Throws a NotAuthenticatedException if the request does not contain OAuth
+ /// credentials, or in case of an unsupported OAuth version or signature method.
+
+ bool verify(const HTTPRequest& request, const Poco::URI& uri, const Poco::Net::HTMLForm& params);
+ /// Verifies the signature of the given request.
+ ///
+ /// The consumer key, consumer secret, token and token secret must have been set.
+ ///
+ /// Returns true if the signature is valid, otherwise false.
+ ///
+ /// Throws a NotAuthenticatedException if the request does not contain OAuth
+ /// credentials, or in case of an unsupported OAuth version or signature method.
+
+ void nonceAndTimestampForTesting(const std::string& nonce, const std::string& timestamp);
+ /// Sets the nonce and timestamp to a wellknown value.
+ ///
+ /// For use by testsuite only, to test the signature
+ /// algorithm with wellknown inputs.
+ ///
+ /// In normal operation, the nonce is a random value
+ /// computed by createNonce() and the timestamp is taken
+ /// from the system time.
+
+ static const std::string SCHEME;
+
+protected:
+ void signPlaintext(Poco::Net::HTTPRequest& request) const;
+ /// Signs the given HTTP request according to OAuth 1.0A PLAINTEXT signature method.
+
+ void signHMACSHA1(Poco::Net::HTTPRequest& request, const std::string& uri, const Poco::Net::HTMLForm& params) const;
+ /// Signs the given HTTP request according to OAuth 1.0A HMAC-SHA1 signature method.
+
+ std::string createNonce() const;
+ /// Creates a nonce, which is basically a Base64-encoded 32 character random
+ /// string, with non-alphanumeric characters removed.
+
+ std::string createSignature(const Poco::Net::HTTPRequest& request, const std::string& uri, const Poco::Net::HTMLForm& params, const std::string& nonce, const std::string& timestamp) const;
+ /// Creates a OAuth signature for the given request and its parameters, according
+ /// to <https://dev.twitter.com/docs/auth/creating-signature>.
+
+ static std::string percentEncode(const std::string& str);
+ /// Percent-encodes the given string according to Twitter API's rules,
+ /// given in <https://dev.twitter.com/docs/auth/percent-encoding-parameters>.
+
+private:
+ OAuth10Credentials(const OAuth10Credentials&);
+ OAuth10Credentials& operator = (const OAuth10Credentials&);
+
+ std::string _consumerKey;
+ std::string _consumerSecret;
+ std::string _token;
+ std::string _tokenSecret;
+ std::string _callback;
+ std::string _realm;
+ std::string _nonce;
+ std::string _timestamp;
+};
+
+
+//
+// inlines
+//
+inline const std::string& OAuth10Credentials::getConsumerKey() const
+{
+ return _consumerKey;
+}
+
+
+inline const std::string& OAuth10Credentials::getConsumerSecret() const
+{
+ return _consumerSecret;
+}
+
+
+inline const std::string& OAuth10Credentials::getToken() const
+{
+ return _token;
+}
+
+
+inline const std::string& OAuth10Credentials::getTokenSecret() const
+{
+ return _tokenSecret;
+}
+
+
+inline const std::string& OAuth10Credentials::getRealm() const
+{
+ return _realm;
+}
+
+
+inline const std::string& OAuth10Credentials::getCallback() const
+{
+ return _callback;
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_OAuth10Credentials_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/OAuth20Credentials.h b/contrib/libs/poco/Net/include/Poco/Net/OAuth20Credentials.h
index 04ab66e35d..6935f2dfa6 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/OAuth20Credentials.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/OAuth20Credentials.h
@@ -1,132 +1,132 @@
-//
-// OAuth20Credentials.h
-//
-// Library: Net
-// Package: OAuth
-// Module: OAuth20Credentials
-//
-// Definition of the OAuth20Credentials class.
-//
-// Copyright (c) 2014, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_OAuth20Credentials_INCLUDED
-#define Net_OAuth20Credentials_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class HTTPRequest;
-
-
-class Net_API OAuth20Credentials
- /// This class implements OAuth 2.0 authentication for HTTP requests,
- /// via Bearer tokens in the Authorization header,
- /// according to RFC 6749 and RFC 6750.
- ///
- /// To add an Authorization header containing a bearer token
- /// to a HTTPRequest object, create an OAuth20Credentials object
- /// with the bearer token and call authenticate().
- ///
- /// The bearer token can also be extracted from a HTTPRequest
- /// by creating the OAuth20Credentials object with a HTTPRequest
- /// object containing a "Bearer" Authorization header and
- /// calling getBearerToken().
- ///
- /// The authorization header scheme can be changed from
- /// "Bearer" to a custom value. For example, GitHub uses
- /// the "token" scheme.
-{
-public:
- OAuth20Credentials();
- /// Creates an empty OAuth20Credentials object.
-
- explicit OAuth20Credentials(const std::string& bearerToken);
- /// Creates an OAuth20Credentials object with the given bearer token.
-
- OAuth20Credentials(const std::string& bearerToken, const std::string& scheme);
- /// Creates an OAuth20Credentials object with the given bearer token
- /// and authorization scheme, which overrides the default scheme ("Bearer").
- ///
- /// This is useful for services like GitHub, which use "token" as scheme.
-
- explicit OAuth20Credentials(const HTTPRequest& request);
- /// Creates an OAuth20Credentials object from a HTTPRequest object.
- ///
- /// Extracts bearer token from the Authorization header, which
- /// must use the "Bearer" authorization scheme.
- ///
- /// Throws a NotAuthenticatedException if the request does
- /// not contain a bearer token in the Authorization header.
-
- OAuth20Credentials(const HTTPRequest& request, const std::string& scheme);
- /// Creates an OAuth20Credentials object from a HTTPRequest object.
- ///
- /// Extracts bearer token from the Authorization header, which must
- /// use the given authorization scheme.
- ///
- /// Throws a NotAuthenticatedException if the request does
- /// not contain a bearer token in the Authorization header.
-
- ~OAuth20Credentials();
- /// Destroys the HTTPCredentials.
-
- void setBearerToken(const std::string& bearerToken);
- /// Sets the bearer token.
-
- const std::string& getBearerToken() const;
- /// Returns the bearer token.
-
- void setScheme(const std::string& scheme);
- /// Sets the Authorization header scheme.
-
- const std::string& getScheme() const;
- /// Returns the Authorization header scheme.
-
- void authenticate(HTTPRequest& request);
- /// Adds an Authorization header containing the bearer token to
- /// the HTTPRequest.
-
- static const std::string SCHEME;
-
-protected:
- void extractBearerToken(const HTTPRequest& request);
- /// Extracts the bearer token from the HTTPRequest.
-
-private:
- OAuth20Credentials(const OAuth20Credentials&);
- OAuth20Credentials& operator = (const OAuth20Credentials&);
-
- std::string _bearerToken;
- std::string _scheme;
-};
-
-
-//
-// inlines
-//
-inline const std::string& OAuth20Credentials::getBearerToken() const
-{
- return _bearerToken;
-}
-
-
-inline const std::string& OAuth20Credentials::getScheme() const
-{
- return _scheme;
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_OAuth20Credentials_INCLUDED
+//
+// OAuth20Credentials.h
+//
+// Library: Net
+// Package: OAuth
+// Module: OAuth20Credentials
+//
+// Definition of the OAuth20Credentials class.
+//
+// Copyright (c) 2014, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_OAuth20Credentials_INCLUDED
+#define Net_OAuth20Credentials_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class HTTPRequest;
+
+
+class Net_API OAuth20Credentials
+ /// This class implements OAuth 2.0 authentication for HTTP requests,
+ /// via Bearer tokens in the Authorization header,
+ /// according to RFC 6749 and RFC 6750.
+ ///
+ /// To add an Authorization header containing a bearer token
+ /// to a HTTPRequest object, create an OAuth20Credentials object
+ /// with the bearer token and call authenticate().
+ ///
+ /// The bearer token can also be extracted from a HTTPRequest
+ /// by creating the OAuth20Credentials object with a HTTPRequest
+ /// object containing a "Bearer" Authorization header and
+ /// calling getBearerToken().
+ ///
+ /// The authorization header scheme can be changed from
+ /// "Bearer" to a custom value. For example, GitHub uses
+ /// the "token" scheme.
+{
+public:
+ OAuth20Credentials();
+ /// Creates an empty OAuth20Credentials object.
+
+ explicit OAuth20Credentials(const std::string& bearerToken);
+ /// Creates an OAuth20Credentials object with the given bearer token.
+
+ OAuth20Credentials(const std::string& bearerToken, const std::string& scheme);
+ /// Creates an OAuth20Credentials object with the given bearer token
+ /// and authorization scheme, which overrides the default scheme ("Bearer").
+ ///
+ /// This is useful for services like GitHub, which use "token" as scheme.
+
+ explicit OAuth20Credentials(const HTTPRequest& request);
+ /// Creates an OAuth20Credentials object from a HTTPRequest object.
+ ///
+ /// Extracts bearer token from the Authorization header, which
+ /// must use the "Bearer" authorization scheme.
+ ///
+ /// Throws a NotAuthenticatedException if the request does
+ /// not contain a bearer token in the Authorization header.
+
+ OAuth20Credentials(const HTTPRequest& request, const std::string& scheme);
+ /// Creates an OAuth20Credentials object from a HTTPRequest object.
+ ///
+ /// Extracts bearer token from the Authorization header, which must
+ /// use the given authorization scheme.
+ ///
+ /// Throws a NotAuthenticatedException if the request does
+ /// not contain a bearer token in the Authorization header.
+
+ ~OAuth20Credentials();
+ /// Destroys the HTTPCredentials.
+
+ void setBearerToken(const std::string& bearerToken);
+ /// Sets the bearer token.
+
+ const std::string& getBearerToken() const;
+ /// Returns the bearer token.
+
+ void setScheme(const std::string& scheme);
+ /// Sets the Authorization header scheme.
+
+ const std::string& getScheme() const;
+ /// Returns the Authorization header scheme.
+
+ void authenticate(HTTPRequest& request);
+ /// Adds an Authorization header containing the bearer token to
+ /// the HTTPRequest.
+
+ static const std::string SCHEME;
+
+protected:
+ void extractBearerToken(const HTTPRequest& request);
+ /// Extracts the bearer token from the HTTPRequest.
+
+private:
+ OAuth20Credentials(const OAuth20Credentials&);
+ OAuth20Credentials& operator = (const OAuth20Credentials&);
+
+ std::string _bearerToken;
+ std::string _scheme;
+};
+
+
+//
+// inlines
+//
+inline const std::string& OAuth20Credentials::getBearerToken() const
+{
+ return _bearerToken;
+}
+
+
+inline const std::string& OAuth20Credentials::getScheme() const
+{
+ return _scheme;
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_OAuth20Credentials_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/POP3ClientSession.h b/contrib/libs/poco/Net/include/Poco/Net/POP3ClientSession.h
index 05fc09f135..a4b12ce1ed 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/POP3ClientSession.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/POP3ClientSession.h
@@ -1,185 +1,185 @@
-//
-// POP3ClientSession.h
-//
-// Library: Net
-// Package: Mail
-// Module: POP3ClientSession
-//
-// Definition of the POP3ClientSession class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_POP3ClientSession_INCLUDED
-#define Net_POP3ClientSession_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/DialogSocket.h"
-#include "Poco/Timespan.h"
-#include <ostream>
-#include <vector>
-
-
-namespace Poco {
-namespace Net {
-
-
-class MessageHeader;
-class MailMessage;
-class PartHandler;
-
-
-class Net_API POP3ClientSession
- /// This class implements an Post Office Protocol
- /// Version 3 (POP3, RFC 1939)
- /// client for receiving e-mail messages.
-{
-public:
- enum
- {
- POP3_PORT = 110
- };
-
- struct MessageInfo
- /// Information returned by listMessages().
- {
- int id;
- int size;
- };
-
- typedef std::vector<MessageInfo> MessageInfoVec;
-
- explicit POP3ClientSession(const StreamSocket& socket);
- /// Creates the POP3ClientSession using
- /// the given socket, which must be connected
- /// to a POP3 server.
-
- POP3ClientSession(const std::string& host, Poco::UInt16 port = POP3_PORT);
- /// Creates the POP3ClientSession using a socket connected
- /// to the given host and port.
-
- virtual ~POP3ClientSession();
- /// Destroys the SMTPClientSession.
-
- void setTimeout(const Poco::Timespan& timeout);
- /// Sets the timeout for socket read operations.
-
- Poco::Timespan getTimeout() const;
- /// Returns the timeout for socket read operations.
-
- void login(const std::string& username, const std::string& password);
- /// Logs in to the POP3 server by sending a USER command
- /// followed by a PASS command.
- ///
- /// Throws a POP3Exception in case of a POP3-specific error, or a
- /// NetException in case of a general network communication failure.
-
- void close();
- /// Sends a QUIT command and closes the connection to the server.
- ///
- /// Throws a POP3Exception in case of a POP3-specific error, or a
- /// NetException in case of a general network communication failure.
-
- int messageCount();
- /// Sends a STAT command to determine the number of messages
- /// available on the server and returns that number.
- ///
- /// Throws a POP3Exception in case of a POP3-specific error, or a
- /// NetException in case of a general network communication failure.
-
- void listMessages(MessageInfoVec& messages);
- /// Fills the given vector with the ids and sizes of all
- /// messages available on the server.
- ///
- /// Throws a POP3Exception in case of a POP3-specific error, or a
- /// NetException in case of a general network communication failure.
-
- void retrieveMessage(int id, MailMessage& message);
- /// Retrieves the message with the given id from the server and
- /// stores the raw message content in the message's
- /// content string, available with message.getContent().
- ///
- /// Throws a POP3Exception in case of a POP3-specific error, or a
- /// NetException in case of a general network communication failure.
-
- void retrieveMessage(int id, MailMessage& message, PartHandler& handler);
- /// Retrieves the message with the given id from the server and
- /// stores it in message.
- ///
- /// If the message has multiple parts, the parts
- /// are reported to the PartHandler. If the message
- /// is not a multi-part message, the content is stored
- /// in a string available by calling message.getContent().
- ///
- /// Throws a POP3Exception in case of a POP3-specific error, or a
- /// NetException in case of a general network communication failure.
-
- void retrieveMessage(int id, std::ostream& ostr);
- /// Retrieves the raw message with the given id from the
- /// server and copies it to the given output stream.
- ///
- /// Throws a POP3Exception in case of a POP3-specific error, or a
- /// NetException in case of a general network communication failure.
-
- void retrieveHeader(int id, MessageHeader& header);
- /// Retrieves the message header of the message with the
- /// given id and stores it in header.
- ///
- /// For this to work, the server must support the TOP command.
- ///
- /// Throws a POP3Exception in case of a POP3-specific error, or a
- /// NetException in case of a general network communication failure.
-
- void deleteMessage(int id);
- /// Marks the message with the given ID for deletion. The message
- /// will be deleted when the connection to the server is
- /// closed by calling close().
- ///
- /// Throws a POP3Exception in case of a POP3-specific error, or a
- /// NetException in case of a general network communication failure.
-
- bool sendCommand(const std::string& command, std::string& response);
- /// Sends the given command verbatim to the server
- /// and waits for a response.
- ///
- /// Returns true if the response is positive, false otherwise.
- ///
- /// Throws a POP3Exception in case of a POP3-specific error, or a
- /// NetException in case of a general network communication failure.
-
- bool sendCommand(const std::string& command, const std::string& arg, std::string& response);
- /// Sends the given command verbatim to the server
- /// and waits for a response.
- ///
- /// Returns true if the response is positive, false otherwise.
- ///
- /// Throws a POP3Exception in case of a POP3-specific error, or a
- /// NetException in case of a general network communication failure.
-
- bool sendCommand(const std::string& command, const std::string& arg1, const std::string& arg2, std::string& response);
- /// Sends the given command verbatim to the server
- /// and waits for a response.
- ///
- /// Returns true if the response is positive, false otherwise.
- ///
- /// Throws a POP3Exception in case of a POP3-specific error, or a
- /// NetException in case of a general network communication failure.
-
-protected:
- static bool isPositive(const std::string& response);
-
-private:
- DialogSocket _socket;
- bool _isOpen;
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_POP3ClientSession_INCLUDED
+//
+// POP3ClientSession.h
+//
+// Library: Net
+// Package: Mail
+// Module: POP3ClientSession
+//
+// Definition of the POP3ClientSession class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_POP3ClientSession_INCLUDED
+#define Net_POP3ClientSession_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/DialogSocket.h"
+#include "Poco/Timespan.h"
+#include <ostream>
+#include <vector>
+
+
+namespace Poco {
+namespace Net {
+
+
+class MessageHeader;
+class MailMessage;
+class PartHandler;
+
+
+class Net_API POP3ClientSession
+ /// This class implements an Post Office Protocol
+ /// Version 3 (POP3, RFC 1939)
+ /// client for receiving e-mail messages.
+{
+public:
+ enum
+ {
+ POP3_PORT = 110
+ };
+
+ struct MessageInfo
+ /// Information returned by listMessages().
+ {
+ int id;
+ int size;
+ };
+
+ typedef std::vector<MessageInfo> MessageInfoVec;
+
+ explicit POP3ClientSession(const StreamSocket& socket);
+ /// Creates the POP3ClientSession using
+ /// the given socket, which must be connected
+ /// to a POP3 server.
+
+ POP3ClientSession(const std::string& host, Poco::UInt16 port = POP3_PORT);
+ /// Creates the POP3ClientSession using a socket connected
+ /// to the given host and port.
+
+ virtual ~POP3ClientSession();
+ /// Destroys the SMTPClientSession.
+
+ void setTimeout(const Poco::Timespan& timeout);
+ /// Sets the timeout for socket read operations.
+
+ Poco::Timespan getTimeout() const;
+ /// Returns the timeout for socket read operations.
+
+ void login(const std::string& username, const std::string& password);
+ /// Logs in to the POP3 server by sending a USER command
+ /// followed by a PASS command.
+ ///
+ /// Throws a POP3Exception in case of a POP3-specific error, or a
+ /// NetException in case of a general network communication failure.
+
+ void close();
+ /// Sends a QUIT command and closes the connection to the server.
+ ///
+ /// Throws a POP3Exception in case of a POP3-specific error, or a
+ /// NetException in case of a general network communication failure.
+
+ int messageCount();
+ /// Sends a STAT command to determine the number of messages
+ /// available on the server and returns that number.
+ ///
+ /// Throws a POP3Exception in case of a POP3-specific error, or a
+ /// NetException in case of a general network communication failure.
+
+ void listMessages(MessageInfoVec& messages);
+ /// Fills the given vector with the ids and sizes of all
+ /// messages available on the server.
+ ///
+ /// Throws a POP3Exception in case of a POP3-specific error, or a
+ /// NetException in case of a general network communication failure.
+
+ void retrieveMessage(int id, MailMessage& message);
+ /// Retrieves the message with the given id from the server and
+ /// stores the raw message content in the message's
+ /// content string, available with message.getContent().
+ ///
+ /// Throws a POP3Exception in case of a POP3-specific error, or a
+ /// NetException in case of a general network communication failure.
+
+ void retrieveMessage(int id, MailMessage& message, PartHandler& handler);
+ /// Retrieves the message with the given id from the server and
+ /// stores it in message.
+ ///
+ /// If the message has multiple parts, the parts
+ /// are reported to the PartHandler. If the message
+ /// is not a multi-part message, the content is stored
+ /// in a string available by calling message.getContent().
+ ///
+ /// Throws a POP3Exception in case of a POP3-specific error, or a
+ /// NetException in case of a general network communication failure.
+
+ void retrieveMessage(int id, std::ostream& ostr);
+ /// Retrieves the raw message with the given id from the
+ /// server and copies it to the given output stream.
+ ///
+ /// Throws a POP3Exception in case of a POP3-specific error, or a
+ /// NetException in case of a general network communication failure.
+
+ void retrieveHeader(int id, MessageHeader& header);
+ /// Retrieves the message header of the message with the
+ /// given id and stores it in header.
+ ///
+ /// For this to work, the server must support the TOP command.
+ ///
+ /// Throws a POP3Exception in case of a POP3-specific error, or a
+ /// NetException in case of a general network communication failure.
+
+ void deleteMessage(int id);
+ /// Marks the message with the given ID for deletion. The message
+ /// will be deleted when the connection to the server is
+ /// closed by calling close().
+ ///
+ /// Throws a POP3Exception in case of a POP3-specific error, or a
+ /// NetException in case of a general network communication failure.
+
+ bool sendCommand(const std::string& command, std::string& response);
+ /// Sends the given command verbatim to the server
+ /// and waits for a response.
+ ///
+ /// Returns true if the response is positive, false otherwise.
+ ///
+ /// Throws a POP3Exception in case of a POP3-specific error, or a
+ /// NetException in case of a general network communication failure.
+
+ bool sendCommand(const std::string& command, const std::string& arg, std::string& response);
+ /// Sends the given command verbatim to the server
+ /// and waits for a response.
+ ///
+ /// Returns true if the response is positive, false otherwise.
+ ///
+ /// Throws a POP3Exception in case of a POP3-specific error, or a
+ /// NetException in case of a general network communication failure.
+
+ bool sendCommand(const std::string& command, const std::string& arg1, const std::string& arg2, std::string& response);
+ /// Sends the given command verbatim to the server
+ /// and waits for a response.
+ ///
+ /// Returns true if the response is positive, false otherwise.
+ ///
+ /// Throws a POP3Exception in case of a POP3-specific error, or a
+ /// NetException in case of a general network communication failure.
+
+protected:
+ static bool isPositive(const std::string& response);
+
+private:
+ DialogSocket _socket;
+ bool _isOpen;
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_POP3ClientSession_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/ParallelSocketAcceptor.h b/contrib/libs/poco/Net/include/Poco/Net/ParallelSocketAcceptor.h
index 458bf4a692..514bcfbfa1 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/ParallelSocketAcceptor.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/ParallelSocketAcceptor.h
@@ -1,233 +1,233 @@
-//
-// ParallelSocketAcceptor.h
-//
-// Library: Net
-// Package: Reactor
-// Module: ParallelSocketAcceptor
-//
-// Definition of the ParallelSocketAcceptor class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_ParallelSocketAcceptor_INCLUDED
-#define Net_ParallelSocketAcceptor_INCLUDED
-
-
-#include "Poco/Net/ParallelSocketReactor.h"
-#include "Poco/Net/StreamSocket.h"
-#include "Poco/Net/ServerSocket.h"
-#include "Poco/Environment.h"
-#include "Poco/NObserver.h"
-#include "Poco/SharedPtr.h"
-#include <vector>
-
-
-using Poco::Net::Socket;
-using Poco::Net::SocketReactor;
-using Poco::Net::ServerSocket;
-using Poco::Net::StreamSocket;
-using Poco::NObserver;
-using Poco::AutoPtr;
-
-
-namespace Poco {
-namespace Net {
-
-
-template <class ServiceHandler, class SR>
-class ParallelSocketAcceptor
- /// This class implements the Acceptor part of the Acceptor-Connector design pattern.
- /// Only the difference from single-threaded version is documented here, For full
- /// description see Poco::Net::SocketAcceptor documentation.
- ///
- /// This is a multi-threaded version of SocketAcceptor, it differs from the
- /// single-threaded version in number of reactors (defaulting to number of processors)
- /// that can be specified at construction time and is rotated in a round-robin fashion
- /// by event handler. See ParallelSocketAcceptor::onAccept and
- /// ParallelSocketAcceptor::createServiceHandler documentation and implementation for
- /// details.
-{
-public:
- typedef Poco::Net::ParallelSocketReactor<SR> ParallelReactor;
-
- explicit ParallelSocketAcceptor(ServerSocket& socket,
- unsigned threads = Poco::Environment::processorCount()):
- _socket(socket),
- _pReactor(0),
- _threads(threads),
- _next(0)
- /// Creates a ParallelSocketAcceptor using the given ServerSocket,
- /// sets number of threads and populates the reactors vector.
- {
- init();
- }
-
- ParallelSocketAcceptor(ServerSocket& socket,
- SocketReactor& reactor,
- unsigned threads = Poco::Environment::processorCount()):
- _socket(socket),
- _pReactor(&reactor),
- _threads(threads),
- _next(0)
- /// Creates a ParallelSocketAcceptor using the given ServerSocket, sets the
- /// number of threads, populates the reactors vector and registers itself
- /// with the given SocketReactor.
- {
- init();
- _pReactor->addEventHandler(_socket,
- Poco::Observer<ParallelSocketAcceptor,
- ReadableNotification>(*this, &ParallelSocketAcceptor::onAccept));
- }
-
- virtual ~ParallelSocketAcceptor()
- /// Destroys the ParallelSocketAcceptor.
- {
- try
- {
- if (_pReactor)
- {
- _pReactor->removeEventHandler(_socket,
- Poco::Observer<ParallelSocketAcceptor,
- ReadableNotification>(*this, &ParallelSocketAcceptor::onAccept));
- }
- }
- catch (...)
- {
- poco_unexpected();
- }
- }
-
- void setReactor(SocketReactor& reactor)
- /// Sets the reactor for this acceptor.
- {
- _pReactor = &reactor;
- if (!_pReactor->hasEventHandler(_socket,
- Poco::Observer<ParallelSocketAcceptor,
- ReadableNotification>(*this, &ParallelSocketAcceptor::onAccept)))
- {
- registerAcceptor(reactor);
- }
- }
-
- virtual void registerAcceptor(SocketReactor& reactor)
- /// Registers the ParallelSocketAcceptor with a SocketReactor.
+//
+// ParallelSocketAcceptor.h
+//
+// Library: Net
+// Package: Reactor
+// Module: ParallelSocketAcceptor
+//
+// Definition of the ParallelSocketAcceptor class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_ParallelSocketAcceptor_INCLUDED
+#define Net_ParallelSocketAcceptor_INCLUDED
+
+
+#include "Poco/Net/ParallelSocketReactor.h"
+#include "Poco/Net/StreamSocket.h"
+#include "Poco/Net/ServerSocket.h"
+#include "Poco/Environment.h"
+#include "Poco/NObserver.h"
+#include "Poco/SharedPtr.h"
+#include <vector>
+
+
+using Poco::Net::Socket;
+using Poco::Net::SocketReactor;
+using Poco::Net::ServerSocket;
+using Poco::Net::StreamSocket;
+using Poco::NObserver;
+using Poco::AutoPtr;
+
+
+namespace Poco {
+namespace Net {
+
+
+template <class ServiceHandler, class SR>
+class ParallelSocketAcceptor
+ /// This class implements the Acceptor part of the Acceptor-Connector design pattern.
+ /// Only the difference from single-threaded version is documented here, For full
+ /// description see Poco::Net::SocketAcceptor documentation.
+ ///
+ /// This is a multi-threaded version of SocketAcceptor, it differs from the
+ /// single-threaded version in number of reactors (defaulting to number of processors)
+ /// that can be specified at construction time and is rotated in a round-robin fashion
+ /// by event handler. See ParallelSocketAcceptor::onAccept and
+ /// ParallelSocketAcceptor::createServiceHandler documentation and implementation for
+ /// details.
+{
+public:
+ typedef Poco::Net::ParallelSocketReactor<SR> ParallelReactor;
+
+ explicit ParallelSocketAcceptor(ServerSocket& socket,
+ unsigned threads = Poco::Environment::processorCount()):
+ _socket(socket),
+ _pReactor(0),
+ _threads(threads),
+ _next(0)
+ /// Creates a ParallelSocketAcceptor using the given ServerSocket,
+ /// sets number of threads and populates the reactors vector.
+ {
+ init();
+ }
+
+ ParallelSocketAcceptor(ServerSocket& socket,
+ SocketReactor& reactor,
+ unsigned threads = Poco::Environment::processorCount()):
+ _socket(socket),
+ _pReactor(&reactor),
+ _threads(threads),
+ _next(0)
+ /// Creates a ParallelSocketAcceptor using the given ServerSocket, sets the
+ /// number of threads, populates the reactors vector and registers itself
+ /// with the given SocketReactor.
+ {
+ init();
+ _pReactor->addEventHandler(_socket,
+ Poco::Observer<ParallelSocketAcceptor,
+ ReadableNotification>(*this, &ParallelSocketAcceptor::onAccept));
+ }
+
+ virtual ~ParallelSocketAcceptor()
+ /// Destroys the ParallelSocketAcceptor.
+ {
+ try
+ {
+ if (_pReactor)
+ {
+ _pReactor->removeEventHandler(_socket,
+ Poco::Observer<ParallelSocketAcceptor,
+ ReadableNotification>(*this, &ParallelSocketAcceptor::onAccept));
+ }
+ }
+ catch (...)
+ {
+ poco_unexpected();
+ }
+ }
+
+ void setReactor(SocketReactor& reactor)
+ /// Sets the reactor for this acceptor.
+ {
+ _pReactor = &reactor;
+ if (!_pReactor->hasEventHandler(_socket,
+ Poco::Observer<ParallelSocketAcceptor,
+ ReadableNotification>(*this, &ParallelSocketAcceptor::onAccept)))
+ {
+ registerAcceptor(reactor);
+ }
+ }
+
+ virtual void registerAcceptor(SocketReactor& reactor)
+ /// Registers the ParallelSocketAcceptor with a SocketReactor.
+ ///
+ /// A subclass can override this function to e.g.
+ /// register an event handler for timeout event.
///
- /// A subclass can override this function to e.g.
- /// register an event handler for timeout event.
- ///
- /// The overriding method must either call the base class
- /// implementation or register the accept handler on its own.
- {
- if (_pReactor)
- throw Poco::InvalidAccessException("Acceptor already registered.");
-
- _pReactor = &reactor;
- _pReactor->addEventHandler(_socket,
- Poco::Observer<ParallelSocketAcceptor,
- ReadableNotification>(*this, &ParallelSocketAcceptor::onAccept));
- }
-
- virtual void unregisterAcceptor()
- /// Unregisters the ParallelSocketAcceptor.
+ /// The overriding method must either call the base class
+ /// implementation or register the accept handler on its own.
+ {
+ if (_pReactor)
+ throw Poco::InvalidAccessException("Acceptor already registered.");
+
+ _pReactor = &reactor;
+ _pReactor->addEventHandler(_socket,
+ Poco::Observer<ParallelSocketAcceptor,
+ ReadableNotification>(*this, &ParallelSocketAcceptor::onAccept));
+ }
+
+ virtual void unregisterAcceptor()
+ /// Unregisters the ParallelSocketAcceptor.
+ ///
+ /// A subclass can override this function to e.g.
+ /// unregister its event handler for a timeout event.
///
- /// A subclass can override this function to e.g.
- /// unregister its event handler for a timeout event.
- ///
- /// The overriding method must either call the base class
- /// implementation or unregister the accept handler on its own.
- {
- if (_pReactor)
- {
- _pReactor->removeEventHandler(_socket,
- Poco::Observer<ParallelSocketAcceptor,
- ReadableNotification>(*this, &ParallelSocketAcceptor::onAccept));
- }
- }
-
- void onAccept(ReadableNotification* pNotification)
- /// Accepts connection and creates event handler.
- {
- pNotification->release();
- StreamSocket sock = _socket.acceptConnection();
- _pReactor->wakeUp();
- createServiceHandler(sock);
- }
-
-protected:
- virtual ServiceHandler* createServiceHandler(StreamSocket& socket)
- /// Create and initialize a new ServiceHandler instance.
- ///
- /// Subclasses can override this method.
- {
- std::size_t next = _next++;
- if (_next == _reactors.size()) _next = 0;
- _reactors[next]->wakeUp();
- return new ServiceHandler(socket, *_reactors[next]);
- }
-
- SocketReactor* reactor()
- /// Returns a pointer to the SocketReactor where
- /// this SocketAcceptor is registered.
- ///
- /// The pointer may be null.
- {
- return _pReactor;
- }
-
- Socket& socket()
- /// Returns a reference to the SocketAcceptor's socket.
- {
- return _socket;
- }
-
- void init()
- /// Populates the reactors vector.
- {
- poco_assert (_threads > 0);
-
- for (unsigned i = 0; i < _threads; ++i)
- _reactors.push_back(new ParallelReactor);
- }
-
- typedef std::vector<typename ParallelReactor::Ptr> ReactorVec;
-
- ReactorVec& reactors()
- /// Returns reference to vector of reactors.
- {
- return _reactors;
- }
-
- SocketReactor* reactor(std::size_t idx)
- /// Returns reference to the reactor at position idx.
- {
- return _reactors.at(idx).get();
- }
-
- std::size_t& next()
- /// Returns reference to the next reactor index.
- {
- return _next;
- }
-
-private:
- ParallelSocketAcceptor();
- ParallelSocketAcceptor(const ParallelSocketAcceptor&);
- ParallelSocketAcceptor& operator = (const ParallelSocketAcceptor&);
-
- ServerSocket _socket;
- SocketReactor* _pReactor;
- unsigned _threads;
- ReactorVec _reactors;
- std::size_t _next;
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_ParallelSocketAcceptor_INCLUDED
+ /// The overriding method must either call the base class
+ /// implementation or unregister the accept handler on its own.
+ {
+ if (_pReactor)
+ {
+ _pReactor->removeEventHandler(_socket,
+ Poco::Observer<ParallelSocketAcceptor,
+ ReadableNotification>(*this, &ParallelSocketAcceptor::onAccept));
+ }
+ }
+
+ void onAccept(ReadableNotification* pNotification)
+ /// Accepts connection and creates event handler.
+ {
+ pNotification->release();
+ StreamSocket sock = _socket.acceptConnection();
+ _pReactor->wakeUp();
+ createServiceHandler(sock);
+ }
+
+protected:
+ virtual ServiceHandler* createServiceHandler(StreamSocket& socket)
+ /// Create and initialize a new ServiceHandler instance.
+ ///
+ /// Subclasses can override this method.
+ {
+ std::size_t next = _next++;
+ if (_next == _reactors.size()) _next = 0;
+ _reactors[next]->wakeUp();
+ return new ServiceHandler(socket, *_reactors[next]);
+ }
+
+ SocketReactor* reactor()
+ /// Returns a pointer to the SocketReactor where
+ /// this SocketAcceptor is registered.
+ ///
+ /// The pointer may be null.
+ {
+ return _pReactor;
+ }
+
+ Socket& socket()
+ /// Returns a reference to the SocketAcceptor's socket.
+ {
+ return _socket;
+ }
+
+ void init()
+ /// Populates the reactors vector.
+ {
+ poco_assert (_threads > 0);
+
+ for (unsigned i = 0; i < _threads; ++i)
+ _reactors.push_back(new ParallelReactor);
+ }
+
+ typedef std::vector<typename ParallelReactor::Ptr> ReactorVec;
+
+ ReactorVec& reactors()
+ /// Returns reference to vector of reactors.
+ {
+ return _reactors;
+ }
+
+ SocketReactor* reactor(std::size_t idx)
+ /// Returns reference to the reactor at position idx.
+ {
+ return _reactors.at(idx).get();
+ }
+
+ std::size_t& next()
+ /// Returns reference to the next reactor index.
+ {
+ return _next;
+ }
+
+private:
+ ParallelSocketAcceptor();
+ ParallelSocketAcceptor(const ParallelSocketAcceptor&);
+ ParallelSocketAcceptor& operator = (const ParallelSocketAcceptor&);
+
+ ServerSocket _socket;
+ SocketReactor* _pReactor;
+ unsigned _threads;
+ ReactorVec _reactors;
+ std::size_t _next;
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_ParallelSocketAcceptor_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/ParallelSocketReactor.h b/contrib/libs/poco/Net/include/Poco/Net/ParallelSocketReactor.h
index 7e65f553eb..a7631ce1d9 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/ParallelSocketReactor.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/ParallelSocketReactor.h
@@ -1,90 +1,90 @@
-//
-// ParallelSocketReactor.h
-//
-// Library: Net
-// Package: Reactor
-// Module: ParallelSocketReactor
-//
-// Definition of the ParallelSocketReactor class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_ParallelSocketReactor_INCLUDED
-#define Net_ParallelSocketReactor_INCLUDED
-
-
-#include "Poco/Net/SocketReactor.h"
-#include "Poco/Net/SocketNotification.h"
-#include "Poco/Net/StreamSocket.h"
-#include "Poco/Net/ServerSocket.h"
-#include "Poco/NObserver.h"
-#include "Poco/Thread.h"
-#include "Poco/SharedPtr.h"
-
-
-using Poco::Net::Socket;
-using Poco::Net::SocketReactor;
-using Poco::Net::ReadableNotification;
-using Poco::Net::ShutdownNotification;
-using Poco::Net::ServerSocket;
-using Poco::Net::StreamSocket;
-using Poco::NObserver;
-using Poco::AutoPtr;
-using Poco::Thread;
-
-
-namespace Poco {
-namespace Net {
-
-
-template <class SR>
-class ParallelSocketReactor: public SR
-{
-public:
- typedef Poco::SharedPtr<ParallelSocketReactor> Ptr;
-
- ParallelSocketReactor()
- {
- _thread.start(*this);
- }
-
- ParallelSocketReactor(const Poco::Timespan& timeout):
- SR(timeout)
- {
- _thread.start(*this);
- }
-
- ~ParallelSocketReactor()
- {
- try
- {
- this->stop();
- _thread.join();
- }
- catch (...)
- {
- poco_unexpected();
- }
- }
-
-protected:
- void onIdle()
- {
- SR::onIdle();
- Poco::Thread::yield();
- }
-
-private:
- Poco::Thread _thread;
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_ParallelSocketReactor_INCLUDED
+//
+// ParallelSocketReactor.h
+//
+// Library: Net
+// Package: Reactor
+// Module: ParallelSocketReactor
+//
+// Definition of the ParallelSocketReactor class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_ParallelSocketReactor_INCLUDED
+#define Net_ParallelSocketReactor_INCLUDED
+
+
+#include "Poco/Net/SocketReactor.h"
+#include "Poco/Net/SocketNotification.h"
+#include "Poco/Net/StreamSocket.h"
+#include "Poco/Net/ServerSocket.h"
+#include "Poco/NObserver.h"
+#include "Poco/Thread.h"
+#include "Poco/SharedPtr.h"
+
+
+using Poco::Net::Socket;
+using Poco::Net::SocketReactor;
+using Poco::Net::ReadableNotification;
+using Poco::Net::ShutdownNotification;
+using Poco::Net::ServerSocket;
+using Poco::Net::StreamSocket;
+using Poco::NObserver;
+using Poco::AutoPtr;
+using Poco::Thread;
+
+
+namespace Poco {
+namespace Net {
+
+
+template <class SR>
+class ParallelSocketReactor: public SR
+{
+public:
+ typedef Poco::SharedPtr<ParallelSocketReactor> Ptr;
+
+ ParallelSocketReactor()
+ {
+ _thread.start(*this);
+ }
+
+ ParallelSocketReactor(const Poco::Timespan& timeout):
+ SR(timeout)
+ {
+ _thread.start(*this);
+ }
+
+ ~ParallelSocketReactor()
+ {
+ try
+ {
+ this->stop();
+ _thread.join();
+ }
+ catch (...)
+ {
+ poco_unexpected();
+ }
+ }
+
+protected:
+ void onIdle()
+ {
+ SR::onIdle();
+ Poco::Thread::yield();
+ }
+
+private:
+ Poco::Thread _thread;
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_ParallelSocketReactor_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/PartHandler.h b/contrib/libs/poco/Net/include/Poco/Net/PartHandler.h
index 6d00892fa7..941dd0305c 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/PartHandler.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/PartHandler.h
@@ -1,68 +1,68 @@
-//
-// PartHandler.h
-//
-// Library: Net
-// Package: Messages
-// Module: PartHandler
-//
-// Definition of the PartHandler class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_PartHandler_INCLUDED
-#define Net_PartHandler_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include <istream>
-
-
-namespace Poco {
-namespace Net {
-
-
-class MessageHeader;
-
-
-class Net_API PartHandler
- /// The base class for all part or attachment handlers.
- ///
- /// Part handlers are used for handling email parts and
- /// attachments in MIME multipart messages, as well as file
- /// uploads via HTML forms.
- ///
- /// Subclasses must override handlePart().
-{
-public:
- virtual void handlePart(const MessageHeader& header, std::istream& stream) = 0;
- /// Called for every part encountered during the processing
- /// of an email message or an uploaded HTML form.
- ///
- /// Information about the part can be extracted from
- /// the given message header. What information can be obtained
- /// from header depends on the kind of part.
- ///
- /// The content of the part can be read from stream.
-
-protected:
- PartHandler();
- /// Creates the PartHandler.
-
- virtual ~PartHandler();
- /// Destroys the PartHandler.
-
-private:
- PartHandler(const PartHandler&);
- PartHandler& operator = (const PartHandler&);
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_PartHandler_INCLUDED
+//
+// PartHandler.h
+//
+// Library: Net
+// Package: Messages
+// Module: PartHandler
+//
+// Definition of the PartHandler class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_PartHandler_INCLUDED
+#define Net_PartHandler_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include <istream>
+
+
+namespace Poco {
+namespace Net {
+
+
+class MessageHeader;
+
+
+class Net_API PartHandler
+ /// The base class for all part or attachment handlers.
+ ///
+ /// Part handlers are used for handling email parts and
+ /// attachments in MIME multipart messages, as well as file
+ /// uploads via HTML forms.
+ ///
+ /// Subclasses must override handlePart().
+{
+public:
+ virtual void handlePart(const MessageHeader& header, std::istream& stream) = 0;
+ /// Called for every part encountered during the processing
+ /// of an email message or an uploaded HTML form.
+ ///
+ /// Information about the part can be extracted from
+ /// the given message header. What information can be obtained
+ /// from header depends on the kind of part.
+ ///
+ /// The content of the part can be read from stream.
+
+protected:
+ PartHandler();
+ /// Creates the PartHandler.
+
+ virtual ~PartHandler();
+ /// Destroys the PartHandler.
+
+private:
+ PartHandler(const PartHandler&);
+ PartHandler& operator = (const PartHandler&);
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_PartHandler_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/PartSource.h b/contrib/libs/poco/Net/include/Poco/Net/PartSource.h
index e04c78cf64..06978d74cd 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/PartSource.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/PartSource.h
@@ -1,110 +1,110 @@
-//
-// PartSource.h
-//
-// Library: Net
-// Package: Messages
-// Module: PartSource
-//
-// Definition of the PartSource class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_PartSource_INCLUDED
-#define Net_PartSource_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/MessageHeader.h"
-#include <istream>
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API PartSource
- /// This abstract class is used for adding parts or attachments
- /// to mail messages, as well as for uploading files as part of a HTML form.
-{
-public:
- virtual std::istream& stream() = 0;
- /// Returns an input stream for reading the
- /// part data.
- ///
- /// Subclasses must override this method.
-
- virtual const std::string& filename() const;
- /// Returns the filename for the part or attachment.
- ///
- /// May be overridded by subclasses. The default
- /// implementation returns an empty string.
-
- const std::string& mediaType() const;
- /// Returns the MIME media type for this part or attachment.
-
- MessageHeader& headers();
- /// Returns a MessageHeader containing additional header
- /// fields for the part.
-
- const MessageHeader& headers() const;
- /// Returns a MessageHeader containing additional header
- /// fields for the part.
-
- virtual std::streamsize getContentLength() const;
- /// Returns the content length for this part
- /// which may be UNKNOWN_CONTENT_LENGTH if
- /// not available.
-
- virtual ~PartSource();
- /// Destroys the PartSource.
-
- static const int UNKNOWN_CONTENT_LENGTH;
-
-protected:
- PartSource();
- /// Creates the PartSource, using
- /// the application/octet-stream MIME type.
-
- PartSource(const std::string& mediaType);
- /// Creates the PartSource, using the
- /// given MIME type.
-
-private:
- PartSource(const PartSource&);
- PartSource& operator = (const PartSource&);
-
- std::string _mediaType;
- MessageHeader _headers;
-};
-
-
-//
-// inlines
-//
-inline const std::string& PartSource::mediaType() const
-{
- return _mediaType;
-}
-
-
-inline MessageHeader& PartSource::headers()
-{
- return _headers;
-}
-
-
-inline const MessageHeader& PartSource::headers() const
-{
- return _headers;
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_PartSource_INCLUDED
+//
+// PartSource.h
+//
+// Library: Net
+// Package: Messages
+// Module: PartSource
+//
+// Definition of the PartSource class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_PartSource_INCLUDED
+#define Net_PartSource_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/MessageHeader.h"
+#include <istream>
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API PartSource
+ /// This abstract class is used for adding parts or attachments
+ /// to mail messages, as well as for uploading files as part of a HTML form.
+{
+public:
+ virtual std::istream& stream() = 0;
+ /// Returns an input stream for reading the
+ /// part data.
+ ///
+ /// Subclasses must override this method.
+
+ virtual const std::string& filename() const;
+ /// Returns the filename for the part or attachment.
+ ///
+ /// May be overridded by subclasses. The default
+ /// implementation returns an empty string.
+
+ const std::string& mediaType() const;
+ /// Returns the MIME media type for this part or attachment.
+
+ MessageHeader& headers();
+ /// Returns a MessageHeader containing additional header
+ /// fields for the part.
+
+ const MessageHeader& headers() const;
+ /// Returns a MessageHeader containing additional header
+ /// fields for the part.
+
+ virtual std::streamsize getContentLength() const;
+ /// Returns the content length for this part
+ /// which may be UNKNOWN_CONTENT_LENGTH if
+ /// not available.
+
+ virtual ~PartSource();
+ /// Destroys the PartSource.
+
+ static const int UNKNOWN_CONTENT_LENGTH;
+
+protected:
+ PartSource();
+ /// Creates the PartSource, using
+ /// the application/octet-stream MIME type.
+
+ PartSource(const std::string& mediaType);
+ /// Creates the PartSource, using the
+ /// given MIME type.
+
+private:
+ PartSource(const PartSource&);
+ PartSource& operator = (const PartSource&);
+
+ std::string _mediaType;
+ MessageHeader _headers;
+};
+
+
+//
+// inlines
+//
+inline const std::string& PartSource::mediaType() const
+{
+ return _mediaType;
+}
+
+
+inline MessageHeader& PartSource::headers()
+{
+ return _headers;
+}
+
+
+inline const MessageHeader& PartSource::headers() const
+{
+ return _headers;
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_PartSource_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/PartStore.h b/contrib/libs/poco/Net/include/Poco/Net/PartStore.h
index cdfb23b588..a7be187c80 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/PartStore.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/PartStore.h
@@ -1,106 +1,106 @@
-//
-// PartStore.h
-//
-// Library: Net
-// Package: Messages
-// Module: PartStore
-//
-// Definition of the PartStore class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_PartStore_INCLUDED
-#define Net_PartStore_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/PartSource.h"
-#include "Poco/FileStream.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API PartStore: public PartSource
- /// A parent class for part stores storing message parts.
-{
-public:
- PartStore(const std::string& mediaType);
- /// Creates the PartStore for the given MIME type.
-
- ~PartStore();
- /// Destroys the PartFileStore.
-
-private:
- PartStore();
-};
-
-
-class Net_API FilePartStore: public PartStore
- /// An implementation of PartSource for persisting
- /// parts (usually email attachment files) to the file system.
-{
-public:
- FilePartStore(const std::string& content, const std::string& mediaType, const std::string& filename = "");
- /// Creates the FilePartStore for the given MIME type.
- /// For security purposes, attachment filename is NOT used to save file to the file system.
- /// A unique temporary file name is used to persist the file.
- /// The given filename parameter is the message part (attachment) filename (see filename()) only.
- ///
- /// Throws an exception if the file cannot be opened.
-
- ~FilePartStore();
- /// Destroys the FilePartStore.
-
- std::istream& stream();
- /// Returns a file input stream for the given file.
-
- const std::string& filename() const;
- /// Returns the filename portion of the path.
- /// This is the name under which the file is known
- /// to the user of this class (typically, MailMessage
- /// class). The real name of the file as saved
- /// to the filesystem can be obtained by calling
- /// path() member function.
-
- const std::string& path() const;
- /// Returns the full path to the file as saved
- /// to the file system. For security reasons,
- /// file is not saved under the real file name
- /// (as specified by the user).
-
-private:
- std::string _filename;
- std::string _path;
- Poco::FileStream _fstr;
-};
-
-
-class PartStoreFactory
- /// Parent factory class for part stores creation.
-{
-public:
- virtual PartSource* createPartStore(const std::string& content, const std::string& mediaType, const std::string& filename = "") = 0;
-};
-
-
-class FilePartStoreFactory: public PartStoreFactory
-{
-public:
- PartSource* createPartStore(const std::string& content, const std::string& mediaType, const std::string& filename = "")
- {
- return new FilePartStore(content, mediaType, filename);
- }
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_PartStore_INCLUDED
+//
+// PartStore.h
+//
+// Library: Net
+// Package: Messages
+// Module: PartStore
+//
+// Definition of the PartStore class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_PartStore_INCLUDED
+#define Net_PartStore_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/PartSource.h"
+#include "Poco/FileStream.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API PartStore: public PartSource
+ /// A parent class for part stores storing message parts.
+{
+public:
+ PartStore(const std::string& mediaType);
+ /// Creates the PartStore for the given MIME type.
+
+ ~PartStore();
+ /// Destroys the PartFileStore.
+
+private:
+ PartStore();
+};
+
+
+class Net_API FilePartStore: public PartStore
+ /// An implementation of PartSource for persisting
+ /// parts (usually email attachment files) to the file system.
+{
+public:
+ FilePartStore(const std::string& content, const std::string& mediaType, const std::string& filename = "");
+ /// Creates the FilePartStore for the given MIME type.
+ /// For security purposes, attachment filename is NOT used to save file to the file system.
+ /// A unique temporary file name is used to persist the file.
+ /// The given filename parameter is the message part (attachment) filename (see filename()) only.
+ ///
+ /// Throws an exception if the file cannot be opened.
+
+ ~FilePartStore();
+ /// Destroys the FilePartStore.
+
+ std::istream& stream();
+ /// Returns a file input stream for the given file.
+
+ const std::string& filename() const;
+ /// Returns the filename portion of the path.
+ /// This is the name under which the file is known
+ /// to the user of this class (typically, MailMessage
+ /// class). The real name of the file as saved
+ /// to the filesystem can be obtained by calling
+ /// path() member function.
+
+ const std::string& path() const;
+ /// Returns the full path to the file as saved
+ /// to the file system. For security reasons,
+ /// file is not saved under the real file name
+ /// (as specified by the user).
+
+private:
+ std::string _filename;
+ std::string _path;
+ Poco::FileStream _fstr;
+};
+
+
+class PartStoreFactory
+ /// Parent factory class for part stores creation.
+{
+public:
+ virtual PartSource* createPartStore(const std::string& content, const std::string& mediaType, const std::string& filename = "") = 0;
+};
+
+
+class FilePartStoreFactory: public PartStoreFactory
+{
+public:
+ PartSource* createPartStore(const std::string& content, const std::string& mediaType, const std::string& filename = "")
+ {
+ return new FilePartStore(content, mediaType, filename);
+ }
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_PartStore_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/PollSet.h b/contrib/libs/poco/Net/include/Poco/Net/PollSet.h
index 1e4c60201c..9b24e13591 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/PollSet.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/PollSet.h
@@ -1,86 +1,86 @@
-//
-// PollSet.h
-//
-// Library: Net
-// Package: Sockets
-// Module: PollSet
-//
-// Definition of the PollSet class.
-//
-// Copyright (c) 2016, Applied Informatics Software Engineering GmbH.
-// All rights reserved.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_PollSet_INCLUDED
-#define Net_PollSet_INCLUDED
-
-
-#include "Poco/Net/Socket.h"
-#include <map>
-
-
-namespace Poco {
-namespace Net {
-
-
-class PollSetImpl;
-
-
-class Net_API PollSet
- /// A set of sockets that can be efficiently polled as a whole.
- ///
- /// If supported, PollSet is implemented using epoll (Linux) or
- /// poll (BSD) APIs. A fallback implementation using select()
- /// is also provided.
-{
-public:
- enum Mode
- {
- POLL_READ = 0x01,
- POLL_WRITE = 0x02,
- POLL_ERROR = 0x04
- };
-
- typedef std::map<Poco::Net::Socket, int> SocketModeMap;
-
- PollSet();
- /// Creates an empty PollSet.
-
- ~PollSet();
- /// Destroys the PollSet.
-
- void add(const Poco::Net::Socket& socket, int mode);
- /// Adds the given socket to the set, for polling with
- /// the given mode, which can be an OR'd combination of
- /// POLL_READ, POLL_WRITE and POLL_ERROR.
-
- void remove(const Poco::Net::Socket& socket);
- /// Removes the given socket from the set.
-
- void update(const Poco::Net::Socket& socket, int mode);
- /// Updates the mode of the given socket.
-
- void clear();
- /// Removes all sockets from the PollSet.
-
- SocketModeMap poll(const Poco::Timespan& timeout);
- /// Waits until the state of at least one of the PollSet's sockets
- /// changes accordingly to its mode, or the timeout expires.
- /// Returns a PollMap containing the sockets that have had
- /// their state changed.
-
-private:
- PollSetImpl* _pImpl;
-
- PollSet(const PollSet&);
- PollSet& operator = (const PollSet&);
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_PollSet_INCLUDED
+//
+// PollSet.h
+//
+// Library: Net
+// Package: Sockets
+// Module: PollSet
+//
+// Definition of the PollSet class.
+//
+// Copyright (c) 2016, Applied Informatics Software Engineering GmbH.
+// All rights reserved.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_PollSet_INCLUDED
+#define Net_PollSet_INCLUDED
+
+
+#include "Poco/Net/Socket.h"
+#include <map>
+
+
+namespace Poco {
+namespace Net {
+
+
+class PollSetImpl;
+
+
+class Net_API PollSet
+ /// A set of sockets that can be efficiently polled as a whole.
+ ///
+ /// If supported, PollSet is implemented using epoll (Linux) or
+ /// poll (BSD) APIs. A fallback implementation using select()
+ /// is also provided.
+{
+public:
+ enum Mode
+ {
+ POLL_READ = 0x01,
+ POLL_WRITE = 0x02,
+ POLL_ERROR = 0x04
+ };
+
+ typedef std::map<Poco::Net::Socket, int> SocketModeMap;
+
+ PollSet();
+ /// Creates an empty PollSet.
+
+ ~PollSet();
+ /// Destroys the PollSet.
+
+ void add(const Poco::Net::Socket& socket, int mode);
+ /// Adds the given socket to the set, for polling with
+ /// the given mode, which can be an OR'd combination of
+ /// POLL_READ, POLL_WRITE and POLL_ERROR.
+
+ void remove(const Poco::Net::Socket& socket);
+ /// Removes the given socket from the set.
+
+ void update(const Poco::Net::Socket& socket, int mode);
+ /// Updates the mode of the given socket.
+
+ void clear();
+ /// Removes all sockets from the PollSet.
+
+ SocketModeMap poll(const Poco::Timespan& timeout);
+ /// Waits until the state of at least one of the PollSet's sockets
+ /// changes accordingly to its mode, or the timeout expires.
+ /// Returns a PollMap containing the sockets that have had
+ /// their state changed.
+
+private:
+ PollSetImpl* _pImpl;
+
+ PollSet(const PollSet&);
+ PollSet& operator = (const PollSet&);
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_PollSet_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/QuotedPrintableDecoder.h b/contrib/libs/poco/Net/include/Poco/Net/QuotedPrintableDecoder.h
index b9044f1513..b456660f6e 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/QuotedPrintableDecoder.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/QuotedPrintableDecoder.h
@@ -1,86 +1,86 @@
-//
-// QuotedPrintableDecoder.h
-//
-// Library: Net
-// Package: Messages
-// Module: QuotedPrintableDecoder
-//
-// Definition of the QuotedPrintableDecoder class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_QuotedPrintableDecoder_INCLUDED
-#define Net_QuotedPrintableDecoder_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/UnbufferedStreamBuf.h"
-#include <istream>
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API QuotedPrintableDecoderBuf: public Poco::UnbufferedStreamBuf
- /// This streambuf decodes all quoted-printable (see RFC 2045)
- /// encoded data read from the istream connected to it.
- ///
- /// Note: For performance reasons, the characters
- /// are read directly from the given istream's
- /// underlying streambuf, so the state
- /// of the istream will not reflect that of
- /// its streambuf.
-{
-public:
- QuotedPrintableDecoderBuf(std::istream& istr);
- ~QuotedPrintableDecoderBuf();
-
-private:
- int readFromDevice();
-
- std::streambuf& _buf;
-};
-
-
-class Net_API QuotedPrintableDecoderIOS: public virtual std::ios
- /// The base class for QuotedPrintableDecoder.
- ///
- /// This class is needed to ensure the correct initialization
- /// order of the stream buffer and base classes.
-{
-public:
- QuotedPrintableDecoderIOS(std::istream& istr);
- ~QuotedPrintableDecoderIOS();
- QuotedPrintableDecoderBuf* rdbuf();
-
-protected:
- QuotedPrintableDecoderBuf _buf;
-};
-
-
-class Net_API QuotedPrintableDecoder: public QuotedPrintableDecoderIOS, public std::istream
- /// This istream decodes all quoted-printable (see RFC 2045)
- /// encoded data read from the istream connected to it.
- ///
- /// Note: For performance reasons, the characters
- /// are read directly from the given istream's
- /// underlying streambuf, so the state
- /// of the istream will not reflect that of
- /// its streambuf.
-{
-public:
- QuotedPrintableDecoder(std::istream& istr);
- ~QuotedPrintableDecoder();
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_QuotedPrintableDecoder_INCLUDED
+//
+// QuotedPrintableDecoder.h
+//
+// Library: Net
+// Package: Messages
+// Module: QuotedPrintableDecoder
+//
+// Definition of the QuotedPrintableDecoder class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_QuotedPrintableDecoder_INCLUDED
+#define Net_QuotedPrintableDecoder_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/UnbufferedStreamBuf.h"
+#include <istream>
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API QuotedPrintableDecoderBuf: public Poco::UnbufferedStreamBuf
+ /// This streambuf decodes all quoted-printable (see RFC 2045)
+ /// encoded data read from the istream connected to it.
+ ///
+ /// Note: For performance reasons, the characters
+ /// are read directly from the given istream's
+ /// underlying streambuf, so the state
+ /// of the istream will not reflect that of
+ /// its streambuf.
+{
+public:
+ QuotedPrintableDecoderBuf(std::istream& istr);
+ ~QuotedPrintableDecoderBuf();
+
+private:
+ int readFromDevice();
+
+ std::streambuf& _buf;
+};
+
+
+class Net_API QuotedPrintableDecoderIOS: public virtual std::ios
+ /// The base class for QuotedPrintableDecoder.
+ ///
+ /// This class is needed to ensure the correct initialization
+ /// order of the stream buffer and base classes.
+{
+public:
+ QuotedPrintableDecoderIOS(std::istream& istr);
+ ~QuotedPrintableDecoderIOS();
+ QuotedPrintableDecoderBuf* rdbuf();
+
+protected:
+ QuotedPrintableDecoderBuf _buf;
+};
+
+
+class Net_API QuotedPrintableDecoder: public QuotedPrintableDecoderIOS, public std::istream
+ /// This istream decodes all quoted-printable (see RFC 2045)
+ /// encoded data read from the istream connected to it.
+ ///
+ /// Note: For performance reasons, the characters
+ /// are read directly from the given istream's
+ /// underlying streambuf, so the state
+ /// of the istream will not reflect that of
+ /// its streambuf.
+{
+public:
+ QuotedPrintableDecoder(std::istream& istr);
+ ~QuotedPrintableDecoder();
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_QuotedPrintableDecoder_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/QuotedPrintableEncoder.h b/contrib/libs/poco/Net/include/Poco/Net/QuotedPrintableEncoder.h
index 7f43db0d64..d0e7d74549 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/QuotedPrintableEncoder.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/QuotedPrintableEncoder.h
@@ -1,85 +1,85 @@
-//
-// QuotedPrintableEncoder.h
-//
-// Library: Net
-// Package: Messages
-// Module: QuotedPrintableEncoder
-//
-// Definition of the QuotedPrintableEncoder class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_QuotedPrintableEncoder_INCLUDED
-#define Net_QuotedPrintableEncoder_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/UnbufferedStreamBuf.h"
-#include <ostream>
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API QuotedPrintableEncoderBuf: public Poco::UnbufferedStreamBuf
- /// This streambuf encodes all data written
- /// to it in quoted-printable encoding (see RFC 2045)
- /// and forwards it to a connected ostream.
-{
-public:
- QuotedPrintableEncoderBuf(std::ostream& ostr);
- ~QuotedPrintableEncoderBuf();
- int close();
-
-private:
- int writeToDevice(char c);
- void writeEncoded(char c);
- void writeRaw(char c);
-
- int _pending;
- int _lineLength;
- std::ostream& _ostr;
-};
-
-
-class Net_API QuotedPrintableEncoderIOS: public virtual std::ios
- /// The base class for QuotedPrintableEncoder.
- ///
- /// This class is needed to ensure the correct initialization
- /// order of the stream buffer and base classes.
-{
-public:
- QuotedPrintableEncoderIOS(std::ostream& ostr);
- ~QuotedPrintableEncoderIOS();
- int close();
- QuotedPrintableEncoderBuf* rdbuf();
-
-protected:
- QuotedPrintableEncoderBuf _buf;
-};
-
-
-class Net_API QuotedPrintableEncoder: public QuotedPrintableEncoderIOS, public std::ostream
- /// This ostream encodes all data
- /// written to it in quoted-printable encoding
- /// (see RFC 2045) and forwards it to a connected ostream.
- /// Always call close() when done
- /// writing data, to ensure proper
- /// completion of the encoding operation.
-{
-public:
- QuotedPrintableEncoder(std::ostream& ostr);
- ~QuotedPrintableEncoder();
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_QuotedPrintableEncoder_INCLUDED
+//
+// QuotedPrintableEncoder.h
+//
+// Library: Net
+// Package: Messages
+// Module: QuotedPrintableEncoder
+//
+// Definition of the QuotedPrintableEncoder class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_QuotedPrintableEncoder_INCLUDED
+#define Net_QuotedPrintableEncoder_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/UnbufferedStreamBuf.h"
+#include <ostream>
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API QuotedPrintableEncoderBuf: public Poco::UnbufferedStreamBuf
+ /// This streambuf encodes all data written
+ /// to it in quoted-printable encoding (see RFC 2045)
+ /// and forwards it to a connected ostream.
+{
+public:
+ QuotedPrintableEncoderBuf(std::ostream& ostr);
+ ~QuotedPrintableEncoderBuf();
+ int close();
+
+private:
+ int writeToDevice(char c);
+ void writeEncoded(char c);
+ void writeRaw(char c);
+
+ int _pending;
+ int _lineLength;
+ std::ostream& _ostr;
+};
+
+
+class Net_API QuotedPrintableEncoderIOS: public virtual std::ios
+ /// The base class for QuotedPrintableEncoder.
+ ///
+ /// This class is needed to ensure the correct initialization
+ /// order of the stream buffer and base classes.
+{
+public:
+ QuotedPrintableEncoderIOS(std::ostream& ostr);
+ ~QuotedPrintableEncoderIOS();
+ int close();
+ QuotedPrintableEncoderBuf* rdbuf();
+
+protected:
+ QuotedPrintableEncoderBuf _buf;
+};
+
+
+class Net_API QuotedPrintableEncoder: public QuotedPrintableEncoderIOS, public std::ostream
+ /// This ostream encodes all data
+ /// written to it in quoted-printable encoding
+ /// (see RFC 2045) and forwards it to a connected ostream.
+ /// Always call close() when done
+ /// writing data, to ensure proper
+ /// completion of the encoding operation.
+{
+public:
+ QuotedPrintableEncoder(std::ostream& ostr);
+ ~QuotedPrintableEncoder();
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_QuotedPrintableEncoder_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/RawSocket.h b/contrib/libs/poco/Net/include/Poco/Net/RawSocket.h
index f07e369e24..3638b20e45 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/RawSocket.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/RawSocket.h
@@ -1,161 +1,161 @@
-//
-// RawSocket.h
-//
-// Library: Net
-// Package: Sockets
-// Module: RawSocket
-//
-// Definition of the RawSocket class.
-//
-// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_RawSocket_INCLUDED
-#define Net_RawSocket_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/Socket.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API RawSocket: public Socket
- /// This class provides an interface to a
- /// raw IP socket.
-{
-public:
- RawSocket();
- /// Creates an unconnected IPv4 raw socket.
-
- RawSocket(SocketAddress::Family family, int proto = IPPROTO_RAW);
- /// Creates an unconnected raw socket.
- ///
- /// The socket will be created for the
- /// given address family.
-
- RawSocket(const SocketAddress& address, bool reuseAddress = false);
- /// Creates a raw socket and binds it
- /// to the given address.
- ///
- /// Depending on the address family, the socket
- /// will be either an IPv4 or an IPv6 socket.
-
- RawSocket(const Socket& socket);
- /// Creates the RawSocket with the SocketImpl
- /// from another socket. The SocketImpl must be
- /// a RawSocketImpl, otherwise an InvalidArgumentException
- /// will be thrown.
-
- ~RawSocket();
- /// Destroys the RawSocket.
-
- RawSocket& operator = (const Socket& socket);
- /// Assignment operator.
- ///
- /// Releases the socket's SocketImpl and
- /// attaches the SocketImpl from the other socket and
- /// increments the reference count of the SocketImpl.
-
- void connect(const SocketAddress& address);
- /// Restricts incoming and outgoing
- /// packets to the specified address.
- ///
- /// Calls to connect() cannot come before calls to bind().
-
- void bind(const SocketAddress& address, bool reuseAddress = false);
- /// Bind a local address to the socket.
- ///
- /// This is usually only done when establishing a server
- /// socket.
- ///
- /// If reuseAddress is true, sets the SO_REUSEADDR
- /// socket option.
- ///
- /// Calls to connect() cannot come before calls to bind().
-
- void bind(const SocketAddress& address, bool reuseAddress, bool reusePort);
- /// Bind a local address to the socket.
- ///
- /// This is usually only done when establishing a server
- /// socket.
- ///
- /// If reuseAddress is true, sets the SO_REUSEADDR
- /// socket option.
- ///
- /// If reusePort is true, sets the SO_REUSEPORT
- /// socket option.
- ///
- /// Calls to connect() cannot come before calls to bind().
-
- int sendBytes(const void* buffer, int length, int flags = 0);
- /// Sends the contents of the given buffer through
- /// the socket.
- ///
- /// Returns the number of bytes sent, which may be
- /// less than the number of bytes specified.
-
- int receiveBytes(void* buffer, int length, int flags = 0);
- /// Receives data from the socket and stores it
- /// in buffer. Up to length bytes are received.
- ///
- /// Returns the number of bytes received.
-
- int sendTo(const void* buffer, int length, const SocketAddress& address, int flags = 0);
- /// Sends the contents of the given buffer through
- /// the socket to the given address.
- ///
- /// Returns the number of bytes sent, which may be
- /// less than the number of bytes specified.
-
- int receiveFrom(void* buffer, int length, SocketAddress& address, int flags = 0);
- /// Receives data from the socket and stores it
- /// in buffer. Up to length bytes are received.
- /// Stores the address of the sender in address.
- ///
- /// Returns the number of bytes received.
-
- void setBroadcast(bool flag);
- /// Sets the value of the SO_BROADCAST socket option.
- ///
- /// Setting this flag allows sending datagrams to
- /// the broadcast address.
-
- bool getBroadcast() const;
- /// Returns the value of the SO_BROADCAST socket option.
-
-protected:
- RawSocket(SocketImpl* pImpl);
- /// Creates the Socket and attaches the given SocketImpl.
- /// The socket takes ownership of the SocketImpl.
- ///
- /// The SocketImpl must be a StreamSocketImpl, otherwise
- /// an InvalidArgumentException will be thrown.
-};
-
-
-//
-// inlines
-//
-inline void RawSocket::setBroadcast(bool flag)
-{
- impl()->setBroadcast(flag);
-}
-
-
-inline bool RawSocket::getBroadcast() const
-{
- return impl()->getBroadcast();
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_RawSocket_INCLUDED
+//
+// RawSocket.h
+//
+// Library: Net
+// Package: Sockets
+// Module: RawSocket
+//
+// Definition of the RawSocket class.
+//
+// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_RawSocket_INCLUDED
+#define Net_RawSocket_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/Socket.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API RawSocket: public Socket
+ /// This class provides an interface to a
+ /// raw IP socket.
+{
+public:
+ RawSocket();
+ /// Creates an unconnected IPv4 raw socket.
+
+ RawSocket(SocketAddress::Family family, int proto = IPPROTO_RAW);
+ /// Creates an unconnected raw socket.
+ ///
+ /// The socket will be created for the
+ /// given address family.
+
+ RawSocket(const SocketAddress& address, bool reuseAddress = false);
+ /// Creates a raw socket and binds it
+ /// to the given address.
+ ///
+ /// Depending on the address family, the socket
+ /// will be either an IPv4 or an IPv6 socket.
+
+ RawSocket(const Socket& socket);
+ /// Creates the RawSocket with the SocketImpl
+ /// from another socket. The SocketImpl must be
+ /// a RawSocketImpl, otherwise an InvalidArgumentException
+ /// will be thrown.
+
+ ~RawSocket();
+ /// Destroys the RawSocket.
+
+ RawSocket& operator = (const Socket& socket);
+ /// Assignment operator.
+ ///
+ /// Releases the socket's SocketImpl and
+ /// attaches the SocketImpl from the other socket and
+ /// increments the reference count of the SocketImpl.
+
+ void connect(const SocketAddress& address);
+ /// Restricts incoming and outgoing
+ /// packets to the specified address.
+ ///
+ /// Calls to connect() cannot come before calls to bind().
+
+ void bind(const SocketAddress& address, bool reuseAddress = false);
+ /// Bind a local address to the socket.
+ ///
+ /// This is usually only done when establishing a server
+ /// socket.
+ ///
+ /// If reuseAddress is true, sets the SO_REUSEADDR
+ /// socket option.
+ ///
+ /// Calls to connect() cannot come before calls to bind().
+
+ void bind(const SocketAddress& address, bool reuseAddress, bool reusePort);
+ /// Bind a local address to the socket.
+ ///
+ /// This is usually only done when establishing a server
+ /// socket.
+ ///
+ /// If reuseAddress is true, sets the SO_REUSEADDR
+ /// socket option.
+ ///
+ /// If reusePort is true, sets the SO_REUSEPORT
+ /// socket option.
+ ///
+ /// Calls to connect() cannot come before calls to bind().
+
+ int sendBytes(const void* buffer, int length, int flags = 0);
+ /// Sends the contents of the given buffer through
+ /// the socket.
+ ///
+ /// Returns the number of bytes sent, which may be
+ /// less than the number of bytes specified.
+
+ int receiveBytes(void* buffer, int length, int flags = 0);
+ /// Receives data from the socket and stores it
+ /// in buffer. Up to length bytes are received.
+ ///
+ /// Returns the number of bytes received.
+
+ int sendTo(const void* buffer, int length, const SocketAddress& address, int flags = 0);
+ /// Sends the contents of the given buffer through
+ /// the socket to the given address.
+ ///
+ /// Returns the number of bytes sent, which may be
+ /// less than the number of bytes specified.
+
+ int receiveFrom(void* buffer, int length, SocketAddress& address, int flags = 0);
+ /// Receives data from the socket and stores it
+ /// in buffer. Up to length bytes are received.
+ /// Stores the address of the sender in address.
+ ///
+ /// Returns the number of bytes received.
+
+ void setBroadcast(bool flag);
+ /// Sets the value of the SO_BROADCAST socket option.
+ ///
+ /// Setting this flag allows sending datagrams to
+ /// the broadcast address.
+
+ bool getBroadcast() const;
+ /// Returns the value of the SO_BROADCAST socket option.
+
+protected:
+ RawSocket(SocketImpl* pImpl);
+ /// Creates the Socket and attaches the given SocketImpl.
+ /// The socket takes ownership of the SocketImpl.
+ ///
+ /// The SocketImpl must be a StreamSocketImpl, otherwise
+ /// an InvalidArgumentException will be thrown.
+};
+
+
+//
+// inlines
+//
+inline void RawSocket::setBroadcast(bool flag)
+{
+ impl()->setBroadcast(flag);
+}
+
+
+inline bool RawSocket::getBroadcast() const
+{
+ return impl()->getBroadcast();
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_RawSocket_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/RawSocketImpl.h b/contrib/libs/poco/Net/include/Poco/Net/RawSocketImpl.h
index b62724abbb..df10b64587 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/RawSocketImpl.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/RawSocketImpl.h
@@ -1,56 +1,56 @@
-//
-// RawSocketImpl.h
-//
-// Library: Net
-// Package: Sockets
-// Module: RawSocketImpl
-//
-// Definition of the RawSocketImpl class.
-//
-// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_RawSocketImpl_INCLUDED
-#define Net_RawSocketImpl_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/SocketImpl.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API RawSocketImpl: public SocketImpl
- /// This class implements a raw socket.
-{
-public:
- RawSocketImpl();
- /// Creates an unconnected IPv4 raw socket with IPPROTO_RAW.
-
- RawSocketImpl(SocketAddress::Family family, int proto = IPPROTO_RAW);
- /// Creates an unconnected raw socket.
- ///
- /// The socket will be created for the
- /// given address family.
-
- RawSocketImpl(poco_socket_t sockfd);
- /// Creates a RawSocketImpl using the given native socket.
-
-protected:
- void init(int af);
- void init2(int af, int proto);
-
- ~RawSocketImpl();
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_RawSocketImpl_INCLUDED
+//
+// RawSocketImpl.h
+//
+// Library: Net
+// Package: Sockets
+// Module: RawSocketImpl
+//
+// Definition of the RawSocketImpl class.
+//
+// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_RawSocketImpl_INCLUDED
+#define Net_RawSocketImpl_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/SocketImpl.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API RawSocketImpl: public SocketImpl
+ /// This class implements a raw socket.
+{
+public:
+ RawSocketImpl();
+ /// Creates an unconnected IPv4 raw socket with IPPROTO_RAW.
+
+ RawSocketImpl(SocketAddress::Family family, int proto = IPPROTO_RAW);
+ /// Creates an unconnected raw socket.
+ ///
+ /// The socket will be created for the
+ /// given address family.
+
+ RawSocketImpl(poco_socket_t sockfd);
+ /// Creates a RawSocketImpl using the given native socket.
+
+protected:
+ void init(int af);
+ void init2(int af, int proto);
+
+ ~RawSocketImpl();
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_RawSocketImpl_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/RemoteSyslogChannel.h b/contrib/libs/poco/Net/include/Poco/Net/RemoteSyslogChannel.h
index f8b5ace367..848b1634fb 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/RemoteSyslogChannel.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/RemoteSyslogChannel.h
@@ -1,158 +1,158 @@
-//
-// RemoteSyslogChannel.h
-//
-// Library: Net
-// Package: Logging
-// Module: RemoteSyslogChannel
-//
-// Definition of the RemoteSyslogChannel class.
-//
-// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_RemoteSyslogChannel_INCLUDED
-#define Net_RemoteSyslogChannel_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Channel.h"
-#include "Poco/Mutex.h"
-#include "Poco/Net/DatagramSocket.h"
-#include "Poco/Net/SocketAddress.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API RemoteSyslogChannel: public Poco::Channel
- /// This Channel implements remote syslog logging over UDP according
- /// to RFC 5424 "The Syslog Protocol"
- /// and RFC 5426 "Transmission of syslog messages over UDP".
- ///
- /// In addition, RemoteSyslogListener also supports the "old" BSD syslog
- /// protocol, as described in RFC 3164.
- ///
- /// RFC 5425 structured data can be passed via the "structured-data"
- /// property of the log Message. The content of the "structured-data"
- /// property must be correct according to RFC 5425.
- ///
- /// Example:
- /// msg.set("structured-data", "[exampleSDID@32473 iut=\"3\" eventSource=\"Application\" eventID=\"1011\"]");
-{
-public:
- static const std::string BSD_TIMEFORMAT;
- static const std::string SYSLOG_TIMEFORMAT;
-
- enum Severity
- {
- SYSLOG_EMERGENCY = 0, /// Emergency: system is unusable
- SYSLOG_ALERT = 1, /// Alert: action must be taken immediately
- SYSLOG_CRITICAL = 2, /// Critical: critical conditions
- SYSLOG_ERROR = 3, /// Error: error conditions
- SYSLOG_WARNING = 4, /// Warning: warning conditions
- SYSLOG_NOTICE = 5, /// Notice: normal but significant condition
- SYSLOG_INFORMATIONAL = 6, /// Informational: informational messages
- SYSLOG_DEBUG = 7 /// Debug: debug-level messages
- };
-
- enum Facility
- {
- SYSLOG_KERN = ( 0<<3), /// kernel messages
- SYSLOG_USER = ( 1<<3), /// random user-level messages
- SYSLOG_MAIL = ( 2<<3), /// mail system
- SYSLOG_DAEMON = ( 3<<3), /// system daemons
- SYSLOG_AUTH = ( 4<<3), /// security/authorization messages
- SYSLOG_SYSLOG = ( 5<<3), /// messages generated internally by syslogd
- SYSLOG_LPR = ( 6<<3), /// line printer subsystem
- SYSLOG_NEWS = ( 7<<3), /// network news subsystem
- SYSLOG_UUCP = ( 8<<3), /// UUCP subsystem
- SYSLOG_CRON = ( 9<<3), /// clock daemon
- SYSLOG_AUTHPRIV = (10<<3), /// security/authorization messages (private)
- SYSLOG_FTP = (11<<3), /// ftp daemon
- SYSLOG_NTP = (12<<3), /// ntp subsystem
- SYSLOG_LOGAUDIT = (13<<3), /// log audit
- SYSLOG_LOGALERT = (14<<3), /// log alert
- SYSLOG_CLOCK = (15<<3), /// clock daemon
- SYSLOG_LOCAL0 = (16<<3), /// reserved for local use
- SYSLOG_LOCAL1 = (17<<3), /// reserved for local use
- SYSLOG_LOCAL2 = (18<<3), /// reserved for local use
- SYSLOG_LOCAL3 = (19<<3), /// reserved for local use
- SYSLOG_LOCAL4 = (20<<3), /// reserved for local use
- SYSLOG_LOCAL5 = (21<<3), /// reserved for local use
- SYSLOG_LOCAL6 = (22<<3), /// reserved for local use
- SYSLOG_LOCAL7 = (23<<3) /// reserved for local use
- };
-
- enum
- {
- SYSLOG_PORT = 514
- };
-
- RemoteSyslogChannel();
- /// Creates a RemoteSyslogChannel.
-
- RemoteSyslogChannel(const std::string& address, const std::string& name, int facility = SYSLOG_USER, bool bsdFormat = false);
- /// Creates a RemoteSyslogChannel with the given target address, name, and facility.
- /// If bsdFormat is true, messages are formatted according to RFC 3164.
-
- void open();
- /// Opens the RemoteSyslogChannel.
-
- void close();
- /// Closes the RemoteSyslogChannel.
-
- void log(const Message& msg);
- /// Sends the message's text to the syslog service.
-
- void setProperty(const std::string& name, const std::string& value);
- /// Sets the property with the given value.
- ///
- /// The following properties are supported:
- /// * name: The name used to identify the source of log messages.
- /// * facility: The facility added to each log message. See the Facility enumeration for a list of supported values.
- /// The LOG_ prefix can be omitted and values are case insensitive (e.g. a facility value "mail" is recognized as SYSLOG_MAIL)
- /// * format: "bsd"/"rfc3164" (RFC 3164 format) or "new"/"rfc5424" (default)
- /// * loghost: The target IP address or host name where log messages are sent. Optionally, a port number (separated
- /// by a colon) can also be specified.
- /// * host: (optional) Host name included in syslog messages. If not specified, the host's real domain name or
- /// IP address will be used.
-
- std::string getProperty(const std::string& name) const;
- /// Returns the value of the property with the given name.
-
- static void registerChannel();
- /// Registers the channel with the global LoggingFactory.
-
- static const std::string PROP_NAME;
- static const std::string PROP_FACILITY;
- static const std::string PROP_FORMAT;
- static const std::string PROP_LOGHOST;
- static const std::string PROP_HOST;
- static const std::string STRUCTURED_DATA;
-
-protected:
- ~RemoteSyslogChannel();
- static int getPrio(const Message& msg);
-
-private:
- std::string _logHost;
- std::string _name;
- std::string _host;
- int _facility;
- bool _bsdFormat;
- DatagramSocket _socket;
- SocketAddress _socketAddress;
- bool _open;
- mutable Poco::FastMutex _mutex;
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_RemoteSyslogChannel_INCLUDED
+//
+// RemoteSyslogChannel.h
+//
+// Library: Net
+// Package: Logging
+// Module: RemoteSyslogChannel
+//
+// Definition of the RemoteSyslogChannel class.
+//
+// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_RemoteSyslogChannel_INCLUDED
+#define Net_RemoteSyslogChannel_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Channel.h"
+#include "Poco/Mutex.h"
+#include "Poco/Net/DatagramSocket.h"
+#include "Poco/Net/SocketAddress.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API RemoteSyslogChannel: public Poco::Channel
+ /// This Channel implements remote syslog logging over UDP according
+ /// to RFC 5424 "The Syslog Protocol"
+ /// and RFC 5426 "Transmission of syslog messages over UDP".
+ ///
+ /// In addition, RemoteSyslogListener also supports the "old" BSD syslog
+ /// protocol, as described in RFC 3164.
+ ///
+ /// RFC 5425 structured data can be passed via the "structured-data"
+ /// property of the log Message. The content of the "structured-data"
+ /// property must be correct according to RFC 5425.
+ ///
+ /// Example:
+ /// msg.set("structured-data", "[exampleSDID@32473 iut=\"3\" eventSource=\"Application\" eventID=\"1011\"]");
+{
+public:
+ static const std::string BSD_TIMEFORMAT;
+ static const std::string SYSLOG_TIMEFORMAT;
+
+ enum Severity
+ {
+ SYSLOG_EMERGENCY = 0, /// Emergency: system is unusable
+ SYSLOG_ALERT = 1, /// Alert: action must be taken immediately
+ SYSLOG_CRITICAL = 2, /// Critical: critical conditions
+ SYSLOG_ERROR = 3, /// Error: error conditions
+ SYSLOG_WARNING = 4, /// Warning: warning conditions
+ SYSLOG_NOTICE = 5, /// Notice: normal but significant condition
+ SYSLOG_INFORMATIONAL = 6, /// Informational: informational messages
+ SYSLOG_DEBUG = 7 /// Debug: debug-level messages
+ };
+
+ enum Facility
+ {
+ SYSLOG_KERN = ( 0<<3), /// kernel messages
+ SYSLOG_USER = ( 1<<3), /// random user-level messages
+ SYSLOG_MAIL = ( 2<<3), /// mail system
+ SYSLOG_DAEMON = ( 3<<3), /// system daemons
+ SYSLOG_AUTH = ( 4<<3), /// security/authorization messages
+ SYSLOG_SYSLOG = ( 5<<3), /// messages generated internally by syslogd
+ SYSLOG_LPR = ( 6<<3), /// line printer subsystem
+ SYSLOG_NEWS = ( 7<<3), /// network news subsystem
+ SYSLOG_UUCP = ( 8<<3), /// UUCP subsystem
+ SYSLOG_CRON = ( 9<<3), /// clock daemon
+ SYSLOG_AUTHPRIV = (10<<3), /// security/authorization messages (private)
+ SYSLOG_FTP = (11<<3), /// ftp daemon
+ SYSLOG_NTP = (12<<3), /// ntp subsystem
+ SYSLOG_LOGAUDIT = (13<<3), /// log audit
+ SYSLOG_LOGALERT = (14<<3), /// log alert
+ SYSLOG_CLOCK = (15<<3), /// clock daemon
+ SYSLOG_LOCAL0 = (16<<3), /// reserved for local use
+ SYSLOG_LOCAL1 = (17<<3), /// reserved for local use
+ SYSLOG_LOCAL2 = (18<<3), /// reserved for local use
+ SYSLOG_LOCAL3 = (19<<3), /// reserved for local use
+ SYSLOG_LOCAL4 = (20<<3), /// reserved for local use
+ SYSLOG_LOCAL5 = (21<<3), /// reserved for local use
+ SYSLOG_LOCAL6 = (22<<3), /// reserved for local use
+ SYSLOG_LOCAL7 = (23<<3) /// reserved for local use
+ };
+
+ enum
+ {
+ SYSLOG_PORT = 514
+ };
+
+ RemoteSyslogChannel();
+ /// Creates a RemoteSyslogChannel.
+
+ RemoteSyslogChannel(const std::string& address, const std::string& name, int facility = SYSLOG_USER, bool bsdFormat = false);
+ /// Creates a RemoteSyslogChannel with the given target address, name, and facility.
+ /// If bsdFormat is true, messages are formatted according to RFC 3164.
+
+ void open();
+ /// Opens the RemoteSyslogChannel.
+
+ void close();
+ /// Closes the RemoteSyslogChannel.
+
+ void log(const Message& msg);
+ /// Sends the message's text to the syslog service.
+
+ void setProperty(const std::string& name, const std::string& value);
+ /// Sets the property with the given value.
+ ///
+ /// The following properties are supported:
+ /// * name: The name used to identify the source of log messages.
+ /// * facility: The facility added to each log message. See the Facility enumeration for a list of supported values.
+ /// The LOG_ prefix can be omitted and values are case insensitive (e.g. a facility value "mail" is recognized as SYSLOG_MAIL)
+ /// * format: "bsd"/"rfc3164" (RFC 3164 format) or "new"/"rfc5424" (default)
+ /// * loghost: The target IP address or host name where log messages are sent. Optionally, a port number (separated
+ /// by a colon) can also be specified.
+ /// * host: (optional) Host name included in syslog messages. If not specified, the host's real domain name or
+ /// IP address will be used.
+
+ std::string getProperty(const std::string& name) const;
+ /// Returns the value of the property with the given name.
+
+ static void registerChannel();
+ /// Registers the channel with the global LoggingFactory.
+
+ static const std::string PROP_NAME;
+ static const std::string PROP_FACILITY;
+ static const std::string PROP_FORMAT;
+ static const std::string PROP_LOGHOST;
+ static const std::string PROP_HOST;
+ static const std::string STRUCTURED_DATA;
+
+protected:
+ ~RemoteSyslogChannel();
+ static int getPrio(const Message& msg);
+
+private:
+ std::string _logHost;
+ std::string _name;
+ std::string _host;
+ int _facility;
+ bool _bsdFormat;
+ DatagramSocket _socket;
+ SocketAddress _socketAddress;
+ bool _open;
+ mutable Poco::FastMutex _mutex;
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_RemoteSyslogChannel_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/RemoteSyslogListener.h b/contrib/libs/poco/Net/include/Poco/Net/RemoteSyslogListener.h
index 435a96cd7c..93895244c2 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/RemoteSyslogListener.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/RemoteSyslogListener.h
@@ -1,121 +1,121 @@
-//
-// RemoteSyslogListener.h
-//
-// Library: Net
-// Package: Logging
-// Module: RemoteSyslogListener
-//
-// Definition of the RemoteSyslogListener class.
-//
-// Copyright (c) 2007-2011, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_RemoteSyslogListener_INCLUDED
-#define Net_RemoteSyslogListener_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/SocketAddress.h"
-#include "Poco/ThreadPool.h"
-#include "Poco/SplitterChannel.h"
-#include "Poco/NotificationQueue.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class RemoteUDPListener;
-class SyslogParser;
-
-
-class Net_API RemoteSyslogListener: public Poco::SplitterChannel
- /// RemoteSyslogListener implements listening for syslog messages
- /// sent over UDP, according to RFC 5424 "The Syslog Protocol"
- /// and RFC 5426 "Transmission of syslog messages over UDP".
- ///
- /// In addition, RemoteSyslogListener also supports the "old" BSD syslog
- /// protocol, as described in RFC 3164.
- ///
- /// The RemoteSyslogListener is a subclass of Poco::SplitterChannel.
- /// Every received log message is sent to the channels registered
- /// with addChannel() or the "channel" property.
- ///
- /// Poco::Message objects created by RemoteSyslogListener will have
- /// the following named parameters:
- /// - addr: IP address of the host/interface sending the message.
- /// - host: host name; only for "new" syslog messages.
- /// - app: application name; only for "new" syslog messages.
- /// - structured-data: RFC 5424 structured data, or empty if not present.
-{
-public:
- RemoteSyslogListener();
- /// Creates the RemoteSyslogListener.
-
- RemoteSyslogListener(Poco::UInt16 port);
- /// Creates the RemoteSyslogListener, listening on the given port number.
-
- RemoteSyslogListener(Poco::UInt16 port, int threads);
- /// Creates the RemoteSyslogListener, listening on the given port number
- /// and using the number of threads for message processing.
-
- void setProperty(const std::string& name, const std::string& value);
- /// Sets the property with the given value.
- ///
- /// The following properties are supported:
- /// * port: The UDP port number where to listen for UDP packets
- /// containing syslog messages. If 0 is specified, does not
- /// listen for UDP messages.
- /// * threads: The number of parser threads processing
- /// received syslog messages. Defaults to 1. A maximum
- /// of 16 threads is supported.
-
- std::string getProperty(const std::string& name) const;
- /// Returns the value of the property with the given name.
-
- void open();
- /// Starts the listener.
-
- void close();
- /// Stops the listener.
-
- void processMessage(const std::string& messageText);
- /// Parses a single line of text containing a syslog message
- /// and sends it down the filter chain.
-
- void enqueueMessage(const std::string& messageText, const Poco::Net::SocketAddress& senderAddress);
- /// Enqueues a single line of text containing a syslog message
- /// for asynchronous processing by a parser thread.
-
- static void registerChannel();
- /// Registers the channel with the global LoggingFactory.
-
- static const std::string PROP_PORT;
- static const std::string PROP_THREADS;
-
- static const std::string LOG_PROP_APP;
- static const std::string LOG_PROP_HOST;
- static const std::string LOG_PROP_STRUCTURED_DATA;
-
-protected:
- ~RemoteSyslogListener();
- /// Destroys the RemoteSyslogListener.
-
-private:
- RemoteUDPListener* _pListener;
- SyslogParser* _pParser;
- Poco::ThreadPool _threadPool;
- Poco::NotificationQueue _queue;
- Poco::UInt16 _port;
- int _threads;
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_RemoteSyslogListener_INCLUDED
+//
+// RemoteSyslogListener.h
+//
+// Library: Net
+// Package: Logging
+// Module: RemoteSyslogListener
+//
+// Definition of the RemoteSyslogListener class.
+//
+// Copyright (c) 2007-2011, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_RemoteSyslogListener_INCLUDED
+#define Net_RemoteSyslogListener_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/SocketAddress.h"
+#include "Poco/ThreadPool.h"
+#include "Poco/SplitterChannel.h"
+#include "Poco/NotificationQueue.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class RemoteUDPListener;
+class SyslogParser;
+
+
+class Net_API RemoteSyslogListener: public Poco::SplitterChannel
+ /// RemoteSyslogListener implements listening for syslog messages
+ /// sent over UDP, according to RFC 5424 "The Syslog Protocol"
+ /// and RFC 5426 "Transmission of syslog messages over UDP".
+ ///
+ /// In addition, RemoteSyslogListener also supports the "old" BSD syslog
+ /// protocol, as described in RFC 3164.
+ ///
+ /// The RemoteSyslogListener is a subclass of Poco::SplitterChannel.
+ /// Every received log message is sent to the channels registered
+ /// with addChannel() or the "channel" property.
+ ///
+ /// Poco::Message objects created by RemoteSyslogListener will have
+ /// the following named parameters:
+ /// - addr: IP address of the host/interface sending the message.
+ /// - host: host name; only for "new" syslog messages.
+ /// - app: application name; only for "new" syslog messages.
+ /// - structured-data: RFC 5424 structured data, or empty if not present.
+{
+public:
+ RemoteSyslogListener();
+ /// Creates the RemoteSyslogListener.
+
+ RemoteSyslogListener(Poco::UInt16 port);
+ /// Creates the RemoteSyslogListener, listening on the given port number.
+
+ RemoteSyslogListener(Poco::UInt16 port, int threads);
+ /// Creates the RemoteSyslogListener, listening on the given port number
+ /// and using the number of threads for message processing.
+
+ void setProperty(const std::string& name, const std::string& value);
+ /// Sets the property with the given value.
+ ///
+ /// The following properties are supported:
+ /// * port: The UDP port number where to listen for UDP packets
+ /// containing syslog messages. If 0 is specified, does not
+ /// listen for UDP messages.
+ /// * threads: The number of parser threads processing
+ /// received syslog messages. Defaults to 1. A maximum
+ /// of 16 threads is supported.
+
+ std::string getProperty(const std::string& name) const;
+ /// Returns the value of the property with the given name.
+
+ void open();
+ /// Starts the listener.
+
+ void close();
+ /// Stops the listener.
+
+ void processMessage(const std::string& messageText);
+ /// Parses a single line of text containing a syslog message
+ /// and sends it down the filter chain.
+
+ void enqueueMessage(const std::string& messageText, const Poco::Net::SocketAddress& senderAddress);
+ /// Enqueues a single line of text containing a syslog message
+ /// for asynchronous processing by a parser thread.
+
+ static void registerChannel();
+ /// Registers the channel with the global LoggingFactory.
+
+ static const std::string PROP_PORT;
+ static const std::string PROP_THREADS;
+
+ static const std::string LOG_PROP_APP;
+ static const std::string LOG_PROP_HOST;
+ static const std::string LOG_PROP_STRUCTURED_DATA;
+
+protected:
+ ~RemoteSyslogListener();
+ /// Destroys the RemoteSyslogListener.
+
+private:
+ RemoteUDPListener* _pListener;
+ SyslogParser* _pParser;
+ Poco::ThreadPool _threadPool;
+ Poco::NotificationQueue _queue;
+ Poco::UInt16 _port;
+ int _threads;
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_RemoteSyslogListener_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/SMTPChannel.h b/contrib/libs/poco/Net/include/Poco/Net/SMTPChannel.h
index 5e06b78629..373d93ded4 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/SMTPChannel.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/SMTPChannel.h
@@ -1,108 +1,108 @@
-//
-// SMTPChannel.h
-//
-// Library: Net
-// Package: Logging
-// Module: SMTPChannel
-//
-// Definition of the SMTPChannel class.
-//
-// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_SMTPChannel_INCLUDED
-#define Net_SMTPChannel_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Channel.h"
-#include "Poco/String.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API SMTPChannel: public Poco::Channel
- /// This Channel implements SMTP (email) logging.
-{
-public:
- SMTPChannel();
- /// Creates a SMTPChannel.
-
- SMTPChannel(const std::string& mailhost, const std::string& sender, const std::string& recipient);
- /// Creates a SMTPChannel with the given target mailhost, sender, and recipient.
-
- void open();
- /// Opens the SMTPChannel.
-
- void close();
- /// Closes the SMTPChannel.
-
- void log(const Message& msg);
- /// Sends the message's text to the recipient.
-
- void setProperty(const std::string& name, const std::string& value);
- /// Sets the property with the given value.
- ///
- /// The following properties are supported:
- /// * mailhost: The SMTP server. Default is "localhost".
- /// * sender: The sender address.
- /// * recipient: The recipient address.
- /// * local: If true, local time is used. Default is true.
- /// * attachment: Filename of the file to attach.
- /// * type: Content type of the file to attach.
- /// * delete: Boolean value indicating whether to delete
- /// the attachment file after sending.
- /// * throw: Boolean value indicating whether to throw
- /// exception upon failure.
-
- std::string getProperty(const std::string& name) const;
- /// Returns the value of the property with the given name.
-
- static void registerChannel();
- /// Registers the channel with the global LoggingFactory.
-
- static const std::string PROP_MAILHOST;
- static const std::string PROP_SENDER;
- static const std::string PROP_RECIPIENT;
- static const std::string PROP_LOCAL;
- static const std::string PROP_ATTACHMENT;
- static const std::string PROP_TYPE;
- static const std::string PROP_DELETE;
- static const std::string PROP_THROW;
-
-protected:
- ~SMTPChannel();
-
-private:
- bool isTrue(const std::string& value) const;
-
- std::string _mailHost;
- std::string _sender;
- std::string _recipient;
- bool _local;
- std::string _attachment;
- std::string _type;
- bool _delete;
- bool _throw;
-};
-
-
-inline bool SMTPChannel::isTrue(const std::string& value) const
-{
- return ((0 == icompare(value, "true")) ||
- (0 == icompare(value, "t")) ||
- (0 == icompare(value, "yes")) ||
- (0 == icompare(value, "y")));
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_SMTPChannel_INCLUDED
+//
+// SMTPChannel.h
+//
+// Library: Net
+// Package: Logging
+// Module: SMTPChannel
+//
+// Definition of the SMTPChannel class.
+//
+// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_SMTPChannel_INCLUDED
+#define Net_SMTPChannel_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Channel.h"
+#include "Poco/String.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API SMTPChannel: public Poco::Channel
+ /// This Channel implements SMTP (email) logging.
+{
+public:
+ SMTPChannel();
+ /// Creates a SMTPChannel.
+
+ SMTPChannel(const std::string& mailhost, const std::string& sender, const std::string& recipient);
+ /// Creates a SMTPChannel with the given target mailhost, sender, and recipient.
+
+ void open();
+ /// Opens the SMTPChannel.
+
+ void close();
+ /// Closes the SMTPChannel.
+
+ void log(const Message& msg);
+ /// Sends the message's text to the recipient.
+
+ void setProperty(const std::string& name, const std::string& value);
+ /// Sets the property with the given value.
+ ///
+ /// The following properties are supported:
+ /// * mailhost: The SMTP server. Default is "localhost".
+ /// * sender: The sender address.
+ /// * recipient: The recipient address.
+ /// * local: If true, local time is used. Default is true.
+ /// * attachment: Filename of the file to attach.
+ /// * type: Content type of the file to attach.
+ /// * delete: Boolean value indicating whether to delete
+ /// the attachment file after sending.
+ /// * throw: Boolean value indicating whether to throw
+ /// exception upon failure.
+
+ std::string getProperty(const std::string& name) const;
+ /// Returns the value of the property with the given name.
+
+ static void registerChannel();
+ /// Registers the channel with the global LoggingFactory.
+
+ static const std::string PROP_MAILHOST;
+ static const std::string PROP_SENDER;
+ static const std::string PROP_RECIPIENT;
+ static const std::string PROP_LOCAL;
+ static const std::string PROP_ATTACHMENT;
+ static const std::string PROP_TYPE;
+ static const std::string PROP_DELETE;
+ static const std::string PROP_THROW;
+
+protected:
+ ~SMTPChannel();
+
+private:
+ bool isTrue(const std::string& value) const;
+
+ std::string _mailHost;
+ std::string _sender;
+ std::string _recipient;
+ bool _local;
+ std::string _attachment;
+ std::string _type;
+ bool _delete;
+ bool _throw;
+};
+
+
+inline bool SMTPChannel::isTrue(const std::string& value) const
+{
+ return ((0 == icompare(value, "true")) ||
+ (0 == icompare(value, "t")) ||
+ (0 == icompare(value, "yes")) ||
+ (0 == icompare(value, "y")));
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_SMTPChannel_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/SMTPClientSession.h b/contrib/libs/poco/Net/include/Poco/Net/SMTPClientSession.h
index c29bfa2a53..5edf999598 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/SMTPClientSession.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/SMTPClientSession.h
@@ -1,234 +1,234 @@
-//
-// SMTPClientSession.h
-//
-// Library: Net
-// Package: Mail
-// Module: SMTPClientSession
-//
-// Definition of the SMTPClientSession class.
-//
-// Copyright (c) 2005-2008, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_SMTPClientSession_INCLUDED
-#define Net_SMTPClientSession_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/DialogSocket.h"
-#include "Poco/DigestEngine.h"
-#include "Poco/Timespan.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class MailMessage;
-
-
-class Net_API SMTPClientSession
- /// This class implements an Simple Mail
- /// Transfer Protocol (SMTP, RFC 2821)
- /// client for sending e-mail messages.
-{
-public:
- typedef std::vector<std::string> Recipients;
-
- enum
- {
- SMTP_PORT = 25
- };
-
- enum LoginMethod
- {
- AUTH_NONE,
- AUTH_CRAM_MD5,
- AUTH_CRAM_SHA1,
- AUTH_LOGIN,
- AUTH_PLAIN,
- AUTH_XOAUTH2
- };
-
- explicit SMTPClientSession(const StreamSocket& socket);
- /// Creates the SMTPClientSession using
- /// the given socket, which must be connected
- /// to a SMTP server.
-
- SMTPClientSession(const std::string& host, Poco::UInt16 port = SMTP_PORT);
- /// Creates the SMTPClientSession using a socket connected
- /// to the given host and port.
-
- virtual ~SMTPClientSession();
- /// Destroys the SMTPClientSession.
-
- void setTimeout(const Poco::Timespan& timeout);
- /// Sets the timeout for socket read operations.
-
- Poco::Timespan getTimeout() const;
- /// Returns the timeout for socket read operations.
-
- void login(const std::string& hostname);
- /// Greets the SMTP server by sending a EHLO command
- /// with the given hostname as argument.
- ///
- /// If the server does not understand the EHLO command,
- /// a HELO command is sent instead.
- ///
- /// Throws a SMTPException in case of a SMTP-specific error, or a
- /// NetException in case of a general network communication failure.
-
- void login();
- /// Calls login(hostname) with the current host name.
-
- void login(const std::string& hostname, LoginMethod loginMethod, const std::string& username, const std::string& password);
- /// Logs in to the SMTP server using the given authentication method and the given
- /// credentials.
-
- void login(LoginMethod loginMethod, const std::string& username, const std::string& password);
- /// Logs in to the SMTP server using the given authentication method and the given
- /// credentials.
-
- void open();
- /// Reads the initial response from the SMTP server.
- ///
- /// Usually called implicitly through login(), but can
- /// also be called explicitly to implement different forms
- /// of SMTP authentication.
- ///
- /// Does nothing if called more than once.
-
- void close();
- /// Sends a QUIT command and closes the connection to the server.
- ///
- /// Throws a SMTPException in case of a SMTP-specific error, or a
- /// NetException in case of a general network communication failure.
-
- void sendMessage(const MailMessage& message);
- /// Sends the given mail message by sending a MAIL FROM command,
- /// a RCPT TO command for every recipient, and a DATA command with
- /// the message headers and content. Using this function results in
- /// RCPT TO commands list generated from the recipient list supplied
- /// with the message itself.
- ///
- /// Throws a SMTPException in case of a SMTP-specific error, or a
- /// NetException in case of a general network communication failure.
-
- void sendMessage(const MailMessage& message, const Recipients& recipients);
- /// Sends the given mail message by sending a MAIL FROM command,
- /// a RCPT TO command for every recipient, and a DATA command with
- /// the message headers and content. Using this function results in
- /// message header being generated from the supplied recipients list.
- ///
- /// Throws a SMTPException in case of a SMTP-specific error, or a
- /// NetException in case of a general network communication failure.
-
- void sendMessage(std::istream& istr);
- /// Sends the mail message from the supplied stream. Content of the stream
- /// is copied without any checking. Only the completion status is checked and,
- /// if not valid, SMTPExcpetion is thrown.
-
- int sendCommand(const std::string& command, std::string& response);
- /// Sends the given command verbatim to the server
- /// and waits for a response.
- ///
- /// Throws a SMTPException in case of a SMTP-specific error, or a
- /// NetException in case of a general network communication failure.
-
- int sendCommand(const std::string& command, const std::string& arg, std::string& response);
- /// Sends the given command verbatim to the server
- /// and waits for a response.
- ///
- /// Throws a SMTPException in case of a SMTP-specific error, or a
- /// NetException in case of a general network communication failure.
-
- void sendAddresses(const std::string& from, const Recipients& recipients);
- /// Sends the message preamble by sending a MAIL FROM command,
- /// and a RCPT TO command for every recipient.
- ///
- /// Throws a SMTPException in case of a SMTP-specific error, or a
- /// NetException in case of a general network communication failure.
-
- void sendData();
- /// Sends the message preamble by sending a DATA command.
- ///
- /// Throws a SMTPException in case of a SMTP-specific error, or a
- /// NetException in case of a general network communication failure.
-
-protected:
- enum StatusClass
- {
- SMTP_POSITIVE_COMPLETION = 2,
- SMTP_POSITIVE_INTERMEDIATE = 3,
- SMTP_TRANSIENT_NEGATIVE = 4,
- SMTP_PERMANENT_NEGATIVE = 5
- };
- enum
- {
- DEFAULT_TIMEOUT = 30000000 // 30 seconds default timeout for socket operations
- };
-
- static bool isPositiveCompletion(int status);
- static bool isPositiveIntermediate(int status);
- static bool isTransientNegative(int status);
- static bool isPermanentNegative(int status);
-
- void login(const std::string& hostname, std::string& response);
- void loginUsingCRAMMD5(const std::string& username, const std::string& password);
- void loginUsingCRAMSHA1(const std::string& username, const std::string& password);
- void loginUsingCRAM(const std::string& username, const std::string& method, Poco::DigestEngine& hmac);
- void loginUsingLogin(const std::string& username, const std::string& password);
- void loginUsingPlain(const std::string& username, const std::string& password);
- void loginUsingXOAUTH2(const std::string& username, const std::string& password);
- DialogSocket& socket();
-
-private:
- void sendCommands(const MailMessage& message, const Recipients* pRecipients = 0);
- void transportMessage(const MailMessage& message);
-
- DialogSocket _socket;
- bool _isOpen;
-};
-
-
-//
-// inlines
-//
-inline bool SMTPClientSession::isPositiveCompletion(int status)
-{
- return status/100 == SMTP_POSITIVE_COMPLETION;
-}
-
-
-inline bool SMTPClientSession::isPositiveIntermediate(int status)
-{
- return status/100 == SMTP_POSITIVE_INTERMEDIATE;
-}
-
-
-inline bool SMTPClientSession::isTransientNegative(int status)
-{
- return status/100 == SMTP_TRANSIENT_NEGATIVE;
-}
-
-
-inline bool SMTPClientSession::isPermanentNegative(int status)
-{
- return status/100 == SMTP_PERMANENT_NEGATIVE;
-}
-
-
-inline DialogSocket& SMTPClientSession::socket()
-{
- return _socket;
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_SMTPClientSession_INCLUDED
+//
+// SMTPClientSession.h
+//
+// Library: Net
+// Package: Mail
+// Module: SMTPClientSession
+//
+// Definition of the SMTPClientSession class.
+//
+// Copyright (c) 2005-2008, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_SMTPClientSession_INCLUDED
+#define Net_SMTPClientSession_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/DialogSocket.h"
+#include "Poco/DigestEngine.h"
+#include "Poco/Timespan.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class MailMessage;
+
+
+class Net_API SMTPClientSession
+ /// This class implements an Simple Mail
+ /// Transfer Protocol (SMTP, RFC 2821)
+ /// client for sending e-mail messages.
+{
+public:
+ typedef std::vector<std::string> Recipients;
+
+ enum
+ {
+ SMTP_PORT = 25
+ };
+
+ enum LoginMethod
+ {
+ AUTH_NONE,
+ AUTH_CRAM_MD5,
+ AUTH_CRAM_SHA1,
+ AUTH_LOGIN,
+ AUTH_PLAIN,
+ AUTH_XOAUTH2
+ };
+
+ explicit SMTPClientSession(const StreamSocket& socket);
+ /// Creates the SMTPClientSession using
+ /// the given socket, which must be connected
+ /// to a SMTP server.
+
+ SMTPClientSession(const std::string& host, Poco::UInt16 port = SMTP_PORT);
+ /// Creates the SMTPClientSession using a socket connected
+ /// to the given host and port.
+
+ virtual ~SMTPClientSession();
+ /// Destroys the SMTPClientSession.
+
+ void setTimeout(const Poco::Timespan& timeout);
+ /// Sets the timeout for socket read operations.
+
+ Poco::Timespan getTimeout() const;
+ /// Returns the timeout for socket read operations.
+
+ void login(const std::string& hostname);
+ /// Greets the SMTP server by sending a EHLO command
+ /// with the given hostname as argument.
+ ///
+ /// If the server does not understand the EHLO command,
+ /// a HELO command is sent instead.
+ ///
+ /// Throws a SMTPException in case of a SMTP-specific error, or a
+ /// NetException in case of a general network communication failure.
+
+ void login();
+ /// Calls login(hostname) with the current host name.
+
+ void login(const std::string& hostname, LoginMethod loginMethod, const std::string& username, const std::string& password);
+ /// Logs in to the SMTP server using the given authentication method and the given
+ /// credentials.
+
+ void login(LoginMethod loginMethod, const std::string& username, const std::string& password);
+ /// Logs in to the SMTP server using the given authentication method and the given
+ /// credentials.
+
+ void open();
+ /// Reads the initial response from the SMTP server.
+ ///
+ /// Usually called implicitly through login(), but can
+ /// also be called explicitly to implement different forms
+ /// of SMTP authentication.
+ ///
+ /// Does nothing if called more than once.
+
+ void close();
+ /// Sends a QUIT command and closes the connection to the server.
+ ///
+ /// Throws a SMTPException in case of a SMTP-specific error, or a
+ /// NetException in case of a general network communication failure.
+
+ void sendMessage(const MailMessage& message);
+ /// Sends the given mail message by sending a MAIL FROM command,
+ /// a RCPT TO command for every recipient, and a DATA command with
+ /// the message headers and content. Using this function results in
+ /// RCPT TO commands list generated from the recipient list supplied
+ /// with the message itself.
+ ///
+ /// Throws a SMTPException in case of a SMTP-specific error, or a
+ /// NetException in case of a general network communication failure.
+
+ void sendMessage(const MailMessage& message, const Recipients& recipients);
+ /// Sends the given mail message by sending a MAIL FROM command,
+ /// a RCPT TO command for every recipient, and a DATA command with
+ /// the message headers and content. Using this function results in
+ /// message header being generated from the supplied recipients list.
+ ///
+ /// Throws a SMTPException in case of a SMTP-specific error, or a
+ /// NetException in case of a general network communication failure.
+
+ void sendMessage(std::istream& istr);
+ /// Sends the mail message from the supplied stream. Content of the stream
+ /// is copied without any checking. Only the completion status is checked and,
+ /// if not valid, SMTPExcpetion is thrown.
+
+ int sendCommand(const std::string& command, std::string& response);
+ /// Sends the given command verbatim to the server
+ /// and waits for a response.
+ ///
+ /// Throws a SMTPException in case of a SMTP-specific error, or a
+ /// NetException in case of a general network communication failure.
+
+ int sendCommand(const std::string& command, const std::string& arg, std::string& response);
+ /// Sends the given command verbatim to the server
+ /// and waits for a response.
+ ///
+ /// Throws a SMTPException in case of a SMTP-specific error, or a
+ /// NetException in case of a general network communication failure.
+
+ void sendAddresses(const std::string& from, const Recipients& recipients);
+ /// Sends the message preamble by sending a MAIL FROM command,
+ /// and a RCPT TO command for every recipient.
+ ///
+ /// Throws a SMTPException in case of a SMTP-specific error, or a
+ /// NetException in case of a general network communication failure.
+
+ void sendData();
+ /// Sends the message preamble by sending a DATA command.
+ ///
+ /// Throws a SMTPException in case of a SMTP-specific error, or a
+ /// NetException in case of a general network communication failure.
+
+protected:
+ enum StatusClass
+ {
+ SMTP_POSITIVE_COMPLETION = 2,
+ SMTP_POSITIVE_INTERMEDIATE = 3,
+ SMTP_TRANSIENT_NEGATIVE = 4,
+ SMTP_PERMANENT_NEGATIVE = 5
+ };
+ enum
+ {
+ DEFAULT_TIMEOUT = 30000000 // 30 seconds default timeout for socket operations
+ };
+
+ static bool isPositiveCompletion(int status);
+ static bool isPositiveIntermediate(int status);
+ static bool isTransientNegative(int status);
+ static bool isPermanentNegative(int status);
+
+ void login(const std::string& hostname, std::string& response);
+ void loginUsingCRAMMD5(const std::string& username, const std::string& password);
+ void loginUsingCRAMSHA1(const std::string& username, const std::string& password);
+ void loginUsingCRAM(const std::string& username, const std::string& method, Poco::DigestEngine& hmac);
+ void loginUsingLogin(const std::string& username, const std::string& password);
+ void loginUsingPlain(const std::string& username, const std::string& password);
+ void loginUsingXOAUTH2(const std::string& username, const std::string& password);
+ DialogSocket& socket();
+
+private:
+ void sendCommands(const MailMessage& message, const Recipients* pRecipients = 0);
+ void transportMessage(const MailMessage& message);
+
+ DialogSocket _socket;
+ bool _isOpen;
+};
+
+
+//
+// inlines
+//
+inline bool SMTPClientSession::isPositiveCompletion(int status)
+{
+ return status/100 == SMTP_POSITIVE_COMPLETION;
+}
+
+
+inline bool SMTPClientSession::isPositiveIntermediate(int status)
+{
+ return status/100 == SMTP_POSITIVE_INTERMEDIATE;
+}
+
+
+inline bool SMTPClientSession::isTransientNegative(int status)
+{
+ return status/100 == SMTP_TRANSIENT_NEGATIVE;
+}
+
+
+inline bool SMTPClientSession::isPermanentNegative(int status)
+{
+ return status/100 == SMTP_PERMANENT_NEGATIVE;
+}
+
+
+inline DialogSocket& SMTPClientSession::socket()
+{
+ return _socket;
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_SMTPClientSession_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/ServerSocket.h b/contrib/libs/poco/Net/include/Poco/Net/ServerSocket.h
index 2cd6765788..d8aca6790a 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/ServerSocket.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/ServerSocket.h
@@ -1,230 +1,230 @@
-//
-// ServerSocket.h
-//
-// Library: Net
-// Package: Sockets
-// Module: ServerSocket
-//
-// Definition of the ServerSocket class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_ServerSocket_INCLUDED
-#define Net_ServerSocket_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/Socket.h"
-#include "Poco/Net/StreamSocket.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API ServerSocket: public Socket
- /// This class provides an interface to a
- /// TCP server socket.
-{
-public:
- ServerSocket();
- /// Creates a server socket.
- ///
- /// The server socket must be bound to
- /// an address and put into listening state.
-
- ServerSocket(const Socket& socket);
- /// Creates the ServerSocket with the SocketImpl
- /// from another socket. The SocketImpl must be
- /// a ServerSocketImpl, otherwise an InvalidArgumentException
- /// will be thrown.
-
- ServerSocket(const SocketAddress& address, int backlog = 64);
- /// Creates a server socket, binds it
- /// to the given address and puts it in listening
- /// state.
- ///
- /// After successful construction, the server socket
- /// is ready to accept connections.
-
- ServerSocket(Poco::UInt16 port, int backlog = 64);
- /// Creates a server socket, binds it
- /// to the given port and puts it in listening
- /// state.
- ///
- /// After successful construction, the server socket
- /// is ready to accept connections.
-
- virtual ~ServerSocket();
- /// Destroys the StreamSocket.
-
- ServerSocket& operator = (const Socket& socket);
- /// Assignment operator.
- ///
- /// Releases the socket's SocketImpl and
- /// attaches the SocketImpl from the other socket and
- /// increments the reference count of the SocketImpl.
-
- virtual void bind(const SocketAddress& address, bool reuseAddress = false);
- /// Binds a local address to the socket.
- ///
- /// This is usually only done when establishing a server
- /// socket. TCP clients should not bind a socket to a
- /// specific address.
- ///
- /// If reuseAddress is true, sets the SO_REUSEADDR
- /// socket option.
-
- virtual void bind(const SocketAddress& address, bool reuseAddress, bool reusePort);
- /// Binds a local address to the socket.
- ///
- /// This is usually only done when establishing a server
- /// socket. TCP clients should not bind a socket to a
- /// specific address.
- ///
- /// If reuseAddress is true, sets the SO_REUSEADDR
- /// socket option.
- ///
- /// If reuseAddress is true, sets the SO_REUSEPORT
- /// socket option.
-
- virtual void bind(Poco::UInt16 port, bool reuseAddress = false);
- /// Binds a local port to the socket.
- ///
- /// This is usually only done when establishing a server
- /// socket.
- ///
- /// If reuseAddress is true, sets the SO_REUSEADDR
- /// socket option.
-
- virtual void bind(Poco::UInt16 port, bool reuseAddress, bool reusePort);
- /// Binds a local port to the socket.
- ///
- /// This is usually only done when establishing a server
- /// socket.
- ///
- /// If reuseAddress is true, sets the SO_REUSEADDR
- /// socket option.
- ///
- /// If reusePort is true, sets the SO_REUSEPORT
- /// socket option.
-
- virtual void bind6(const SocketAddress& address, bool reuseAddress = false, bool ipV6Only = false);
- /// Binds a local IPv6 address to the socket.
- ///
- /// This is usually only done when establishing a server
- /// socket. TCP clients should not bind a socket to a
- /// specific address.
- ///
- /// If reuseAddress is true, sets the SO_REUSEADDR
- /// socket option.
- ///
- /// The given address must be an IPv6 address. The
- /// IPPROTO_IPV6/IPV6_V6ONLY option is set on the socket
- /// according to the ipV6Only parameter.
- ///
- /// If the library has not been built with IPv6 support,
- /// a Poco::NotImplementedException will be thrown.
-
- virtual void bind6(const SocketAddress& address, bool reuseAddress, bool reusePort, bool ipV6Only);
- /// Binds a local IPv6 address to the socket.
- ///
- /// This is usually only done when establishing a server
- /// socket. TCP clients should not bind a socket to a
- /// specific address.
- ///
- /// If reuseAddress is true, sets the SO_REUSEADDR
- /// socket option.
- ///
- /// If reusePort is true, sets the SO_REUSEPORT
- /// socket option.
- ///
- /// The given address must be an IPv6 address. The
- /// IPPROTO_IPV6/IPV6_V6ONLY option is set on the socket
- /// according to the ipV6Only parameter.
- ///
- /// If the library has not been built with IPv6 support,
- /// a Poco::NotImplementedException will be thrown.
-
- virtual void bind6(Poco::UInt16 port, bool reuseAddress = false, bool ipV6Only = false);
- /// Binds a local IPv6 port to the socket.
- ///
- /// This is usually only done when establishing a server
- /// socket.
- ///
- /// If reuseAddress is true, sets the SO_REUSEADDR
- /// socket option.
- ///
- /// The given address must be an IPv6 address. The
- /// IPPROTO_IPV6/IPV6_V6ONLY option is set on the socket
- /// according to the ipV6Only parameter.
- ///
- /// If the library has not been built with IPv6 support,
- /// a Poco::NotImplementedException will be thrown.
-
- virtual void bind6(Poco::UInt16 port, bool reuseAddress, bool reusePort, bool ipV6Only);
- /// Binds a local IPv6 port to the socket.
- ///
- /// This is usually only done when establishing a server
- /// socket.
- ///
- /// If reuseAddress is true, sets the SO_REUSEADDR
- /// socket option.
- ///
- /// If reusePort is true, sets the SO_REUSEPORT
- /// socket option.
- /// The given address must be an IPv6 address. The
- /// IPPROTO_IPV6/IPV6_V6ONLY option is set on the socket
- /// according to the ipV6Only parameter.
- ///
- /// If the library has not been built with IPv6 support,
- /// a Poco::NotImplementedException will be thrown.
-
- virtual void listen(int backlog = 64);
- /// Puts the socket into listening state.
- ///
- /// The socket becomes a passive socket that
- /// can accept incoming connection requests.
- ///
- /// The backlog argument specifies the maximum
- /// number of connections that can be queued
- /// for this socket.
-
- virtual StreamSocket acceptConnection(SocketAddress& clientAddr);
- /// Gets the next completed connection from the
- /// socket's completed connection queue.
- ///
- /// If the queue is empty, waits until a connection
- /// request completes.
- ///
- /// Returns a new TCP socket for the connection
- /// with the client.
- ///
- /// The client socket's address is returned in clientAddr.
-
- virtual StreamSocket acceptConnection();
- /// Gets the next completed connection from the
- /// socket's completed connection queue.
- ///
- /// If the queue is empty, waits until a connection
- /// request completes.
- ///
- /// Returns a new TCP socket for the connection
- /// with the client.
-
-protected:
- ServerSocket(SocketImpl* pImpl, bool);
- /// The bool argument is to resolve an ambiguity with
- /// another constructor (Microsoft Visual C++ 2005)
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_ServerSocket_INCLUDED
+//
+// ServerSocket.h
+//
+// Library: Net
+// Package: Sockets
+// Module: ServerSocket
+//
+// Definition of the ServerSocket class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_ServerSocket_INCLUDED
+#define Net_ServerSocket_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/Socket.h"
+#include "Poco/Net/StreamSocket.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API ServerSocket: public Socket
+ /// This class provides an interface to a
+ /// TCP server socket.
+{
+public:
+ ServerSocket();
+ /// Creates a server socket.
+ ///
+ /// The server socket must be bound to
+ /// an address and put into listening state.
+
+ ServerSocket(const Socket& socket);
+ /// Creates the ServerSocket with the SocketImpl
+ /// from another socket. The SocketImpl must be
+ /// a ServerSocketImpl, otherwise an InvalidArgumentException
+ /// will be thrown.
+
+ ServerSocket(const SocketAddress& address, int backlog = 64);
+ /// Creates a server socket, binds it
+ /// to the given address and puts it in listening
+ /// state.
+ ///
+ /// After successful construction, the server socket
+ /// is ready to accept connections.
+
+ ServerSocket(Poco::UInt16 port, int backlog = 64);
+ /// Creates a server socket, binds it
+ /// to the given port and puts it in listening
+ /// state.
+ ///
+ /// After successful construction, the server socket
+ /// is ready to accept connections.
+
+ virtual ~ServerSocket();
+ /// Destroys the StreamSocket.
+
+ ServerSocket& operator = (const Socket& socket);
+ /// Assignment operator.
+ ///
+ /// Releases the socket's SocketImpl and
+ /// attaches the SocketImpl from the other socket and
+ /// increments the reference count of the SocketImpl.
+
+ virtual void bind(const SocketAddress& address, bool reuseAddress = false);
+ /// Binds a local address to the socket.
+ ///
+ /// This is usually only done when establishing a server
+ /// socket. TCP clients should not bind a socket to a
+ /// specific address.
+ ///
+ /// If reuseAddress is true, sets the SO_REUSEADDR
+ /// socket option.
+
+ virtual void bind(const SocketAddress& address, bool reuseAddress, bool reusePort);
+ /// Binds a local address to the socket.
+ ///
+ /// This is usually only done when establishing a server
+ /// socket. TCP clients should not bind a socket to a
+ /// specific address.
+ ///
+ /// If reuseAddress is true, sets the SO_REUSEADDR
+ /// socket option.
+ ///
+ /// If reuseAddress is true, sets the SO_REUSEPORT
+ /// socket option.
+
+ virtual void bind(Poco::UInt16 port, bool reuseAddress = false);
+ /// Binds a local port to the socket.
+ ///
+ /// This is usually only done when establishing a server
+ /// socket.
+ ///
+ /// If reuseAddress is true, sets the SO_REUSEADDR
+ /// socket option.
+
+ virtual void bind(Poco::UInt16 port, bool reuseAddress, bool reusePort);
+ /// Binds a local port to the socket.
+ ///
+ /// This is usually only done when establishing a server
+ /// socket.
+ ///
+ /// If reuseAddress is true, sets the SO_REUSEADDR
+ /// socket option.
+ ///
+ /// If reusePort is true, sets the SO_REUSEPORT
+ /// socket option.
+
+ virtual void bind6(const SocketAddress& address, bool reuseAddress = false, bool ipV6Only = false);
+ /// Binds a local IPv6 address to the socket.
+ ///
+ /// This is usually only done when establishing a server
+ /// socket. TCP clients should not bind a socket to a
+ /// specific address.
+ ///
+ /// If reuseAddress is true, sets the SO_REUSEADDR
+ /// socket option.
+ ///
+ /// The given address must be an IPv6 address. The
+ /// IPPROTO_IPV6/IPV6_V6ONLY option is set on the socket
+ /// according to the ipV6Only parameter.
+ ///
+ /// If the library has not been built with IPv6 support,
+ /// a Poco::NotImplementedException will be thrown.
+
+ virtual void bind6(const SocketAddress& address, bool reuseAddress, bool reusePort, bool ipV6Only);
+ /// Binds a local IPv6 address to the socket.
+ ///
+ /// This is usually only done when establishing a server
+ /// socket. TCP clients should not bind a socket to a
+ /// specific address.
+ ///
+ /// If reuseAddress is true, sets the SO_REUSEADDR
+ /// socket option.
+ ///
+ /// If reusePort is true, sets the SO_REUSEPORT
+ /// socket option.
+ ///
+ /// The given address must be an IPv6 address. The
+ /// IPPROTO_IPV6/IPV6_V6ONLY option is set on the socket
+ /// according to the ipV6Only parameter.
+ ///
+ /// If the library has not been built with IPv6 support,
+ /// a Poco::NotImplementedException will be thrown.
+
+ virtual void bind6(Poco::UInt16 port, bool reuseAddress = false, bool ipV6Only = false);
+ /// Binds a local IPv6 port to the socket.
+ ///
+ /// This is usually only done when establishing a server
+ /// socket.
+ ///
+ /// If reuseAddress is true, sets the SO_REUSEADDR
+ /// socket option.
+ ///
+ /// The given address must be an IPv6 address. The
+ /// IPPROTO_IPV6/IPV6_V6ONLY option is set on the socket
+ /// according to the ipV6Only parameter.
+ ///
+ /// If the library has not been built with IPv6 support,
+ /// a Poco::NotImplementedException will be thrown.
+
+ virtual void bind6(Poco::UInt16 port, bool reuseAddress, bool reusePort, bool ipV6Only);
+ /// Binds a local IPv6 port to the socket.
+ ///
+ /// This is usually only done when establishing a server
+ /// socket.
+ ///
+ /// If reuseAddress is true, sets the SO_REUSEADDR
+ /// socket option.
+ ///
+ /// If reusePort is true, sets the SO_REUSEPORT
+ /// socket option.
+ /// The given address must be an IPv6 address. The
+ /// IPPROTO_IPV6/IPV6_V6ONLY option is set on the socket
+ /// according to the ipV6Only parameter.
+ ///
+ /// If the library has not been built with IPv6 support,
+ /// a Poco::NotImplementedException will be thrown.
+
+ virtual void listen(int backlog = 64);
+ /// Puts the socket into listening state.
+ ///
+ /// The socket becomes a passive socket that
+ /// can accept incoming connection requests.
+ ///
+ /// The backlog argument specifies the maximum
+ /// number of connections that can be queued
+ /// for this socket.
+
+ virtual StreamSocket acceptConnection(SocketAddress& clientAddr);
+ /// Gets the next completed connection from the
+ /// socket's completed connection queue.
+ ///
+ /// If the queue is empty, waits until a connection
+ /// request completes.
+ ///
+ /// Returns a new TCP socket for the connection
+ /// with the client.
+ ///
+ /// The client socket's address is returned in clientAddr.
+
+ virtual StreamSocket acceptConnection();
+ /// Gets the next completed connection from the
+ /// socket's completed connection queue.
+ ///
+ /// If the queue is empty, waits until a connection
+ /// request completes.
+ ///
+ /// Returns a new TCP socket for the connection
+ /// with the client.
+
+protected:
+ ServerSocket(SocketImpl* pImpl, bool);
+ /// The bool argument is to resolve an ambiguity with
+ /// another constructor (Microsoft Visual C++ 2005)
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_ServerSocket_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/ServerSocketImpl.h b/contrib/libs/poco/Net/include/Poco/Net/ServerSocketImpl.h
index 903b153281..aaa5c7cc20 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/ServerSocketImpl.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/ServerSocketImpl.h
@@ -1,45 +1,45 @@
-//
-// ServerSocketImpl.h
-//
-// Library: Net
-// Package: Sockets
-// Module: ServerSocketImpl
-//
-// Definition of the ServerSocketImpl class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_ServerSocketImpl_INCLUDED
-#define Net_ServerSocketImpl_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/SocketImpl.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API ServerSocketImpl: public SocketImpl
- /// This class implements a TCP server socket.
-{
-public:
- ServerSocketImpl();
- /// Creates the ServerSocketImpl.
-
-protected:
- virtual ~ServerSocketImpl();
- /// Destroys the ServerSocketImpl.
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_ServerSocketImpl_INCLUDED
+//
+// ServerSocketImpl.h
+//
+// Library: Net
+// Package: Sockets
+// Module: ServerSocketImpl
+//
+// Definition of the ServerSocketImpl class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_ServerSocketImpl_INCLUDED
+#define Net_ServerSocketImpl_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/SocketImpl.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API ServerSocketImpl: public SocketImpl
+ /// This class implements a TCP server socket.
+{
+public:
+ ServerSocketImpl();
+ /// Creates the ServerSocketImpl.
+
+protected:
+ virtual ~ServerSocketImpl();
+ /// Destroys the ServerSocketImpl.
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_ServerSocketImpl_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/Socket.h b/contrib/libs/poco/Net/include/Poco/Net/Socket.h
index 01f3f3ef2d..c509187d8d 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/Socket.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/Socket.h
@@ -1,631 +1,631 @@
-//
-// Socket.h
-//
-// Library: Net
-// Package: Sockets
-// Module: Socket
-//
-// Definition of the Socket class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_Socket_INCLUDED
-#define Net_Socket_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/SocketImpl.h"
-#include <vector>
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API Socket
- /// Socket is the common base class for
- /// StreamSocket, ServerSocket, DatagramSocket and other
- /// socket classes.
- ///
- /// It provides operations common to all socket types.
-{
-public:
- enum SelectMode
- /// The mode argument to poll() and select().
- {
- SELECT_READ = 1,
- SELECT_WRITE = 2,
- SELECT_ERROR = 4
- };
-
- typedef std::vector<Socket> SocketList;
-
- Socket();
- /// Creates an uninitialized socket.
-
- Socket(const Socket& socket);
- /// Copy constructor.
+//
+// Socket.h
+//
+// Library: Net
+// Package: Sockets
+// Module: Socket
+//
+// Definition of the Socket class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_Socket_INCLUDED
+#define Net_Socket_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/SocketImpl.h"
+#include <vector>
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API Socket
+ /// Socket is the common base class for
+ /// StreamSocket, ServerSocket, DatagramSocket and other
+ /// socket classes.
+ ///
+ /// It provides operations common to all socket types.
+{
+public:
+ enum SelectMode
+ /// The mode argument to poll() and select().
+ {
+ SELECT_READ = 1,
+ SELECT_WRITE = 2,
+ SELECT_ERROR = 4
+ };
+
+ typedef std::vector<Socket> SocketList;
+
+ Socket();
+ /// Creates an uninitialized socket.
+
+ Socket(const Socket& socket);
+ /// Copy constructor.
+ ///
+ /// Attaches the SocketImpl from the other socket and
+ /// increments the reference count of the SocketImpl.
+
+ Socket& operator = (const Socket& socket);
+ /// Assignment operator.
+ ///
+ /// Releases the socket's SocketImpl and
+ /// attaches the SocketImpl from the other socket and
+ /// increments the reference count of the SocketImpl.
+
+ virtual ~Socket();
+ /// Destroys the Socket and releases the
+ /// SocketImpl.
+
+ bool operator == (const Socket& socket) const;
+ /// Returns true if both sockets share the same
+ /// SocketImpl, false otherwise.
+
+ bool operator != (const Socket& socket) const;
+ /// Returns false if both sockets share the same
+ /// SocketImpl, true otherwise.
+
+ bool operator < (const Socket& socket) const;
+ /// Compares the SocketImpl pointers.
+
+ bool operator <= (const Socket& socket) const;
+ /// Compares the SocketImpl pointers.
+
+ bool operator > (const Socket& socket) const;
+ /// Compares the SocketImpl pointers.
+
+ bool operator >= (const Socket& socket) const;
+ /// Compares the SocketImpl pointers.
+
+ void close();
+ /// Closes the socket.
+
+ static int select(SocketList& readList, SocketList& writeList, SocketList& exceptList, const Poco::Timespan& timeout);
+ /// Determines the status of one or more sockets,
+ /// using a call to select().
+ ///
+ /// ReadList contains the list of sockets which should be
+ /// checked for readability.
+ ///
+ /// WriteList contains the list of sockets which should be
+ /// checked for writeability.
+ ///
+ /// ExceptList contains a list of sockets which should be
+ /// checked for a pending error.
+ ///
+ /// Returns the number of sockets ready.
+ ///
+ /// After return,
+ /// * readList contains those sockets ready for reading,
+ /// * writeList contains those sockets ready for writing,
+ /// * exceptList contains those sockets with a pending error.
+ ///
+ /// If the total number of sockets passed in readList, writeList and
+ /// exceptList is zero, select() will return immediately and the
+ /// return value will be 0.
+ ///
+ /// If one of the sockets passed to select() is closed while
+ /// select() runs, select will return immediately. However,
+ /// the closed socket will not be included in any list.
+ /// In this case, the return value may be greater than the sum
+ /// of all sockets in all list.
+
+ bool poll(const Poco::Timespan& timeout, int mode) const;
+ /// Determines the status of the socket, using a
+ /// call to poll() or select().
///
- /// Attaches the SocketImpl from the other socket and
- /// increments the reference count of the SocketImpl.
-
- Socket& operator = (const Socket& socket);
- /// Assignment operator.
- ///
- /// Releases the socket's SocketImpl and
- /// attaches the SocketImpl from the other socket and
- /// increments the reference count of the SocketImpl.
-
- virtual ~Socket();
- /// Destroys the Socket and releases the
- /// SocketImpl.
-
- bool operator == (const Socket& socket) const;
- /// Returns true if both sockets share the same
- /// SocketImpl, false otherwise.
-
- bool operator != (const Socket& socket) const;
- /// Returns false if both sockets share the same
- /// SocketImpl, true otherwise.
-
- bool operator < (const Socket& socket) const;
- /// Compares the SocketImpl pointers.
-
- bool operator <= (const Socket& socket) const;
- /// Compares the SocketImpl pointers.
-
- bool operator > (const Socket& socket) const;
- /// Compares the SocketImpl pointers.
-
- bool operator >= (const Socket& socket) const;
- /// Compares the SocketImpl pointers.
-
- void close();
- /// Closes the socket.
-
- static int select(SocketList& readList, SocketList& writeList, SocketList& exceptList, const Poco::Timespan& timeout);
- /// Determines the status of one or more sockets,
- /// using a call to select().
- ///
- /// ReadList contains the list of sockets which should be
- /// checked for readability.
- ///
- /// WriteList contains the list of sockets which should be
- /// checked for writeability.
- ///
- /// ExceptList contains a list of sockets which should be
- /// checked for a pending error.
- ///
- /// Returns the number of sockets ready.
- ///
- /// After return,
- /// * readList contains those sockets ready for reading,
- /// * writeList contains those sockets ready for writing,
- /// * exceptList contains those sockets with a pending error.
- ///
- /// If the total number of sockets passed in readList, writeList and
- /// exceptList is zero, select() will return immediately and the
- /// return value will be 0.
- ///
- /// If one of the sockets passed to select() is closed while
- /// select() runs, select will return immediately. However,
- /// the closed socket will not be included in any list.
- /// In this case, the return value may be greater than the sum
- /// of all sockets in all list.
-
- bool poll(const Poco::Timespan& timeout, int mode) const;
- /// Determines the status of the socket, using a
- /// call to poll() or select().
- ///
- /// The mode argument is constructed by combining the values
- /// of the SelectMode enumeration.
- ///
- /// Returns true if the next operation corresponding to
- /// mode will not block, false otherwise.
-
- int available() const;
- /// Returns the number of bytes available that can be read
- /// without causing the socket to block.
-
- void setSendBufferSize(int size);
- /// Sets the size of the send buffer.
-
- int getSendBufferSize() const;
- /// Returns the size of the send buffer.
- ///
- /// The returned value may be different than the
- /// value previously set with setSendBufferSize(),
- /// as the system is free to adjust the value.
-
- void setReceiveBufferSize(int size);
- /// Sets the size of the receive buffer.
-
- int getReceiveBufferSize() const;
- /// Returns the size of the receive buffer.
- ///
- /// The returned value may be different than the
- /// value previously set with setReceiveBufferSize(),
- /// as the system is free to adjust the value.
-
- void setSendTimeout(const Poco::Timespan& timeout);
- /// Sets the send timeout for the socket.
-
- Poco::Timespan getSendTimeout() const;
- /// Returns the send timeout for the socket.
- ///
- /// The returned timeout may be different than the
- /// timeout previously set with setSendTimeout(),
- /// as the system is free to adjust the value.
-
- void setReceiveTimeout(const Poco::Timespan& timeout);
- /// Sets the send timeout for the socket.
- ///
- /// On systems that do not support SO_RCVTIMEO, a
- /// workaround using poll() is provided.
-
- Poco::Timespan getReceiveTimeout() const;
- /// Returns the receive timeout for the socket.
- ///
- /// The returned timeout may be different than the
- /// timeout previously set with getReceiveTimeout(),
- /// as the system is free to adjust the value.
-
- void setOption(int level, int option, int value);
- /// Sets the socket option specified by level and option
- /// to the given integer value.
-
- void setOption(int level, int option, unsigned value);
- /// Sets the socket option specified by level and option
- /// to the given integer value.
-
- void setOption(int level, int option, unsigned char value);
- /// Sets the socket option specified by level and option
- /// to the given integer value.
-
- void setOption(int level, int option, const Poco::Timespan& value);
- /// Sets the socket option specified by level and option
- /// to the given time value.
-
- void setOption(int level, int option, const IPAddress& value);
- /// Sets the socket option specified by level and option
- /// to the given time value.
-
- void getOption(int level, int option, int& value) const;
- /// Returns the value of the socket option
- /// specified by level and option.
-
- void getOption(int level, int option, unsigned& value) const;
- /// Returns the value of the socket option
- /// specified by level and option.
-
- void getOption(int level, int option, unsigned char& value) const;
- /// Returns the value of the socket option
- /// specified by level and option.
-
- void getOption(int level, int option, Poco::Timespan& value) const;
- /// Returns the value of the socket option
- /// specified by level and option.
-
- void getOption(int level, int option, IPAddress& value) const;
- /// Returns the value of the socket option
- /// specified by level and option.
-
- void setLinger(bool on, int seconds);
- /// Sets the value of the SO_LINGER socket option.
-
- void getLinger(bool& on, int& seconds) const;
- /// Returns the value of the SO_LINGER socket option.
-
- void setNoDelay(bool flag);
- /// Sets the value of the TCP_NODELAY socket option.
-
- bool getNoDelay() const;
- /// Returns the value of the TCP_NODELAY socket option.
-
- void setKeepAlive(bool flag);
- /// Sets the value of the SO_KEEPALIVE socket option.
-
- bool getKeepAlive() const;
- /// Returns the value of the SO_KEEPALIVE socket option.
-
- void setReuseAddress(bool flag);
- /// Sets the value of the SO_REUSEADDR socket option.
-
- bool getReuseAddress() const;
- /// Returns the value of the SO_REUSEADDR socket option.
-
- void setReusePort(bool flag);
- /// Sets the value of the SO_REUSEPORT socket option.
- /// Does nothing if the socket implementation does not
- /// support SO_REUSEPORT.
-
- bool getReusePort() const;
- /// Returns the value of the SO_REUSEPORT socket option.
- ///
- /// Returns false if the socket implementation does not
- /// support SO_REUSEPORT.
-
- void setOOBInline(bool flag);
- /// Sets the value of the SO_OOBINLINE socket option.
-
- bool getOOBInline() const;
- /// Returns the value of the SO_OOBINLINE socket option.
-
- void setBlocking(bool flag);
- /// Sets the socket in blocking mode if flag is true,
- /// disables blocking mode if flag is false.
-
- bool getBlocking() const;
- /// Returns the blocking mode of the socket.
- /// This method will only work if the blocking modes of
- /// the socket are changed via the setBlocking method!
-
- SocketAddress address() const;
- /// Returns the IP address and port number of the socket.
-
- SocketAddress peerAddress() const;
- /// Returns the IP address and port number of the peer socket.
-
- SocketImpl* impl() const;
- /// Returns the SocketImpl for this socket.
-
- bool secure() const;
- /// Returns true iff the socket's connection is secure
- /// (using SSL or TLS).
-
- static bool supportsIPv4();
- /// Returns true if the system supports IPv4.
-
- static bool supportsIPv6();
- /// Returns true if the system supports IPv6.
-
- void init(int af);
- /// Creates the underlying system socket for the given
- /// address family.
- ///
- /// Normally, this method should not be called directly, as
- /// socket creation will be handled automatically. There are
- /// a few situations where calling this method after creation
- /// of the Socket object makes sense. One example is setting
- /// a socket option before calling bind() on a ServerSocket.
-
-protected:
- Socket(SocketImpl* pImpl);
- /// Creates the Socket and attaches the given SocketImpl.
- /// The socket takes ownership of the SocketImpl.
-
- poco_socket_t sockfd() const;
- /// Returns the socket descriptor for this socket.
-
-private:
-
-#if defined(POCO_HAVE_FD_POLL)
-class FDCompare
- /// Utility functor used to compare socket file descriptors.
- /// Used in poll() member function.
-{
-public:
- FDCompare(int fd): _fd(fd) { }
- inline bool operator()(const Socket& socket) const
- { return socket.sockfd() == _fd; }
-
-private:
- FDCompare();
- int _fd;
-};
-#endif
-
- SocketImpl* _pImpl;
-};
-
-
-//
-// inlines
-//
-inline bool Socket::operator == (const Socket& socket) const
-{
- return _pImpl == socket._pImpl;
-}
-
-
-inline bool Socket::operator != (const Socket& socket) const
-{
- return _pImpl != socket._pImpl;
-}
-
-
-inline bool Socket::operator < (const Socket& socket) const
-{
- return _pImpl < socket._pImpl;
-}
-
-
-inline bool Socket::operator <= (const Socket& socket) const
-{
- return _pImpl <= socket._pImpl;
-}
-
-
-inline bool Socket::operator > (const Socket& socket) const
-{
- return _pImpl > socket._pImpl;
-}
-
-
-inline bool Socket::operator >= (const Socket& socket) const
-{
- return _pImpl >= socket._pImpl;
-}
-
-
-inline void Socket::close()
-{
- _pImpl->close();
-}
-
-
-inline bool Socket::poll(const Poco::Timespan& timeout, int mode) const
-{
- return _pImpl->poll(timeout, mode);
-}
-
-
-inline int Socket::available() const
-{
- return _pImpl->available();
-}
-
-
-inline void Socket::setSendBufferSize(int size)
-{
- _pImpl->setSendBufferSize(size);
-}
-
-
-inline int Socket::getSendBufferSize() const
-{
- return _pImpl->getSendBufferSize();
-}
-
-
-inline void Socket::setReceiveBufferSize(int size)
-{
- _pImpl->setReceiveBufferSize(size);
-}
-
-
-inline int Socket::getReceiveBufferSize() const
-{
- return _pImpl->getReceiveBufferSize();
-}
-
-
-inline void Socket::setSendTimeout(const Poco::Timespan& timeout)
-{
- _pImpl->setSendTimeout(timeout);
-}
-
-
-inline Poco::Timespan Socket::getSendTimeout() const
-{
- return _pImpl->getSendTimeout();
-}
-
-
-inline void Socket::setReceiveTimeout(const Poco::Timespan& timeout)
-{
- _pImpl->setReceiveTimeout(timeout);
-}
-
-
-inline Poco::Timespan Socket::getReceiveTimeout() const
-{
- return _pImpl->getReceiveTimeout();
-}
-
-
-inline void Socket::setOption(int level, int option, int value)
-{
- _pImpl->setOption(level, option, value);
-}
-
-
-inline void Socket::setOption(int level, int option, unsigned value)
-{
- _pImpl->setOption(level, option, value);
-}
-
-
-inline void Socket::setOption(int level, int option, unsigned char value)
-{
- _pImpl->setOption(level, option, value);
-}
-
-
-inline void Socket::setOption(int level, int option, const Poco::Timespan& value)
-{
- _pImpl->setOption(level, option, value);
-}
-
-
-inline void Socket::setOption(int level, int option, const IPAddress& value)
-{
- _pImpl->setOption(level, option, value);
-}
-
-
-inline void Socket::getOption(int level, int option, int& value) const
-{
- _pImpl->getOption(level, option, value);
-}
-
-
-inline void Socket::getOption(int level, int option, unsigned& value) const
-{
- _pImpl->getOption(level, option, value);
-}
-
-
-inline void Socket::getOption(int level, int option, unsigned char& value) const
-{
- _pImpl->getOption(level, option, value);
-}
-
-
-inline void Socket::getOption(int level, int option, Poco::Timespan& value) const
-{
- _pImpl->getOption(level, option, value);
-}
-
-
-inline void Socket::getOption(int level, int option, IPAddress& value) const
-{
- _pImpl->getOption(level, option, value);
-}
-
-
-inline void Socket::setLinger(bool on, int seconds)
-{
- _pImpl->setLinger(on, seconds);
-}
-
-
-inline void Socket::getLinger(bool& on, int& seconds) const
-{
- _pImpl->getLinger(on, seconds);
-}
-
-
-inline void Socket::setNoDelay(bool flag)
-{
- _pImpl->setNoDelay(flag);
-}
-
-
-inline bool Socket::getNoDelay() const
-{
- return _pImpl->getNoDelay();
-}
-
-
-inline void Socket::setKeepAlive(bool flag)
-{
- _pImpl->setKeepAlive(flag);
-}
-
-
-inline bool Socket::getKeepAlive() const
-{
- return _pImpl->getKeepAlive();
-}
-
-
-inline void Socket::setReuseAddress(bool flag)
-{
- _pImpl->setReuseAddress(flag);
-}
-
-
-inline bool Socket::getReuseAddress() const
-{
- return _pImpl->getReuseAddress();
-}
-
-
-inline void Socket::setReusePort(bool flag)
-{
- _pImpl->setReusePort(flag);
-}
-
-
-inline bool Socket::getReusePort() const
-{
- return _pImpl->getReusePort();
-}
-
-
-inline void Socket::setOOBInline(bool flag)
-{
- _pImpl->setOOBInline(flag);
-}
-
-
-inline bool Socket::getOOBInline() const
-{
- return _pImpl->getOOBInline();
-}
-
-
-inline void Socket::setBlocking(bool flag)
-{
- _pImpl->setBlocking(flag);
-}
-
-
-inline bool Socket::getBlocking() const
-{
- return _pImpl->getBlocking();
-}
-
-
-inline SocketImpl* Socket::impl() const
-{
- return _pImpl;
-}
-
-
-inline poco_socket_t Socket::sockfd() const
-{
- return _pImpl->sockfd();
-}
-
-
-inline SocketAddress Socket::address() const
-{
- return _pImpl->address();
-}
-
-
-inline SocketAddress Socket::peerAddress() const
-{
- return _pImpl->peerAddress();
-}
-
-
-inline bool Socket::secure() const
-{
- return _pImpl->secure();
-}
-
-
-inline bool Socket::supportsIPv4()
-{
- return true;
-}
-
-
-inline bool Socket::supportsIPv6()
-{
-#if defined(POCO_HAVE_IPv6)
- return true;
-#else
- return false;
-#endif
-}
-
-
-inline void Socket::init(int af)
-{
- _pImpl->init(af);
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_Socket_INCLUDED
+ /// The mode argument is constructed by combining the values
+ /// of the SelectMode enumeration.
+ ///
+ /// Returns true if the next operation corresponding to
+ /// mode will not block, false otherwise.
+
+ int available() const;
+ /// Returns the number of bytes available that can be read
+ /// without causing the socket to block.
+
+ void setSendBufferSize(int size);
+ /// Sets the size of the send buffer.
+
+ int getSendBufferSize() const;
+ /// Returns the size of the send buffer.
+ ///
+ /// The returned value may be different than the
+ /// value previously set with setSendBufferSize(),
+ /// as the system is free to adjust the value.
+
+ void setReceiveBufferSize(int size);
+ /// Sets the size of the receive buffer.
+
+ int getReceiveBufferSize() const;
+ /// Returns the size of the receive buffer.
+ ///
+ /// The returned value may be different than the
+ /// value previously set with setReceiveBufferSize(),
+ /// as the system is free to adjust the value.
+
+ void setSendTimeout(const Poco::Timespan& timeout);
+ /// Sets the send timeout for the socket.
+
+ Poco::Timespan getSendTimeout() const;
+ /// Returns the send timeout for the socket.
+ ///
+ /// The returned timeout may be different than the
+ /// timeout previously set with setSendTimeout(),
+ /// as the system is free to adjust the value.
+
+ void setReceiveTimeout(const Poco::Timespan& timeout);
+ /// Sets the send timeout for the socket.
+ ///
+ /// On systems that do not support SO_RCVTIMEO, a
+ /// workaround using poll() is provided.
+
+ Poco::Timespan getReceiveTimeout() const;
+ /// Returns the receive timeout for the socket.
+ ///
+ /// The returned timeout may be different than the
+ /// timeout previously set with getReceiveTimeout(),
+ /// as the system is free to adjust the value.
+
+ void setOption(int level, int option, int value);
+ /// Sets the socket option specified by level and option
+ /// to the given integer value.
+
+ void setOption(int level, int option, unsigned value);
+ /// Sets the socket option specified by level and option
+ /// to the given integer value.
+
+ void setOption(int level, int option, unsigned char value);
+ /// Sets the socket option specified by level and option
+ /// to the given integer value.
+
+ void setOption(int level, int option, const Poco::Timespan& value);
+ /// Sets the socket option specified by level and option
+ /// to the given time value.
+
+ void setOption(int level, int option, const IPAddress& value);
+ /// Sets the socket option specified by level and option
+ /// to the given time value.
+
+ void getOption(int level, int option, int& value) const;
+ /// Returns the value of the socket option
+ /// specified by level and option.
+
+ void getOption(int level, int option, unsigned& value) const;
+ /// Returns the value of the socket option
+ /// specified by level and option.
+
+ void getOption(int level, int option, unsigned char& value) const;
+ /// Returns the value of the socket option
+ /// specified by level and option.
+
+ void getOption(int level, int option, Poco::Timespan& value) const;
+ /// Returns the value of the socket option
+ /// specified by level and option.
+
+ void getOption(int level, int option, IPAddress& value) const;
+ /// Returns the value of the socket option
+ /// specified by level and option.
+
+ void setLinger(bool on, int seconds);
+ /// Sets the value of the SO_LINGER socket option.
+
+ void getLinger(bool& on, int& seconds) const;
+ /// Returns the value of the SO_LINGER socket option.
+
+ void setNoDelay(bool flag);
+ /// Sets the value of the TCP_NODELAY socket option.
+
+ bool getNoDelay() const;
+ /// Returns the value of the TCP_NODELAY socket option.
+
+ void setKeepAlive(bool flag);
+ /// Sets the value of the SO_KEEPALIVE socket option.
+
+ bool getKeepAlive() const;
+ /// Returns the value of the SO_KEEPALIVE socket option.
+
+ void setReuseAddress(bool flag);
+ /// Sets the value of the SO_REUSEADDR socket option.
+
+ bool getReuseAddress() const;
+ /// Returns the value of the SO_REUSEADDR socket option.
+
+ void setReusePort(bool flag);
+ /// Sets the value of the SO_REUSEPORT socket option.
+ /// Does nothing if the socket implementation does not
+ /// support SO_REUSEPORT.
+
+ bool getReusePort() const;
+ /// Returns the value of the SO_REUSEPORT socket option.
+ ///
+ /// Returns false if the socket implementation does not
+ /// support SO_REUSEPORT.
+
+ void setOOBInline(bool flag);
+ /// Sets the value of the SO_OOBINLINE socket option.
+
+ bool getOOBInline() const;
+ /// Returns the value of the SO_OOBINLINE socket option.
+
+ void setBlocking(bool flag);
+ /// Sets the socket in blocking mode if flag is true,
+ /// disables blocking mode if flag is false.
+
+ bool getBlocking() const;
+ /// Returns the blocking mode of the socket.
+ /// This method will only work if the blocking modes of
+ /// the socket are changed via the setBlocking method!
+
+ SocketAddress address() const;
+ /// Returns the IP address and port number of the socket.
+
+ SocketAddress peerAddress() const;
+ /// Returns the IP address and port number of the peer socket.
+
+ SocketImpl* impl() const;
+ /// Returns the SocketImpl for this socket.
+
+ bool secure() const;
+ /// Returns true iff the socket's connection is secure
+ /// (using SSL or TLS).
+
+ static bool supportsIPv4();
+ /// Returns true if the system supports IPv4.
+
+ static bool supportsIPv6();
+ /// Returns true if the system supports IPv6.
+
+ void init(int af);
+ /// Creates the underlying system socket for the given
+ /// address family.
+ ///
+ /// Normally, this method should not be called directly, as
+ /// socket creation will be handled automatically. There are
+ /// a few situations where calling this method after creation
+ /// of the Socket object makes sense. One example is setting
+ /// a socket option before calling bind() on a ServerSocket.
+
+protected:
+ Socket(SocketImpl* pImpl);
+ /// Creates the Socket and attaches the given SocketImpl.
+ /// The socket takes ownership of the SocketImpl.
+
+ poco_socket_t sockfd() const;
+ /// Returns the socket descriptor for this socket.
+
+private:
+
+#if defined(POCO_HAVE_FD_POLL)
+class FDCompare
+ /// Utility functor used to compare socket file descriptors.
+ /// Used in poll() member function.
+{
+public:
+ FDCompare(int fd): _fd(fd) { }
+ inline bool operator()(const Socket& socket) const
+ { return socket.sockfd() == _fd; }
+
+private:
+ FDCompare();
+ int _fd;
+};
+#endif
+
+ SocketImpl* _pImpl;
+};
+
+
+//
+// inlines
+//
+inline bool Socket::operator == (const Socket& socket) const
+{
+ return _pImpl == socket._pImpl;
+}
+
+
+inline bool Socket::operator != (const Socket& socket) const
+{
+ return _pImpl != socket._pImpl;
+}
+
+
+inline bool Socket::operator < (const Socket& socket) const
+{
+ return _pImpl < socket._pImpl;
+}
+
+
+inline bool Socket::operator <= (const Socket& socket) const
+{
+ return _pImpl <= socket._pImpl;
+}
+
+
+inline bool Socket::operator > (const Socket& socket) const
+{
+ return _pImpl > socket._pImpl;
+}
+
+
+inline bool Socket::operator >= (const Socket& socket) const
+{
+ return _pImpl >= socket._pImpl;
+}
+
+
+inline void Socket::close()
+{
+ _pImpl->close();
+}
+
+
+inline bool Socket::poll(const Poco::Timespan& timeout, int mode) const
+{
+ return _pImpl->poll(timeout, mode);
+}
+
+
+inline int Socket::available() const
+{
+ return _pImpl->available();
+}
+
+
+inline void Socket::setSendBufferSize(int size)
+{
+ _pImpl->setSendBufferSize(size);
+}
+
+
+inline int Socket::getSendBufferSize() const
+{
+ return _pImpl->getSendBufferSize();
+}
+
+
+inline void Socket::setReceiveBufferSize(int size)
+{
+ _pImpl->setReceiveBufferSize(size);
+}
+
+
+inline int Socket::getReceiveBufferSize() const
+{
+ return _pImpl->getReceiveBufferSize();
+}
+
+
+inline void Socket::setSendTimeout(const Poco::Timespan& timeout)
+{
+ _pImpl->setSendTimeout(timeout);
+}
+
+
+inline Poco::Timespan Socket::getSendTimeout() const
+{
+ return _pImpl->getSendTimeout();
+}
+
+
+inline void Socket::setReceiveTimeout(const Poco::Timespan& timeout)
+{
+ _pImpl->setReceiveTimeout(timeout);
+}
+
+
+inline Poco::Timespan Socket::getReceiveTimeout() const
+{
+ return _pImpl->getReceiveTimeout();
+}
+
+
+inline void Socket::setOption(int level, int option, int value)
+{
+ _pImpl->setOption(level, option, value);
+}
+
+
+inline void Socket::setOption(int level, int option, unsigned value)
+{
+ _pImpl->setOption(level, option, value);
+}
+
+
+inline void Socket::setOption(int level, int option, unsigned char value)
+{
+ _pImpl->setOption(level, option, value);
+}
+
+
+inline void Socket::setOption(int level, int option, const Poco::Timespan& value)
+{
+ _pImpl->setOption(level, option, value);
+}
+
+
+inline void Socket::setOption(int level, int option, const IPAddress& value)
+{
+ _pImpl->setOption(level, option, value);
+}
+
+
+inline void Socket::getOption(int level, int option, int& value) const
+{
+ _pImpl->getOption(level, option, value);
+}
+
+
+inline void Socket::getOption(int level, int option, unsigned& value) const
+{
+ _pImpl->getOption(level, option, value);
+}
+
+
+inline void Socket::getOption(int level, int option, unsigned char& value) const
+{
+ _pImpl->getOption(level, option, value);
+}
+
+
+inline void Socket::getOption(int level, int option, Poco::Timespan& value) const
+{
+ _pImpl->getOption(level, option, value);
+}
+
+
+inline void Socket::getOption(int level, int option, IPAddress& value) const
+{
+ _pImpl->getOption(level, option, value);
+}
+
+
+inline void Socket::setLinger(bool on, int seconds)
+{
+ _pImpl->setLinger(on, seconds);
+}
+
+
+inline void Socket::getLinger(bool& on, int& seconds) const
+{
+ _pImpl->getLinger(on, seconds);
+}
+
+
+inline void Socket::setNoDelay(bool flag)
+{
+ _pImpl->setNoDelay(flag);
+}
+
+
+inline bool Socket::getNoDelay() const
+{
+ return _pImpl->getNoDelay();
+}
+
+
+inline void Socket::setKeepAlive(bool flag)
+{
+ _pImpl->setKeepAlive(flag);
+}
+
+
+inline bool Socket::getKeepAlive() const
+{
+ return _pImpl->getKeepAlive();
+}
+
+
+inline void Socket::setReuseAddress(bool flag)
+{
+ _pImpl->setReuseAddress(flag);
+}
+
+
+inline bool Socket::getReuseAddress() const
+{
+ return _pImpl->getReuseAddress();
+}
+
+
+inline void Socket::setReusePort(bool flag)
+{
+ _pImpl->setReusePort(flag);
+}
+
+
+inline bool Socket::getReusePort() const
+{
+ return _pImpl->getReusePort();
+}
+
+
+inline void Socket::setOOBInline(bool flag)
+{
+ _pImpl->setOOBInline(flag);
+}
+
+
+inline bool Socket::getOOBInline() const
+{
+ return _pImpl->getOOBInline();
+}
+
+
+inline void Socket::setBlocking(bool flag)
+{
+ _pImpl->setBlocking(flag);
+}
+
+
+inline bool Socket::getBlocking() const
+{
+ return _pImpl->getBlocking();
+}
+
+
+inline SocketImpl* Socket::impl() const
+{
+ return _pImpl;
+}
+
+
+inline poco_socket_t Socket::sockfd() const
+{
+ return _pImpl->sockfd();
+}
+
+
+inline SocketAddress Socket::address() const
+{
+ return _pImpl->address();
+}
+
+
+inline SocketAddress Socket::peerAddress() const
+{
+ return _pImpl->peerAddress();
+}
+
+
+inline bool Socket::secure() const
+{
+ return _pImpl->secure();
+}
+
+
+inline bool Socket::supportsIPv4()
+{
+ return true;
+}
+
+
+inline bool Socket::supportsIPv6()
+{
+#if defined(POCO_HAVE_IPv6)
+ return true;
+#else
+ return false;
+#endif
+}
+
+
+inline void Socket::init(int af)
+{
+ _pImpl->init(af);
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_Socket_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/SocketAcceptor.h b/contrib/libs/poco/Net/include/Poco/Net/SocketAcceptor.h
index 63d2959ead..c9021ecd0b 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/SocketAcceptor.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/SocketAcceptor.h
@@ -1,196 +1,196 @@
-//
-// SocketAcceptor.h
-//
-// Library: Net
-// Package: Reactor
-// Module: SocketAcceptor
-//
-// Definition of the SocketAcceptor class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_SocketAcceptor_INCLUDED
-#define Net_SocketAcceptor_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/SocketNotification.h"
-#include "Poco/Net/SocketReactor.h"
-#include "Poco/Net/ServerSocket.h"
-#include "Poco/Net/StreamSocket.h"
-#include "Poco/Observer.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-template <class ServiceHandler>
-class SocketAcceptor
- /// This class implements the Acceptor part of the
- /// Acceptor-Connector design pattern.
- ///
- /// The Acceptor-Connector pattern has been described in the book
- /// "Pattern Languages of Program Design 3", edited by Robert Martin,
- /// Frank Buschmann and Dirk Riehle (Addison Wesley, 1997).
- ///
- /// The Acceptor-Connector design pattern decouples connection
- /// establishment and service initialization in a distributed system
- /// from the processing performed once a service is initialized.
- /// This decoupling is achieved with three components: Acceptors,
- /// Connectors and Service Handlers.
- /// The SocketAcceptor passively waits for connection requests (usually
- /// from a remote Connector) and establishes a connection upon
- /// arrival of a connection requests. Also, a Service Handler is
- /// initialized to process the data arriving via the connection in
- /// an application-specific way.
- ///
- /// The SocketAcceptor sets up a ServerSocket and registers itself
- /// for a ReadableNotification, denoting an incoming connection request.
- ///
- /// When the ServerSocket becomes readable the SocketAcceptor accepts
- /// the connection request and creates a ServiceHandler to
- /// service the connection.
- ///
- /// The ServiceHandler class must provide a constructor that
- /// takes a StreamSocket and a SocketReactor as arguments,
- /// e.g.:
- /// MyServiceHandler(const StreamSocket& socket, ServiceReactor& reactor)
- ///
- /// When the ServiceHandler is done, it must destroy itself.
- ///
- /// Subclasses can override the createServiceHandler() factory method
- /// if special steps are necessary to create a ServiceHandler object.
-{
-public:
- explicit SocketAcceptor(ServerSocket& socket):
- _socket(socket),
- _pReactor(0)
- /// Creates a SocketAcceptor, using the given ServerSocket.
- {
- }
-
- SocketAcceptor(ServerSocket& socket, SocketReactor& reactor):
- _socket(socket),
- _pReactor(&reactor)
- /// Creates a SocketAcceptor, using the given ServerSocket.
- /// The SocketAcceptor registers itself with the given SocketReactor.
- {
- _pReactor->addEventHandler(_socket, Poco::Observer<SocketAcceptor,
- ReadableNotification>(*this, &SocketAcceptor::onAccept));
- }
-
- virtual ~SocketAcceptor()
- /// Destroys the SocketAcceptor.
- {
- try
- {
- if (_pReactor)
- {
- _pReactor->removeEventHandler(_socket, Poco::Observer<SocketAcceptor,
- ReadableNotification>(*this, &SocketAcceptor::onAccept));
- }
- }
- catch (...)
- {
- poco_unexpected();
- }
- }
-
- void setReactor(SocketReactor& reactor)
- /// Sets the reactor for this acceptor.
- {
- _pReactor = &reactor;
- if (!_pReactor->hasEventHandler(_socket, Poco::Observer<SocketAcceptor,
- ReadableNotification>(*this, &SocketAcceptor::onAccept)))
- {
- registerAcceptor(reactor);
- }
- }
-
- virtual void registerAcceptor(SocketReactor& reactor)
- /// Registers the SocketAcceptor with a SocketReactor.
+//
+// SocketAcceptor.h
+//
+// Library: Net
+// Package: Reactor
+// Module: SocketAcceptor
+//
+// Definition of the SocketAcceptor class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_SocketAcceptor_INCLUDED
+#define Net_SocketAcceptor_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/SocketNotification.h"
+#include "Poco/Net/SocketReactor.h"
+#include "Poco/Net/ServerSocket.h"
+#include "Poco/Net/StreamSocket.h"
+#include "Poco/Observer.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+template <class ServiceHandler>
+class SocketAcceptor
+ /// This class implements the Acceptor part of the
+ /// Acceptor-Connector design pattern.
+ ///
+ /// The Acceptor-Connector pattern has been described in the book
+ /// "Pattern Languages of Program Design 3", edited by Robert Martin,
+ /// Frank Buschmann and Dirk Riehle (Addison Wesley, 1997).
+ ///
+ /// The Acceptor-Connector design pattern decouples connection
+ /// establishment and service initialization in a distributed system
+ /// from the processing performed once a service is initialized.
+ /// This decoupling is achieved with three components: Acceptors,
+ /// Connectors and Service Handlers.
+ /// The SocketAcceptor passively waits for connection requests (usually
+ /// from a remote Connector) and establishes a connection upon
+ /// arrival of a connection requests. Also, a Service Handler is
+ /// initialized to process the data arriving via the connection in
+ /// an application-specific way.
+ ///
+ /// The SocketAcceptor sets up a ServerSocket and registers itself
+ /// for a ReadableNotification, denoting an incoming connection request.
+ ///
+ /// When the ServerSocket becomes readable the SocketAcceptor accepts
+ /// the connection request and creates a ServiceHandler to
+ /// service the connection.
+ ///
+ /// The ServiceHandler class must provide a constructor that
+ /// takes a StreamSocket and a SocketReactor as arguments,
+ /// e.g.:
+ /// MyServiceHandler(const StreamSocket& socket, ServiceReactor& reactor)
+ ///
+ /// When the ServiceHandler is done, it must destroy itself.
+ ///
+ /// Subclasses can override the createServiceHandler() factory method
+ /// if special steps are necessary to create a ServiceHandler object.
+{
+public:
+ explicit SocketAcceptor(ServerSocket& socket):
+ _socket(socket),
+ _pReactor(0)
+ /// Creates a SocketAcceptor, using the given ServerSocket.
+ {
+ }
+
+ SocketAcceptor(ServerSocket& socket, SocketReactor& reactor):
+ _socket(socket),
+ _pReactor(&reactor)
+ /// Creates a SocketAcceptor, using the given ServerSocket.
+ /// The SocketAcceptor registers itself with the given SocketReactor.
+ {
+ _pReactor->addEventHandler(_socket, Poco::Observer<SocketAcceptor,
+ ReadableNotification>(*this, &SocketAcceptor::onAccept));
+ }
+
+ virtual ~SocketAcceptor()
+ /// Destroys the SocketAcceptor.
+ {
+ try
+ {
+ if (_pReactor)
+ {
+ _pReactor->removeEventHandler(_socket, Poco::Observer<SocketAcceptor,
+ ReadableNotification>(*this, &SocketAcceptor::onAccept));
+ }
+ }
+ catch (...)
+ {
+ poco_unexpected();
+ }
+ }
+
+ void setReactor(SocketReactor& reactor)
+ /// Sets the reactor for this acceptor.
+ {
+ _pReactor = &reactor;
+ if (!_pReactor->hasEventHandler(_socket, Poco::Observer<SocketAcceptor,
+ ReadableNotification>(*this, &SocketAcceptor::onAccept)))
+ {
+ registerAcceptor(reactor);
+ }
+ }
+
+ virtual void registerAcceptor(SocketReactor& reactor)
+ /// Registers the SocketAcceptor with a SocketReactor.
+ ///
+ /// A subclass can override this function to e.g.
+ /// register an event handler for timeout event.
///
- /// A subclass can override this function to e.g.
- /// register an event handler for timeout event.
- ///
- /// If acceptor was constructed without providing reactor to it,
- /// the override of this method must either call the base class
- /// implementation or directly register the accept handler with
- /// the reactor.
- {
- if (_pReactor)
- throw Poco::InvalidAccessException("Acceptor already registered.");
-
- _pReactor = &reactor;
- _pReactor->addEventHandler(_socket, Poco::Observer<SocketAcceptor, ReadableNotification>(*this, &SocketAcceptor::onAccept));
- }
-
- virtual void unregisterAcceptor()
- /// Unregisters the SocketAcceptor.
+ /// If acceptor was constructed without providing reactor to it,
+ /// the override of this method must either call the base class
+ /// implementation or directly register the accept handler with
+ /// the reactor.
+ {
+ if (_pReactor)
+ throw Poco::InvalidAccessException("Acceptor already registered.");
+
+ _pReactor = &reactor;
+ _pReactor->addEventHandler(_socket, Poco::Observer<SocketAcceptor, ReadableNotification>(*this, &SocketAcceptor::onAccept));
+ }
+
+ virtual void unregisterAcceptor()
+ /// Unregisters the SocketAcceptor.
+ ///
+ /// A subclass can override this function to e.g.
+ /// unregister its event handler for a timeout event.
///
- /// A subclass can override this function to e.g.
- /// unregister its event handler for a timeout event.
- ///
- /// If the accept handler was registered with the reactor,
- /// the overriding method must either call the base class
- /// implementation or directly unregister the accept handler.
- {
- if (_pReactor)
- {
- _pReactor->removeEventHandler(_socket, Poco::Observer<SocketAcceptor, ReadableNotification>(*this, &SocketAcceptor::onAccept));
- }
- }
-
- void onAccept(ReadableNotification* pNotification)
- /// Accepts connection and creates event handler.
- {
- pNotification->release();
- StreamSocket sock = _socket.acceptConnection();
- _pReactor->wakeUp();
- createServiceHandler(sock);
- }
-
-protected:
- virtual ServiceHandler* createServiceHandler(StreamSocket& socket)
- /// Create and initialize a new ServiceHandler instance.
- ///
- /// Subclasses can override this method.
- {
- return new ServiceHandler(socket, *_pReactor);
- }
-
- SocketReactor* reactor()
- /// Returns a pointer to the SocketReactor where
- /// this SocketAcceptor is registered.
- ///
- /// The pointer may be null.
- {
- return _pReactor;
- }
-
- Socket& socket()
- /// Returns a reference to the SocketAcceptor's socket.
- {
- return _socket;
- }
-
-private:
- SocketAcceptor();
- SocketAcceptor(const SocketAcceptor&);
- SocketAcceptor& operator = (const SocketAcceptor&);
-
- ServerSocket _socket;
- SocketReactor* _pReactor;
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_SocketAcceptor_INCLUDED
+ /// If the accept handler was registered with the reactor,
+ /// the overriding method must either call the base class
+ /// implementation or directly unregister the accept handler.
+ {
+ if (_pReactor)
+ {
+ _pReactor->removeEventHandler(_socket, Poco::Observer<SocketAcceptor, ReadableNotification>(*this, &SocketAcceptor::onAccept));
+ }
+ }
+
+ void onAccept(ReadableNotification* pNotification)
+ /// Accepts connection and creates event handler.
+ {
+ pNotification->release();
+ StreamSocket sock = _socket.acceptConnection();
+ _pReactor->wakeUp();
+ createServiceHandler(sock);
+ }
+
+protected:
+ virtual ServiceHandler* createServiceHandler(StreamSocket& socket)
+ /// Create and initialize a new ServiceHandler instance.
+ ///
+ /// Subclasses can override this method.
+ {
+ return new ServiceHandler(socket, *_pReactor);
+ }
+
+ SocketReactor* reactor()
+ /// Returns a pointer to the SocketReactor where
+ /// this SocketAcceptor is registered.
+ ///
+ /// The pointer may be null.
+ {
+ return _pReactor;
+ }
+
+ Socket& socket()
+ /// Returns a reference to the SocketAcceptor's socket.
+ {
+ return _socket;
+ }
+
+private:
+ SocketAcceptor();
+ SocketAcceptor(const SocketAcceptor&);
+ SocketAcceptor& operator = (const SocketAcceptor&);
+
+ ServerSocket _socket;
+ SocketReactor* _pReactor;
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_SocketAcceptor_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/SocketAddress.h b/contrib/libs/poco/Net/include/Poco/Net/SocketAddress.h
index 34fd515d9d..61c5581789 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/SocketAddress.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/SocketAddress.h
@@ -1,301 +1,301 @@
-//
-// SocketAddress.h
-//
-// Library: Net
-// Package: NetCore
-// Module: SocketAddress
-//
-// Definition of the SocketAddress class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_SocketAddress_INCLUDED
-#define Net_SocketAddress_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/SocketAddressImpl.h"
-#include <ostream>
-
-
-namespace Poco {
-
-class BinaryReader;
-class BinaryWriter;
-
-namespace Net {
-
-
-class IPAddress;
-
-
-class Net_API SocketAddress
- /// This class represents an internet (IP) endpoint/socket
- /// address. The address can belong either to the
- /// IPv4 or the IPv6 address family and consists of a
- /// host address and a port number.
-{
-public:
- // The following declarations keep the Family type
- // backwards compatible with the previously used
- // enum declaration.
- typedef AddressFamily::Family Family;
- static const Family IPv4 = AddressFamily::IPv4;
-#if defined(POCO_HAVE_IPv6)
- static const Family IPv6 = AddressFamily::IPv6;
-#endif
-#if defined(POCO_OS_FAMILY_UNIX)
- static const Family UNIX_LOCAL = AddressFamily::UNIX_LOCAL;
-#endif
-
- SocketAddress();
- /// Creates a wildcard (all zero) IPv4 SocketAddress.
-
- explicit SocketAddress(Family family);
- /// Creates a SocketAddress with unspecified (wildcard) IP address
- /// of the given family.
-
- SocketAddress(const IPAddress& hostAddress, Poco::UInt16 portNumber);
- /// Creates a SocketAddress from an IP address and given port number.
-
- explicit SocketAddress(Poco::UInt16 port);
- /// Creates a SocketAddress with unspecified (wildcard) IP address
- /// and given port number.
-
- SocketAddress(Family family, Poco::UInt16 port);
- /// Creates a SocketAddress with unspecified (wildcard) IP address
- /// of the given family, and given port number.
-
- SocketAddress(const std::string& hostAddress, Poco::UInt16 portNumber);
- /// Creates a SocketAddress from an IP address and given port number.
- ///
- /// The IP address must either be a domain name, or it must
- /// be in dotted decimal (IPv4) or hex string (IPv6) format.
-
- SocketAddress(Family family, const std::string& hostAddress, Poco::UInt16 portNumber);
- /// Creates a SocketAddress from an IP address and given port number.
- ///
- /// The IP address must either be a domain name, or it must
- /// be in dotted decimal (IPv4) or hex string (IPv6) format.
- ///
- /// If a domain name is given in hostAddress, it is resolved and the address
- /// matching the given family is used. If no address matching the given family
- /// is found, or the IP address given in hostAddress does not match the given
- /// family, an AddressFamilyMismatchException is thrown.
-
- SocketAddress(const std::string& hostAddress, const std::string& portNumber);
- /// Creates a SocketAddress from an IP address and the
- /// service name or port number.
- ///
- /// The IP address must either be a domain name, or it must
- /// be in dotted decimal (IPv4) or hex string (IPv6) format.
- ///
- /// The given port must either be a decimal port number, or
- /// a service name.
-
- SocketAddress(Family family, const std::string& hostAddress, const std::string& portNumber);
- /// Creates a SocketAddress from an IP address and the
- /// service name or port number.
- ///
- /// The IP address must either be a domain name, or it must
- /// be in dotted decimal (IPv4) or hex string (IPv6) format.
- ///
- /// The given port must either be a decimal port number, or
- /// a service name.
- ///
- /// If a domain name is given in hostAddress, it is resolved and the address
- /// matching the given family is used. If no address matching the given family
- /// is found, or the IP address given in hostAddress does not match the given
- /// family, an AddressFamilyMismatchException is thrown.
-
- explicit SocketAddress(const std::string& hostAndPort);
- /// Creates a SocketAddress from an IP address or host name and the
- /// port number/service name. Host name/address and port number must
- /// be separated by a colon. In case of an IPv6 address,
- /// the address part must be enclosed in brackets.
- ///
- /// Examples:
- /// 192.168.1.10:80
- /// [::ffff:192.168.1.120]:2040
- /// www.appinf.com:8080
- ///
- /// On POSIX platforms supporting UNIX_LOCAL sockets, hostAndPort
- /// can also be the absolute path of a local socket, starting with a
- /// slash, e.g. "/tmp/local.socket".
-
- SocketAddress(Family family, const std::string& addr);
- /// Creates a SocketAddress of the given family from a
- /// string representation of the address, which is
- /// either an IP address and port number, separated by
- /// a colon for IPv4 or IPv6 addresses, or a path for
- /// UNIX_LOCAL sockets.
-
- SocketAddress(const SocketAddress& addr);
- /// Creates a SocketAddress by copying another one.
-
- SocketAddress(const struct sockaddr* addr, poco_socklen_t length);
- /// Creates a SocketAddress from a native socket address.
-
- ~SocketAddress();
- /// Destroys the SocketAddress.
-
- SocketAddress& operator = (const SocketAddress& socketAddress);
- /// Assigns another SocketAddress.
-
- IPAddress host() const;
- /// Returns the host IP address.
-
- Poco::UInt16 port() const;
- /// Returns the port number.
-
- poco_socklen_t length() const;
- /// Returns the length of the internal native socket address.
-
- const struct sockaddr* addr() const;
- /// Returns a pointer to the internal native socket address.
-
- int af() const;
- /// Returns the address family (AF_INET or AF_INET6) of the address.
-
- std::string toString() const;
- /// Returns a string representation of the address.
-
- Family family() const;
- /// Returns the address family of the host's address.
-
- bool operator < (const SocketAddress& socketAddress) const;
- bool operator == (const SocketAddress& socketAddress) const;
- bool operator != (const SocketAddress& socketAddress) const;
-
- enum
- {
- MAX_ADDRESS_LENGTH =
-#if defined(POCO_OS_FAMILY_UNIX)
- sizeof(struct sockaddr_un)
-#elif defined(POCO_HAVE_IPv6)
- sizeof(struct sockaddr_in6)
-#else
- sizeof(struct sockaddr_in)
-#endif
- /// Maximum length in bytes of a socket address.
- };
-
-protected:
- void init(const IPAddress& hostAddress, Poco::UInt16 portNumber);
- void init(const std::string& hostAddress, Poco::UInt16 portNumber);
- void init(Family family, const std::string& hostAddress, Poco::UInt16 portNumber);
- void init(Family family, const std::string& address);
- void init(const std::string& hostAndPort);
- Poco::UInt16 resolveService(const std::string& service);
-
-private:
- typedef Poco::Net::Impl::SocketAddressImpl Impl;
- typedef Poco::AutoPtr<Impl> Ptr;
-
- Ptr pImpl() const;
-
- void newIPv4();
- void newIPv4(const sockaddr_in*);
- void newIPv4(const IPAddress& hostAddress, Poco::UInt16 portNumber);
-
-#if defined(POCO_HAVE_IPv6)
- void newIPv6(const sockaddr_in6*);
- void newIPv6(const IPAddress& hostAddress, Poco::UInt16 portNumber);
-#endif
-
-#if defined(POCO_OS_FAMILY_UNIX)
- void newLocal(const sockaddr_un* sockAddr);
- void newLocal(const std::string& path);
-#endif
-
- Ptr _pImpl;
-};
-
-
-//
-// inlines
-//
-inline SocketAddress::Ptr SocketAddress::pImpl() const
-{
- if (_pImpl) return _pImpl;
- throw Poco::NullPointerException("Pointer to SocketAddress implementation is NULL.");
-}
-
-
-inline void SocketAddress::newIPv4()
-{
- _pImpl = new Poco::Net::Impl::IPv4SocketAddressImpl;
-}
-
-
-inline void SocketAddress::newIPv4(const sockaddr_in* sockAddr)
-{
- _pImpl = new Poco::Net::Impl::IPv4SocketAddressImpl(sockAddr);
-}
-
-
-inline void SocketAddress::newIPv4(const IPAddress& hostAddress, Poco::UInt16 portNumber)
-{
- _pImpl = new Poco::Net::Impl::IPv4SocketAddressImpl(hostAddress.addr(), htons(portNumber));
-}
-
-
-#if defined(POCO_HAVE_IPv6)
-inline void SocketAddress::newIPv6(const sockaddr_in6* sockAddr)
-{
- _pImpl = new Poco::Net::Impl::IPv6SocketAddressImpl(sockAddr);
-}
-
-
-inline void SocketAddress::newIPv6(const IPAddress& hostAddress, Poco::UInt16 portNumber)
-{
- _pImpl = new Poco::Net::Impl::IPv6SocketAddressImpl(hostAddress.addr(), htons(portNumber), hostAddress.scope());
-}
-#endif // POCO_HAVE_IPv6
-
-
-#if defined(POCO_OS_FAMILY_UNIX)
-inline void SocketAddress::newLocal(const sockaddr_un* sockAddr)
-{
- _pImpl = new Poco::Net::Impl::LocalSocketAddressImpl(sockAddr);
-}
-
-
-inline void SocketAddress::newLocal(const std::string& path)
-{
- _pImpl = new Poco::Net::Impl::LocalSocketAddressImpl(path.c_str(), path.size());
-}
-#endif // POCO_OS_FAMILY_UNIX
-
-
-inline bool SocketAddress::operator == (const SocketAddress& socketAddress) const
-{
-#if defined(POCO_OS_FAMILY_UNIX)
- if (family() == UNIX_LOCAL)
- return toString() == socketAddress.toString();
- else
-#endif
- return host() == socketAddress.host() && port() == socketAddress.port();
-}
-
-
-inline bool SocketAddress::operator != (const SocketAddress& socketAddress) const
-{
- return !(operator == (socketAddress));
-}
-
-
-} } // namespace Poco::Net
-
-
-Net_API Poco::BinaryWriter& operator << (Poco::BinaryWriter& writer, const Poco::Net::SocketAddress& value);
-Net_API Poco::BinaryReader& operator >> (Poco::BinaryReader& reader, Poco::Net::SocketAddress& value);
-Net_API std::ostream& operator << (std::ostream& ostr, const Poco::Net::SocketAddress& address);
-
-
-#endif // Net_SocketAddress_INCLUDED
+//
+// SocketAddress.h
+//
+// Library: Net
+// Package: NetCore
+// Module: SocketAddress
+//
+// Definition of the SocketAddress class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_SocketAddress_INCLUDED
+#define Net_SocketAddress_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/SocketAddressImpl.h"
+#include <ostream>
+
+
+namespace Poco {
+
+class BinaryReader;
+class BinaryWriter;
+
+namespace Net {
+
+
+class IPAddress;
+
+
+class Net_API SocketAddress
+ /// This class represents an internet (IP) endpoint/socket
+ /// address. The address can belong either to the
+ /// IPv4 or the IPv6 address family and consists of a
+ /// host address and a port number.
+{
+public:
+ // The following declarations keep the Family type
+ // backwards compatible with the previously used
+ // enum declaration.
+ typedef AddressFamily::Family Family;
+ static const Family IPv4 = AddressFamily::IPv4;
+#if defined(POCO_HAVE_IPv6)
+ static const Family IPv6 = AddressFamily::IPv6;
+#endif
+#if defined(POCO_OS_FAMILY_UNIX)
+ static const Family UNIX_LOCAL = AddressFamily::UNIX_LOCAL;
+#endif
+
+ SocketAddress();
+ /// Creates a wildcard (all zero) IPv4 SocketAddress.
+
+ explicit SocketAddress(Family family);
+ /// Creates a SocketAddress with unspecified (wildcard) IP address
+ /// of the given family.
+
+ SocketAddress(const IPAddress& hostAddress, Poco::UInt16 portNumber);
+ /// Creates a SocketAddress from an IP address and given port number.
+
+ explicit SocketAddress(Poco::UInt16 port);
+ /// Creates a SocketAddress with unspecified (wildcard) IP address
+ /// and given port number.
+
+ SocketAddress(Family family, Poco::UInt16 port);
+ /// Creates a SocketAddress with unspecified (wildcard) IP address
+ /// of the given family, and given port number.
+
+ SocketAddress(const std::string& hostAddress, Poco::UInt16 portNumber);
+ /// Creates a SocketAddress from an IP address and given port number.
+ ///
+ /// The IP address must either be a domain name, or it must
+ /// be in dotted decimal (IPv4) or hex string (IPv6) format.
+
+ SocketAddress(Family family, const std::string& hostAddress, Poco::UInt16 portNumber);
+ /// Creates a SocketAddress from an IP address and given port number.
+ ///
+ /// The IP address must either be a domain name, or it must
+ /// be in dotted decimal (IPv4) or hex string (IPv6) format.
+ ///
+ /// If a domain name is given in hostAddress, it is resolved and the address
+ /// matching the given family is used. If no address matching the given family
+ /// is found, or the IP address given in hostAddress does not match the given
+ /// family, an AddressFamilyMismatchException is thrown.
+
+ SocketAddress(const std::string& hostAddress, const std::string& portNumber);
+ /// Creates a SocketAddress from an IP address and the
+ /// service name or port number.
+ ///
+ /// The IP address must either be a domain name, or it must
+ /// be in dotted decimal (IPv4) or hex string (IPv6) format.
+ ///
+ /// The given port must either be a decimal port number, or
+ /// a service name.
+
+ SocketAddress(Family family, const std::string& hostAddress, const std::string& portNumber);
+ /// Creates a SocketAddress from an IP address and the
+ /// service name or port number.
+ ///
+ /// The IP address must either be a domain name, or it must
+ /// be in dotted decimal (IPv4) or hex string (IPv6) format.
+ ///
+ /// The given port must either be a decimal port number, or
+ /// a service name.
+ ///
+ /// If a domain name is given in hostAddress, it is resolved and the address
+ /// matching the given family is used. If no address matching the given family
+ /// is found, or the IP address given in hostAddress does not match the given
+ /// family, an AddressFamilyMismatchException is thrown.
+
+ explicit SocketAddress(const std::string& hostAndPort);
+ /// Creates a SocketAddress from an IP address or host name and the
+ /// port number/service name. Host name/address and port number must
+ /// be separated by a colon. In case of an IPv6 address,
+ /// the address part must be enclosed in brackets.
+ ///
+ /// Examples:
+ /// 192.168.1.10:80
+ /// [::ffff:192.168.1.120]:2040
+ /// www.appinf.com:8080
+ ///
+ /// On POSIX platforms supporting UNIX_LOCAL sockets, hostAndPort
+ /// can also be the absolute path of a local socket, starting with a
+ /// slash, e.g. "/tmp/local.socket".
+
+ SocketAddress(Family family, const std::string& addr);
+ /// Creates a SocketAddress of the given family from a
+ /// string representation of the address, which is
+ /// either an IP address and port number, separated by
+ /// a colon for IPv4 or IPv6 addresses, or a path for
+ /// UNIX_LOCAL sockets.
+
+ SocketAddress(const SocketAddress& addr);
+ /// Creates a SocketAddress by copying another one.
+
+ SocketAddress(const struct sockaddr* addr, poco_socklen_t length);
+ /// Creates a SocketAddress from a native socket address.
+
+ ~SocketAddress();
+ /// Destroys the SocketAddress.
+
+ SocketAddress& operator = (const SocketAddress& socketAddress);
+ /// Assigns another SocketAddress.
+
+ IPAddress host() const;
+ /// Returns the host IP address.
+
+ Poco::UInt16 port() const;
+ /// Returns the port number.
+
+ poco_socklen_t length() const;
+ /// Returns the length of the internal native socket address.
+
+ const struct sockaddr* addr() const;
+ /// Returns a pointer to the internal native socket address.
+
+ int af() const;
+ /// Returns the address family (AF_INET or AF_INET6) of the address.
+
+ std::string toString() const;
+ /// Returns a string representation of the address.
+
+ Family family() const;
+ /// Returns the address family of the host's address.
+
+ bool operator < (const SocketAddress& socketAddress) const;
+ bool operator == (const SocketAddress& socketAddress) const;
+ bool operator != (const SocketAddress& socketAddress) const;
+
+ enum
+ {
+ MAX_ADDRESS_LENGTH =
+#if defined(POCO_OS_FAMILY_UNIX)
+ sizeof(struct sockaddr_un)
+#elif defined(POCO_HAVE_IPv6)
+ sizeof(struct sockaddr_in6)
+#else
+ sizeof(struct sockaddr_in)
+#endif
+ /// Maximum length in bytes of a socket address.
+ };
+
+protected:
+ void init(const IPAddress& hostAddress, Poco::UInt16 portNumber);
+ void init(const std::string& hostAddress, Poco::UInt16 portNumber);
+ void init(Family family, const std::string& hostAddress, Poco::UInt16 portNumber);
+ void init(Family family, const std::string& address);
+ void init(const std::string& hostAndPort);
+ Poco::UInt16 resolveService(const std::string& service);
+
+private:
+ typedef Poco::Net::Impl::SocketAddressImpl Impl;
+ typedef Poco::AutoPtr<Impl> Ptr;
+
+ Ptr pImpl() const;
+
+ void newIPv4();
+ void newIPv4(const sockaddr_in*);
+ void newIPv4(const IPAddress& hostAddress, Poco::UInt16 portNumber);
+
+#if defined(POCO_HAVE_IPv6)
+ void newIPv6(const sockaddr_in6*);
+ void newIPv6(const IPAddress& hostAddress, Poco::UInt16 portNumber);
+#endif
+
+#if defined(POCO_OS_FAMILY_UNIX)
+ void newLocal(const sockaddr_un* sockAddr);
+ void newLocal(const std::string& path);
+#endif
+
+ Ptr _pImpl;
+};
+
+
+//
+// inlines
+//
+inline SocketAddress::Ptr SocketAddress::pImpl() const
+{
+ if (_pImpl) return _pImpl;
+ throw Poco::NullPointerException("Pointer to SocketAddress implementation is NULL.");
+}
+
+
+inline void SocketAddress::newIPv4()
+{
+ _pImpl = new Poco::Net::Impl::IPv4SocketAddressImpl;
+}
+
+
+inline void SocketAddress::newIPv4(const sockaddr_in* sockAddr)
+{
+ _pImpl = new Poco::Net::Impl::IPv4SocketAddressImpl(sockAddr);
+}
+
+
+inline void SocketAddress::newIPv4(const IPAddress& hostAddress, Poco::UInt16 portNumber)
+{
+ _pImpl = new Poco::Net::Impl::IPv4SocketAddressImpl(hostAddress.addr(), htons(portNumber));
+}
+
+
+#if defined(POCO_HAVE_IPv6)
+inline void SocketAddress::newIPv6(const sockaddr_in6* sockAddr)
+{
+ _pImpl = new Poco::Net::Impl::IPv6SocketAddressImpl(sockAddr);
+}
+
+
+inline void SocketAddress::newIPv6(const IPAddress& hostAddress, Poco::UInt16 portNumber)
+{
+ _pImpl = new Poco::Net::Impl::IPv6SocketAddressImpl(hostAddress.addr(), htons(portNumber), hostAddress.scope());
+}
+#endif // POCO_HAVE_IPv6
+
+
+#if defined(POCO_OS_FAMILY_UNIX)
+inline void SocketAddress::newLocal(const sockaddr_un* sockAddr)
+{
+ _pImpl = new Poco::Net::Impl::LocalSocketAddressImpl(sockAddr);
+}
+
+
+inline void SocketAddress::newLocal(const std::string& path)
+{
+ _pImpl = new Poco::Net::Impl::LocalSocketAddressImpl(path.c_str(), path.size());
+}
+#endif // POCO_OS_FAMILY_UNIX
+
+
+inline bool SocketAddress::operator == (const SocketAddress& socketAddress) const
+{
+#if defined(POCO_OS_FAMILY_UNIX)
+ if (family() == UNIX_LOCAL)
+ return toString() == socketAddress.toString();
+ else
+#endif
+ return host() == socketAddress.host() && port() == socketAddress.port();
+}
+
+
+inline bool SocketAddress::operator != (const SocketAddress& socketAddress) const
+{
+ return !(operator == (socketAddress));
+}
+
+
+} } // namespace Poco::Net
+
+
+Net_API Poco::BinaryWriter& operator << (Poco::BinaryWriter& writer, const Poco::Net::SocketAddress& value);
+Net_API Poco::BinaryReader& operator >> (Poco::BinaryReader& reader, Poco::Net::SocketAddress& value);
+Net_API std::ostream& operator << (std::ostream& ostr, const Poco::Net::SocketAddress& address);
+
+
+#endif // Net_SocketAddress_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/SocketAddressImpl.h b/contrib/libs/poco/Net/include/Poco/Net/SocketAddressImpl.h
index 355a25a3ac..079bece510 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/SocketAddressImpl.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/SocketAddressImpl.h
@@ -1,258 +1,258 @@
-//
-// SocketAddressImpl.h
-//
-// Library: Net
-// Package: NetCore
-// Module: SocketAddressImpl
-//
-// Definition of the SocketAddressImpl class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_SocketAddressImpl_INCLUDED
-#define Net_SocketAddressImpl_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/SocketDefs.h"
-#include "Poco/Net/IPAddress.h"
-#include "Poco/RefCountedObject.h"
-
-
-namespace Poco {
-namespace Net {
-namespace Impl {
-
-
-class Net_API SocketAddressImpl : public Poco::RefCountedObject
-{
-public:
- typedef AddressFamily::Family Family;
-
- virtual ~SocketAddressImpl();
-
- virtual IPAddress host() const = 0;
- virtual UInt16 port() const = 0;
- virtual poco_socklen_t length() const = 0;
- virtual const struct sockaddr* addr() const = 0;
- virtual int af() const = 0;
- virtual Family family() const = 0;
- virtual std::string toString() const = 0;
-
-protected:
- SocketAddressImpl();
-
-private:
- SocketAddressImpl(const SocketAddressImpl&);
- SocketAddressImpl& operator = (const SocketAddressImpl&);
-};
-
-
-class Net_API IPv4SocketAddressImpl: public SocketAddressImpl
-{
-public:
- IPv4SocketAddressImpl();
- IPv4SocketAddressImpl(const struct sockaddr_in* addr);
- IPv4SocketAddressImpl(const void* addr, UInt16 port);
- IPAddress host() const;
- UInt16 port() const;
- poco_socklen_t length() const;
- const struct sockaddr* addr() const;
- int af() const;
- Family family() const;
- std::string toString() const;
-
-private:
- struct sockaddr_in _addr;
-};
-
-
-//
-// inlines
-//
-
-inline IPAddress IPv4SocketAddressImpl::host() const
-{
- return IPAddress(&_addr.sin_addr, sizeof(_addr.sin_addr));
-}
-
-
-inline UInt16 IPv4SocketAddressImpl::port() const
-{
- return _addr.sin_port;
-}
-
-
-inline poco_socklen_t IPv4SocketAddressImpl::length() const
-{
- return sizeof(_addr);
-}
-
-
-inline const struct sockaddr* IPv4SocketAddressImpl::addr() const
-{
- return reinterpret_cast<const struct sockaddr*>(&_addr);
-}
-
-
-inline int IPv4SocketAddressImpl::af() const
-{
- return _addr.sin_family;
-}
-
-
-inline SocketAddressImpl::Family IPv4SocketAddressImpl::family() const
-{
- return AddressFamily::IPv4;
-}
-
-
-#if defined(POCO_HAVE_IPv6)
-
-
-class Net_API IPv6SocketAddressImpl: public SocketAddressImpl
-{
-public:
- IPv6SocketAddressImpl(const struct sockaddr_in6* addr);
- IPv6SocketAddressImpl(const void* addr, UInt16 port);
- IPv6SocketAddressImpl(const void* addr, UInt16 port, UInt32 scope);
- IPAddress host() const;
- UInt16 port() const;
- poco_socklen_t length() const;
- const struct sockaddr* addr() const;
- int af() const;
- Family family() const;
- std::string toString() const;
-
-private:
- struct sockaddr_in6 _addr;
-};
-
-
-//
-// inlines
-//
-
-inline IPAddress IPv6SocketAddressImpl::host() const
-{
- return IPAddress(&_addr.sin6_addr, sizeof(_addr.sin6_addr), _addr.sin6_scope_id);
-}
-
-
-inline UInt16 IPv6SocketAddressImpl::port() const
-{
- return _addr.sin6_port;
-}
-
-
-inline poco_socklen_t IPv6SocketAddressImpl::length() const
-{
- return sizeof(_addr);
-}
-
-
-inline const struct sockaddr* IPv6SocketAddressImpl::addr() const
-{
- return reinterpret_cast<const struct sockaddr*>(&_addr);
-}
-
-
-inline int IPv6SocketAddressImpl::af() const
-{
- return _addr.sin6_family;
-}
-
-
-inline SocketAddressImpl::Family IPv6SocketAddressImpl::family() const
-{
- return AddressFamily::IPv6;
-}
-
-
-#endif // POCO_HAVE_IPv6
-
-
-#if defined(POCO_OS_FAMILY_UNIX)
-
-
-class Net_API LocalSocketAddressImpl: public SocketAddressImpl
-{
-public:
- LocalSocketAddressImpl(const struct sockaddr_un* addr);
- LocalSocketAddressImpl(const char* path);
- LocalSocketAddressImpl(const char* path, std::size_t length);
- ~LocalSocketAddressImpl();
- IPAddress host() const;
- UInt16 port() const;
- poco_socklen_t length() const;
- const struct sockaddr* addr() const;
- int af() const;
- Family family() const;
- const char* path() const;
- std::string toString() const;
-
-private:
- struct sockaddr_un* _pAddr;
- // Note: We allocate struct sockaddr_un on the heap, otherwise we would
- // waste a lot of memory due to small object optimization in SocketAddress.
-};
-
-
-//
-// inlines
-//
-
-inline IPAddress LocalSocketAddressImpl::host() const
-{
- throw Poco::InvalidAccessException("local socket address does not have host IP address");
-}
-
-
-inline UInt16 LocalSocketAddressImpl::port() const
-{
- throw Poco::InvalidAccessException("local socket address does not have port number");
-}
-
-
-inline poco_socklen_t LocalSocketAddressImpl::length() const
-{
- return sizeof(struct sockaddr_un);
-}
-
-
-inline const struct sockaddr* LocalSocketAddressImpl::addr() const
-{
- return reinterpret_cast<const struct sockaddr*>(_pAddr);
-}
-
-
-inline int LocalSocketAddressImpl::af() const
-{
- return _pAddr->sun_family;
-}
-
-
-inline SocketAddressImpl::Family LocalSocketAddressImpl::family() const
-{
- return AddressFamily::UNIX_LOCAL;
-}
-
-
-inline const char* LocalSocketAddressImpl::path() const
-{
- return _pAddr->sun_path;
-}
-
-
-#endif // POCO_OS_FAMILY_UNIX
-
-
-} } } // namespace Poco::Net::Impl
-
-
-#endif // Net_SocketAddressImpl_INCLUDED
+//
+// SocketAddressImpl.h
+//
+// Library: Net
+// Package: NetCore
+// Module: SocketAddressImpl
+//
+// Definition of the SocketAddressImpl class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_SocketAddressImpl_INCLUDED
+#define Net_SocketAddressImpl_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/SocketDefs.h"
+#include "Poco/Net/IPAddress.h"
+#include "Poco/RefCountedObject.h"
+
+
+namespace Poco {
+namespace Net {
+namespace Impl {
+
+
+class Net_API SocketAddressImpl : public Poco::RefCountedObject
+{
+public:
+ typedef AddressFamily::Family Family;
+
+ virtual ~SocketAddressImpl();
+
+ virtual IPAddress host() const = 0;
+ virtual UInt16 port() const = 0;
+ virtual poco_socklen_t length() const = 0;
+ virtual const struct sockaddr* addr() const = 0;
+ virtual int af() const = 0;
+ virtual Family family() const = 0;
+ virtual std::string toString() const = 0;
+
+protected:
+ SocketAddressImpl();
+
+private:
+ SocketAddressImpl(const SocketAddressImpl&);
+ SocketAddressImpl& operator = (const SocketAddressImpl&);
+};
+
+
+class Net_API IPv4SocketAddressImpl: public SocketAddressImpl
+{
+public:
+ IPv4SocketAddressImpl();
+ IPv4SocketAddressImpl(const struct sockaddr_in* addr);
+ IPv4SocketAddressImpl(const void* addr, UInt16 port);
+ IPAddress host() const;
+ UInt16 port() const;
+ poco_socklen_t length() const;
+ const struct sockaddr* addr() const;
+ int af() const;
+ Family family() const;
+ std::string toString() const;
+
+private:
+ struct sockaddr_in _addr;
+};
+
+
+//
+// inlines
+//
+
+inline IPAddress IPv4SocketAddressImpl::host() const
+{
+ return IPAddress(&_addr.sin_addr, sizeof(_addr.sin_addr));
+}
+
+
+inline UInt16 IPv4SocketAddressImpl::port() const
+{
+ return _addr.sin_port;
+}
+
+
+inline poco_socklen_t IPv4SocketAddressImpl::length() const
+{
+ return sizeof(_addr);
+}
+
+
+inline const struct sockaddr* IPv4SocketAddressImpl::addr() const
+{
+ return reinterpret_cast<const struct sockaddr*>(&_addr);
+}
+
+
+inline int IPv4SocketAddressImpl::af() const
+{
+ return _addr.sin_family;
+}
+
+
+inline SocketAddressImpl::Family IPv4SocketAddressImpl::family() const
+{
+ return AddressFamily::IPv4;
+}
+
+
+#if defined(POCO_HAVE_IPv6)
+
+
+class Net_API IPv6SocketAddressImpl: public SocketAddressImpl
+{
+public:
+ IPv6SocketAddressImpl(const struct sockaddr_in6* addr);
+ IPv6SocketAddressImpl(const void* addr, UInt16 port);
+ IPv6SocketAddressImpl(const void* addr, UInt16 port, UInt32 scope);
+ IPAddress host() const;
+ UInt16 port() const;
+ poco_socklen_t length() const;
+ const struct sockaddr* addr() const;
+ int af() const;
+ Family family() const;
+ std::string toString() const;
+
+private:
+ struct sockaddr_in6 _addr;
+};
+
+
+//
+// inlines
+//
+
+inline IPAddress IPv6SocketAddressImpl::host() const
+{
+ return IPAddress(&_addr.sin6_addr, sizeof(_addr.sin6_addr), _addr.sin6_scope_id);
+}
+
+
+inline UInt16 IPv6SocketAddressImpl::port() const
+{
+ return _addr.sin6_port;
+}
+
+
+inline poco_socklen_t IPv6SocketAddressImpl::length() const
+{
+ return sizeof(_addr);
+}
+
+
+inline const struct sockaddr* IPv6SocketAddressImpl::addr() const
+{
+ return reinterpret_cast<const struct sockaddr*>(&_addr);
+}
+
+
+inline int IPv6SocketAddressImpl::af() const
+{
+ return _addr.sin6_family;
+}
+
+
+inline SocketAddressImpl::Family IPv6SocketAddressImpl::family() const
+{
+ return AddressFamily::IPv6;
+}
+
+
+#endif // POCO_HAVE_IPv6
+
+
+#if defined(POCO_OS_FAMILY_UNIX)
+
+
+class Net_API LocalSocketAddressImpl: public SocketAddressImpl
+{
+public:
+ LocalSocketAddressImpl(const struct sockaddr_un* addr);
+ LocalSocketAddressImpl(const char* path);
+ LocalSocketAddressImpl(const char* path, std::size_t length);
+ ~LocalSocketAddressImpl();
+ IPAddress host() const;
+ UInt16 port() const;
+ poco_socklen_t length() const;
+ const struct sockaddr* addr() const;
+ int af() const;
+ Family family() const;
+ const char* path() const;
+ std::string toString() const;
+
+private:
+ struct sockaddr_un* _pAddr;
+ // Note: We allocate struct sockaddr_un on the heap, otherwise we would
+ // waste a lot of memory due to small object optimization in SocketAddress.
+};
+
+
+//
+// inlines
+//
+
+inline IPAddress LocalSocketAddressImpl::host() const
+{
+ throw Poco::InvalidAccessException("local socket address does not have host IP address");
+}
+
+
+inline UInt16 LocalSocketAddressImpl::port() const
+{
+ throw Poco::InvalidAccessException("local socket address does not have port number");
+}
+
+
+inline poco_socklen_t LocalSocketAddressImpl::length() const
+{
+ return sizeof(struct sockaddr_un);
+}
+
+
+inline const struct sockaddr* LocalSocketAddressImpl::addr() const
+{
+ return reinterpret_cast<const struct sockaddr*>(_pAddr);
+}
+
+
+inline int LocalSocketAddressImpl::af() const
+{
+ return _pAddr->sun_family;
+}
+
+
+inline SocketAddressImpl::Family LocalSocketAddressImpl::family() const
+{
+ return AddressFamily::UNIX_LOCAL;
+}
+
+
+inline const char* LocalSocketAddressImpl::path() const
+{
+ return _pAddr->sun_path;
+}
+
+
+#endif // POCO_OS_FAMILY_UNIX
+
+
+} } } // namespace Poco::Net::Impl
+
+
+#endif // Net_SocketAddressImpl_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/SocketConnector.h b/contrib/libs/poco/Net/include/Poco/Net/SocketConnector.h
index 075bdf6d77..d3196c9f62 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/SocketConnector.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/SocketConnector.h
@@ -1,212 +1,212 @@
-//
-// SocketConnector.h
-//
-// Library: Net
-// Package: Reactor
-// Module: SocketConnector
-//
-// Definition of the SocketConnector class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_SocketConnector_INCLUDED
-#define Net_SocketConnector_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/SocketNotification.h"
-#include "Poco/Net/SocketAddress.h"
-#include "Poco/Net/StreamSocket.h"
-#include "Poco/Observer.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-template <class ServiceHandler>
-class SocketConnector
- /// This class implements the Connector part of the
- /// Acceptor-Connector design pattern.
- ///
- /// The Acceptor-Connector pattern has been described in the book
- /// "Pattern Languages of Program Design 3", edited by Robert Martin,
- /// Frank Buschmann and Dirk Riehle (Addison Wesley, 1997).
- ///
- /// The Acceptor-Connector design pattern decouples connection
- /// establishment and service initialization in a distributed system
- /// from the processing performed once a service is initialized.
- /// This decoupling is achieved with three components: Acceptors,
- /// Connectors and Service Handlers.
- /// The Connector actively establishes a connection with a remote
- /// server socket (usually managed by an Acceptor) and initializes
- /// a Service Handler to manage the connection.
- ///
- /// The SocketConnector sets up a StreamSocket, initiates a non-blocking
- /// connect operation and registers itself for ReadableNotification, WritableNotification
- /// and ErrorNotification. ReadableNotification or WritableNotification denote the successful
- /// establishment of the connection.
- ///
- /// When the StreamSocket becomes readable or writeable, the SocketConnector
- /// creates a ServiceHandler to service the connection and unregisters
- /// itself.
- ///
- /// In case of an error (ErrorNotification), the SocketConnector unregisters itself
- /// and calls the onError() method, which can be overridden by subclasses
- /// to perform custom error handling.
- ///
- /// The ServiceHandler class must provide a constructor that
- /// takes a StreamSocket and a SocketReactor as arguments,
- /// e.g.:
- /// MyServiceHandler(const StreamSocket& socket, ServiceReactor& reactor)
- ///
- /// When the ServiceHandler is done, it must destroy itself.
- ///
- /// Subclasses can override the createServiceHandler() factory method
- /// if special steps are necessary to create a ServiceHandler object.
-{
-public:
- explicit SocketConnector(SocketAddress& address):
- _pReactor(0)
- /// Creates a SocketConnector, using the given Socket.
- {
- _socket.connectNB(address);
- }
-
- SocketConnector(SocketAddress& address, SocketReactor& reactor):
- _pReactor(0)
- /// Creates an acceptor, using the given ServerSocket.
- /// The SocketConnector registers itself with the given SocketReactor.
- {
- _socket.connectNB(address);
- registerConnector(reactor);
- }
-
- virtual ~SocketConnector()
- /// Destroys the SocketConnector.
- {
- try
- {
- unregisterConnector();
- }
- catch (...)
- {
- poco_unexpected();
- }
- }
-
- virtual void registerConnector(SocketReactor& reactor)
- /// Registers the SocketConnector with a SocketReactor.
- ///
- /// A subclass can override this and, for example, also register
- /// an event handler for a timeout event.
- ///
- /// The overriding method must call the baseclass implementation first.
- {
- _pReactor = &reactor;
- _pReactor->addEventHandler(_socket, Poco::Observer<SocketConnector, ReadableNotification>(*this, &SocketConnector::onReadable));
- _pReactor->addEventHandler(_socket, Poco::Observer<SocketConnector, WritableNotification>(*this, &SocketConnector::onWritable));
- _pReactor->addEventHandler(_socket, Poco::Observer<SocketConnector, ErrorNotification>(*this, &SocketConnector::onError));
- }
-
- virtual void unregisterConnector()
- /// Unregisters the SocketConnector.
- ///
- /// A subclass can override this and, for example, also unregister
- /// its event handler for a timeout event.
- ///
- /// The overriding method must call the baseclass implementation first.
- {
- if (_pReactor)
- {
- _pReactor->removeEventHandler(_socket, Poco::Observer<SocketConnector, ReadableNotification>(*this, &SocketConnector::onReadable));
- _pReactor->removeEventHandler(_socket, Poco::Observer<SocketConnector, WritableNotification>(*this, &SocketConnector::onWritable));
- _pReactor->removeEventHandler(_socket, Poco::Observer<SocketConnector, ErrorNotification>(*this, &SocketConnector::onError));
- }
- }
-
- void onReadable(ReadableNotification* pNotification)
- {
- pNotification->release();
- int err = _socket.impl()->socketError();
- if (err)
- {
- onError(err);
- unregisterConnector();
- }
- else
- {
- onConnect();
- }
- }
-
- void onWritable(WritableNotification* pNotification)
- {
- pNotification->release();
- onConnect();
- }
-
- void onConnect()
- {
- _socket.setBlocking(true);
- createServiceHandler();
- unregisterConnector();
- }
-
- void onError(ErrorNotification* pNotification)
- {
- pNotification->release();
- onError(_socket.impl()->socketError());
- unregisterConnector();
- }
-
-protected:
- virtual ServiceHandler* createServiceHandler()
- /// Create and initialize a new ServiceHandler instance.
- ///
- /// Subclasses can override this method.
- {
- return new ServiceHandler(_socket, *_pReactor);
- }
-
- virtual void onError(int errorCode)
- /// Called when the socket cannot be connected.
- ///
- /// Subclasses can override this method.
- {
- }
-
- SocketReactor* reactor()
- /// Returns a pointer to the SocketReactor where
- /// this SocketConnector is registered.
- ///
- /// The pointer may be null.
- {
- return _pReactor;
- }
-
- StreamSocket& socket()
- /// Returns a reference to the SocketConnector's socket.
- {
- return _socket;
- }
-
-private:
- SocketConnector();
- SocketConnector(const SocketConnector&);
- SocketConnector& operator = (const SocketConnector&);
-
- StreamSocket _socket;
- SocketReactor* _pReactor;
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_SocketConnector_INCLUDED
+//
+// SocketConnector.h
+//
+// Library: Net
+// Package: Reactor
+// Module: SocketConnector
+//
+// Definition of the SocketConnector class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_SocketConnector_INCLUDED
+#define Net_SocketConnector_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/SocketNotification.h"
+#include "Poco/Net/SocketAddress.h"
+#include "Poco/Net/StreamSocket.h"
+#include "Poco/Observer.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+template <class ServiceHandler>
+class SocketConnector
+ /// This class implements the Connector part of the
+ /// Acceptor-Connector design pattern.
+ ///
+ /// The Acceptor-Connector pattern has been described in the book
+ /// "Pattern Languages of Program Design 3", edited by Robert Martin,
+ /// Frank Buschmann and Dirk Riehle (Addison Wesley, 1997).
+ ///
+ /// The Acceptor-Connector design pattern decouples connection
+ /// establishment and service initialization in a distributed system
+ /// from the processing performed once a service is initialized.
+ /// This decoupling is achieved with three components: Acceptors,
+ /// Connectors and Service Handlers.
+ /// The Connector actively establishes a connection with a remote
+ /// server socket (usually managed by an Acceptor) and initializes
+ /// a Service Handler to manage the connection.
+ ///
+ /// The SocketConnector sets up a StreamSocket, initiates a non-blocking
+ /// connect operation and registers itself for ReadableNotification, WritableNotification
+ /// and ErrorNotification. ReadableNotification or WritableNotification denote the successful
+ /// establishment of the connection.
+ ///
+ /// When the StreamSocket becomes readable or writeable, the SocketConnector
+ /// creates a ServiceHandler to service the connection and unregisters
+ /// itself.
+ ///
+ /// In case of an error (ErrorNotification), the SocketConnector unregisters itself
+ /// and calls the onError() method, which can be overridden by subclasses
+ /// to perform custom error handling.
+ ///
+ /// The ServiceHandler class must provide a constructor that
+ /// takes a StreamSocket and a SocketReactor as arguments,
+ /// e.g.:
+ /// MyServiceHandler(const StreamSocket& socket, ServiceReactor& reactor)
+ ///
+ /// When the ServiceHandler is done, it must destroy itself.
+ ///
+ /// Subclasses can override the createServiceHandler() factory method
+ /// if special steps are necessary to create a ServiceHandler object.
+{
+public:
+ explicit SocketConnector(SocketAddress& address):
+ _pReactor(0)
+ /// Creates a SocketConnector, using the given Socket.
+ {
+ _socket.connectNB(address);
+ }
+
+ SocketConnector(SocketAddress& address, SocketReactor& reactor):
+ _pReactor(0)
+ /// Creates an acceptor, using the given ServerSocket.
+ /// The SocketConnector registers itself with the given SocketReactor.
+ {
+ _socket.connectNB(address);
+ registerConnector(reactor);
+ }
+
+ virtual ~SocketConnector()
+ /// Destroys the SocketConnector.
+ {
+ try
+ {
+ unregisterConnector();
+ }
+ catch (...)
+ {
+ poco_unexpected();
+ }
+ }
+
+ virtual void registerConnector(SocketReactor& reactor)
+ /// Registers the SocketConnector with a SocketReactor.
+ ///
+ /// A subclass can override this and, for example, also register
+ /// an event handler for a timeout event.
+ ///
+ /// The overriding method must call the baseclass implementation first.
+ {
+ _pReactor = &reactor;
+ _pReactor->addEventHandler(_socket, Poco::Observer<SocketConnector, ReadableNotification>(*this, &SocketConnector::onReadable));
+ _pReactor->addEventHandler(_socket, Poco::Observer<SocketConnector, WritableNotification>(*this, &SocketConnector::onWritable));
+ _pReactor->addEventHandler(_socket, Poco::Observer<SocketConnector, ErrorNotification>(*this, &SocketConnector::onError));
+ }
+
+ virtual void unregisterConnector()
+ /// Unregisters the SocketConnector.
+ ///
+ /// A subclass can override this and, for example, also unregister
+ /// its event handler for a timeout event.
+ ///
+ /// The overriding method must call the baseclass implementation first.
+ {
+ if (_pReactor)
+ {
+ _pReactor->removeEventHandler(_socket, Poco::Observer<SocketConnector, ReadableNotification>(*this, &SocketConnector::onReadable));
+ _pReactor->removeEventHandler(_socket, Poco::Observer<SocketConnector, WritableNotification>(*this, &SocketConnector::onWritable));
+ _pReactor->removeEventHandler(_socket, Poco::Observer<SocketConnector, ErrorNotification>(*this, &SocketConnector::onError));
+ }
+ }
+
+ void onReadable(ReadableNotification* pNotification)
+ {
+ pNotification->release();
+ int err = _socket.impl()->socketError();
+ if (err)
+ {
+ onError(err);
+ unregisterConnector();
+ }
+ else
+ {
+ onConnect();
+ }
+ }
+
+ void onWritable(WritableNotification* pNotification)
+ {
+ pNotification->release();
+ onConnect();
+ }
+
+ void onConnect()
+ {
+ _socket.setBlocking(true);
+ createServiceHandler();
+ unregisterConnector();
+ }
+
+ void onError(ErrorNotification* pNotification)
+ {
+ pNotification->release();
+ onError(_socket.impl()->socketError());
+ unregisterConnector();
+ }
+
+protected:
+ virtual ServiceHandler* createServiceHandler()
+ /// Create and initialize a new ServiceHandler instance.
+ ///
+ /// Subclasses can override this method.
+ {
+ return new ServiceHandler(_socket, *_pReactor);
+ }
+
+ virtual void onError(int errorCode)
+ /// Called when the socket cannot be connected.
+ ///
+ /// Subclasses can override this method.
+ {
+ }
+
+ SocketReactor* reactor()
+ /// Returns a pointer to the SocketReactor where
+ /// this SocketConnector is registered.
+ ///
+ /// The pointer may be null.
+ {
+ return _pReactor;
+ }
+
+ StreamSocket& socket()
+ /// Returns a reference to the SocketConnector's socket.
+ {
+ return _socket;
+ }
+
+private:
+ SocketConnector();
+ SocketConnector(const SocketConnector&);
+ SocketConnector& operator = (const SocketConnector&);
+
+ StreamSocket _socket;
+ SocketReactor* _pReactor;
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_SocketConnector_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/SocketDefs.h b/contrib/libs/poco/Net/include/Poco/Net/SocketDefs.h
index 194e9f0a9a..ef62155389 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/SocketDefs.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/SocketDefs.h
@@ -1,385 +1,385 @@
-//
-// SocketDefs.h
-//
-// Library: Net
-// Package: NetCore
-// Module: SocketDefs
-//
-// Include platform-specific header files for sockets.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_SocketDefs_INCLUDED
-#define Net_SocketDefs_INCLUDED
-
-
-#define POCO_ENOERR 0
-
-
-#if defined(POCO_OS_FAMILY_WINDOWS)
- #include "Poco/UnWindows.h"
- #include <winsock2.h>
- #include <ws2tcpip.h>
- #define POCO_INVALID_SOCKET INVALID_SOCKET
- #define poco_socket_t SOCKET
- #define poco_socklen_t int
- #define poco_ioctl_request_t int
- #define poco_closesocket(s) closesocket(s)
- #define POCO_EINTR WSAEINTR
- #define POCO_EACCES WSAEACCES
- #define POCO_EFAULT WSAEFAULT
- #define POCO_EINVAL WSAEINVAL
- #define POCO_EMFILE WSAEMFILE
- #define POCO_EAGAIN WSAEWOULDBLOCK
- #define POCO_EWOULDBLOCK WSAEWOULDBLOCK
- #define POCO_EINPROGRESS WSAEINPROGRESS
- #define POCO_EALREADY WSAEALREADY
- #define POCO_ENOTSOCK WSAENOTSOCK
- #define POCO_EDESTADDRREQ WSAEDESTADDRREQ
- #define POCO_EMSGSIZE WSAEMSGSIZE
- #define POCO_EPROTOTYPE WSAEPROTOTYPE
- #define POCO_ENOPROTOOPT WSAENOPROTOOPT
- #define POCO_EPROTONOSUPPORT WSAEPROTONOSUPPORT
- #define POCO_ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT
- #define POCO_ENOTSUP WSAEOPNOTSUPP
- #define POCO_EPFNOSUPPORT WSAEPFNOSUPPORT
- #define POCO_EAFNOSUPPORT WSAEAFNOSUPPORT
- #define POCO_EADDRINUSE WSAEADDRINUSE
- #define POCO_EADDRNOTAVAIL WSAEADDRNOTAVAIL
- #define POCO_ENETDOWN WSAENETDOWN
- #define POCO_ENETUNREACH WSAENETUNREACH
- #define POCO_ENETRESET WSAENETRESET
- #define POCO_ECONNABORTED WSAECONNABORTED
- #define POCO_ECONNRESET WSAECONNRESET
- #define POCO_ENOBUFS WSAENOBUFS
- #define POCO_EISCONN WSAEISCONN
- #define POCO_ENOTCONN WSAENOTCONN
- #define POCO_ESHUTDOWN WSAESHUTDOWN
- #define POCO_ETIMEDOUT WSAETIMEDOUT
- #define POCO_ECONNREFUSED WSAECONNREFUSED
- #define POCO_EHOSTDOWN WSAEHOSTDOWN
- #define POCO_EHOSTUNREACH WSAEHOSTUNREACH
- #define POCO_ESYSNOTREADY WSASYSNOTREADY
- #define POCO_ENOTINIT WSANOTINITIALISED
- #define POCO_HOST_NOT_FOUND WSAHOST_NOT_FOUND
- #define POCO_TRY_AGAIN WSATRY_AGAIN
- #define POCO_NO_RECOVERY WSANO_RECOVERY
- #define POCO_NO_DATA WSANO_DATA
- #ifndef ADDRESS_FAMILY
- #define ADDRESS_FAMILY USHORT
- #endif
-#elif defined(POCO_VXWORKS)
- #include <hostLib.h>
- #error #include <ifLib.h>
- #error #include <inetLib.h>
- #include <ioLib.h>
- #include <resolvLib.h>
- #include <types.h>
- #include <socket.h>
- #include <netinet/tcp.h>
- #define POCO_INVALID_SOCKET -1
- #define poco_socket_t int
- #define poco_socklen_t int
- #define poco_ioctl_request_t int
- #define poco_closesocket(s) ::close(s)
- #define POCO_EINTR EINTR
- #define POCO_EACCES EACCES
- #define POCO_EFAULT EFAULT
- #define POCO_EINVAL EINVAL
- #define POCO_EMFILE EMFILE
- #define POCO_EAGAIN EAGAIN
- #define POCO_EWOULDBLOCK EWOULDBLOCK
- #define POCO_EINPROGRESS EINPROGRESS
- #define POCO_EALREADY EALREADY
- #define POCO_ENOTSOCK ENOTSOCK
- #define POCO_EDESTADDRREQ EDESTADDRREQ
- #define POCO_EMSGSIZE EMSGSIZE
- #define POCO_EPROTOTYPE EPROTOTYPE
- #define POCO_ENOPROTOOPT ENOPROTOOPT
- #define POCO_EPROTONOSUPPORT EPROTONOSUPPORT
- #define POCO_ESOCKTNOSUPPORT ESOCKTNOSUPPORT
- #define POCO_ENOTSUP ENOTSUP
- #define POCO_EPFNOSUPPORT EPFNOSUPPORT
- #define POCO_EAFNOSUPPORT EAFNOSUPPORT
- #define POCO_EADDRINUSE EADDRINUSE
- #define POCO_EADDRNOTAVAIL EADDRNOTAVAIL
- #define POCO_ENETDOWN ENETDOWN
- #define POCO_ENETUNREACH ENETUNREACH
- #define POCO_ENETRESET ENETRESET
- #define POCO_ECONNABORTED ECONNABORTED
- #define POCO_ECONNRESET ECONNRESET
- #define POCO_ENOBUFS ENOBUFS
- #define POCO_EISCONN EISCONN
- #define POCO_ENOTCONN ENOTCONN
- #define POCO_ESHUTDOWN ESHUTDOWN
- #define POCO_ETIMEDOUT ETIMEDOUT
- #define POCO_ECONNREFUSED ECONNREFUSED
- #define POCO_EHOSTDOWN EHOSTDOWN
- #define POCO_EHOSTUNREACH EHOSTUNREACH
- #define POCO_ESYSNOTREADY -4
- #define POCO_ENOTINIT -5
- #define POCO_HOST_NOT_FOUND HOST_NOT_FOUND
- #define POCO_TRY_AGAIN TRY_AGAIN
- #define POCO_NO_RECOVERY NO_RECOVERY
- #define POCO_NO_DATA NO_DATA
-#elif defined(POCO_OS_FAMILY_UNIX)
- #include <unistd.h>
- #include <errno.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <sys/un.h>
- #include <fcntl.h>
- #if POCO_OS != POCO_OS_HPUX
- #include <sys/select.h>
- #endif
- #include <sys/ioctl.h>
- #include <arpa/inet.h>
- #include <netinet/in.h>
- #include <netinet/tcp.h>
- #include <netdb.h>
- #if defined(POCO_OS_FAMILY_UNIX)
- #if (POCO_OS == POCO_OS_LINUX) || (POCO_OS == POCO_OS_ANDROID)
- // Net/src/NetworkInterface.cpp changed #include <linux/if.h> to #include <net/if.h>
- // no more conflict, can use #include <net/if.h> here
- #include <net/if.h>
- #elif (POCO_OS == POCO_OS_HPUX)
- extern "C"
- {
- #include <net/if.h>
- }
- #else
- #include <net/if.h>
- #endif
- #endif
- #if (POCO_OS == POCO_OS_SOLARIS) || (POCO_OS == POCO_OS_MAC_OS_X)
- #include <sys/sockio.h>
- #include <sys/filio.h>
- #endif
- #define POCO_INVALID_SOCKET -1
- #define poco_socket_t int
- #define poco_socklen_t socklen_t
- #define poco_fcntl_request_t int
- #if defined(POCO_OS_FAMILY_BSD)
- #define poco_ioctl_request_t unsigned long
- #else
- #define poco_ioctl_request_t int
- #endif
- #define poco_closesocket(s) ::close(s)
- #define POCO_EINTR EINTR
- #define POCO_EACCES EACCES
- #define POCO_EFAULT EFAULT
- #define POCO_EINVAL EINVAL
- #define POCO_EMFILE EMFILE
- #define POCO_EAGAIN EAGAIN
- #define POCO_EWOULDBLOCK EWOULDBLOCK
- #define POCO_EINPROGRESS EINPROGRESS
- #define POCO_EALREADY EALREADY
- #define POCO_ENOTSOCK ENOTSOCK
- #define POCO_EDESTADDRREQ EDESTADDRREQ
- #define POCO_EMSGSIZE EMSGSIZE
- #define POCO_EPROTOTYPE EPROTOTYPE
- #define POCO_ENOPROTOOPT ENOPROTOOPT
- #define POCO_EPROTONOSUPPORT EPROTONOSUPPORT
- #if defined(ESOCKTNOSUPPORT)
- #define POCO_ESOCKTNOSUPPORT ESOCKTNOSUPPORT
- #else
- #define POCO_ESOCKTNOSUPPORT -1
- #endif
- #define POCO_ENOTSUP ENOTSUP
- #define POCO_EPFNOSUPPORT EPFNOSUPPORT
- #define POCO_EAFNOSUPPORT EAFNOSUPPORT
- #define POCO_EADDRINUSE EADDRINUSE
- #define POCO_EADDRNOTAVAIL EADDRNOTAVAIL
- #define POCO_ENETDOWN ENETDOWN
- #define POCO_ENETUNREACH ENETUNREACH
- #define POCO_ENETRESET ENETRESET
- #define POCO_ECONNABORTED ECONNABORTED
- #define POCO_ECONNRESET ECONNRESET
- #define POCO_ENOBUFS ENOBUFS
- #define POCO_EISCONN EISCONN
- #define POCO_ENOTCONN ENOTCONN
- #if defined(ESHUTDOWN)
- #define POCO_ESHUTDOWN ESHUTDOWN
- #else
- #define POCO_ESHUTDOWN -2
- #endif
- #define POCO_ETIMEDOUT ETIMEDOUT
- #define POCO_ECONNREFUSED ECONNREFUSED
- #if defined(EHOSTDOWN)
- #define POCO_EHOSTDOWN EHOSTDOWN
- #else
- #define POCO_EHOSTDOWN -3
- #endif
- #define POCO_EHOSTUNREACH EHOSTUNREACH
- #define POCO_ESYSNOTREADY -4
- #define POCO_ENOTINIT -5
- #define POCO_HOST_NOT_FOUND HOST_NOT_FOUND
- #define POCO_TRY_AGAIN TRY_AGAIN
- #define POCO_NO_RECOVERY NO_RECOVERY
- #define POCO_NO_DATA NO_DATA
-#endif
-
-
-#if defined(POCO_OS_FAMILY_BSD) || (POCO_OS == POCO_OS_TRU64) || (POCO_OS == POCO_OS_AIX) || (POCO_OS == POCO_OS_IRIX) || (POCO_OS == POCO_OS_QNX) || (POCO_OS == POCO_OS_VXWORKS)
- #define POCO_HAVE_SALEN 1
-#endif
-
-
-#if POCO_OS != POCO_OS_VXWORKS && !defined(POCO_NET_NO_ADDRINFO)
- #define POCO_HAVE_ADDRINFO 1
-#endif
-
-
-#if POCO_OS == POCO_OS_LINUX
- #define POCO_HAVE_ADDRINFO_A 1
-#endif
-
-
-/// Without this option, Poco library will restart recv after EINTR,
-/// but it doesn't update socket receive timeout that leads to infinite wait
-/// when query profiler is activated. The issue persisted in delayed_replica_failover
-/// integration test after we enabled query profiler by default.
-#define POCO_BROKEN_TIMEOUTS 1
-
-
-#if defined(POCO_HAVE_ADDRINFO)
- #ifndef AI_PASSIVE
- #define AI_PASSIVE 0
- #endif
- #ifndef AI_CANONNAME
- #define AI_CANONNAME 0
- #endif
- #ifndef AI_NUMERICHOST
- #define AI_NUMERICHOST 0
- #endif
- #ifndef AI_NUMERICSERV
- #define AI_NUMERICSERV 0
- #endif
- #ifndef AI_ALL
- #define AI_ALL 0
- #endif
- #ifndef AI_ADDRCONFIG
- #define AI_ADDRCONFIG 0
- #endif
- #ifndef AI_V4MAPPED
- #define AI_V4MAPPED 0
- #endif
-#endif
-
-
-#if defined(POCO_HAVE_SALEN)
- #define poco_set_sa_len(pSA, len) (pSA)->sa_len = (len)
- #define poco_set_sin_len(pSA) (pSA)->sin_len = sizeof(struct sockaddr_in)
- #if defined(POCO_HAVE_IPv6)
- #define poco_set_sin6_len(pSA) (pSA)->sin6_len = sizeof(struct sockaddr_in6)
- #endif
- #if defined(POCO_OS_FAMILY_UNIX)
- #define poco_set_sun_len(pSA, len) (pSA)->sun_len = (len)
- #endif
-#else
- #define poco_set_sa_len(pSA, len) (void) 0
- #define poco_set_sin_len(pSA) (void) 0
- #define poco_set_sin6_len(pSA) (void) 0
- #define poco_set_sun_len(pSA, len) (void) 0
-#endif
-
-
-#ifndef INADDR_NONE
- #define INADDR_NONE 0xffffffff
-#endif
-
-#ifndef INADDR_ANY
- #define INADDR_ANY 0x00000000
-#endif
-
-#ifndef INADDR_BROADCAST
- #define INADDR_BROADCAST 0xffffffff
-#endif
-
-#ifndef INADDR_LOOPBACK
- #define INADDR_LOOPBACK 0x7f000001
-#endif
-
-#ifndef INADDR_UNSPEC_GROUP
- #define INADDR_UNSPEC_GROUP 0xe0000000
-#endif
-
-#ifndef INADDR_ALLHOSTS_GROUP
- #define INADDR_ALLHOSTS_GROUP 0xe0000001
-#endif
-
-#ifndef INADDR_ALLRTRS_GROUP
- #define INADDR_ALLRTRS_GROUP 0xe0000002
-#endif
-
-#ifndef INADDR_MAX_LOCAL_GROUP
- #define INADDR_MAX_LOCAL_GROUP 0xe00000ff
-#endif
-
-#if defined(POCO_ARCH_BIG_ENDIAN)
- #define poco_ntoh_16(x) (x)
- #define poco_ntoh_32(x) (x)
-#else
- #define poco_ntoh_16(x) \
- ((((x) >> 8) & 0x00ff) | (((x) << 8) & 0xff00))
- #define poco_ntoh_32(x) \
- ((((x) >> 24) & 0x000000ff) | (((x) >> 8) & 0x0000ff00) | (((x) << 8) & 0x00ff0000) | (((x) << 24) & 0xff000000))
-#endif
-#define poco_hton_16(x) poco_ntoh_16(x)
-#define poco_hton_32(x) poco_ntoh_32(x)
-
-
-#if !defined(s6_addr16)
- #if defined(POCO_OS_FAMILY_WINDOWS)
- #define s6_addr16 u.Word
- #else
- #define s6_addr16 __u6_addr.__u6_addr16
- #endif
-#endif
-
-
-#if !defined(s6_addr32)
- #if defined(POCO_OS_FAMILY_UNIX)
- #if (POCO_OS == POCO_OS_SOLARIS)
- #define s6_addr32 _S6_un._S6_u32
- #else
- #define s6_addr32 __u6_addr.__u6_addr32
- #endif
- #endif
-#endif
-
-
-namespace Poco {
-namespace Net {
-
-
-struct AddressFamily
- /// AddressFamily::Family replaces the previously used IPAddress::Family
- /// enumeration and is now used for IPAddress::Family and SocketAddress::Family.
-{
- enum Family
- /// Possible address families for socket addresses.
- {
- IPv4,
- /// IPv4 address family.
- #if defined(POCO_HAVE_IPv6)
- IPv6,
- /// IPv6 address family.
- #endif
- #if defined(POCO_OS_FAMILY_UNIX)
- UNIX_LOCAL
- /// UNIX domain socket address family. Available on UNIX/POSIX platforms only.
- #endif
- };
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_SocketDefs_INCLUDED
+//
+// SocketDefs.h
+//
+// Library: Net
+// Package: NetCore
+// Module: SocketDefs
+//
+// Include platform-specific header files for sockets.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_SocketDefs_INCLUDED
+#define Net_SocketDefs_INCLUDED
+
+
+#define POCO_ENOERR 0
+
+
+#if defined(POCO_OS_FAMILY_WINDOWS)
+ #include "Poco/UnWindows.h"
+ #include <winsock2.h>
+ #include <ws2tcpip.h>
+ #define POCO_INVALID_SOCKET INVALID_SOCKET
+ #define poco_socket_t SOCKET
+ #define poco_socklen_t int
+ #define poco_ioctl_request_t int
+ #define poco_closesocket(s) closesocket(s)
+ #define POCO_EINTR WSAEINTR
+ #define POCO_EACCES WSAEACCES
+ #define POCO_EFAULT WSAEFAULT
+ #define POCO_EINVAL WSAEINVAL
+ #define POCO_EMFILE WSAEMFILE
+ #define POCO_EAGAIN WSAEWOULDBLOCK
+ #define POCO_EWOULDBLOCK WSAEWOULDBLOCK
+ #define POCO_EINPROGRESS WSAEINPROGRESS
+ #define POCO_EALREADY WSAEALREADY
+ #define POCO_ENOTSOCK WSAENOTSOCK
+ #define POCO_EDESTADDRREQ WSAEDESTADDRREQ
+ #define POCO_EMSGSIZE WSAEMSGSIZE
+ #define POCO_EPROTOTYPE WSAEPROTOTYPE
+ #define POCO_ENOPROTOOPT WSAENOPROTOOPT
+ #define POCO_EPROTONOSUPPORT WSAEPROTONOSUPPORT
+ #define POCO_ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT
+ #define POCO_ENOTSUP WSAEOPNOTSUPP
+ #define POCO_EPFNOSUPPORT WSAEPFNOSUPPORT
+ #define POCO_EAFNOSUPPORT WSAEAFNOSUPPORT
+ #define POCO_EADDRINUSE WSAEADDRINUSE
+ #define POCO_EADDRNOTAVAIL WSAEADDRNOTAVAIL
+ #define POCO_ENETDOWN WSAENETDOWN
+ #define POCO_ENETUNREACH WSAENETUNREACH
+ #define POCO_ENETRESET WSAENETRESET
+ #define POCO_ECONNABORTED WSAECONNABORTED
+ #define POCO_ECONNRESET WSAECONNRESET
+ #define POCO_ENOBUFS WSAENOBUFS
+ #define POCO_EISCONN WSAEISCONN
+ #define POCO_ENOTCONN WSAENOTCONN
+ #define POCO_ESHUTDOWN WSAESHUTDOWN
+ #define POCO_ETIMEDOUT WSAETIMEDOUT
+ #define POCO_ECONNREFUSED WSAECONNREFUSED
+ #define POCO_EHOSTDOWN WSAEHOSTDOWN
+ #define POCO_EHOSTUNREACH WSAEHOSTUNREACH
+ #define POCO_ESYSNOTREADY WSASYSNOTREADY
+ #define POCO_ENOTINIT WSANOTINITIALISED
+ #define POCO_HOST_NOT_FOUND WSAHOST_NOT_FOUND
+ #define POCO_TRY_AGAIN WSATRY_AGAIN
+ #define POCO_NO_RECOVERY WSANO_RECOVERY
+ #define POCO_NO_DATA WSANO_DATA
+ #ifndef ADDRESS_FAMILY
+ #define ADDRESS_FAMILY USHORT
+ #endif
+#elif defined(POCO_VXWORKS)
+ #include <hostLib.h>
+ #error #include <ifLib.h>
+ #error #include <inetLib.h>
+ #include <ioLib.h>
+ #include <resolvLib.h>
+ #include <types.h>
+ #include <socket.h>
+ #include <netinet/tcp.h>
+ #define POCO_INVALID_SOCKET -1
+ #define poco_socket_t int
+ #define poco_socklen_t int
+ #define poco_ioctl_request_t int
+ #define poco_closesocket(s) ::close(s)
+ #define POCO_EINTR EINTR
+ #define POCO_EACCES EACCES
+ #define POCO_EFAULT EFAULT
+ #define POCO_EINVAL EINVAL
+ #define POCO_EMFILE EMFILE
+ #define POCO_EAGAIN EAGAIN
+ #define POCO_EWOULDBLOCK EWOULDBLOCK
+ #define POCO_EINPROGRESS EINPROGRESS
+ #define POCO_EALREADY EALREADY
+ #define POCO_ENOTSOCK ENOTSOCK
+ #define POCO_EDESTADDRREQ EDESTADDRREQ
+ #define POCO_EMSGSIZE EMSGSIZE
+ #define POCO_EPROTOTYPE EPROTOTYPE
+ #define POCO_ENOPROTOOPT ENOPROTOOPT
+ #define POCO_EPROTONOSUPPORT EPROTONOSUPPORT
+ #define POCO_ESOCKTNOSUPPORT ESOCKTNOSUPPORT
+ #define POCO_ENOTSUP ENOTSUP
+ #define POCO_EPFNOSUPPORT EPFNOSUPPORT
+ #define POCO_EAFNOSUPPORT EAFNOSUPPORT
+ #define POCO_EADDRINUSE EADDRINUSE
+ #define POCO_EADDRNOTAVAIL EADDRNOTAVAIL
+ #define POCO_ENETDOWN ENETDOWN
+ #define POCO_ENETUNREACH ENETUNREACH
+ #define POCO_ENETRESET ENETRESET
+ #define POCO_ECONNABORTED ECONNABORTED
+ #define POCO_ECONNRESET ECONNRESET
+ #define POCO_ENOBUFS ENOBUFS
+ #define POCO_EISCONN EISCONN
+ #define POCO_ENOTCONN ENOTCONN
+ #define POCO_ESHUTDOWN ESHUTDOWN
+ #define POCO_ETIMEDOUT ETIMEDOUT
+ #define POCO_ECONNREFUSED ECONNREFUSED
+ #define POCO_EHOSTDOWN EHOSTDOWN
+ #define POCO_EHOSTUNREACH EHOSTUNREACH
+ #define POCO_ESYSNOTREADY -4
+ #define POCO_ENOTINIT -5
+ #define POCO_HOST_NOT_FOUND HOST_NOT_FOUND
+ #define POCO_TRY_AGAIN TRY_AGAIN
+ #define POCO_NO_RECOVERY NO_RECOVERY
+ #define POCO_NO_DATA NO_DATA
+#elif defined(POCO_OS_FAMILY_UNIX)
+ #include <unistd.h>
+ #include <errno.h>
+ #include <sys/types.h>
+ #include <sys/socket.h>
+ #include <sys/un.h>
+ #include <fcntl.h>
+ #if POCO_OS != POCO_OS_HPUX
+ #include <sys/select.h>
+ #endif
+ #include <sys/ioctl.h>
+ #include <arpa/inet.h>
+ #include <netinet/in.h>
+ #include <netinet/tcp.h>
+ #include <netdb.h>
+ #if defined(POCO_OS_FAMILY_UNIX)
+ #if (POCO_OS == POCO_OS_LINUX) || (POCO_OS == POCO_OS_ANDROID)
+ // Net/src/NetworkInterface.cpp changed #include <linux/if.h> to #include <net/if.h>
+ // no more conflict, can use #include <net/if.h> here
+ #include <net/if.h>
+ #elif (POCO_OS == POCO_OS_HPUX)
+ extern "C"
+ {
+ #include <net/if.h>
+ }
+ #else
+ #include <net/if.h>
+ #endif
+ #endif
+ #if (POCO_OS == POCO_OS_SOLARIS) || (POCO_OS == POCO_OS_MAC_OS_X)
+ #include <sys/sockio.h>
+ #include <sys/filio.h>
+ #endif
+ #define POCO_INVALID_SOCKET -1
+ #define poco_socket_t int
+ #define poco_socklen_t socklen_t
+ #define poco_fcntl_request_t int
+ #if defined(POCO_OS_FAMILY_BSD)
+ #define poco_ioctl_request_t unsigned long
+ #else
+ #define poco_ioctl_request_t int
+ #endif
+ #define poco_closesocket(s) ::close(s)
+ #define POCO_EINTR EINTR
+ #define POCO_EACCES EACCES
+ #define POCO_EFAULT EFAULT
+ #define POCO_EINVAL EINVAL
+ #define POCO_EMFILE EMFILE
+ #define POCO_EAGAIN EAGAIN
+ #define POCO_EWOULDBLOCK EWOULDBLOCK
+ #define POCO_EINPROGRESS EINPROGRESS
+ #define POCO_EALREADY EALREADY
+ #define POCO_ENOTSOCK ENOTSOCK
+ #define POCO_EDESTADDRREQ EDESTADDRREQ
+ #define POCO_EMSGSIZE EMSGSIZE
+ #define POCO_EPROTOTYPE EPROTOTYPE
+ #define POCO_ENOPROTOOPT ENOPROTOOPT
+ #define POCO_EPROTONOSUPPORT EPROTONOSUPPORT
+ #if defined(ESOCKTNOSUPPORT)
+ #define POCO_ESOCKTNOSUPPORT ESOCKTNOSUPPORT
+ #else
+ #define POCO_ESOCKTNOSUPPORT -1
+ #endif
+ #define POCO_ENOTSUP ENOTSUP
+ #define POCO_EPFNOSUPPORT EPFNOSUPPORT
+ #define POCO_EAFNOSUPPORT EAFNOSUPPORT
+ #define POCO_EADDRINUSE EADDRINUSE
+ #define POCO_EADDRNOTAVAIL EADDRNOTAVAIL
+ #define POCO_ENETDOWN ENETDOWN
+ #define POCO_ENETUNREACH ENETUNREACH
+ #define POCO_ENETRESET ENETRESET
+ #define POCO_ECONNABORTED ECONNABORTED
+ #define POCO_ECONNRESET ECONNRESET
+ #define POCO_ENOBUFS ENOBUFS
+ #define POCO_EISCONN EISCONN
+ #define POCO_ENOTCONN ENOTCONN
+ #if defined(ESHUTDOWN)
+ #define POCO_ESHUTDOWN ESHUTDOWN
+ #else
+ #define POCO_ESHUTDOWN -2
+ #endif
+ #define POCO_ETIMEDOUT ETIMEDOUT
+ #define POCO_ECONNREFUSED ECONNREFUSED
+ #if defined(EHOSTDOWN)
+ #define POCO_EHOSTDOWN EHOSTDOWN
+ #else
+ #define POCO_EHOSTDOWN -3
+ #endif
+ #define POCO_EHOSTUNREACH EHOSTUNREACH
+ #define POCO_ESYSNOTREADY -4
+ #define POCO_ENOTINIT -5
+ #define POCO_HOST_NOT_FOUND HOST_NOT_FOUND
+ #define POCO_TRY_AGAIN TRY_AGAIN
+ #define POCO_NO_RECOVERY NO_RECOVERY
+ #define POCO_NO_DATA NO_DATA
+#endif
+
+
+#if defined(POCO_OS_FAMILY_BSD) || (POCO_OS == POCO_OS_TRU64) || (POCO_OS == POCO_OS_AIX) || (POCO_OS == POCO_OS_IRIX) || (POCO_OS == POCO_OS_QNX) || (POCO_OS == POCO_OS_VXWORKS)
+ #define POCO_HAVE_SALEN 1
+#endif
+
+
+#if POCO_OS != POCO_OS_VXWORKS && !defined(POCO_NET_NO_ADDRINFO)
+ #define POCO_HAVE_ADDRINFO 1
+#endif
+
+
+#if POCO_OS == POCO_OS_LINUX
+ #define POCO_HAVE_ADDRINFO_A 1
+#endif
+
+
+/// Without this option, Poco library will restart recv after EINTR,
+/// but it doesn't update socket receive timeout that leads to infinite wait
+/// when query profiler is activated. The issue persisted in delayed_replica_failover
+/// integration test after we enabled query profiler by default.
+#define POCO_BROKEN_TIMEOUTS 1
+
+
+#if defined(POCO_HAVE_ADDRINFO)
+ #ifndef AI_PASSIVE
+ #define AI_PASSIVE 0
+ #endif
+ #ifndef AI_CANONNAME
+ #define AI_CANONNAME 0
+ #endif
+ #ifndef AI_NUMERICHOST
+ #define AI_NUMERICHOST 0
+ #endif
+ #ifndef AI_NUMERICSERV
+ #define AI_NUMERICSERV 0
+ #endif
+ #ifndef AI_ALL
+ #define AI_ALL 0
+ #endif
+ #ifndef AI_ADDRCONFIG
+ #define AI_ADDRCONFIG 0
+ #endif
+ #ifndef AI_V4MAPPED
+ #define AI_V4MAPPED 0
+ #endif
+#endif
+
+
+#if defined(POCO_HAVE_SALEN)
+ #define poco_set_sa_len(pSA, len) (pSA)->sa_len = (len)
+ #define poco_set_sin_len(pSA) (pSA)->sin_len = sizeof(struct sockaddr_in)
+ #if defined(POCO_HAVE_IPv6)
+ #define poco_set_sin6_len(pSA) (pSA)->sin6_len = sizeof(struct sockaddr_in6)
+ #endif
+ #if defined(POCO_OS_FAMILY_UNIX)
+ #define poco_set_sun_len(pSA, len) (pSA)->sun_len = (len)
+ #endif
+#else
+ #define poco_set_sa_len(pSA, len) (void) 0
+ #define poco_set_sin_len(pSA) (void) 0
+ #define poco_set_sin6_len(pSA) (void) 0
+ #define poco_set_sun_len(pSA, len) (void) 0
+#endif
+
+
+#ifndef INADDR_NONE
+ #define INADDR_NONE 0xffffffff
+#endif
+
+#ifndef INADDR_ANY
+ #define INADDR_ANY 0x00000000
+#endif
+
+#ifndef INADDR_BROADCAST
+ #define INADDR_BROADCAST 0xffffffff
+#endif
+
+#ifndef INADDR_LOOPBACK
+ #define INADDR_LOOPBACK 0x7f000001
+#endif
+
+#ifndef INADDR_UNSPEC_GROUP
+ #define INADDR_UNSPEC_GROUP 0xe0000000
+#endif
+
+#ifndef INADDR_ALLHOSTS_GROUP
+ #define INADDR_ALLHOSTS_GROUP 0xe0000001
+#endif
+
+#ifndef INADDR_ALLRTRS_GROUP
+ #define INADDR_ALLRTRS_GROUP 0xe0000002
+#endif
+
+#ifndef INADDR_MAX_LOCAL_GROUP
+ #define INADDR_MAX_LOCAL_GROUP 0xe00000ff
+#endif
+
+#if defined(POCO_ARCH_BIG_ENDIAN)
+ #define poco_ntoh_16(x) (x)
+ #define poco_ntoh_32(x) (x)
+#else
+ #define poco_ntoh_16(x) \
+ ((((x) >> 8) & 0x00ff) | (((x) << 8) & 0xff00))
+ #define poco_ntoh_32(x) \
+ ((((x) >> 24) & 0x000000ff) | (((x) >> 8) & 0x0000ff00) | (((x) << 8) & 0x00ff0000) | (((x) << 24) & 0xff000000))
+#endif
+#define poco_hton_16(x) poco_ntoh_16(x)
+#define poco_hton_32(x) poco_ntoh_32(x)
+
+
+#if !defined(s6_addr16)
+ #if defined(POCO_OS_FAMILY_WINDOWS)
+ #define s6_addr16 u.Word
+ #else
+ #define s6_addr16 __u6_addr.__u6_addr16
+ #endif
+#endif
+
+
+#if !defined(s6_addr32)
+ #if defined(POCO_OS_FAMILY_UNIX)
+ #if (POCO_OS == POCO_OS_SOLARIS)
+ #define s6_addr32 _S6_un._S6_u32
+ #else
+ #define s6_addr32 __u6_addr.__u6_addr32
+ #endif
+ #endif
+#endif
+
+
+namespace Poco {
+namespace Net {
+
+
+struct AddressFamily
+ /// AddressFamily::Family replaces the previously used IPAddress::Family
+ /// enumeration and is now used for IPAddress::Family and SocketAddress::Family.
+{
+ enum Family
+ /// Possible address families for socket addresses.
+ {
+ IPv4,
+ /// IPv4 address family.
+ #if defined(POCO_HAVE_IPv6)
+ IPv6,
+ /// IPv6 address family.
+ #endif
+ #if defined(POCO_OS_FAMILY_UNIX)
+ UNIX_LOCAL
+ /// UNIX domain socket address family. Available on UNIX/POSIX platforms only.
+ #endif
+ };
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_SocketDefs_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/SocketImpl.h b/contrib/libs/poco/Net/include/Poco/Net/SocketImpl.h
index 4c51121bed..d1fec1de7d 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/SocketImpl.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/SocketImpl.h
@@ -1,503 +1,503 @@
-//
-// SocketImpl.h
-//
-// Library: Net
-// Package: Sockets
-// Module: SocketImpl
-//
-// Definition of the SocketImpl class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_SocketImpl_INCLUDED
-#define Net_SocketImpl_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/SocketDefs.h"
-#include "Poco/Net/SocketAddress.h"
-#include "Poco/RefCountedObject.h"
-#include "Poco/Timespan.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API SocketImpl: public Poco::RefCountedObject
- /// This class encapsulates the Berkeley sockets API.
- ///
- /// Subclasses implement specific socket types like
- /// stream or datagram sockets.
- ///
- /// You should not create any instances of this class.
-{
-public:
- enum SelectMode
- {
- SELECT_READ = 1,
- SELECT_WRITE = 2,
- SELECT_ERROR = 4
- };
-
- virtual SocketImpl* acceptConnection(SocketAddress& clientAddr);
- /// Get the next completed connection from the
- /// socket's completed connection queue.
- ///
- /// If the queue is empty, waits until a connection
- /// request completes.
- ///
- /// Returns a new TCP socket for the connection
- /// with the client.
- ///
- /// The client socket's address is returned in clientAddr.
-
- virtual void connect(const SocketAddress& address);
- /// Initializes the socket and establishes a connection to
- /// the TCP server at the given address.
- ///
- /// Can also be used for UDP sockets. In this case, no
- /// connection is established. Instead, incoming and outgoing
- /// packets are restricted to the specified address.
-
- virtual void connect(const SocketAddress& address, const Poco::Timespan& timeout);
- /// Initializes the socket, sets the socket timeout and
- /// establishes a connection to the TCP server at the given address.
-
- virtual void connectNB(const SocketAddress& address);
- /// Initializes the socket and establishes a connection to
- /// the TCP server at the given address. Prior to opening the
- /// connection the socket is set to nonblocking mode.
-
- virtual void bind(const SocketAddress& address, bool reuseAddress = false);
- /// Bind a local address to the socket.
- ///
- /// This is usually only done when establishing a server
- /// socket. TCP clients should not bind a socket to a
- /// specific address.
- ///
- /// If reuseAddress is true, sets the SO_REUSEADDR
- /// socket option.
-
- virtual void bind(const SocketAddress& address, bool reuseAddress, bool reusePort );
- /// Bind a local address to the socket.
- ///
- /// This is usually only done when establishing a server
- /// socket. TCP clients should not bind a socket to a
- /// specific address.
- ///
- /// If reuseAddress is true, sets the SO_REUSEADDR
- /// socket option.
- ///
- /// If reusePort is true, sets the SO_REUSEPORT
- /// socket option.
-
- virtual void bind6(const SocketAddress& address, bool reuseAddress = false, bool ipV6Only = false);
- /// Bind a local IPv6 address to the socket.
- ///
- /// This is usually only done when establishing a server
- /// socket. TCP clients should not bind a socket to a
- /// specific address.
- ///
- /// If reuseAddress is true, sets the SO_REUSEADDR
- /// socket option.
- ///
- /// The given address must be an IPv6 address. The
- /// IPPROTO_IPV6/IPV6_V6ONLY option is set on the socket
- /// according to the ipV6Only parameter.
- ///
- /// If the library has not been built with IPv6 support,
- /// a Poco::NotImplementedException will be thrown.
-
- virtual void bind6(const SocketAddress& address, bool reuseAddress, bool reusePort, bool ipV6Only);
- /// Bind a local IPv6 address to the socket.
- ///
- /// This is usually only done when establishing a server
- /// socket. TCP clients should not bind a socket to a
- /// specific address.
- ///
- /// If reuseAddress is true, sets the SO_REUSEADDR
- /// socket option.
- ///
- /// If reusePort is true, sets the SO_REUSEPORT
- /// socket option.
- ///
- /// The given address must be an IPv6 address. The
- /// IPPROTO_IPV6/IPV6_V6ONLY option is set on the socket
- /// according to the ipV6Only parameter.
- ///
- /// If the library has not been built with IPv6 support,
- /// a Poco::NotImplementedException will be thrown.
-
- virtual void listen(int backlog = 64);
- /// Puts the socket into listening state.
- ///
- /// The socket becomes a passive socket that
- /// can accept incoming connection requests.
- ///
- /// The backlog argument specifies the maximum
- /// number of connections that can be queued
- /// for this socket.
-
- virtual void close();
- /// Close the socket.
-
- virtual void shutdownReceive();
- /// Shuts down the receiving part of the socket connection.
-
- virtual void shutdownSend();
- /// Shuts down the sending part of the socket connection.
-
- virtual void shutdown();
- /// Shuts down both the receiving and the sending part
- /// of the socket connection.
-
- virtual int sendBytes(const void* buffer, int length, int flags = 0);
- /// Sends the contents of the given buffer through
- /// the socket.
- ///
- /// Returns the number of bytes sent, which may be
- /// less than the number of bytes specified.
- ///
- /// Certain socket implementations may also return a negative
- /// value denoting a certain condition.
-
- virtual int receiveBytes(void* buffer, int length, int flags = 0);
- /// Receives data from the socket and stores it
- /// in buffer. Up to length bytes are received.
- ///
- /// Returns the number of bytes received.
- ///
- /// Certain socket implementations may also return a negative
- /// value denoting a certain condition.
-
- virtual int sendTo(const void* buffer, int length, const SocketAddress& address, int flags = 0);
- /// Sends the contents of the given buffer through
- /// the socket to the given address.
- ///
- /// Returns the number of bytes sent, which may be
- /// less than the number of bytes specified.
-
- virtual int receiveFrom(void* buffer, int length, SocketAddress& address, int flags = 0);
- /// Receives data from the socket and stores it
- /// in buffer. Up to length bytes are received.
- /// Stores the address of the sender in address.
- ///
- /// Returns the number of bytes received.
-
- virtual void sendUrgent(unsigned char data);
- /// Sends one byte of urgent data through
- /// the socket.
- ///
- /// The data is sent with the MSG_OOB flag.
- ///
- /// The preferred way for a socket to receive urgent data
- /// is by enabling the SO_OOBINLINE option.
-
- virtual int available();
- /// Returns the number of bytes available that can be read
- /// without causing the socket to block.
-
- virtual bool poll(const Poco::Timespan& timeout, int mode);
- /// Determines the status of the socket, using a
- /// call to select().
- ///
- /// The mode argument is constructed by combining the values
- /// of the SelectMode enumeration.
- ///
- /// Returns true if the next operation corresponding to
- /// mode will not block, false otherwise.
-
+//
+// SocketImpl.h
+//
+// Library: Net
+// Package: Sockets
+// Module: SocketImpl
+//
+// Definition of the SocketImpl class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_SocketImpl_INCLUDED
+#define Net_SocketImpl_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/SocketDefs.h"
+#include "Poco/Net/SocketAddress.h"
+#include "Poco/RefCountedObject.h"
+#include "Poco/Timespan.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API SocketImpl: public Poco::RefCountedObject
+ /// This class encapsulates the Berkeley sockets API.
+ ///
+ /// Subclasses implement specific socket types like
+ /// stream or datagram sockets.
+ ///
+ /// You should not create any instances of this class.
+{
+public:
+ enum SelectMode
+ {
+ SELECT_READ = 1,
+ SELECT_WRITE = 2,
+ SELECT_ERROR = 4
+ };
+
+ virtual SocketImpl* acceptConnection(SocketAddress& clientAddr);
+ /// Get the next completed connection from the
+ /// socket's completed connection queue.
+ ///
+ /// If the queue is empty, waits until a connection
+ /// request completes.
+ ///
+ /// Returns a new TCP socket for the connection
+ /// with the client.
+ ///
+ /// The client socket's address is returned in clientAddr.
+
+ virtual void connect(const SocketAddress& address);
+ /// Initializes the socket and establishes a connection to
+ /// the TCP server at the given address.
+ ///
+ /// Can also be used for UDP sockets. In this case, no
+ /// connection is established. Instead, incoming and outgoing
+ /// packets are restricted to the specified address.
+
+ virtual void connect(const SocketAddress& address, const Poco::Timespan& timeout);
+ /// Initializes the socket, sets the socket timeout and
+ /// establishes a connection to the TCP server at the given address.
+
+ virtual void connectNB(const SocketAddress& address);
+ /// Initializes the socket and establishes a connection to
+ /// the TCP server at the given address. Prior to opening the
+ /// connection the socket is set to nonblocking mode.
+
+ virtual void bind(const SocketAddress& address, bool reuseAddress = false);
+ /// Bind a local address to the socket.
+ ///
+ /// This is usually only done when establishing a server
+ /// socket. TCP clients should not bind a socket to a
+ /// specific address.
+ ///
+ /// If reuseAddress is true, sets the SO_REUSEADDR
+ /// socket option.
+
+ virtual void bind(const SocketAddress& address, bool reuseAddress, bool reusePort );
+ /// Bind a local address to the socket.
+ ///
+ /// This is usually only done when establishing a server
+ /// socket. TCP clients should not bind a socket to a
+ /// specific address.
+ ///
+ /// If reuseAddress is true, sets the SO_REUSEADDR
+ /// socket option.
+ ///
+ /// If reusePort is true, sets the SO_REUSEPORT
+ /// socket option.
+
+ virtual void bind6(const SocketAddress& address, bool reuseAddress = false, bool ipV6Only = false);
+ /// Bind a local IPv6 address to the socket.
+ ///
+ /// This is usually only done when establishing a server
+ /// socket. TCP clients should not bind a socket to a
+ /// specific address.
+ ///
+ /// If reuseAddress is true, sets the SO_REUSEADDR
+ /// socket option.
+ ///
+ /// The given address must be an IPv6 address. The
+ /// IPPROTO_IPV6/IPV6_V6ONLY option is set on the socket
+ /// according to the ipV6Only parameter.
+ ///
+ /// If the library has not been built with IPv6 support,
+ /// a Poco::NotImplementedException will be thrown.
+
+ virtual void bind6(const SocketAddress& address, bool reuseAddress, bool reusePort, bool ipV6Only);
+ /// Bind a local IPv6 address to the socket.
+ ///
+ /// This is usually only done when establishing a server
+ /// socket. TCP clients should not bind a socket to a
+ /// specific address.
+ ///
+ /// If reuseAddress is true, sets the SO_REUSEADDR
+ /// socket option.
+ ///
+ /// If reusePort is true, sets the SO_REUSEPORT
+ /// socket option.
+ ///
+ /// The given address must be an IPv6 address. The
+ /// IPPROTO_IPV6/IPV6_V6ONLY option is set on the socket
+ /// according to the ipV6Only parameter.
+ ///
+ /// If the library has not been built with IPv6 support,
+ /// a Poco::NotImplementedException will be thrown.
+
+ virtual void listen(int backlog = 64);
+ /// Puts the socket into listening state.
+ ///
+ /// The socket becomes a passive socket that
+ /// can accept incoming connection requests.
+ ///
+ /// The backlog argument specifies the maximum
+ /// number of connections that can be queued
+ /// for this socket.
+
+ virtual void close();
+ /// Close the socket.
+
+ virtual void shutdownReceive();
+ /// Shuts down the receiving part of the socket connection.
+
+ virtual void shutdownSend();
+ /// Shuts down the sending part of the socket connection.
+
+ virtual void shutdown();
+ /// Shuts down both the receiving and the sending part
+ /// of the socket connection.
+
+ virtual int sendBytes(const void* buffer, int length, int flags = 0);
+ /// Sends the contents of the given buffer through
+ /// the socket.
+ ///
+ /// Returns the number of bytes sent, which may be
+ /// less than the number of bytes specified.
+ ///
+ /// Certain socket implementations may also return a negative
+ /// value denoting a certain condition.
+
+ virtual int receiveBytes(void* buffer, int length, int flags = 0);
+ /// Receives data from the socket and stores it
+ /// in buffer. Up to length bytes are received.
+ ///
+ /// Returns the number of bytes received.
+ ///
+ /// Certain socket implementations may also return a negative
+ /// value denoting a certain condition.
+
+ virtual int sendTo(const void* buffer, int length, const SocketAddress& address, int flags = 0);
+ /// Sends the contents of the given buffer through
+ /// the socket to the given address.
+ ///
+ /// Returns the number of bytes sent, which may be
+ /// less than the number of bytes specified.
+
+ virtual int receiveFrom(void* buffer, int length, SocketAddress& address, int flags = 0);
+ /// Receives data from the socket and stores it
+ /// in buffer. Up to length bytes are received.
+ /// Stores the address of the sender in address.
+ ///
+ /// Returns the number of bytes received.
+
+ virtual void sendUrgent(unsigned char data);
+ /// Sends one byte of urgent data through
+ /// the socket.
+ ///
+ /// The data is sent with the MSG_OOB flag.
+ ///
+ /// The preferred way for a socket to receive urgent data
+ /// is by enabling the SO_OOBINLINE option.
+
+ virtual int available();
+ /// Returns the number of bytes available that can be read
+ /// without causing the socket to block.
+
+ virtual bool poll(const Poco::Timespan& timeout, int mode);
+ /// Determines the status of the socket, using a
+ /// call to select().
+ ///
+ /// The mode argument is constructed by combining the values
+ /// of the SelectMode enumeration.
+ ///
+ /// Returns true if the next operation corresponding to
+ /// mode will not block, false otherwise.
+
bool pollImpl(Poco::Timespan& timeout, int mode);
/// Modifies `timeout`
- virtual void setSendBufferSize(int size);
- /// Sets the size of the send buffer.
-
- virtual int getSendBufferSize();
- /// Returns the size of the send buffer.
- ///
- /// The returned value may be different than the
- /// value previously set with setSendBufferSize(),
- /// as the system is free to adjust the value.
-
- virtual void setReceiveBufferSize(int size);
- /// Sets the size of the receive buffer.
-
- virtual int getReceiveBufferSize();
- /// Returns the size of the receive buffer.
- ///
- /// The returned value may be different than the
- /// value previously set with setReceiveBufferSize(),
- /// as the system is free to adjust the value.
-
- virtual void setSendTimeout(const Poco::Timespan& timeout);
- /// Sets the send timeout for the socket.
-
- virtual Poco::Timespan getSendTimeout();
- /// Returns the send timeout for the socket.
- ///
- /// The returned timeout may be different than the
- /// timeout previously set with setSendTimeout(),
- /// as the system is free to adjust the value.
-
- virtual void setReceiveTimeout(const Poco::Timespan& timeout);
- /// Sets the send timeout for the socket.
- ///
- /// On systems that do not support SO_RCVTIMEO, a
- /// workaround using poll() is provided.
-
- virtual Poco::Timespan getReceiveTimeout();
- /// Returns the receive timeout for the socket.
- ///
- /// The returned timeout may be different than the
- /// timeout previously set with setReceiveTimeout(),
- /// as the system is free to adjust the value.
-
- virtual SocketAddress address();
- /// Returns the IP address and port number of the socket.
-
- virtual SocketAddress peerAddress();
- /// Returns the IP address and port number of the peer socket.
-
- void setOption(int level, int option, int value);
- /// Sets the socket option specified by level and option
- /// to the given integer value.
-
- void setOption(int level, int option, unsigned value);
- /// Sets the socket option specified by level and option
- /// to the given integer value.
-
- void setOption(int level, int option, unsigned char value);
- /// Sets the socket option specified by level and option
- /// to the given integer value.
-
- void setOption(int level, int option, const Poco::Timespan& value);
- /// Sets the socket option specified by level and option
- /// to the given time value.
-
- void setOption(int level, int option, const IPAddress& value);
- /// Sets the socket option specified by level and option
- /// to the given time value.
-
- virtual void setRawOption(int level, int option, const void* value, poco_socklen_t length);
- /// Sets the socket option specified by level and option
- /// to the given time value.
-
- void getOption(int level, int option, int& value);
- /// Returns the value of the socket option
- /// specified by level and option.
-
- void getOption(int level, int option, unsigned& value);
- /// Returns the value of the socket option
- /// specified by level and option.
-
- void getOption(int level, int option, unsigned char& value);
- /// Returns the value of the socket option
- /// specified by level and option.
-
- void getOption(int level, int option, Poco::Timespan& value);
- /// Returns the value of the socket option
- /// specified by level and option.
-
- void getOption(int level, int option, IPAddress& value);
- /// Returns the value of the socket option
- /// specified by level and option.
-
- virtual void getRawOption(int level, int option, void* value, poco_socklen_t& length);
- /// Returns the value of the socket option
- /// specified by level and option.
-
- void setLinger(bool on, int seconds);
- /// Sets the value of the SO_LINGER socket option.
-
- void getLinger(bool& on, int& seconds);
- /// Returns the value of the SO_LINGER socket option.
-
- void setNoDelay(bool flag);
- /// Sets the value of the TCP_NODELAY socket option.
-
- bool getNoDelay();
- /// Returns the value of the TCP_NODELAY socket option.
-
- void setKeepAlive(bool flag);
- /// Sets the value of the SO_KEEPALIVE socket option.
-
- bool getKeepAlive();
- /// Returns the value of the SO_KEEPALIVE socket option.
-
- void setReuseAddress(bool flag);
- /// Sets the value of the SO_REUSEADDR socket option.
-
- bool getReuseAddress();
- /// Returns the value of the SO_REUSEADDR socket option.
-
- void setReusePort(bool flag);
- /// Sets the value of the SO_REUSEPORT socket option.
- /// Does nothing if the socket implementation does not
- /// support SO_REUSEPORT.
-
- bool getReusePort();
- /// Returns the value of the SO_REUSEPORT socket option.
- ///
- /// Returns false if the socket implementation does not
- /// support SO_REUSEPORT.
-
- void setOOBInline(bool flag);
- /// Sets the value of the SO_OOBINLINE socket option.
-
- bool getOOBInline();
- /// Returns the value of the SO_OOBINLINE socket option.
-
- void setBroadcast(bool flag);
- /// Sets the value of the SO_BROADCAST socket option.
-
- bool getBroadcast();
- /// Returns the value of the SO_BROADCAST socket option.
-
- virtual void setBlocking(bool flag);
- /// Sets the socket in blocking mode if flag is true,
- /// disables blocking mode if flag is false.
-
- virtual bool getBlocking() const;
- /// Returns the blocking mode of the socket.
- /// This method will only work if the blocking modes of
- /// the socket are changed via the setBlocking method!
-
- virtual bool secure() const;
- /// Returns true iff the socket's connection is secure
- /// (using SSL or TLS).
-
- int socketError();
- /// Returns the value of the SO_ERROR socket option.
-
- poco_socket_t sockfd() const;
- /// Returns the socket descriptor for the
- /// underlying native socket.
-
- void ioctl(poco_ioctl_request_t request, int& arg);
- /// A wrapper for the ioctl system call.
-
- void ioctl(poco_ioctl_request_t request, void* arg);
- /// A wrapper for the ioctl system call.
-
-#if defined(POCO_OS_FAMILY_UNIX)
- int fcntl(poco_fcntl_request_t request);
- /// A wrapper for the fcntl system call.
-
- int fcntl(poco_fcntl_request_t request, long arg);
- /// A wrapper for the fcntl system call.
-#endif
-
- bool initialized() const;
- /// Returns true iff the underlying socket is initialized.
-
-protected:
- SocketImpl();
- /// Creates a SocketImpl.
-
- SocketImpl(poco_socket_t sockfd);
- /// Creates a SocketImpl using the given native socket.
-
- virtual ~SocketImpl();
- /// Destroys the SocketImpl.
- /// Closes the socket if it is still open.
-
- virtual void init(int af);
- /// Creates the underlying native socket.
- ///
- /// Subclasses must implement this method so
- /// that it calls initSocket() with the
- /// appropriate arguments.
- ///
- /// The default implementation creates a
- /// stream socket.
-
- void initSocket(int af, int type, int proto = 0);
- /// Creates the underlying native socket.
- ///
- /// The first argument, af, specifies the address family
- /// used by the socket, which should be either AF_INET or
- /// AF_INET6.
- ///
- /// The second argument, type, specifies the type of the
- /// socket, which can be one of SOCK_STREAM, SOCK_DGRAM
- /// or SOCK_RAW.
- ///
- /// The third argument, proto, is normally set to 0,
- /// except for raw sockets.
-
- void reset(poco_socket_t fd = POCO_INVALID_SOCKET);
- /// Allows subclasses to set the socket manually, iff no valid socket is set yet.
-
- static int lastError();
- /// Returns the last error code.
-
- static void error();
- /// Throws an appropriate exception for the last error.
-
- static void error(const std::string& arg);
- /// Throws an appropriate exception for the last error.
-
- static void error(int code);
- /// Throws an appropriate exception for the given error code.
-
- static void error(int code, const std::string& arg);
- /// Throws an appropriate exception for the given error code.
-
+ virtual void setSendBufferSize(int size);
+ /// Sets the size of the send buffer.
+
+ virtual int getSendBufferSize();
+ /// Returns the size of the send buffer.
+ ///
+ /// The returned value may be different than the
+ /// value previously set with setSendBufferSize(),
+ /// as the system is free to adjust the value.
+
+ virtual void setReceiveBufferSize(int size);
+ /// Sets the size of the receive buffer.
+
+ virtual int getReceiveBufferSize();
+ /// Returns the size of the receive buffer.
+ ///
+ /// The returned value may be different than the
+ /// value previously set with setReceiveBufferSize(),
+ /// as the system is free to adjust the value.
+
+ virtual void setSendTimeout(const Poco::Timespan& timeout);
+ /// Sets the send timeout for the socket.
+
+ virtual Poco::Timespan getSendTimeout();
+ /// Returns the send timeout for the socket.
+ ///
+ /// The returned timeout may be different than the
+ /// timeout previously set with setSendTimeout(),
+ /// as the system is free to adjust the value.
+
+ virtual void setReceiveTimeout(const Poco::Timespan& timeout);
+ /// Sets the send timeout for the socket.
+ ///
+ /// On systems that do not support SO_RCVTIMEO, a
+ /// workaround using poll() is provided.
+
+ virtual Poco::Timespan getReceiveTimeout();
+ /// Returns the receive timeout for the socket.
+ ///
+ /// The returned timeout may be different than the
+ /// timeout previously set with setReceiveTimeout(),
+ /// as the system is free to adjust the value.
+
+ virtual SocketAddress address();
+ /// Returns the IP address and port number of the socket.
+
+ virtual SocketAddress peerAddress();
+ /// Returns the IP address and port number of the peer socket.
+
+ void setOption(int level, int option, int value);
+ /// Sets the socket option specified by level and option
+ /// to the given integer value.
+
+ void setOption(int level, int option, unsigned value);
+ /// Sets the socket option specified by level and option
+ /// to the given integer value.
+
+ void setOption(int level, int option, unsigned char value);
+ /// Sets the socket option specified by level and option
+ /// to the given integer value.
+
+ void setOption(int level, int option, const Poco::Timespan& value);
+ /// Sets the socket option specified by level and option
+ /// to the given time value.
+
+ void setOption(int level, int option, const IPAddress& value);
+ /// Sets the socket option specified by level and option
+ /// to the given time value.
+
+ virtual void setRawOption(int level, int option, const void* value, poco_socklen_t length);
+ /// Sets the socket option specified by level and option
+ /// to the given time value.
+
+ void getOption(int level, int option, int& value);
+ /// Returns the value of the socket option
+ /// specified by level and option.
+
+ void getOption(int level, int option, unsigned& value);
+ /// Returns the value of the socket option
+ /// specified by level and option.
+
+ void getOption(int level, int option, unsigned char& value);
+ /// Returns the value of the socket option
+ /// specified by level and option.
+
+ void getOption(int level, int option, Poco::Timespan& value);
+ /// Returns the value of the socket option
+ /// specified by level and option.
+
+ void getOption(int level, int option, IPAddress& value);
+ /// Returns the value of the socket option
+ /// specified by level and option.
+
+ virtual void getRawOption(int level, int option, void* value, poco_socklen_t& length);
+ /// Returns the value of the socket option
+ /// specified by level and option.
+
+ void setLinger(bool on, int seconds);
+ /// Sets the value of the SO_LINGER socket option.
+
+ void getLinger(bool& on, int& seconds);
+ /// Returns the value of the SO_LINGER socket option.
+
+ void setNoDelay(bool flag);
+ /// Sets the value of the TCP_NODELAY socket option.
+
+ bool getNoDelay();
+ /// Returns the value of the TCP_NODELAY socket option.
+
+ void setKeepAlive(bool flag);
+ /// Sets the value of the SO_KEEPALIVE socket option.
+
+ bool getKeepAlive();
+ /// Returns the value of the SO_KEEPALIVE socket option.
+
+ void setReuseAddress(bool flag);
+ /// Sets the value of the SO_REUSEADDR socket option.
+
+ bool getReuseAddress();
+ /// Returns the value of the SO_REUSEADDR socket option.
+
+ void setReusePort(bool flag);
+ /// Sets the value of the SO_REUSEPORT socket option.
+ /// Does nothing if the socket implementation does not
+ /// support SO_REUSEPORT.
+
+ bool getReusePort();
+ /// Returns the value of the SO_REUSEPORT socket option.
+ ///
+ /// Returns false if the socket implementation does not
+ /// support SO_REUSEPORT.
+
+ void setOOBInline(bool flag);
+ /// Sets the value of the SO_OOBINLINE socket option.
+
+ bool getOOBInline();
+ /// Returns the value of the SO_OOBINLINE socket option.
+
+ void setBroadcast(bool flag);
+ /// Sets the value of the SO_BROADCAST socket option.
+
+ bool getBroadcast();
+ /// Returns the value of the SO_BROADCAST socket option.
+
+ virtual void setBlocking(bool flag);
+ /// Sets the socket in blocking mode if flag is true,
+ /// disables blocking mode if flag is false.
+
+ virtual bool getBlocking() const;
+ /// Returns the blocking mode of the socket.
+ /// This method will only work if the blocking modes of
+ /// the socket are changed via the setBlocking method!
+
+ virtual bool secure() const;
+ /// Returns true iff the socket's connection is secure
+ /// (using SSL or TLS).
+
+ int socketError();
+ /// Returns the value of the SO_ERROR socket option.
+
+ poco_socket_t sockfd() const;
+ /// Returns the socket descriptor for the
+ /// underlying native socket.
+
+ void ioctl(poco_ioctl_request_t request, int& arg);
+ /// A wrapper for the ioctl system call.
+
+ void ioctl(poco_ioctl_request_t request, void* arg);
+ /// A wrapper for the ioctl system call.
+
+#if defined(POCO_OS_FAMILY_UNIX)
+ int fcntl(poco_fcntl_request_t request);
+ /// A wrapper for the fcntl system call.
+
+ int fcntl(poco_fcntl_request_t request, long arg);
+ /// A wrapper for the fcntl system call.
+#endif
+
+ bool initialized() const;
+ /// Returns true iff the underlying socket is initialized.
+
+protected:
+ SocketImpl();
+ /// Creates a SocketImpl.
+
+ SocketImpl(poco_socket_t sockfd);
+ /// Creates a SocketImpl using the given native socket.
+
+ virtual ~SocketImpl();
+ /// Destroys the SocketImpl.
+ /// Closes the socket if it is still open.
+
+ virtual void init(int af);
+ /// Creates the underlying native socket.
+ ///
+ /// Subclasses must implement this method so
+ /// that it calls initSocket() with the
+ /// appropriate arguments.
+ ///
+ /// The default implementation creates a
+ /// stream socket.
+
+ void initSocket(int af, int type, int proto = 0);
+ /// Creates the underlying native socket.
+ ///
+ /// The first argument, af, specifies the address family
+ /// used by the socket, which should be either AF_INET or
+ /// AF_INET6.
+ ///
+ /// The second argument, type, specifies the type of the
+ /// socket, which can be one of SOCK_STREAM, SOCK_DGRAM
+ /// or SOCK_RAW.
+ ///
+ /// The third argument, proto, is normally set to 0,
+ /// except for raw sockets.
+
+ void reset(poco_socket_t fd = POCO_INVALID_SOCKET);
+ /// Allows subclasses to set the socket manually, iff no valid socket is set yet.
+
+ static int lastError();
+ /// Returns the last error code.
+
+ static void error();
+ /// Throws an appropriate exception for the last error.
+
+ static void error(const std::string& arg);
+ /// Throws an appropriate exception for the last error.
+
+ static void error(int code);
+ /// Throws an appropriate exception for the given error code.
+
+ static void error(int code, const std::string& arg);
+ /// Throws an appropriate exception for the given error code.
+
protected:
- SocketImpl(const SocketImpl&);
- SocketImpl& operator = (const SocketImpl&);
-
- poco_socket_t _sockfd;
- Poco::Timespan _recvTimeout;
- Poco::Timespan _sndTimeout;
- bool _blocking;
- bool _isBrokenTimeout;
-
- friend class Socket;
- friend class SecureSocketImpl;
- friend class PollSetImpl;
-};
-
-
-//
-// inlines
-//
-inline poco_socket_t SocketImpl::sockfd() const
-{
- return _sockfd;
-}
-
-
-inline bool SocketImpl::initialized() const
-{
- return _sockfd != POCO_INVALID_SOCKET;
-}
-
-
-inline int SocketImpl::lastError()
-{
-#if defined(_WIN32)
- return WSAGetLastError();
-#else
- return errno;
-#endif
-}
-
-
-inline bool SocketImpl::getBlocking() const
-{
- return _blocking;
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_SocketImpl_INCLUDED
+ SocketImpl(const SocketImpl&);
+ SocketImpl& operator = (const SocketImpl&);
+
+ poco_socket_t _sockfd;
+ Poco::Timespan _recvTimeout;
+ Poco::Timespan _sndTimeout;
+ bool _blocking;
+ bool _isBrokenTimeout;
+
+ friend class Socket;
+ friend class SecureSocketImpl;
+ friend class PollSetImpl;
+};
+
+
+//
+// inlines
+//
+inline poco_socket_t SocketImpl::sockfd() const
+{
+ return _sockfd;
+}
+
+
+inline bool SocketImpl::initialized() const
+{
+ return _sockfd != POCO_INVALID_SOCKET;
+}
+
+
+inline int SocketImpl::lastError()
+{
+#if defined(_WIN32)
+ return WSAGetLastError();
+#else
+ return errno;
+#endif
+}
+
+
+inline bool SocketImpl::getBlocking() const
+{
+ return _blocking;
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_SocketImpl_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/SocketNotification.h b/contrib/libs/poco/Net/include/Poco/Net/SocketNotification.h
index 7934dffaab..7b857ecfe8 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/SocketNotification.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/SocketNotification.h
@@ -1,153 +1,153 @@
-//
-// SocketNotification.h
-//
-// Library: Net
-// Package: Reactor
-// Module: SocketNotification
-//
-// Definition of the SocketNotification class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_SocketNotification_INCLUDED
-#define Net_SocketNotification_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/Socket.h"
-#include "Poco/Notification.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class SocketReactor;
-
-
-class Net_API SocketNotification: public Poco::Notification
- /// The base class for all notifications generated by
- /// the SocketReactor.
-{
-public:
- explicit SocketNotification(SocketReactor* pReactor);
- /// Creates the SocketNotification for the given SocketReactor.
-
- virtual ~SocketNotification();
- /// Destroys the SocketNotification.
-
- SocketReactor& source() const;
- /// Returns the SocketReactor that generated the notification.
-
- Socket socket() const;
- /// Returns the socket that caused the notification.
-
-private:
- void setSocket(const Socket& socket);
-
- SocketReactor* _pReactor;
- Socket _socket;
-
- friend class SocketNotifier;
-};
-
-
-class Net_API ReadableNotification: public SocketNotification
- /// This notification is sent if a socket has become readable.
-{
-public:
- ReadableNotification(SocketReactor* pReactor);
- /// Creates the ReadableNotification for the given SocketReactor.
-
- ~ReadableNotification();
- /// Destroys the ReadableNotification.
-};
-
-
-class Net_API WritableNotification: public SocketNotification
- /// This notification is sent if a socket has become writable.
-{
-public:
- WritableNotification(SocketReactor* pReactor);
- /// Creates the WritableNotification for the given SocketReactor.
-
- ~WritableNotification();
- /// Destroys the WritableNotification.
-};
-
-
-class Net_API ErrorNotification: public SocketNotification
- /// This notification is sent if a socket has signalled an error.
-{
-public:
- ErrorNotification(SocketReactor* pReactor);
- /// Creates the ErrorNotification for the given SocketReactor.
-
- ~ErrorNotification();
- /// Destroys the ErrorNotification.
-};
-
-
-class Net_API TimeoutNotification: public SocketNotification
- /// This notification is sent if no other event has occurred
- /// for a specified time.
-{
-public:
- TimeoutNotification(SocketReactor* pReactor);
- /// Creates the TimeoutNotification for the given SocketReactor.
-
- ~TimeoutNotification();
- /// Destroys the TimeoutNotification.
-};
-
-
-class Net_API IdleNotification: public SocketNotification
- /// This notification is sent when the SocketReactor does
- /// not have any sockets to react to.
-{
-public:
- IdleNotification(SocketReactor* pReactor);
- /// Creates the IdleNotification for the given SocketReactor.
-
- ~IdleNotification();
- /// Destroys the IdleNotification.
-};
-
-
-class Net_API ShutdownNotification: public SocketNotification
- /// This notification is sent when the SocketReactor is
- /// about to shut down.
-{
-public:
- ShutdownNotification(SocketReactor* pReactor);
- /// Creates the ShutdownNotification for the given SocketReactor.
-
- ~ShutdownNotification();
- /// Destroys the ShutdownNotification.
-};
-
-
-//
-// inlines
-//
-inline SocketReactor& SocketNotification::source() const
-{
- return *_pReactor;
-}
-
-
-inline Socket SocketNotification::socket() const
-{
- return _socket;
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_SocketNotification_INCLUDED
+//
+// SocketNotification.h
+//
+// Library: Net
+// Package: Reactor
+// Module: SocketNotification
+//
+// Definition of the SocketNotification class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_SocketNotification_INCLUDED
+#define Net_SocketNotification_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/Socket.h"
+#include "Poco/Notification.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class SocketReactor;
+
+
+class Net_API SocketNotification: public Poco::Notification
+ /// The base class for all notifications generated by
+ /// the SocketReactor.
+{
+public:
+ explicit SocketNotification(SocketReactor* pReactor);
+ /// Creates the SocketNotification for the given SocketReactor.
+
+ virtual ~SocketNotification();
+ /// Destroys the SocketNotification.
+
+ SocketReactor& source() const;
+ /// Returns the SocketReactor that generated the notification.
+
+ Socket socket() const;
+ /// Returns the socket that caused the notification.
+
+private:
+ void setSocket(const Socket& socket);
+
+ SocketReactor* _pReactor;
+ Socket _socket;
+
+ friend class SocketNotifier;
+};
+
+
+class Net_API ReadableNotification: public SocketNotification
+ /// This notification is sent if a socket has become readable.
+{
+public:
+ ReadableNotification(SocketReactor* pReactor);
+ /// Creates the ReadableNotification for the given SocketReactor.
+
+ ~ReadableNotification();
+ /// Destroys the ReadableNotification.
+};
+
+
+class Net_API WritableNotification: public SocketNotification
+ /// This notification is sent if a socket has become writable.
+{
+public:
+ WritableNotification(SocketReactor* pReactor);
+ /// Creates the WritableNotification for the given SocketReactor.
+
+ ~WritableNotification();
+ /// Destroys the WritableNotification.
+};
+
+
+class Net_API ErrorNotification: public SocketNotification
+ /// This notification is sent if a socket has signalled an error.
+{
+public:
+ ErrorNotification(SocketReactor* pReactor);
+ /// Creates the ErrorNotification for the given SocketReactor.
+
+ ~ErrorNotification();
+ /// Destroys the ErrorNotification.
+};
+
+
+class Net_API TimeoutNotification: public SocketNotification
+ /// This notification is sent if no other event has occurred
+ /// for a specified time.
+{
+public:
+ TimeoutNotification(SocketReactor* pReactor);
+ /// Creates the TimeoutNotification for the given SocketReactor.
+
+ ~TimeoutNotification();
+ /// Destroys the TimeoutNotification.
+};
+
+
+class Net_API IdleNotification: public SocketNotification
+ /// This notification is sent when the SocketReactor does
+ /// not have any sockets to react to.
+{
+public:
+ IdleNotification(SocketReactor* pReactor);
+ /// Creates the IdleNotification for the given SocketReactor.
+
+ ~IdleNotification();
+ /// Destroys the IdleNotification.
+};
+
+
+class Net_API ShutdownNotification: public SocketNotification
+ /// This notification is sent when the SocketReactor is
+ /// about to shut down.
+{
+public:
+ ShutdownNotification(SocketReactor* pReactor);
+ /// Creates the ShutdownNotification for the given SocketReactor.
+
+ ~ShutdownNotification();
+ /// Destroys the ShutdownNotification.
+};
+
+
+//
+// inlines
+//
+inline SocketReactor& SocketNotification::source() const
+{
+ return *_pReactor;
+}
+
+
+inline Socket SocketNotification::socket() const
+{
+ return _socket;
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_SocketNotification_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/SocketNotifier.h b/contrib/libs/poco/Net/include/Poco/Net/SocketNotifier.h
index 7a14fa1add..a98e407a3d 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/SocketNotifier.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/SocketNotifier.h
@@ -1,110 +1,110 @@
-//
-// SocketNotifier.h
-//
-// Library: Net
-// Package: Reactor
-// Module: SocketNotifier
-//
-// Definition of the SocketNotifier class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_SocketNotifier_INCLUDED
-#define Net_SocketNotifier_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/Socket.h"
-#include "Poco/RefCountedObject.h"
-#include "Poco/NotificationCenter.h"
-#include "Poco/Observer.h"
-#include <set>
-
-
-namespace Poco {
-namespace Net {
-
-
-class Socket;
-class SocketReactor;
-class SocketNotification;
-
-
-class Net_API SocketNotifier: public Poco::RefCountedObject
- /// This class is used internally by SocketReactor
- /// to notify registered event handlers of socket events.
-{
-public:
- explicit SocketNotifier(const Socket& socket);
- /// Creates the SocketNotifier for the given socket.
-
- void addObserver(SocketReactor* pReactor, const Poco::AbstractObserver& observer);
- /// Adds the given observer.
-
- void removeObserver(SocketReactor* pReactor, const Poco::AbstractObserver& observer);
- /// Removes the given observer.
-
- bool hasObserver(const Poco::AbstractObserver& observer) const;
- /// Returns true if the given observer is registered.
-
- bool accepts(SocketNotification* pNotification);
- /// Returns true if there is at least one observer for the given notification.
-
- void dispatch(SocketNotification* pNotification);
- /// Dispatches the notification to all observers.
-
- bool hasObservers() const;
- /// Returns true if there are subscribers.
-
- std::size_t countObservers() const;
- /// Returns the number of subscribers;
-
-protected:
- ~SocketNotifier();
- /// Destroys the SocketNotifier.
-
-private:
- typedef std::multiset<SocketNotification*> EventSet;
-
- EventSet _events;
- Poco::NotificationCenter _nc;
- Socket _socket;
-};
-
-
-//
-// inlines
-//
-inline bool SocketNotifier::accepts(SocketNotification* pNotification)
-{
- return _events.find(pNotification) != _events.end();
-}
-
-
-inline bool SocketNotifier::hasObserver(const Poco::AbstractObserver& observer) const
-{
- return _nc.hasObserver(observer);
-}
-
-
-inline bool SocketNotifier::hasObservers() const
-{
- return _nc.hasObservers();
-}
-
-
-inline std::size_t SocketNotifier::countObservers() const
-{
- return _nc.countObservers();
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_SocketNotifier_INCLUDED
+//
+// SocketNotifier.h
+//
+// Library: Net
+// Package: Reactor
+// Module: SocketNotifier
+//
+// Definition of the SocketNotifier class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_SocketNotifier_INCLUDED
+#define Net_SocketNotifier_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/Socket.h"
+#include "Poco/RefCountedObject.h"
+#include "Poco/NotificationCenter.h"
+#include "Poco/Observer.h"
+#include <set>
+
+
+namespace Poco {
+namespace Net {
+
+
+class Socket;
+class SocketReactor;
+class SocketNotification;
+
+
+class Net_API SocketNotifier: public Poco::RefCountedObject
+ /// This class is used internally by SocketReactor
+ /// to notify registered event handlers of socket events.
+{
+public:
+ explicit SocketNotifier(const Socket& socket);
+ /// Creates the SocketNotifier for the given socket.
+
+ void addObserver(SocketReactor* pReactor, const Poco::AbstractObserver& observer);
+ /// Adds the given observer.
+
+ void removeObserver(SocketReactor* pReactor, const Poco::AbstractObserver& observer);
+ /// Removes the given observer.
+
+ bool hasObserver(const Poco::AbstractObserver& observer) const;
+ /// Returns true if the given observer is registered.
+
+ bool accepts(SocketNotification* pNotification);
+ /// Returns true if there is at least one observer for the given notification.
+
+ void dispatch(SocketNotification* pNotification);
+ /// Dispatches the notification to all observers.
+
+ bool hasObservers() const;
+ /// Returns true if there are subscribers.
+
+ std::size_t countObservers() const;
+ /// Returns the number of subscribers;
+
+protected:
+ ~SocketNotifier();
+ /// Destroys the SocketNotifier.
+
+private:
+ typedef std::multiset<SocketNotification*> EventSet;
+
+ EventSet _events;
+ Poco::NotificationCenter _nc;
+ Socket _socket;
+};
+
+
+//
+// inlines
+//
+inline bool SocketNotifier::accepts(SocketNotification* pNotification)
+{
+ return _events.find(pNotification) != _events.end();
+}
+
+
+inline bool SocketNotifier::hasObserver(const Poco::AbstractObserver& observer) const
+{
+ return _nc.hasObserver(observer);
+}
+
+
+inline bool SocketNotifier::hasObservers() const
+{
+ return _nc.hasObservers();
+}
+
+
+inline std::size_t SocketNotifier::countObservers() const
+{
+ return _nc.countObservers();
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_SocketNotifier_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/SocketReactor.h b/contrib/libs/poco/Net/include/Poco/Net/SocketReactor.h
index 0de3af64c0..06c40bbd6a 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/SocketReactor.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/SocketReactor.h
@@ -1,235 +1,235 @@
-//
-// SocketReactor.h
-//
-// Library: Net
-// Package: Reactor
-// Module: SocketReactor
-//
-// Definition of the SocketReactor class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_SocketReactor_INCLUDED
-#define Net_SocketReactor_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/Socket.h"
-#include "Poco/Runnable.h"
-#include "Poco/Timespan.h"
-#include "Poco/Observer.h"
-#include "Poco/AutoPtr.h"
-#include <map>
-
-
-namespace Poco {
-
-
-class Thread;
-
-
-namespace Net {
-
-
-class Socket;
-class SocketNotification;
-class SocketNotifier;
-
-
-class Net_API SocketReactor: public Poco::Runnable
- /// This class, which is part of the Reactor pattern,
- /// implements the "Initiation Dispatcher".
+//
+// SocketReactor.h
+//
+// Library: Net
+// Package: Reactor
+// Module: SocketReactor
+//
+// Definition of the SocketReactor class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_SocketReactor_INCLUDED
+#define Net_SocketReactor_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/Socket.h"
+#include "Poco/Runnable.h"
+#include "Poco/Timespan.h"
+#include "Poco/Observer.h"
+#include "Poco/AutoPtr.h"
+#include <map>
+
+
+namespace Poco {
+
+
+class Thread;
+
+
+namespace Net {
+
+
+class Socket;
+class SocketNotification;
+class SocketNotifier;
+
+
+class Net_API SocketReactor: public Poco::Runnable
+ /// This class, which is part of the Reactor pattern,
+ /// implements the "Initiation Dispatcher".
+ ///
+ /// The Reactor pattern has been described in the book
+ /// "Pattern Languages of Program Design" by Jim Coplien
+ /// and Douglas C. Schmidt (Addison Wesley, 1995).
+ ///
+ /// The Reactor design pattern handles service requests that
+ /// are delivered concurrently to an application by one or more
+ /// clients. Each service in an application may consist of several
+ /// methods and is represented by a separate event handler. The event
+ /// handler is responsible for servicing service-specific requests.
+ /// The SocketReactor dispatches the event handlers.
+ ///
+ /// Event handlers (any class can be an event handler - there
+ /// is no base class for event handlers) can be registered
+ /// with the addEventHandler() method and deregistered with
+ /// the removeEventHandler() method.
///
- /// The Reactor pattern has been described in the book
- /// "Pattern Languages of Program Design" by Jim Coplien
- /// and Douglas C. Schmidt (Addison Wesley, 1995).
+ /// An event handler is always registered for a certain socket,
+ /// which is given in the call to addEventHandler(). Any method
+ /// of the event handler class can be registered to handle the
+ /// event - the only requirement is that the method takes
+ /// a pointer to an instance of SocketNotification (or a subclass of it)
+ /// as argument.
+ ///
+ /// Once started, the SocketReactor waits for events
+ /// on the registered sockets, using Socket::select().
+ /// If an event is detected, the corresponding event handler
+ /// is invoked. There are five event types (and corresponding
+ /// notification classes) defined: ReadableNotification, WritableNotification,
+ /// ErrorNotification, TimeoutNotification, IdleNotification and
+ /// ShutdownNotification.
///
- /// The Reactor design pattern handles service requests that
- /// are delivered concurrently to an application by one or more
- /// clients. Each service in an application may consist of several
- /// methods and is represented by a separate event handler. The event
- /// handler is responsible for servicing service-specific requests.
- /// The SocketReactor dispatches the event handlers.
- ///
- /// Event handlers (any class can be an event handler - there
- /// is no base class for event handlers) can be registered
- /// with the addEventHandler() method and deregistered with
- /// the removeEventHandler() method.
- ///
- /// An event handler is always registered for a certain socket,
- /// which is given in the call to addEventHandler(). Any method
- /// of the event handler class can be registered to handle the
- /// event - the only requirement is that the method takes
- /// a pointer to an instance of SocketNotification (or a subclass of it)
- /// as argument.
- ///
- /// Once started, the SocketReactor waits for events
- /// on the registered sockets, using Socket::select().
- /// If an event is detected, the corresponding event handler
- /// is invoked. There are five event types (and corresponding
- /// notification classes) defined: ReadableNotification, WritableNotification,
- /// ErrorNotification, TimeoutNotification, IdleNotification and
- /// ShutdownNotification.
- ///
- /// The ReadableNotification will be dispatched if a socket becomes
- /// readable. The WritableNotification will be dispatched if a socket
- /// becomes writable. The ErrorNotification will be dispatched if
- /// there is an error condition on a socket.
- ///
- /// If the timeout expires and no event has occurred, a
- /// TimeoutNotification will be dispatched to all event handlers
- /// registered for it. This is done in the onTimeout() method
- /// which can be overridden by subclasses to perform custom
- /// timeout processing.
- ///
- /// If there are no sockets for the SocketReactor to pass to
- /// Socket::select(), an IdleNotification will be dispatched to
- /// all event handlers registered for it. This is done in the
- /// onIdle() method which can be overridden by subclasses
- /// to perform custom idle processing. Since onIdle() will be
- /// called repeatedly in a loop, it is recommended to do a
- /// short sleep or yield in the event handler.
- ///
- /// Finally, when the SocketReactor is about to shut down (as a result
- /// of stop() being called), it dispatches a ShutdownNotification
- /// to all event handlers. This is done in the onShutdown() method
- /// which can be overridded by subclasses to perform custom
- /// shutdown processing.
- ///
- /// The SocketReactor is implemented so that it can
- /// run in its own thread. It is also possible to run
- /// multiple SocketReactors in parallel, as long as
- /// they work on different sockets.
- ///
- /// It is safe to call addEventHandler() and removeEventHandler()
- /// from another thread while the SocketReactor is running. Also,
- /// it is safe to call addEventHandler() and removeEventHandler()
- /// from event handlers.
-{
-public:
- SocketReactor();
- /// Creates the SocketReactor.
-
- explicit SocketReactor(const Poco::Timespan& timeout);
- /// Creates the SocketReactor, using the given timeout.
-
- virtual ~SocketReactor();
- /// Destroys the SocketReactor.
-
- void run();
- /// Runs the SocketReactor. The reactor will run
- /// until stop() is called (in a separate thread).
-
- void stop();
- /// Stops the SocketReactor.
- ///
- /// The reactor will be stopped when the next event
- /// (including a timeout event) occurs.
-
- void wakeUp();
- /// Wakes up idle reactor.
-
- void setTimeout(const Poco::Timespan& timeout);
- /// Sets the timeout.
- ///
- /// If no other event occurs for the given timeout
- /// interval, a timeout event is sent to all event listeners.
- ///
- /// The default timeout is 250 milliseconds;
- ///
- /// The timeout is passed to the Socket::select()
- /// method.
-
- const Poco::Timespan& getTimeout() const;
- /// Returns the timeout.
-
- void addEventHandler(const Socket& socket, const Poco::AbstractObserver& observer);
- /// Registers an event handler with the SocketReactor.
- ///
- /// Usage:
- /// Poco::Observer<MyEventHandler, SocketNotification> obs(*this, &MyEventHandler::handleMyEvent);
- /// reactor.addEventHandler(obs);
-
- bool hasEventHandler(const Socket& socket, const Poco::AbstractObserver& observer);
- /// Returns true if the observer is registered with SocketReactor for the given socket.
-
- void removeEventHandler(const Socket& socket, const Poco::AbstractObserver& observer);
- /// Unregisters an event handler with the SocketReactor.
- ///
- /// Usage:
- /// Poco::Observer<MyEventHandler, SocketNotification> obs(*this, &MyEventHandler::handleMyEvent);
- /// reactor.removeEventHandler(obs);
-
-protected:
- virtual void onTimeout();
- /// Called if the timeout expires and no other events are available.
- ///
- /// Can be overridden by subclasses. The default implementation
- /// dispatches the TimeoutNotification and thus should be called by overriding
- /// implementations.
-
- virtual void onIdle();
- /// Called if no sockets are available to call select() on.
- ///
- /// Can be overridden by subclasses. The default implementation
- /// dispatches the IdleNotification and thus should be called by overriding
- /// implementations.
-
- virtual void onShutdown();
- /// Called when the SocketReactor is about to terminate.
- ///
- /// Can be overridden by subclasses. The default implementation
- /// dispatches the ShutdownNotification and thus should be called by overriding
- /// implementations.
-
- virtual void onBusy();
- /// Called when the SocketReactor is busy and at least one notification
- /// has been dispatched.
- ///
- /// Can be overridden by subclasses to perform additional
- /// periodic tasks. The default implementation does nothing.
-
- void dispatch(const Socket& socket, SocketNotification* pNotification);
- /// Dispatches the given notification to all observers
- /// registered for the given socket.
-
- void dispatch(SocketNotification* pNotification);
- /// Dispatches the given notification to all observers.
-
-private:
- typedef Poco::AutoPtr<SocketNotifier> NotifierPtr;
- typedef Poco::AutoPtr<SocketNotification> NotificationPtr;
- typedef std::map<Socket, NotifierPtr> EventHandlerMap;
-
- void dispatch(NotifierPtr& pNotifier, SocketNotification* pNotification);
-
- enum
- {
- DEFAULT_TIMEOUT = 250000
- };
-
- bool _stop;
- Poco::Timespan _timeout;
- EventHandlerMap _handlers;
- NotificationPtr _pReadableNotification;
- NotificationPtr _pWritableNotification;
- NotificationPtr _pErrorNotification;
- NotificationPtr _pTimeoutNotification;
- NotificationPtr _pIdleNotification;
- NotificationPtr _pShutdownNotification;
- Poco::FastMutex _mutex;
- Poco::Thread* _pThread;
-
- friend class SocketNotifier;
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_SocketReactor_INCLUDED
+ /// The ReadableNotification will be dispatched if a socket becomes
+ /// readable. The WritableNotification will be dispatched if a socket
+ /// becomes writable. The ErrorNotification will be dispatched if
+ /// there is an error condition on a socket.
+ ///
+ /// If the timeout expires and no event has occurred, a
+ /// TimeoutNotification will be dispatched to all event handlers
+ /// registered for it. This is done in the onTimeout() method
+ /// which can be overridden by subclasses to perform custom
+ /// timeout processing.
+ ///
+ /// If there are no sockets for the SocketReactor to pass to
+ /// Socket::select(), an IdleNotification will be dispatched to
+ /// all event handlers registered for it. This is done in the
+ /// onIdle() method which can be overridden by subclasses
+ /// to perform custom idle processing. Since onIdle() will be
+ /// called repeatedly in a loop, it is recommended to do a
+ /// short sleep or yield in the event handler.
+ ///
+ /// Finally, when the SocketReactor is about to shut down (as a result
+ /// of stop() being called), it dispatches a ShutdownNotification
+ /// to all event handlers. This is done in the onShutdown() method
+ /// which can be overridded by subclasses to perform custom
+ /// shutdown processing.
+ ///
+ /// The SocketReactor is implemented so that it can
+ /// run in its own thread. It is also possible to run
+ /// multiple SocketReactors in parallel, as long as
+ /// they work on different sockets.
+ ///
+ /// It is safe to call addEventHandler() and removeEventHandler()
+ /// from another thread while the SocketReactor is running. Also,
+ /// it is safe to call addEventHandler() and removeEventHandler()
+ /// from event handlers.
+{
+public:
+ SocketReactor();
+ /// Creates the SocketReactor.
+
+ explicit SocketReactor(const Poco::Timespan& timeout);
+ /// Creates the SocketReactor, using the given timeout.
+
+ virtual ~SocketReactor();
+ /// Destroys the SocketReactor.
+
+ void run();
+ /// Runs the SocketReactor. The reactor will run
+ /// until stop() is called (in a separate thread).
+
+ void stop();
+ /// Stops the SocketReactor.
+ ///
+ /// The reactor will be stopped when the next event
+ /// (including a timeout event) occurs.
+
+ void wakeUp();
+ /// Wakes up idle reactor.
+
+ void setTimeout(const Poco::Timespan& timeout);
+ /// Sets the timeout.
+ ///
+ /// If no other event occurs for the given timeout
+ /// interval, a timeout event is sent to all event listeners.
+ ///
+ /// The default timeout is 250 milliseconds;
+ ///
+ /// The timeout is passed to the Socket::select()
+ /// method.
+
+ const Poco::Timespan& getTimeout() const;
+ /// Returns the timeout.
+
+ void addEventHandler(const Socket& socket, const Poco::AbstractObserver& observer);
+ /// Registers an event handler with the SocketReactor.
+ ///
+ /// Usage:
+ /// Poco::Observer<MyEventHandler, SocketNotification> obs(*this, &MyEventHandler::handleMyEvent);
+ /// reactor.addEventHandler(obs);
+
+ bool hasEventHandler(const Socket& socket, const Poco::AbstractObserver& observer);
+ /// Returns true if the observer is registered with SocketReactor for the given socket.
+
+ void removeEventHandler(const Socket& socket, const Poco::AbstractObserver& observer);
+ /// Unregisters an event handler with the SocketReactor.
+ ///
+ /// Usage:
+ /// Poco::Observer<MyEventHandler, SocketNotification> obs(*this, &MyEventHandler::handleMyEvent);
+ /// reactor.removeEventHandler(obs);
+
+protected:
+ virtual void onTimeout();
+ /// Called if the timeout expires and no other events are available.
+ ///
+ /// Can be overridden by subclasses. The default implementation
+ /// dispatches the TimeoutNotification and thus should be called by overriding
+ /// implementations.
+
+ virtual void onIdle();
+ /// Called if no sockets are available to call select() on.
+ ///
+ /// Can be overridden by subclasses. The default implementation
+ /// dispatches the IdleNotification and thus should be called by overriding
+ /// implementations.
+
+ virtual void onShutdown();
+ /// Called when the SocketReactor is about to terminate.
+ ///
+ /// Can be overridden by subclasses. The default implementation
+ /// dispatches the ShutdownNotification and thus should be called by overriding
+ /// implementations.
+
+ virtual void onBusy();
+ /// Called when the SocketReactor is busy and at least one notification
+ /// has been dispatched.
+ ///
+ /// Can be overridden by subclasses to perform additional
+ /// periodic tasks. The default implementation does nothing.
+
+ void dispatch(const Socket& socket, SocketNotification* pNotification);
+ /// Dispatches the given notification to all observers
+ /// registered for the given socket.
+
+ void dispatch(SocketNotification* pNotification);
+ /// Dispatches the given notification to all observers.
+
+private:
+ typedef Poco::AutoPtr<SocketNotifier> NotifierPtr;
+ typedef Poco::AutoPtr<SocketNotification> NotificationPtr;
+ typedef std::map<Socket, NotifierPtr> EventHandlerMap;
+
+ void dispatch(NotifierPtr& pNotifier, SocketNotification* pNotification);
+
+ enum
+ {
+ DEFAULT_TIMEOUT = 250000
+ };
+
+ bool _stop;
+ Poco::Timespan _timeout;
+ EventHandlerMap _handlers;
+ NotificationPtr _pReadableNotification;
+ NotificationPtr _pWritableNotification;
+ NotificationPtr _pErrorNotification;
+ NotificationPtr _pTimeoutNotification;
+ NotificationPtr _pIdleNotification;
+ NotificationPtr _pShutdownNotification;
+ Poco::FastMutex _mutex;
+ Poco::Thread* _pThread;
+
+ friend class SocketNotifier;
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_SocketReactor_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/SocketStream.h b/contrib/libs/poco/Net/include/Poco/Net/SocketStream.h
index ba626cdbc3..5a9a62c0ef 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/SocketStream.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/SocketStream.h
@@ -1,177 +1,177 @@
-//
-// SocketStream.h
-//
-// Library: Net
-// Package: Sockets
-// Module: SocketStream
-//
-// Definition of the SocketStream class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_SocketStream_INCLUDED
-#define Net_SocketStream_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/StreamSocket.h"
-#include "Poco/BufferedBidirectionalStreamBuf.h"
-#include <istream>
-#include <ostream>
-
-
-namespace Poco {
-namespace Net {
-
-
-class StreamSocketImpl;
-
-
-class Net_API SocketStreamBuf: public Poco::BufferedBidirectionalStreamBuf
- /// This is the streambuf class used for reading from and writing to a socket.
-{
-public:
- SocketStreamBuf(const Socket& socket);
- /// Creates a SocketStreamBuf with the given socket.
- ///
- /// The socket's SocketImpl must be a StreamSocketImpl,
- /// otherwise an InvalidArgumentException is thrown.
-
- ~SocketStreamBuf();
- /// Destroys the SocketStreamBuf.
-
- StreamSocketImpl* socketImpl() const;
- /// Returns the internal SocketImpl.
-
-protected:
- int readFromDevice(char* buffer, std::streamsize length);
- int writeToDevice(const char* buffer, std::streamsize length);
-
-private:
- enum
- {
- STREAM_BUFFER_SIZE = 1024
- };
-
- StreamSocketImpl* _pImpl;
-};
-
-
-class Net_API SocketIOS: public virtual std::ios
- /// The base class for SocketStream, SocketInputStream and
- /// SocketOutputStream.
- ///
- /// This class is needed to ensure the correct initialization
- /// order of the stream buffer and base classes.
-{
-public:
- SocketIOS(const Socket& socket);
- /// Creates the SocketIOS with the given socket.
- ///
- /// The socket's SocketImpl must be a StreamSocketImpl,
- /// otherwise an InvalidArgumentException is thrown.
-
- ~SocketIOS();
- /// Destroys the SocketIOS.
- ///
- /// Flushes the buffer, but does not close the socket.
-
- SocketStreamBuf* rdbuf();
- /// Returns a pointer to the internal SocketStreamBuf.
-
- void close();
- /// Flushes the stream and closes the socket.
-
- StreamSocket socket() const;
- /// Returns the underlying socket.
-
-protected:
- SocketStreamBuf _buf;
-};
-
-
-class Net_API SocketOutputStream: public SocketIOS, public std::ostream
- /// An output stream for writing to a socket.
-{
-public:
- explicit SocketOutputStream(const Socket& socket);
- /// Creates the SocketOutputStream with the given socket.
- ///
- /// The socket's SocketImpl must be a StreamSocketImpl,
- /// otherwise an InvalidArgumentException is thrown.
-
- ~SocketOutputStream();
- /// Destroys the SocketOutputStream.
- ///
- /// Flushes the buffer, but does not close the socket.
-};
-
-
-class Net_API SocketInputStream: public SocketIOS, public std::istream
- /// An input stream for reading from a socket.
- ///
- /// When using formatted input from a SocketInputStream,
- /// always ensure that a receive timeout is set for the
- /// socket. Otherwise your program might unexpectedly
- /// hang.
- ///
- /// However, using formatted input from a SocketInputStream
- /// is not recommended, due to the read-ahead behavior of
- /// istream with formatted reads.
-{
-public:
- explicit SocketInputStream(const Socket& socket);
- /// Creates the SocketInputStream with the given socket.
- ///
- /// The socket's SocketImpl must be a StreamSocketImpl,
- /// otherwise an InvalidArgumentException is thrown.
-
- ~SocketInputStream();
- /// Destroys the SocketInputStream.
-};
-
-
-class Net_API SocketStream: public SocketIOS, public std::iostream
- /// An bidirectional stream for reading from and writing to a socket.
- ///
- /// When using formatted input from a SocketStream,
- /// always ensure that a receive timeout is set for the
- /// socket. Otherwise your program might unexpectedly
- /// hang.
- ///
- /// However, using formatted input from a SocketStream
- /// is not recommended, due to the read-ahead behavior of
- /// istream with formatted reads.
-{
-public:
- explicit SocketStream(const Socket& socket);
- /// Creates the SocketStream with the given socket.
- ///
- /// The socket's SocketImpl must be a StreamSocketImpl,
- /// otherwise an InvalidArgumentException is thrown.
-
- ~SocketStream();
- /// Destroys the SocketStream.
- ///
- /// Flushes the buffer, but does not close the socket.
-};
-
-
-//
-// inlines
-//
-inline StreamSocketImpl* SocketStreamBuf::socketImpl() const
-{
- return _pImpl;
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_SocketStream_INCLUDED
+//
+// SocketStream.h
+//
+// Library: Net
+// Package: Sockets
+// Module: SocketStream
+//
+// Definition of the SocketStream class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_SocketStream_INCLUDED
+#define Net_SocketStream_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/StreamSocket.h"
+#include "Poco/BufferedBidirectionalStreamBuf.h"
+#include <istream>
+#include <ostream>
+
+
+namespace Poco {
+namespace Net {
+
+
+class StreamSocketImpl;
+
+
+class Net_API SocketStreamBuf: public Poco::BufferedBidirectionalStreamBuf
+ /// This is the streambuf class used for reading from and writing to a socket.
+{
+public:
+ SocketStreamBuf(const Socket& socket);
+ /// Creates a SocketStreamBuf with the given socket.
+ ///
+ /// The socket's SocketImpl must be a StreamSocketImpl,
+ /// otherwise an InvalidArgumentException is thrown.
+
+ ~SocketStreamBuf();
+ /// Destroys the SocketStreamBuf.
+
+ StreamSocketImpl* socketImpl() const;
+ /// Returns the internal SocketImpl.
+
+protected:
+ int readFromDevice(char* buffer, std::streamsize length);
+ int writeToDevice(const char* buffer, std::streamsize length);
+
+private:
+ enum
+ {
+ STREAM_BUFFER_SIZE = 1024
+ };
+
+ StreamSocketImpl* _pImpl;
+};
+
+
+class Net_API SocketIOS: public virtual std::ios
+ /// The base class for SocketStream, SocketInputStream and
+ /// SocketOutputStream.
+ ///
+ /// This class is needed to ensure the correct initialization
+ /// order of the stream buffer and base classes.
+{
+public:
+ SocketIOS(const Socket& socket);
+ /// Creates the SocketIOS with the given socket.
+ ///
+ /// The socket's SocketImpl must be a StreamSocketImpl,
+ /// otherwise an InvalidArgumentException is thrown.
+
+ ~SocketIOS();
+ /// Destroys the SocketIOS.
+ ///
+ /// Flushes the buffer, but does not close the socket.
+
+ SocketStreamBuf* rdbuf();
+ /// Returns a pointer to the internal SocketStreamBuf.
+
+ void close();
+ /// Flushes the stream and closes the socket.
+
+ StreamSocket socket() const;
+ /// Returns the underlying socket.
+
+protected:
+ SocketStreamBuf _buf;
+};
+
+
+class Net_API SocketOutputStream: public SocketIOS, public std::ostream
+ /// An output stream for writing to a socket.
+{
+public:
+ explicit SocketOutputStream(const Socket& socket);
+ /// Creates the SocketOutputStream with the given socket.
+ ///
+ /// The socket's SocketImpl must be a StreamSocketImpl,
+ /// otherwise an InvalidArgumentException is thrown.
+
+ ~SocketOutputStream();
+ /// Destroys the SocketOutputStream.
+ ///
+ /// Flushes the buffer, but does not close the socket.
+};
+
+
+class Net_API SocketInputStream: public SocketIOS, public std::istream
+ /// An input stream for reading from a socket.
+ ///
+ /// When using formatted input from a SocketInputStream,
+ /// always ensure that a receive timeout is set for the
+ /// socket. Otherwise your program might unexpectedly
+ /// hang.
+ ///
+ /// However, using formatted input from a SocketInputStream
+ /// is not recommended, due to the read-ahead behavior of
+ /// istream with formatted reads.
+{
+public:
+ explicit SocketInputStream(const Socket& socket);
+ /// Creates the SocketInputStream with the given socket.
+ ///
+ /// The socket's SocketImpl must be a StreamSocketImpl,
+ /// otherwise an InvalidArgumentException is thrown.
+
+ ~SocketInputStream();
+ /// Destroys the SocketInputStream.
+};
+
+
+class Net_API SocketStream: public SocketIOS, public std::iostream
+ /// An bidirectional stream for reading from and writing to a socket.
+ ///
+ /// When using formatted input from a SocketStream,
+ /// always ensure that a receive timeout is set for the
+ /// socket. Otherwise your program might unexpectedly
+ /// hang.
+ ///
+ /// However, using formatted input from a SocketStream
+ /// is not recommended, due to the read-ahead behavior of
+ /// istream with formatted reads.
+{
+public:
+ explicit SocketStream(const Socket& socket);
+ /// Creates the SocketStream with the given socket.
+ ///
+ /// The socket's SocketImpl must be a StreamSocketImpl,
+ /// otherwise an InvalidArgumentException is thrown.
+
+ ~SocketStream();
+ /// Destroys the SocketStream.
+ ///
+ /// Flushes the buffer, but does not close the socket.
+};
+
+
+//
+// inlines
+//
+inline StreamSocketImpl* SocketStreamBuf::socketImpl() const
+{
+ return _pImpl;
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_SocketStream_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/StreamSocket.h b/contrib/libs/poco/Net/include/Poco/Net/StreamSocket.h
index 8d36cd79a5..46374d85dc 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/StreamSocket.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/StreamSocket.h
@@ -1,180 +1,180 @@
-//
-// StreamSocket.h
-//
-// Library: Net
-// Package: Sockets
-// Module: StreamSocket
-//
-// Definition of the StreamSocket class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_StreamSocket_INCLUDED
-#define Net_StreamSocket_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/Socket.h"
-#include "Poco/FIFOBuffer.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class StreamSocketImpl;
-
-
-class Net_API StreamSocket: public Socket
- /// This class provides an interface to a
- /// TCP stream socket.
-{
-public:
- StreamSocket();
- /// Creates an unconnected stream socket.
- ///
- /// Before sending or receiving data, the socket
- /// must be connected with a call to connect().
-
- explicit StreamSocket(const SocketAddress& address);
- /// Creates a stream socket and connects it to
- /// the socket specified by address.
-
- explicit StreamSocket(SocketAddress::Family family);
- /// Creates an unconnected stream socket
- /// for the given address family.
- ///
- /// This is useful if certain socket options
- /// (like send and receive buffer) sizes, that must
- /// be set before connecting the socket, will be
- /// set later on.
-
- StreamSocket(const Socket& socket);
- /// Creates the StreamSocket with the SocketImpl
- /// from another socket. The SocketImpl must be
- /// a StreamSocketImpl, otherwise an InvalidArgumentException
- /// will be thrown.
-
- virtual ~StreamSocket();
- /// Destroys the StreamSocket.
-
- StreamSocket& operator = (const Socket& socket);
- /// Assignment operator.
- ///
- /// Releases the socket's SocketImpl and
- /// attaches the SocketImpl from the other socket and
- /// increments the reference count of the SocketImpl.
-
- void connect(const SocketAddress& address);
- /// Initializes the socket and establishes a connection to
- /// the TCP server at the given address.
- ///
- /// Can also be used for UDP sockets. In this case, no
- /// connection is established. Instead, incoming and outgoing
- /// packets are restricted to the specified address.
-
- void connect(const SocketAddress& address, const Poco::Timespan& timeout);
- /// Initializes the socket, sets the socket timeout and
- /// establishes a connection to the TCP server at the given address.
-
- void connectNB(const SocketAddress& address);
- /// Initializes the socket and establishes a connection to
- /// the TCP server at the given address. Prior to opening the
- /// connection the socket is set to nonblocking mode.
-
- void shutdownReceive();
- /// Shuts down the receiving part of the socket connection.
-
- void shutdownSend();
- /// Shuts down the sending part of the socket connection.
-
- void shutdown();
- /// Shuts down both the receiving and the sending part
- /// of the socket connection.
-
- int sendBytes(const void* buffer, int length, int flags = 0);
- /// Sends the contents of the given buffer through
- /// the socket.
- ///
- /// Returns the number of bytes sent, which may be
- /// less than the number of bytes specified.
- ///
- /// Certain socket implementations may also return a negative
- /// value denoting a certain condition.
-
- int sendBytes(Poco::FIFOBuffer& buffer);
- /// Sends the contents of the given buffer through
- /// the socket. FIFOBuffer has writable/readable transition
- /// notifications which may be enabled to notify the caller when
- /// the buffer transitions between empty, partially full and
- /// full states.
- ///
- /// Returns the number of bytes sent, which may be
- /// less than the number of bytes specified.
- ///
- /// Certain socket implementations may also return a negative
- /// value denoting a certain condition.
-
- int receiveBytes(void* buffer, int length, int flags = 0);
- /// Receives data from the socket and stores it
- /// in buffer. Up to length bytes are received.
- ///
- /// Returns the number of bytes received.
- /// A return value of 0 means a graceful shutdown
- /// of the connection from the peer.
- ///
- /// Throws a TimeoutException if a receive timeout has
- /// been set and nothing is received within that interval.
- /// Throws a NetException (or a subclass) in case of other errors.
-
- int receiveBytes(Poco::FIFOBuffer& buffer);
- /// Receives data from the socket and stores it
- /// in buffer. Up to length bytes are received. FIFOBuffer has
- /// writable/readable transition notifications which may be enabled
- /// to notify the caller when the buffer transitions between empty,
- /// partially full and full states.
- ///
- /// Returns the number of bytes received.
- /// A return value of 0 means a graceful shutdown
- /// of the connection from the peer.
- ///
- /// Throws a TimeoutException if a receive timeout has
- /// been set and nothing is received within that interval.
- /// Throws a NetException (or a subclass) in case of other errors.
-
- void sendUrgent(unsigned char data);
- /// Sends one byte of urgent data through
- /// the socket.
- ///
- /// The data is sent with the MSG_OOB flag.
- ///
- /// The preferred way for a socket to receive urgent data
- /// is by enabling the SO_OOBINLINE option.
-
- StreamSocket(SocketImpl* pImpl);
- /// Creates the Socket and attaches the given SocketImpl.
- /// The socket takes ownership of the SocketImpl.
- ///
- /// The SocketImpl must be a StreamSocketImpl, otherwise
- /// an InvalidArgumentException will be thrown.
-
-private:
- enum
- {
- BUFFER_SIZE = 1024
- };
-
- friend class ServerSocket;
- friend class SocketIOS;
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_StreamSocket_INCLUDED
+//
+// StreamSocket.h
+//
+// Library: Net
+// Package: Sockets
+// Module: StreamSocket
+//
+// Definition of the StreamSocket class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_StreamSocket_INCLUDED
+#define Net_StreamSocket_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/Socket.h"
+#include "Poco/FIFOBuffer.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class StreamSocketImpl;
+
+
+class Net_API StreamSocket: public Socket
+ /// This class provides an interface to a
+ /// TCP stream socket.
+{
+public:
+ StreamSocket();
+ /// Creates an unconnected stream socket.
+ ///
+ /// Before sending or receiving data, the socket
+ /// must be connected with a call to connect().
+
+ explicit StreamSocket(const SocketAddress& address);
+ /// Creates a stream socket and connects it to
+ /// the socket specified by address.
+
+ explicit StreamSocket(SocketAddress::Family family);
+ /// Creates an unconnected stream socket
+ /// for the given address family.
+ ///
+ /// This is useful if certain socket options
+ /// (like send and receive buffer) sizes, that must
+ /// be set before connecting the socket, will be
+ /// set later on.
+
+ StreamSocket(const Socket& socket);
+ /// Creates the StreamSocket with the SocketImpl
+ /// from another socket. The SocketImpl must be
+ /// a StreamSocketImpl, otherwise an InvalidArgumentException
+ /// will be thrown.
+
+ virtual ~StreamSocket();
+ /// Destroys the StreamSocket.
+
+ StreamSocket& operator = (const Socket& socket);
+ /// Assignment operator.
+ ///
+ /// Releases the socket's SocketImpl and
+ /// attaches the SocketImpl from the other socket and
+ /// increments the reference count of the SocketImpl.
+
+ void connect(const SocketAddress& address);
+ /// Initializes the socket and establishes a connection to
+ /// the TCP server at the given address.
+ ///
+ /// Can also be used for UDP sockets. In this case, no
+ /// connection is established. Instead, incoming and outgoing
+ /// packets are restricted to the specified address.
+
+ void connect(const SocketAddress& address, const Poco::Timespan& timeout);
+ /// Initializes the socket, sets the socket timeout and
+ /// establishes a connection to the TCP server at the given address.
+
+ void connectNB(const SocketAddress& address);
+ /// Initializes the socket and establishes a connection to
+ /// the TCP server at the given address. Prior to opening the
+ /// connection the socket is set to nonblocking mode.
+
+ void shutdownReceive();
+ /// Shuts down the receiving part of the socket connection.
+
+ void shutdownSend();
+ /// Shuts down the sending part of the socket connection.
+
+ void shutdown();
+ /// Shuts down both the receiving and the sending part
+ /// of the socket connection.
+
+ int sendBytes(const void* buffer, int length, int flags = 0);
+ /// Sends the contents of the given buffer through
+ /// the socket.
+ ///
+ /// Returns the number of bytes sent, which may be
+ /// less than the number of bytes specified.
+ ///
+ /// Certain socket implementations may also return a negative
+ /// value denoting a certain condition.
+
+ int sendBytes(Poco::FIFOBuffer& buffer);
+ /// Sends the contents of the given buffer through
+ /// the socket. FIFOBuffer has writable/readable transition
+ /// notifications which may be enabled to notify the caller when
+ /// the buffer transitions between empty, partially full and
+ /// full states.
+ ///
+ /// Returns the number of bytes sent, which may be
+ /// less than the number of bytes specified.
+ ///
+ /// Certain socket implementations may also return a negative
+ /// value denoting a certain condition.
+
+ int receiveBytes(void* buffer, int length, int flags = 0);
+ /// Receives data from the socket and stores it
+ /// in buffer. Up to length bytes are received.
+ ///
+ /// Returns the number of bytes received.
+ /// A return value of 0 means a graceful shutdown
+ /// of the connection from the peer.
+ ///
+ /// Throws a TimeoutException if a receive timeout has
+ /// been set and nothing is received within that interval.
+ /// Throws a NetException (or a subclass) in case of other errors.
+
+ int receiveBytes(Poco::FIFOBuffer& buffer);
+ /// Receives data from the socket and stores it
+ /// in buffer. Up to length bytes are received. FIFOBuffer has
+ /// writable/readable transition notifications which may be enabled
+ /// to notify the caller when the buffer transitions between empty,
+ /// partially full and full states.
+ ///
+ /// Returns the number of bytes received.
+ /// A return value of 0 means a graceful shutdown
+ /// of the connection from the peer.
+ ///
+ /// Throws a TimeoutException if a receive timeout has
+ /// been set and nothing is received within that interval.
+ /// Throws a NetException (or a subclass) in case of other errors.
+
+ void sendUrgent(unsigned char data);
+ /// Sends one byte of urgent data through
+ /// the socket.
+ ///
+ /// The data is sent with the MSG_OOB flag.
+ ///
+ /// The preferred way for a socket to receive urgent data
+ /// is by enabling the SO_OOBINLINE option.
+
+ StreamSocket(SocketImpl* pImpl);
+ /// Creates the Socket and attaches the given SocketImpl.
+ /// The socket takes ownership of the SocketImpl.
+ ///
+ /// The SocketImpl must be a StreamSocketImpl, otherwise
+ /// an InvalidArgumentException will be thrown.
+
+private:
+ enum
+ {
+ BUFFER_SIZE = 1024
+ };
+
+ friend class ServerSocket;
+ friend class SocketIOS;
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_StreamSocket_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/StreamSocketImpl.h b/contrib/libs/poco/Net/include/Poco/Net/StreamSocketImpl.h
index 879c0f5b93..eb4196983c 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/StreamSocketImpl.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/StreamSocketImpl.h
@@ -1,59 +1,59 @@
-//
-// StreamSocketImpl.h
-//
-// Library: Net
-// Package: Sockets
-// Module: StreamSocketImpl
-//
-// Definition of the StreamSocketImpl class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_StreamSocketImpl_INCLUDED
-#define Net_StreamSocketImpl_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/SocketImpl.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API StreamSocketImpl: public SocketImpl
- /// This class implements a TCP socket.
-{
-public:
- StreamSocketImpl();
- /// Creates a StreamSocketImpl.
-
- explicit StreamSocketImpl(SocketAddress::Family addressFamily);
- /// Creates a SocketImpl, with the underlying
- /// socket initialized for the given address family.
-
- StreamSocketImpl(poco_socket_t sockfd);
- /// Creates a StreamSocketImpl using the given native socket.
-
- virtual int sendBytes(const void* buffer, int length, int flags = 0);
- /// Ensures that all data in buffer is sent if the socket
- /// is blocking. In case of a non-blocking socket, sends as
- /// many bytes as possible.
- ///
- /// Returns the number of bytes sent. The return value may also be
- /// negative to denote some special condition.
-
-protected:
- virtual ~StreamSocketImpl();
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_StreamSocketImpl_INCLUDED
+//
+// StreamSocketImpl.h
+//
+// Library: Net
+// Package: Sockets
+// Module: StreamSocketImpl
+//
+// Definition of the StreamSocketImpl class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_StreamSocketImpl_INCLUDED
+#define Net_StreamSocketImpl_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/SocketImpl.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API StreamSocketImpl: public SocketImpl
+ /// This class implements a TCP socket.
+{
+public:
+ StreamSocketImpl();
+ /// Creates a StreamSocketImpl.
+
+ explicit StreamSocketImpl(SocketAddress::Family addressFamily);
+ /// Creates a SocketImpl, with the underlying
+ /// socket initialized for the given address family.
+
+ StreamSocketImpl(poco_socket_t sockfd);
+ /// Creates a StreamSocketImpl using the given native socket.
+
+ virtual int sendBytes(const void* buffer, int length, int flags = 0);
+ /// Ensures that all data in buffer is sent if the socket
+ /// is blocking. In case of a non-blocking socket, sends as
+ /// many bytes as possible.
+ ///
+ /// Returns the number of bytes sent. The return value may also be
+ /// negative to denote some special condition.
+
+protected:
+ virtual ~StreamSocketImpl();
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_StreamSocketImpl_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/StringPartSource.h b/contrib/libs/poco/Net/include/Poco/Net/StringPartSource.h
index b559d5c291..8f2b478dc2 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/StringPartSource.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/StringPartSource.h
@@ -1,71 +1,71 @@
-//
-// StringPartSource.h
-//
-// Library: Net
-// Package: Messages
-// Module: StringPartSource
-//
-// Definition of the StringPartSource class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_StringPartSource_INCLUDED
-#define Net_StringPartSource_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/PartSource.h"
-#include <sstream>
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API StringPartSource: public PartSource
- /// An implementation of PartSource for strings.
-{
-public:
- StringPartSource(const std::string& str);
- /// Creates the StringPartSource for the given string.
- ///
- /// The MIME type is set to text/plain.
-
- StringPartSource(const std::string& str, const std::string& mediaType);
- /// Creates the StringPartSource for the given
- /// string and MIME type.
-
- StringPartSource(const std::string& str, const std::string& mediaType, const std::string& filename);
- /// Creates the StringPartSource for the given
- /// string, MIME type and filename.
-
- ~StringPartSource();
- /// Destroys the StringPartSource.
-
- std::istream& stream();
- /// Returns a string input stream for the string.
-
- const std::string& filename() const;
- /// Returns the filename portion of the path.
-
- std::streamsize getContentLength() const;
- /// Returns the string size.
-
-private:
- std::istringstream _istr;
- std::string _filename;
-
- StringPartSource(const StringPartSource&);
- StringPartSource& operator = (const StringPartSource&);
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_StringPartSource_INCLUDED
+//
+// StringPartSource.h
+//
+// Library: Net
+// Package: Messages
+// Module: StringPartSource
+//
+// Definition of the StringPartSource class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_StringPartSource_INCLUDED
+#define Net_StringPartSource_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/PartSource.h"
+#include <sstream>
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API StringPartSource: public PartSource
+ /// An implementation of PartSource for strings.
+{
+public:
+ StringPartSource(const std::string& str);
+ /// Creates the StringPartSource for the given string.
+ ///
+ /// The MIME type is set to text/plain.
+
+ StringPartSource(const std::string& str, const std::string& mediaType);
+ /// Creates the StringPartSource for the given
+ /// string and MIME type.
+
+ StringPartSource(const std::string& str, const std::string& mediaType, const std::string& filename);
+ /// Creates the StringPartSource for the given
+ /// string, MIME type and filename.
+
+ ~StringPartSource();
+ /// Destroys the StringPartSource.
+
+ std::istream& stream();
+ /// Returns a string input stream for the string.
+
+ const std::string& filename() const;
+ /// Returns the filename portion of the path.
+
+ std::streamsize getContentLength() const;
+ /// Returns the string size.
+
+private:
+ std::istringstream _istr;
+ std::string _filename;
+
+ StringPartSource(const StringPartSource&);
+ StringPartSource& operator = (const StringPartSource&);
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_StringPartSource_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/TCPServer.h b/contrib/libs/poco/Net/include/Poco/Net/TCPServer.h
index 69da1c2af7..1277475a11 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/TCPServer.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/TCPServer.h
@@ -1,260 +1,260 @@
-//
-// TCPServer.h
-//
-// Library: Net
-// Package: TCPServer
-// Module: TCPServer
-//
-// Definition of the TCPServer class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_TCPServer_INCLUDED
-#define Net_TCPServer_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/ServerSocket.h"
-#include "Poco/Net/TCPServerConnectionFactory.h"
-#include "Poco/Net/TCPServerParams.h"
-#include "Poco/RefCountedObject.h"
-#include "Poco/AutoPtr.h"
-#include "Poco/Runnable.h"
-#include "Poco/Thread.h"
-#include "Poco/ThreadPool.h"
-
-#include <atomic>
-
-
-namespace Poco {
-namespace Net {
-
-
-class TCPServerDispatcher;
-class StreamSocket;
-
-
-class Net_API TCPServerConnectionFilter: public Poco::RefCountedObject
- /// A TCPServerConnectionFilter can be used to reject incoming connections
- /// before passing them on to the TCPServerDispatcher and
- /// starting a thread to handle them.
- ///
- /// An example use case is white-list or black-list IP address filtering.
- ///
- /// Subclasses must override the accept() method.
-{
-public:
- typedef Poco::AutoPtr<TCPServerConnectionFilter> Ptr;
-
- virtual bool accept(const StreamSocket& socket) = 0;
- /// Returns true if the given StreamSocket connection should
- /// be handled, and passed on to the TCPServerDispatcher.
- ///
- /// Returns false if the socket should be closed immediately.
- ///
- /// The socket can be prevented from being closed immediately
- /// if false is returned by creating a copy of the socket.
- /// This can be used to handle certain socket connections in
- /// a special way, outside the TCPServer framework.
-
-protected:
- virtual ~TCPServerConnectionFilter();
-};
-
-
-class Net_API TCPServer: public Poco::Runnable
- /// This class implements a multithreaded TCP server.
- ///
- /// The server uses a ServerSocket to listen for incoming
- /// connections. The ServerSocket must have been bound to
- /// an address before it is passed to the TCPServer constructor.
- /// Additionally, the ServerSocket must be put into listening
- /// state before the TCPServer is started by calling the start()
- /// method.
- ///
- /// The server uses a thread pool to assign threads to incoming
- /// connections. Before incoming connections are assigned to
- /// a connection thread, they are put into a queue.
- /// Connection threads fetch new connections from the queue as soon
- /// as they become free. Thus, a connection thread may serve more
- /// than one connection.
- ///
- /// As soon as a connection thread fetches the next connection from
- /// the queue, it creates a TCPServerConnection object for it
- /// (using the TCPServerConnectionFactory passed to the constructor)
- /// and calls the TCPServerConnection's start() method. When the
- /// start() method returns, the connection object is deleted.
- ///
- /// The number of connection threads is adjusted dynamically, depending
- /// on the number of connections waiting to be served.
- ///
- /// It is possible to specify a maximum number of queued connections.
- /// This prevents the connection queue from overflowing in the
- /// case of an extreme server load. In such a case, connections that
- /// cannot be queued are silently and immediately closed.
- ///
- /// TCPServer uses a separate thread to accept incoming connections.
- /// Thus, the call to start() returns immediately, and the server
- /// continues to run in the background.
- ///
- /// To stop the server from accepting new connections, call stop().
- ///
- /// After calling stop(), no new connections will be accepted and
- /// all queued connections will be discarded.
- /// Already served connections, however, will continue being served.
-{
-public:
- TCPServer(TCPServerConnectionFactory::Ptr pFactory, Poco::UInt16 portNumber = 0, TCPServerParams::Ptr pParams = 0);
- /// Creates the TCPServer, with ServerSocket listening on the given port.
- /// Default port is zero, allowing any available port. The port number
- /// can be queried through TCPServer::port() member.
- ///
- /// The server takes ownership of the TCPServerConnectionFactory
- /// and deletes it when it's no longer needed.
- ///
- /// The server also takes ownership of the TCPServerParams object.
- /// If no TCPServerParams object is given, the server's TCPServerDispatcher
- /// creates its own one.
- ///
- /// New threads are taken from the default thread pool.
-
- TCPServer(TCPServerConnectionFactory::Ptr pFactory, const ServerSocket& socket, TCPServerParams::Ptr pParams = 0);
- /// Creates the TCPServer, using the given ServerSocket.
- ///
- /// The server takes ownership of the TCPServerConnectionFactory
- /// and deletes it when it's no longer needed.
- ///
- /// The server also takes ownership of the TCPServerParams object.
- /// If no TCPServerParams object is given, the server's TCPServerDispatcher
- /// creates its own one.
- ///
- /// New threads are taken from the default thread pool.
-
- TCPServer(TCPServerConnectionFactory::Ptr pFactory, Poco::ThreadPool& threadPool, const ServerSocket& socket, TCPServerParams::Ptr pParams = 0);
- /// Creates the TCPServer, using the given ServerSocket.
- ///
- /// The server takes ownership of the TCPServerConnectionFactory
- /// and deletes it when it's no longer needed.
- ///
- /// The server also takes ownership of the TCPServerParams object.
- /// If no TCPServerParams object is given, the server's TCPServerDispatcher
- /// creates its own one.
- ///
- /// New threads are taken from the given thread pool.
-
- virtual ~TCPServer();
- /// Destroys the TCPServer and its TCPServerConnectionFactory.
-
- const TCPServerParams& params() const;
- /// Returns a const reference to the TCPServerParam object
- /// used by the server's TCPServerDispatcher.
-
- void start();
- /// Starts the server. A new thread will be
- /// created that waits for and accepts incoming
- /// connections.
- ///
- /// Before start() is called, the ServerSocket passed to
- /// TCPServer must have been bound and put into listening state.
-
- void stop();
- /// Stops the server.
- ///
- /// No new connections will be accepted.
- /// Already handled connections will continue to be served.
- ///
- /// Once the server has been stopped, it cannot be restarted.
-
- int currentThreads() const;
- /// Returns the number of currently used connection threads.
-
- int maxThreads() const;
- /// Returns the maximum number of threads available.
-
- int totalConnections() const;
- /// Returns the total number of handled connections.
-
- int currentConnections() const;
- /// Returns the number of currently handled connections.
-
- int maxConcurrentConnections() const;
- /// Returns the maximum number of concurrently handled connections.
-
- int queuedConnections() const;
- /// Returns the number of queued connections.
-
- int refusedConnections() const;
- /// Returns the number of refused connections.
-
- const ServerSocket& socket() const;
- /// Returns the underlying server socket.
-
- Poco::UInt16 port() const;
- /// Returns the port the server socket listens on.
-
- void setConnectionFilter(const TCPServerConnectionFilter::Ptr& pFilter);
- /// Sets a TCPServerConnectionFilter. Can also be used to remove
- /// a filter by passing a null pointer.
- ///
- /// To avoid a potential race condition, the filter must
- /// be set before the TCPServer is started. Trying to set
- /// the filter after start() has been called will trigger
- /// an assertion.
-
- TCPServerConnectionFilter::Ptr getConnectionFilter() const;
- /// Returns the TCPServerConnectionFilter set with setConnectionFilter(),
- /// or null pointer if no filter has been set.
-
-protected:
- void run();
- /// Runs the server. The server will run until
- /// the stop() method is called, or the server
- /// object is destroyed, which implicitly calls
- /// the stop() method.
-
- static std::string threadName(const ServerSocket& socket);
- /// Returns a thread name for the server thread.
-
-private:
- TCPServer();
- TCPServer(const TCPServer&);
- TCPServer& operator = (const TCPServer&);
-
- ServerSocket _socket;
- TCPServerDispatcher* _pDispatcher;
- TCPServerConnectionFilter::Ptr _pConnectionFilter;
- Poco::Thread _thread;
- std::atomic<bool> _stopped;
-};
-
-
-//
-// inlines
-//
-inline const ServerSocket& TCPServer::socket() const
-{
- return _socket;
-}
-
-
-inline Poco::UInt16 TCPServer::port() const
-{
- return _socket.address().port();
-}
-
-
-inline TCPServerConnectionFilter::Ptr TCPServer::getConnectionFilter() const
-{
- return _pConnectionFilter;
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_TCPServer_INCLUDED
+//
+// TCPServer.h
+//
+// Library: Net
+// Package: TCPServer
+// Module: TCPServer
+//
+// Definition of the TCPServer class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_TCPServer_INCLUDED
+#define Net_TCPServer_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/ServerSocket.h"
+#include "Poco/Net/TCPServerConnectionFactory.h"
+#include "Poco/Net/TCPServerParams.h"
+#include "Poco/RefCountedObject.h"
+#include "Poco/AutoPtr.h"
+#include "Poco/Runnable.h"
+#include "Poco/Thread.h"
+#include "Poco/ThreadPool.h"
+
+#include <atomic>
+
+
+namespace Poco {
+namespace Net {
+
+
+class TCPServerDispatcher;
+class StreamSocket;
+
+
+class Net_API TCPServerConnectionFilter: public Poco::RefCountedObject
+ /// A TCPServerConnectionFilter can be used to reject incoming connections
+ /// before passing them on to the TCPServerDispatcher and
+ /// starting a thread to handle them.
+ ///
+ /// An example use case is white-list or black-list IP address filtering.
+ ///
+ /// Subclasses must override the accept() method.
+{
+public:
+ typedef Poco::AutoPtr<TCPServerConnectionFilter> Ptr;
+
+ virtual bool accept(const StreamSocket& socket) = 0;
+ /// Returns true if the given StreamSocket connection should
+ /// be handled, and passed on to the TCPServerDispatcher.
+ ///
+ /// Returns false if the socket should be closed immediately.
+ ///
+ /// The socket can be prevented from being closed immediately
+ /// if false is returned by creating a copy of the socket.
+ /// This can be used to handle certain socket connections in
+ /// a special way, outside the TCPServer framework.
+
+protected:
+ virtual ~TCPServerConnectionFilter();
+};
+
+
+class Net_API TCPServer: public Poco::Runnable
+ /// This class implements a multithreaded TCP server.
+ ///
+ /// The server uses a ServerSocket to listen for incoming
+ /// connections. The ServerSocket must have been bound to
+ /// an address before it is passed to the TCPServer constructor.
+ /// Additionally, the ServerSocket must be put into listening
+ /// state before the TCPServer is started by calling the start()
+ /// method.
+ ///
+ /// The server uses a thread pool to assign threads to incoming
+ /// connections. Before incoming connections are assigned to
+ /// a connection thread, they are put into a queue.
+ /// Connection threads fetch new connections from the queue as soon
+ /// as they become free. Thus, a connection thread may serve more
+ /// than one connection.
+ ///
+ /// As soon as a connection thread fetches the next connection from
+ /// the queue, it creates a TCPServerConnection object for it
+ /// (using the TCPServerConnectionFactory passed to the constructor)
+ /// and calls the TCPServerConnection's start() method. When the
+ /// start() method returns, the connection object is deleted.
+ ///
+ /// The number of connection threads is adjusted dynamically, depending
+ /// on the number of connections waiting to be served.
+ ///
+ /// It is possible to specify a maximum number of queued connections.
+ /// This prevents the connection queue from overflowing in the
+ /// case of an extreme server load. In such a case, connections that
+ /// cannot be queued are silently and immediately closed.
+ ///
+ /// TCPServer uses a separate thread to accept incoming connections.
+ /// Thus, the call to start() returns immediately, and the server
+ /// continues to run in the background.
+ ///
+ /// To stop the server from accepting new connections, call stop().
+ ///
+ /// After calling stop(), no new connections will be accepted and
+ /// all queued connections will be discarded.
+ /// Already served connections, however, will continue being served.
+{
+public:
+ TCPServer(TCPServerConnectionFactory::Ptr pFactory, Poco::UInt16 portNumber = 0, TCPServerParams::Ptr pParams = 0);
+ /// Creates the TCPServer, with ServerSocket listening on the given port.
+ /// Default port is zero, allowing any available port. The port number
+ /// can be queried through TCPServer::port() member.
+ ///
+ /// The server takes ownership of the TCPServerConnectionFactory
+ /// and deletes it when it's no longer needed.
+ ///
+ /// The server also takes ownership of the TCPServerParams object.
+ /// If no TCPServerParams object is given, the server's TCPServerDispatcher
+ /// creates its own one.
+ ///
+ /// New threads are taken from the default thread pool.
+
+ TCPServer(TCPServerConnectionFactory::Ptr pFactory, const ServerSocket& socket, TCPServerParams::Ptr pParams = 0);
+ /// Creates the TCPServer, using the given ServerSocket.
+ ///
+ /// The server takes ownership of the TCPServerConnectionFactory
+ /// and deletes it when it's no longer needed.
+ ///
+ /// The server also takes ownership of the TCPServerParams object.
+ /// If no TCPServerParams object is given, the server's TCPServerDispatcher
+ /// creates its own one.
+ ///
+ /// New threads are taken from the default thread pool.
+
+ TCPServer(TCPServerConnectionFactory::Ptr pFactory, Poco::ThreadPool& threadPool, const ServerSocket& socket, TCPServerParams::Ptr pParams = 0);
+ /// Creates the TCPServer, using the given ServerSocket.
+ ///
+ /// The server takes ownership of the TCPServerConnectionFactory
+ /// and deletes it when it's no longer needed.
+ ///
+ /// The server also takes ownership of the TCPServerParams object.
+ /// If no TCPServerParams object is given, the server's TCPServerDispatcher
+ /// creates its own one.
+ ///
+ /// New threads are taken from the given thread pool.
+
+ virtual ~TCPServer();
+ /// Destroys the TCPServer and its TCPServerConnectionFactory.
+
+ const TCPServerParams& params() const;
+ /// Returns a const reference to the TCPServerParam object
+ /// used by the server's TCPServerDispatcher.
+
+ void start();
+ /// Starts the server. A new thread will be
+ /// created that waits for and accepts incoming
+ /// connections.
+ ///
+ /// Before start() is called, the ServerSocket passed to
+ /// TCPServer must have been bound and put into listening state.
+
+ void stop();
+ /// Stops the server.
+ ///
+ /// No new connections will be accepted.
+ /// Already handled connections will continue to be served.
+ ///
+ /// Once the server has been stopped, it cannot be restarted.
+
+ int currentThreads() const;
+ /// Returns the number of currently used connection threads.
+
+ int maxThreads() const;
+ /// Returns the maximum number of threads available.
+
+ int totalConnections() const;
+ /// Returns the total number of handled connections.
+
+ int currentConnections() const;
+ /// Returns the number of currently handled connections.
+
+ int maxConcurrentConnections() const;
+ /// Returns the maximum number of concurrently handled connections.
+
+ int queuedConnections() const;
+ /// Returns the number of queued connections.
+
+ int refusedConnections() const;
+ /// Returns the number of refused connections.
+
+ const ServerSocket& socket() const;
+ /// Returns the underlying server socket.
+
+ Poco::UInt16 port() const;
+ /// Returns the port the server socket listens on.
+
+ void setConnectionFilter(const TCPServerConnectionFilter::Ptr& pFilter);
+ /// Sets a TCPServerConnectionFilter. Can also be used to remove
+ /// a filter by passing a null pointer.
+ ///
+ /// To avoid a potential race condition, the filter must
+ /// be set before the TCPServer is started. Trying to set
+ /// the filter after start() has been called will trigger
+ /// an assertion.
+
+ TCPServerConnectionFilter::Ptr getConnectionFilter() const;
+ /// Returns the TCPServerConnectionFilter set with setConnectionFilter(),
+ /// or null pointer if no filter has been set.
+
+protected:
+ void run();
+ /// Runs the server. The server will run until
+ /// the stop() method is called, or the server
+ /// object is destroyed, which implicitly calls
+ /// the stop() method.
+
+ static std::string threadName(const ServerSocket& socket);
+ /// Returns a thread name for the server thread.
+
+private:
+ TCPServer();
+ TCPServer(const TCPServer&);
+ TCPServer& operator = (const TCPServer&);
+
+ ServerSocket _socket;
+ TCPServerDispatcher* _pDispatcher;
+ TCPServerConnectionFilter::Ptr _pConnectionFilter;
+ Poco::Thread _thread;
+ std::atomic<bool> _stopped;
+};
+
+
+//
+// inlines
+//
+inline const ServerSocket& TCPServer::socket() const
+{
+ return _socket;
+}
+
+
+inline Poco::UInt16 TCPServer::port() const
+{
+ return _socket.address().port();
+}
+
+
+inline TCPServerConnectionFilter::Ptr TCPServer::getConnectionFilter() const
+{
+ return _pConnectionFilter;
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_TCPServer_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/TCPServerConnection.h b/contrib/libs/poco/Net/include/Poco/Net/TCPServerConnection.h
index d89dffbdbf..380edcc169 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/TCPServerConnection.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/TCPServerConnection.h
@@ -1,86 +1,86 @@
-//
-// TCPServerConnection.h
-//
-// Library: Net
-// Package: TCPServer
-// Module: TCPServerConnection
-//
-// Definition of the TCPServerConnection class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_TCPServerConnection_INCLUDED
-#define Net_TCPServerConnection_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/StreamSocket.h"
-#include "Poco/Runnable.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API TCPServerConnection: public Poco::Runnable
- /// The abstract base class for TCP server connections
- /// created by TCPServer.
- ///
- /// Derived classes must override the run() method
- /// (inherited from Runnable). Furthermore, a
- /// TCPServerConnectionFactory must be provided for the subclass.
- ///
- /// The run() method must perform the complete handling
- /// of the client connection. As soon as the run() method
- /// returns, the server connection object is destroyed and
- /// the connection is automatically closed.
- ///
- /// A new TCPServerConnection object will be created for
- /// each new client connection that is accepted by
- /// TCPServer.
-{
-public:
- TCPServerConnection(const StreamSocket& socket);
- /// Creates the TCPServerConnection using the given
- /// stream socket.
-
- virtual ~TCPServerConnection();
- /// Destroys the TCPServerConnection.
-
-protected:
- StreamSocket& socket();
- /// Returns a reference to the underlying socket.
-
- void start();
- /// Calls run() and catches any exceptions that
- /// might be thrown by run().
-
-private:
- TCPServerConnection();
- TCPServerConnection(const TCPServerConnection&);
- TCPServerConnection& operator = (const TCPServerConnection&);
-
- StreamSocket _socket;
-
- friend class TCPServerDispatcher;
-};
-
-
-//
-// inlines
-//
-inline StreamSocket& TCPServerConnection::socket()
-{
- return _socket;
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_TCPServerConnection_INCLUDED
+//
+// TCPServerConnection.h
+//
+// Library: Net
+// Package: TCPServer
+// Module: TCPServerConnection
+//
+// Definition of the TCPServerConnection class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_TCPServerConnection_INCLUDED
+#define Net_TCPServerConnection_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/StreamSocket.h"
+#include "Poco/Runnable.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API TCPServerConnection: public Poco::Runnable
+ /// The abstract base class for TCP server connections
+ /// created by TCPServer.
+ ///
+ /// Derived classes must override the run() method
+ /// (inherited from Runnable). Furthermore, a
+ /// TCPServerConnectionFactory must be provided for the subclass.
+ ///
+ /// The run() method must perform the complete handling
+ /// of the client connection. As soon as the run() method
+ /// returns, the server connection object is destroyed and
+ /// the connection is automatically closed.
+ ///
+ /// A new TCPServerConnection object will be created for
+ /// each new client connection that is accepted by
+ /// TCPServer.
+{
+public:
+ TCPServerConnection(const StreamSocket& socket);
+ /// Creates the TCPServerConnection using the given
+ /// stream socket.
+
+ virtual ~TCPServerConnection();
+ /// Destroys the TCPServerConnection.
+
+protected:
+ StreamSocket& socket();
+ /// Returns a reference to the underlying socket.
+
+ void start();
+ /// Calls run() and catches any exceptions that
+ /// might be thrown by run().
+
+private:
+ TCPServerConnection();
+ TCPServerConnection(const TCPServerConnection&);
+ TCPServerConnection& operator = (const TCPServerConnection&);
+
+ StreamSocket _socket;
+
+ friend class TCPServerDispatcher;
+};
+
+
+//
+// inlines
+//
+inline StreamSocket& TCPServerConnection::socket()
+{
+ return _socket;
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_TCPServerConnection_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/TCPServerConnectionFactory.h b/contrib/libs/poco/Net/include/Poco/Net/TCPServerConnectionFactory.h
index 36c52b3d57..8fc4d6b4d0 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/TCPServerConnectionFactory.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/TCPServerConnectionFactory.h
@@ -1,89 +1,89 @@
-//
-// TCPServerConnectionFactory.h
-//
-// Library: Net
-// Package: TCPServer
-// Module: TCPServerConnectionFactory
-//
-// Definition of the TCPServerConnectionFactory class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_TCPServerConnectionFactory_INCLUDED
-#define Net_TCPServerConnectionFactory_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/TCPServerConnection.h"
-#include "Poco/SharedPtr.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API TCPServerConnectionFactory
- /// A factory for TCPServerConnection objects.
- ///
- /// The TCPServer class uses a TCPServerConnectionFactory
- /// to create a connection object for each new connection
- /// it accepts.
- ///
- /// Subclasses must override the createConnection()
- /// method.
- ///
- /// The TCPServerConnectionFactoryImpl template class
- /// can be used to automatically instantiate a
- /// TCPServerConnectionFactory for a given subclass
- /// of TCPServerConnection.
-{
-public:
- typedef Poco::SharedPtr<TCPServerConnectionFactory> Ptr;
-
- virtual ~TCPServerConnectionFactory();
- /// Destroys the TCPServerConnectionFactory.
-
- virtual TCPServerConnection* createConnection(const StreamSocket& socket) = 0;
- /// Creates an instance of a subclass of TCPServerConnection,
- /// using the given StreamSocket.
-
-protected:
- TCPServerConnectionFactory();
- /// Creates the TCPServerConnectionFactory.
-
-private:
- TCPServerConnectionFactory(const TCPServerConnectionFactory&);
- TCPServerConnectionFactory& operator = (const TCPServerConnectionFactory&);
-};
-
-
-template <class S>
-class TCPServerConnectionFactoryImpl: public TCPServerConnectionFactory
- /// This template provides a basic implementation of
- /// TCPServerConnectionFactory.
-{
-public:
- TCPServerConnectionFactoryImpl()
- {
- }
-
- ~TCPServerConnectionFactoryImpl()
- {
- }
-
- TCPServerConnection* createConnection(const StreamSocket& socket)
- {
- return new S(socket);
- }
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_TCPServerConnectionFactory_INCLUDED
+//
+// TCPServerConnectionFactory.h
+//
+// Library: Net
+// Package: TCPServer
+// Module: TCPServerConnectionFactory
+//
+// Definition of the TCPServerConnectionFactory class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_TCPServerConnectionFactory_INCLUDED
+#define Net_TCPServerConnectionFactory_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/TCPServerConnection.h"
+#include "Poco/SharedPtr.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API TCPServerConnectionFactory
+ /// A factory for TCPServerConnection objects.
+ ///
+ /// The TCPServer class uses a TCPServerConnectionFactory
+ /// to create a connection object for each new connection
+ /// it accepts.
+ ///
+ /// Subclasses must override the createConnection()
+ /// method.
+ ///
+ /// The TCPServerConnectionFactoryImpl template class
+ /// can be used to automatically instantiate a
+ /// TCPServerConnectionFactory for a given subclass
+ /// of TCPServerConnection.
+{
+public:
+ typedef Poco::SharedPtr<TCPServerConnectionFactory> Ptr;
+
+ virtual ~TCPServerConnectionFactory();
+ /// Destroys the TCPServerConnectionFactory.
+
+ virtual TCPServerConnection* createConnection(const StreamSocket& socket) = 0;
+ /// Creates an instance of a subclass of TCPServerConnection,
+ /// using the given StreamSocket.
+
+protected:
+ TCPServerConnectionFactory();
+ /// Creates the TCPServerConnectionFactory.
+
+private:
+ TCPServerConnectionFactory(const TCPServerConnectionFactory&);
+ TCPServerConnectionFactory& operator = (const TCPServerConnectionFactory&);
+};
+
+
+template <class S>
+class TCPServerConnectionFactoryImpl: public TCPServerConnectionFactory
+ /// This template provides a basic implementation of
+ /// TCPServerConnectionFactory.
+{
+public:
+ TCPServerConnectionFactoryImpl()
+ {
+ }
+
+ ~TCPServerConnectionFactoryImpl()
+ {
+ }
+
+ TCPServerConnection* createConnection(const StreamSocket& socket)
+ {
+ return new S(socket);
+ }
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_TCPServerConnectionFactory_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/TCPServerDispatcher.h b/contrib/libs/poco/Net/include/Poco/Net/TCPServerDispatcher.h
index 5a1a6a79a0..3c46d0f268 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/TCPServerDispatcher.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/TCPServerDispatcher.h
@@ -1,130 +1,130 @@
-//
-// TCPServerDispatcher.h
-//
-// Library: Net
-// Package: TCPServer
-// Module: TCPServerDispatcher
-//
-// Definition of the TCPServerDispatcher class.
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_TCPServerDispatcher_INCLUDED
-#define Net_TCPServerDispatcher_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/StreamSocket.h"
-#include "Poco/Net/TCPServerConnectionFactory.h"
-#include "Poco/Net/TCPServerParams.h"
-#include "Poco/Runnable.h"
-#include "Poco/NotificationQueue.h"
-#include "Poco/ThreadPool.h"
-#include "Poco/Mutex.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API TCPServerDispatcher: public Poco::Runnable
- /// A helper class for TCPServer that dispatches
- /// connections to server connection threads.
-{
-public:
- TCPServerDispatcher(TCPServerConnectionFactory::Ptr pFactory, Poco::ThreadPool& threadPool, TCPServerParams::Ptr pParams);
- /// Creates the TCPServerDispatcher.
- ///
- /// The dispatcher takes ownership of the TCPServerParams object.
- /// If no TCPServerParams object is supplied, the TCPServerDispatcher
- /// creates one.
-
- void duplicate();
- /// Increments the object's reference count.
-
- void release();
- /// Decrements the object's reference count
- /// and deletes the object if the count
- /// reaches zero.
-
- void run();
- /// Runs the dispatcher.
-
- void enqueue(const StreamSocket& socket);
- /// Queues the given socket connection.
-
- void stop();
- /// Stops the dispatcher.
-
- int currentThreads() const;
- /// Returns the number of currently used threads.
-
- int maxThreads() const;
- /// Returns the maximum number of threads available.
-
- int totalConnections() const;
- /// Returns the total number of handled connections.
-
- int currentConnections() const;
- /// Returns the number of currently handled connections.
-
- int maxConcurrentConnections() const;
- /// Returns the maximum number of concurrently handled connections.
-
- int queuedConnections() const;
- /// Returns the number of queued connections.
-
- int refusedConnections() const;
- /// Returns the number of refused connections.
-
- const TCPServerParams& params() const;
- /// Returns a const reference to the TCPServerParam object.
-
-protected:
- ~TCPServerDispatcher();
- /// Destroys the TCPServerDispatcher.
-
- void beginConnection();
- /// Updates the performance counters.
-
- void endConnection();
- /// Updates the performance counters.
-
-private:
- TCPServerDispatcher();
- TCPServerDispatcher(const TCPServerDispatcher&);
- TCPServerDispatcher& operator = (const TCPServerDispatcher&);
-
- int _rc;
- TCPServerParams::Ptr _pParams;
- int _currentThreads;
- int _totalConnections;
- int _currentConnections;
- int _maxConcurrentConnections;
- int _refusedConnections;
- bool _stopped;
- Poco::NotificationQueue _queue;
- TCPServerConnectionFactory::Ptr _pConnectionFactory;
- Poco::ThreadPool& _threadPool;
- mutable Poco::FastMutex _mutex;
-};
-
-
-//
-// inlines
-//
-inline const TCPServerParams& TCPServerDispatcher::params() const
-{
- return *_pParams;
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_TCPServerDispatcher_INCLUDED
+//
+// TCPServerDispatcher.h
+//
+// Library: Net
+// Package: TCPServer
+// Module: TCPServerDispatcher
+//
+// Definition of the TCPServerDispatcher class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_TCPServerDispatcher_INCLUDED
+#define Net_TCPServerDispatcher_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/StreamSocket.h"
+#include "Poco/Net/TCPServerConnectionFactory.h"
+#include "Poco/Net/TCPServerParams.h"
+#include "Poco/Runnable.h"
+#include "Poco/NotificationQueue.h"
+#include "Poco/ThreadPool.h"
+#include "Poco/Mutex.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API TCPServerDispatcher: public Poco::Runnable
+ /// A helper class for TCPServer that dispatches
+ /// connections to server connection threads.
+{
+public:
+ TCPServerDispatcher(TCPServerConnectionFactory::Ptr pFactory, Poco::ThreadPool& threadPool, TCPServerParams::Ptr pParams);
+ /// Creates the TCPServerDispatcher.
+ ///
+ /// The dispatcher takes ownership of the TCPServerParams object.
+ /// If no TCPServerParams object is supplied, the TCPServerDispatcher
+ /// creates one.
+
+ void duplicate();
+ /// Increments the object's reference count.
+
+ void release();
+ /// Decrements the object's reference count
+ /// and deletes the object if the count
+ /// reaches zero.
+
+ void run();
+ /// Runs the dispatcher.
+
+ void enqueue(const StreamSocket& socket);
+ /// Queues the given socket connection.
+
+ void stop();
+ /// Stops the dispatcher.
+
+ int currentThreads() const;
+ /// Returns the number of currently used threads.
+
+ int maxThreads() const;
+ /// Returns the maximum number of threads available.
+
+ int totalConnections() const;
+ /// Returns the total number of handled connections.
+
+ int currentConnections() const;
+ /// Returns the number of currently handled connections.
+
+ int maxConcurrentConnections() const;
+ /// Returns the maximum number of concurrently handled connections.
+
+ int queuedConnections() const;
+ /// Returns the number of queued connections.
+
+ int refusedConnections() const;
+ /// Returns the number of refused connections.
+
+ const TCPServerParams& params() const;
+ /// Returns a const reference to the TCPServerParam object.
+
+protected:
+ ~TCPServerDispatcher();
+ /// Destroys the TCPServerDispatcher.
+
+ void beginConnection();
+ /// Updates the performance counters.
+
+ void endConnection();
+ /// Updates the performance counters.
+
+private:
+ TCPServerDispatcher();
+ TCPServerDispatcher(const TCPServerDispatcher&);
+ TCPServerDispatcher& operator = (const TCPServerDispatcher&);
+
+ int _rc;
+ TCPServerParams::Ptr _pParams;
+ int _currentThreads;
+ int _totalConnections;
+ int _currentConnections;
+ int _maxConcurrentConnections;
+ int _refusedConnections;
+ bool _stopped;
+ Poco::NotificationQueue _queue;
+ TCPServerConnectionFactory::Ptr _pConnectionFactory;
+ Poco::ThreadPool& _threadPool;
+ mutable Poco::FastMutex _mutex;
+};
+
+
+//
+// inlines
+//
+inline const TCPServerParams& TCPServerDispatcher::params() const
+{
+ return *_pParams;
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_TCPServerDispatcher_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/TCPServerParams.h b/contrib/libs/poco/Net/include/Poco/Net/TCPServerParams.h
index 1752b732b6..1c2057e5ec 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/TCPServerParams.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/TCPServerParams.h
@@ -1,137 +1,137 @@
-//
-// TCPServerParams.h
-//
-// Library: Net
-// Package: TCPServer
-// Module: TCPServerParams
-//
-// Definition of the TCPServerParams class.
-//
-// Copyright (c) 2005-2007, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_TCPServerParams_INCLUDED
-#define Net_TCPServerParams_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/RefCountedObject.h"
-#include "Poco/Timespan.h"
-#include "Poco/Thread.h"
-#include "Poco/AutoPtr.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class Net_API TCPServerParams: public Poco::RefCountedObject
- /// This class is used to specify parameters to both the
- /// TCPServer, as well as to TCPServerDispatcher objects.
- ///
- /// Subclasses may add new parameters to the class.
-{
-public:
- typedef Poco::AutoPtr<TCPServerParams> Ptr;
-
- TCPServerParams();
- /// Creates the TCPServerParams.
- ///
- /// Sets the following default values:
- /// - threadIdleTime: 10 seconds
- /// - maxThreads: 0
- /// - maxQueued: 64
-
- void setThreadIdleTime(const Poco::Timespan& idleTime);
- /// Sets the maximum idle time for a thread before
- /// it is terminated.
- ///
- /// The default idle time is 10 seconds;
-
- const Poco::Timespan& getThreadIdleTime() const;
- /// Returns the maximum thread idle time.
-
- void setMaxQueued(int count);
- /// Sets the maximum number of queued connections.
- /// Must be greater than 0.
- ///
- /// If there are already the maximum number of connections
- /// in the queue, new connections will be silently discarded.
- ///
- /// The default number is 64.
-
- int getMaxQueued() const;
- /// Returns the maximum number of queued connections.
-
- void setMaxThreads(int count);
- /// Sets the maximum number of simultaneous threads
- /// available for this TCPServerDispatcher.
- ///
- /// Must be greater than or equal to 0.
- /// If 0 is specified, the TCPServerDispatcher will
- /// set this parameter to the number of available threads
- /// in its thread pool.
- ///
- /// The thread pool used by the TCPServerDispatcher
- /// must at least have the capacity for the given
- /// number of threads.
-
- int getMaxThreads() const;
- /// Returns the maximum number of simultaneous threads
- /// available for this TCPServerDispatcher.
-
- void setThreadPriority(Poco::Thread::Priority prio);
- /// Sets the priority of TCP server threads
+//
+// TCPServerParams.h
+//
+// Library: Net
+// Package: TCPServer
+// Module: TCPServerParams
+//
+// Definition of the TCPServerParams class.
+//
+// Copyright (c) 2005-2007, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_TCPServerParams_INCLUDED
+#define Net_TCPServerParams_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/RefCountedObject.h"
+#include "Poco/Timespan.h"
+#include "Poco/Thread.h"
+#include "Poco/AutoPtr.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class Net_API TCPServerParams: public Poco::RefCountedObject
+ /// This class is used to specify parameters to both the
+ /// TCPServer, as well as to TCPServerDispatcher objects.
+ ///
+ /// Subclasses may add new parameters to the class.
+{
+public:
+ typedef Poco::AutoPtr<TCPServerParams> Ptr;
+
+ TCPServerParams();
+ /// Creates the TCPServerParams.
+ ///
+ /// Sets the following default values:
+ /// - threadIdleTime: 10 seconds
+ /// - maxThreads: 0
+ /// - maxQueued: 64
+
+ void setThreadIdleTime(const Poco::Timespan& idleTime);
+ /// Sets the maximum idle time for a thread before
+ /// it is terminated.
+ ///
+ /// The default idle time is 10 seconds;
+
+ const Poco::Timespan& getThreadIdleTime() const;
+ /// Returns the maximum thread idle time.
+
+ void setMaxQueued(int count);
+ /// Sets the maximum number of queued connections.
+ /// Must be greater than 0.
+ ///
+ /// If there are already the maximum number of connections
+ /// in the queue, new connections will be silently discarded.
+ ///
+ /// The default number is 64.
+
+ int getMaxQueued() const;
+ /// Returns the maximum number of queued connections.
+
+ void setMaxThreads(int count);
+ /// Sets the maximum number of simultaneous threads
+ /// available for this TCPServerDispatcher.
+ ///
+ /// Must be greater than or equal to 0.
+ /// If 0 is specified, the TCPServerDispatcher will
+ /// set this parameter to the number of available threads
+ /// in its thread pool.
+ ///
+ /// The thread pool used by the TCPServerDispatcher
+ /// must at least have the capacity for the given
+ /// number of threads.
+
+ int getMaxThreads() const;
+ /// Returns the maximum number of simultaneous threads
+ /// available for this TCPServerDispatcher.
+
+ void setThreadPriority(Poco::Thread::Priority prio);
+ /// Sets the priority of TCP server threads
+ /// created by TCPServer.
+
+ Poco::Thread::Priority getThreadPriority() const;
+ /// Returns the priority of TCP server threads
/// created by TCPServer.
-
- Poco::Thread::Priority getThreadPriority() const;
- /// Returns the priority of TCP server threads
- /// created by TCPServer.
-
-protected:
- virtual ~TCPServerParams();
- /// Destroys the TCPServerParams.
-
-private:
- Poco::Timespan _threadIdleTime;
- int _maxThreads;
- int _maxQueued;
- Poco::Thread::Priority _threadPriority;
-};
-
-
-//
-// inlines
-//
-inline const Poco::Timespan& TCPServerParams::getThreadIdleTime() const
-{
- return _threadIdleTime;
-}
-
-
-inline int TCPServerParams::getMaxThreads() const
-{
- return _maxThreads;
-}
-
-
-inline int TCPServerParams::getMaxQueued() const
-{
- return _maxQueued;
-}
-
-
-inline Poco::Thread::Priority TCPServerParams::getThreadPriority() const
-{
- return _threadPriority;
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_TCPServerParams_INCLUDED
+
+protected:
+ virtual ~TCPServerParams();
+ /// Destroys the TCPServerParams.
+
+private:
+ Poco::Timespan _threadIdleTime;
+ int _maxThreads;
+ int _maxQueued;
+ Poco::Thread::Priority _threadPriority;
+};
+
+
+//
+// inlines
+//
+inline const Poco::Timespan& TCPServerParams::getThreadIdleTime() const
+{
+ return _threadIdleTime;
+}
+
+
+inline int TCPServerParams::getMaxThreads() const
+{
+ return _maxThreads;
+}
+
+
+inline int TCPServerParams::getMaxQueued() const
+{
+ return _maxQueued;
+}
+
+
+inline Poco::Thread::Priority TCPServerParams::getThreadPriority() const
+{
+ return _threadPriority;
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_TCPServerParams_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/WebSocket.h b/contrib/libs/poco/Net/include/Poco/Net/WebSocket.h
index bb6b29a5e7..5d3f05d12d 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/WebSocket.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/WebSocket.h
@@ -1,297 +1,297 @@
-//
-// WebSocket.h
-//
-// Library: Net
-// Package: WebSocket
-// Module: WebSocket
-//
-// Definition of the WebSocket class.
-//
-// Copyright (c) 2012, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_WebSocket_INCLUDED
-#define Net_WebSocket_INCLUDED
-
-
-#include "Poco/Net/Net.h"
-#include "Poco/Net/StreamSocket.h"
-#include "Poco/Net/HTTPCredentials.h"
-#include "Poco/Buffer.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class WebSocketImpl;
-class HTTPServerRequest;
-class HTTPServerResponse;
-class HTTPClientSession;
-
-
-class Net_API WebSocket: public StreamSocket
- /// This class implements a WebSocket according
- /// to the WebSocket protocol specification in RFC 6455.
- ///
- /// Both client-side and server-side WebSockets
- /// are supported.
- ///
- /// Server-side WebSockets are usually created from within
- /// a HTTPRequestHandler.
- ///
- /// Client-side WebSockets are created using a HTTPClientSession.
- ///
- /// Note that special frames like PING must be handled at
- /// application level. In the case of a PING, a PONG message
- /// must be returned.
-{
-public:
- enum Mode
- {
- WS_SERVER, /// Server-side WebSocket.
- WS_CLIENT /// Client-side WebSocket.
- };
-
- enum FrameFlags
- /// Frame header flags.
- {
- FRAME_FLAG_FIN = 0x80, /// FIN bit: final fragment of a multi-fragment message.
- FRAME_FLAG_RSV1 = 0x40, /// Reserved for future use. Must be zero.
- FRAME_FLAG_RSV2 = 0x20, /// Reserved for future use. Must be zero.
- FRAME_FLAG_RSV3 = 0x10 /// Reserved for future use. Must be zero.
- };
-
- enum FrameOpcodes
- /// Frame header opcodes.
- {
- FRAME_OP_CONT = 0x00, /// Continuation frame.
- FRAME_OP_TEXT = 0x01, /// Text frame.
- FRAME_OP_BINARY = 0x02, /// Binary frame.
- FRAME_OP_CLOSE = 0x08, /// Close connection.
- FRAME_OP_PING = 0x09, /// Ping frame.
- FRAME_OP_PONG = 0x0a, /// Pong frame.
- FRAME_OP_BITMASK = 0x0f, /// Bit mask for opcodes.
- FRAME_OP_SETRAW = 0x100 /// Set raw flags (for use with sendBytes() and FRAME_OP_CONT).
- };
-
- enum SendFlags
- /// Combined header flags and opcodes for use with sendFrame().
- {
- FRAME_TEXT = FRAME_FLAG_FIN | FRAME_OP_TEXT,
- /// Use this for sending a single text (UTF-8) payload frame.
- FRAME_BINARY = FRAME_FLAG_FIN | FRAME_OP_BINARY
- /// Use this for sending a single binary payload frame.
- };
-
- enum StatusCodes
- /// StatusCodes for CLOSE frames sent with shutdown().
- {
- WS_NORMAL_CLOSE = 1000,
- WS_ENDPOINT_GOING_AWAY = 1001,
- WS_PROTOCOL_ERROR = 1002,
- WS_PAYLOAD_NOT_ACCEPTABLE = 1003,
- WS_RESERVED = 1004,
- WS_RESERVED_NO_STATUS_CODE = 1005,
- WS_RESERVED_ABNORMAL_CLOSE = 1006,
- WS_MALFORMED_PAYLOAD = 1007,
- WS_POLICY_VIOLATION = 1008,
- WS_PAYLOAD_TOO_BIG = 1009,
- WS_EXTENSION_REQUIRED = 1010,
- WS_UNEXPECTED_CONDITION = 1011,
- WS_RESERVED_TLS_FAILURE = 1015
- };
-
- enum ErrorCodes
- /// These error codes can be obtained from a WebSocketException
- /// to determine the exact cause of the error.
- {
- WS_ERR_NO_HANDSHAKE = 1,
- /// No Connection: Upgrade or Upgrade: websocket header in handshake request.
- WS_ERR_HANDSHAKE_NO_VERSION = 2,
- /// No Sec-WebSocket-Version header in handshake request.
- WS_ERR_HANDSHAKE_UNSUPPORTED_VERSION = 3,
- /// Unsupported WebSocket version requested by client.
- WS_ERR_HANDSHAKE_NO_KEY = 4,
- /// No Sec-WebSocket-Key header in handshake request.
- WS_ERR_HANDSHAKE_ACCEPT = 5,
- /// No Sec-WebSocket-Accept header or wrong value.
- WS_ERR_UNAUTHORIZED = 6,
- /// The server rejected the username or password for authentication.
- WS_ERR_PAYLOAD_TOO_BIG = 10,
- /// Payload too big for supplied buffer.
- WS_ERR_INCOMPLETE_FRAME = 11
- /// Incomplete frame received.
- };
-
- WebSocket(HTTPServerRequest& request, HTTPServerResponse& response);
- /// Creates a server-side WebSocket from within a
- /// HTTPRequestHandler.
- ///
- /// First verifies that the request is a valid WebSocket upgrade
- /// request. If so, completes the handshake by sending
- /// a proper 101 response.
- ///
- /// Throws an exception if the request is not a proper WebSocket
- /// upgrade request.
-
- WebSocket(HTTPClientSession& cs, HTTPRequest& request, HTTPResponse& response);
- /// Creates a client-side WebSocket, using the given
- /// HTTPClientSession and HTTPRequest for the initial handshake
- /// (HTTP Upgrade request).
- ///
- /// Additional HTTP headers for the initial handshake request
- /// (such as Origin or Sec-WebSocket-Protocol) can be given
- /// in the request object.
- ///
- /// The result of the handshake can be obtained from the response
- /// object.
-
- WebSocket(HTTPClientSession& cs, HTTPRequest& request, HTTPResponse& response, HTTPCredentials& credentials);
- /// Creates a client-side WebSocket, using the given
- /// HTTPClientSession and HTTPRequest for the initial handshake
- /// (HTTP Upgrade request).
- ///
- /// The given credentials are used for authentication
- /// if requested by the server.
- ///
- /// Additional HTTP headers for the initial handshake request
- /// (such as Origin or Sec-WebSocket-Protocol) can be given
- /// in the request object.
- ///
- /// The result of the handshake can be obtained from the response
- /// object.
-
- WebSocket(const Socket& socket);
- /// Creates a WebSocket from another Socket, which must be a WebSocket,
- /// otherwise a Poco::InvalidArgumentException will be thrown.
-
- virtual ~WebSocket();
- /// Destroys the StreamSocket.
-
- WebSocket& operator = (const Socket& socket);
- /// Assignment operator.
- ///
- /// The other socket must be a WebSocket, otherwise a Poco::InvalidArgumentException
- /// will be thrown.
-
- void shutdown();
- /// Sends a Close control frame to the server end of
- /// the connection to initiate an orderly shutdown
- /// of the connection.
-
- void shutdown(Poco::UInt16 statusCode, const std::string& statusMessage = "");
- /// Sends a Close control frame to the server end of
- /// the connection to initiate an orderly shutdown
- /// of the connection.
-
- int sendFrame(const void* buffer, int length, int flags = FRAME_TEXT);
- /// Sends the contents of the given buffer through
- /// the socket as a single frame.
- ///
- /// Values from the FrameFlags, FrameOpcodes and SendFlags enumerations
- /// can be specified in flags.
- ///
- /// Returns the number of bytes sent, which may be
- /// less than the number of bytes specified.
- ///
- /// Certain socket implementations may also return a negative
- /// value denoting a certain condition.
-
- int receiveFrame(void* buffer, int length, int& flags);
- /// Receives a frame from the socket and stores it
- /// in buffer. Up to length bytes are received. If
- /// the frame's payload is larger, a WebSocketException
- /// is thrown and the WebSocket connection must be
- /// terminated.
- ///
- /// The frame's payload size must not exceed the
- /// maximum payload size set with setMaxPayloadSize().
- /// If it does, a WebSocketException (WS_ERR_PAYLOAD_TOO_BIG)
- /// is thrown and the WebSocket connection must be
- /// terminated.
- ///
- /// A WebSocketException will also be thrown if a malformed
- /// or incomplete frame is received.
- ///
- /// Returns the number of bytes received.
- /// A return value of 0 means that the peer has
- /// shut down or closed the connection.
- ///
- /// Throws a TimeoutException if a receive timeout has
- /// been set and nothing is received within that interval.
- /// Throws a NetException (or a subclass) in case of other errors.
- ///
- /// The frame flags and opcode (FrameFlags and FrameOpcodes)
- /// is stored in flags.
-
- int receiveFrame(Poco::Buffer<char>& buffer, int& flags);
- /// Receives a frame from the socket and stores it
- /// after any previous content in buffer.
- /// The buffer will be grown as necessary.
- ///
- /// The frame's payload size must not exceed the
- /// maximum payload size set with setMaxPayloadSize().
- /// If it does, a WebSocketException (WS_ERR_PAYLOAD_TOO_BIG)
- /// is thrown and the WebSocket connection must be
- /// terminated.
- ///
- /// A WebSocketException will also be thrown if a malformed
- /// or incomplete frame is received.
- ///
- /// If this method is used, a reasonable maximum payload size should
- /// be set with setMaxPayloadSize() to prevent a potential
- /// DoS attack (memory exhaustion) by sending a WebSocket frame
- /// header with a huge payload size.
- ///
- /// Returns the number of bytes received.
- /// A return value of 0 means that the peer has
- /// shut down or closed the connection.
- ///
- /// Throws a TimeoutException if a receive timeout has
- /// been set and nothing is received within that interval.
- /// Throws a NetException (or a subclass) in case of other errors.
- ///
- /// The frame flags and opcode (FrameFlags and FrameOpcodes)
- /// is stored in flags.
-
- Mode mode() const;
- /// Returns WS_SERVER if the WebSocket is a server-side
- /// WebSocket, or WS_CLIENT otherwise.
-
- void setMaxPayloadSize(int maxPayloadSize);
- /// Sets the maximum payload size for receiveFrame().
- ///
- /// The default is std::numeric_limits<int>::max().
-
- int getMaxPayloadSize() const;
- /// Returns the maximum payload size for receiveFrame().
- ///
- /// The default is std::numeric_limits<int>::max().
-
- static const std::string WEBSOCKET_VERSION;
- /// The WebSocket protocol version supported (13).
-
-protected:
- static WebSocketImpl* accept(HTTPServerRequest& request, HTTPServerResponse& response);
- static WebSocketImpl* connect(HTTPClientSession& cs, HTTPRequest& request, HTTPResponse& response, HTTPCredentials& credentials);
- static WebSocketImpl* completeHandshake(HTTPClientSession& cs, HTTPResponse& response, const std::string& key);
- static std::string computeAccept(const std::string& key);
- static std::string createKey();
-
-private:
- WebSocket();
-
- static const std::string WEBSOCKET_GUID;
- static HTTPCredentials _defaultCreds;
-};
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_WebSocket_INCLUDED
+//
+// WebSocket.h
+//
+// Library: Net
+// Package: WebSocket
+// Module: WebSocket
+//
+// Definition of the WebSocket class.
+//
+// Copyright (c) 2012, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_WebSocket_INCLUDED
+#define Net_WebSocket_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/StreamSocket.h"
+#include "Poco/Net/HTTPCredentials.h"
+#include "Poco/Buffer.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class WebSocketImpl;
+class HTTPServerRequest;
+class HTTPServerResponse;
+class HTTPClientSession;
+
+
+class Net_API WebSocket: public StreamSocket
+ /// This class implements a WebSocket according
+ /// to the WebSocket protocol specification in RFC 6455.
+ ///
+ /// Both client-side and server-side WebSockets
+ /// are supported.
+ ///
+ /// Server-side WebSockets are usually created from within
+ /// a HTTPRequestHandler.
+ ///
+ /// Client-side WebSockets are created using a HTTPClientSession.
+ ///
+ /// Note that special frames like PING must be handled at
+ /// application level. In the case of a PING, a PONG message
+ /// must be returned.
+{
+public:
+ enum Mode
+ {
+ WS_SERVER, /// Server-side WebSocket.
+ WS_CLIENT /// Client-side WebSocket.
+ };
+
+ enum FrameFlags
+ /// Frame header flags.
+ {
+ FRAME_FLAG_FIN = 0x80, /// FIN bit: final fragment of a multi-fragment message.
+ FRAME_FLAG_RSV1 = 0x40, /// Reserved for future use. Must be zero.
+ FRAME_FLAG_RSV2 = 0x20, /// Reserved for future use. Must be zero.
+ FRAME_FLAG_RSV3 = 0x10 /// Reserved for future use. Must be zero.
+ };
+
+ enum FrameOpcodes
+ /// Frame header opcodes.
+ {
+ FRAME_OP_CONT = 0x00, /// Continuation frame.
+ FRAME_OP_TEXT = 0x01, /// Text frame.
+ FRAME_OP_BINARY = 0x02, /// Binary frame.
+ FRAME_OP_CLOSE = 0x08, /// Close connection.
+ FRAME_OP_PING = 0x09, /// Ping frame.
+ FRAME_OP_PONG = 0x0a, /// Pong frame.
+ FRAME_OP_BITMASK = 0x0f, /// Bit mask for opcodes.
+ FRAME_OP_SETRAW = 0x100 /// Set raw flags (for use with sendBytes() and FRAME_OP_CONT).
+ };
+
+ enum SendFlags
+ /// Combined header flags and opcodes for use with sendFrame().
+ {
+ FRAME_TEXT = FRAME_FLAG_FIN | FRAME_OP_TEXT,
+ /// Use this for sending a single text (UTF-8) payload frame.
+ FRAME_BINARY = FRAME_FLAG_FIN | FRAME_OP_BINARY
+ /// Use this for sending a single binary payload frame.
+ };
+
+ enum StatusCodes
+ /// StatusCodes for CLOSE frames sent with shutdown().
+ {
+ WS_NORMAL_CLOSE = 1000,
+ WS_ENDPOINT_GOING_AWAY = 1001,
+ WS_PROTOCOL_ERROR = 1002,
+ WS_PAYLOAD_NOT_ACCEPTABLE = 1003,
+ WS_RESERVED = 1004,
+ WS_RESERVED_NO_STATUS_CODE = 1005,
+ WS_RESERVED_ABNORMAL_CLOSE = 1006,
+ WS_MALFORMED_PAYLOAD = 1007,
+ WS_POLICY_VIOLATION = 1008,
+ WS_PAYLOAD_TOO_BIG = 1009,
+ WS_EXTENSION_REQUIRED = 1010,
+ WS_UNEXPECTED_CONDITION = 1011,
+ WS_RESERVED_TLS_FAILURE = 1015
+ };
+
+ enum ErrorCodes
+ /// These error codes can be obtained from a WebSocketException
+ /// to determine the exact cause of the error.
+ {
+ WS_ERR_NO_HANDSHAKE = 1,
+ /// No Connection: Upgrade or Upgrade: websocket header in handshake request.
+ WS_ERR_HANDSHAKE_NO_VERSION = 2,
+ /// No Sec-WebSocket-Version header in handshake request.
+ WS_ERR_HANDSHAKE_UNSUPPORTED_VERSION = 3,
+ /// Unsupported WebSocket version requested by client.
+ WS_ERR_HANDSHAKE_NO_KEY = 4,
+ /// No Sec-WebSocket-Key header in handshake request.
+ WS_ERR_HANDSHAKE_ACCEPT = 5,
+ /// No Sec-WebSocket-Accept header or wrong value.
+ WS_ERR_UNAUTHORIZED = 6,
+ /// The server rejected the username or password for authentication.
+ WS_ERR_PAYLOAD_TOO_BIG = 10,
+ /// Payload too big for supplied buffer.
+ WS_ERR_INCOMPLETE_FRAME = 11
+ /// Incomplete frame received.
+ };
+
+ WebSocket(HTTPServerRequest& request, HTTPServerResponse& response);
+ /// Creates a server-side WebSocket from within a
+ /// HTTPRequestHandler.
+ ///
+ /// First verifies that the request is a valid WebSocket upgrade
+ /// request. If so, completes the handshake by sending
+ /// a proper 101 response.
+ ///
+ /// Throws an exception if the request is not a proper WebSocket
+ /// upgrade request.
+
+ WebSocket(HTTPClientSession& cs, HTTPRequest& request, HTTPResponse& response);
+ /// Creates a client-side WebSocket, using the given
+ /// HTTPClientSession and HTTPRequest for the initial handshake
+ /// (HTTP Upgrade request).
+ ///
+ /// Additional HTTP headers for the initial handshake request
+ /// (such as Origin or Sec-WebSocket-Protocol) can be given
+ /// in the request object.
+ ///
+ /// The result of the handshake can be obtained from the response
+ /// object.
+
+ WebSocket(HTTPClientSession& cs, HTTPRequest& request, HTTPResponse& response, HTTPCredentials& credentials);
+ /// Creates a client-side WebSocket, using the given
+ /// HTTPClientSession and HTTPRequest for the initial handshake
+ /// (HTTP Upgrade request).
+ ///
+ /// The given credentials are used for authentication
+ /// if requested by the server.
+ ///
+ /// Additional HTTP headers for the initial handshake request
+ /// (such as Origin or Sec-WebSocket-Protocol) can be given
+ /// in the request object.
+ ///
+ /// The result of the handshake can be obtained from the response
+ /// object.
+
+ WebSocket(const Socket& socket);
+ /// Creates a WebSocket from another Socket, which must be a WebSocket,
+ /// otherwise a Poco::InvalidArgumentException will be thrown.
+
+ virtual ~WebSocket();
+ /// Destroys the StreamSocket.
+
+ WebSocket& operator = (const Socket& socket);
+ /// Assignment operator.
+ ///
+ /// The other socket must be a WebSocket, otherwise a Poco::InvalidArgumentException
+ /// will be thrown.
+
+ void shutdown();
+ /// Sends a Close control frame to the server end of
+ /// the connection to initiate an orderly shutdown
+ /// of the connection.
+
+ void shutdown(Poco::UInt16 statusCode, const std::string& statusMessage = "");
+ /// Sends a Close control frame to the server end of
+ /// the connection to initiate an orderly shutdown
+ /// of the connection.
+
+ int sendFrame(const void* buffer, int length, int flags = FRAME_TEXT);
+ /// Sends the contents of the given buffer through
+ /// the socket as a single frame.
+ ///
+ /// Values from the FrameFlags, FrameOpcodes and SendFlags enumerations
+ /// can be specified in flags.
+ ///
+ /// Returns the number of bytes sent, which may be
+ /// less than the number of bytes specified.
+ ///
+ /// Certain socket implementations may also return a negative
+ /// value denoting a certain condition.
+
+ int receiveFrame(void* buffer, int length, int& flags);
+ /// Receives a frame from the socket and stores it
+ /// in buffer. Up to length bytes are received. If
+ /// the frame's payload is larger, a WebSocketException
+ /// is thrown and the WebSocket connection must be
+ /// terminated.
+ ///
+ /// The frame's payload size must not exceed the
+ /// maximum payload size set with setMaxPayloadSize().
+ /// If it does, a WebSocketException (WS_ERR_PAYLOAD_TOO_BIG)
+ /// is thrown and the WebSocket connection must be
+ /// terminated.
+ ///
+ /// A WebSocketException will also be thrown if a malformed
+ /// or incomplete frame is received.
+ ///
+ /// Returns the number of bytes received.
+ /// A return value of 0 means that the peer has
+ /// shut down or closed the connection.
+ ///
+ /// Throws a TimeoutException if a receive timeout has
+ /// been set and nothing is received within that interval.
+ /// Throws a NetException (or a subclass) in case of other errors.
+ ///
+ /// The frame flags and opcode (FrameFlags and FrameOpcodes)
+ /// is stored in flags.
+
+ int receiveFrame(Poco::Buffer<char>& buffer, int& flags);
+ /// Receives a frame from the socket and stores it
+ /// after any previous content in buffer.
+ /// The buffer will be grown as necessary.
+ ///
+ /// The frame's payload size must not exceed the
+ /// maximum payload size set with setMaxPayloadSize().
+ /// If it does, a WebSocketException (WS_ERR_PAYLOAD_TOO_BIG)
+ /// is thrown and the WebSocket connection must be
+ /// terminated.
+ ///
+ /// A WebSocketException will also be thrown if a malformed
+ /// or incomplete frame is received.
+ ///
+ /// If this method is used, a reasonable maximum payload size should
+ /// be set with setMaxPayloadSize() to prevent a potential
+ /// DoS attack (memory exhaustion) by sending a WebSocket frame
+ /// header with a huge payload size.
+ ///
+ /// Returns the number of bytes received.
+ /// A return value of 0 means that the peer has
+ /// shut down or closed the connection.
+ ///
+ /// Throws a TimeoutException if a receive timeout has
+ /// been set and nothing is received within that interval.
+ /// Throws a NetException (or a subclass) in case of other errors.
+ ///
+ /// The frame flags and opcode (FrameFlags and FrameOpcodes)
+ /// is stored in flags.
+
+ Mode mode() const;
+ /// Returns WS_SERVER if the WebSocket is a server-side
+ /// WebSocket, or WS_CLIENT otherwise.
+
+ void setMaxPayloadSize(int maxPayloadSize);
+ /// Sets the maximum payload size for receiveFrame().
+ ///
+ /// The default is std::numeric_limits<int>::max().
+
+ int getMaxPayloadSize() const;
+ /// Returns the maximum payload size for receiveFrame().
+ ///
+ /// The default is std::numeric_limits<int>::max().
+
+ static const std::string WEBSOCKET_VERSION;
+ /// The WebSocket protocol version supported (13).
+
+protected:
+ static WebSocketImpl* accept(HTTPServerRequest& request, HTTPServerResponse& response);
+ static WebSocketImpl* connect(HTTPClientSession& cs, HTTPRequest& request, HTTPResponse& response, HTTPCredentials& credentials);
+ static WebSocketImpl* completeHandshake(HTTPClientSession& cs, HTTPResponse& response, const std::string& key);
+ static std::string computeAccept(const std::string& key);
+ static std::string createKey();
+
+private:
+ WebSocket();
+
+ static const std::string WEBSOCKET_GUID;
+ static HTTPCredentials _defaultCreds;
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_WebSocket_INCLUDED
diff --git a/contrib/libs/poco/Net/include/Poco/Net/WebSocketImpl.h b/contrib/libs/poco/Net/include/Poco/Net/WebSocketImpl.h
index fb9751dbce..a2471c3694 100644
--- a/contrib/libs/poco/Net/include/Poco/Net/WebSocketImpl.h
+++ b/contrib/libs/poco/Net/include/Poco/Net/WebSocketImpl.h
@@ -1,142 +1,142 @@
-//
-// WebSocketImpl.h
-//
-// Library: Net
-// Package: WebSocket
-// Module: WebSocketImpl
-//
-// Definition of the StreamSocketImpl class.
-//
-// Copyright (c) 2012, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#ifndef Net_WebSocketImpl_INCLUDED
-#define Net_WebSocketImpl_INCLUDED
-
-
-#include "Poco/Net/StreamSocketImpl.h"
-#include "Poco/Buffer.h"
-#include "Poco/Random.h"
-#include "Poco/Buffer.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-class HTTPSession;
-
-
-class Net_API WebSocketImpl: public StreamSocketImpl
- /// This class implements a WebSocket, according
- /// to the WebSocket protocol described in RFC 6455.
-{
-public:
- WebSocketImpl(StreamSocketImpl* pStreamSocketImpl, HTTPSession& session, bool mustMaskPayload);
- /// Creates a WebSocketImpl.
-
- // StreamSocketImpl
- virtual int sendBytes(const void* buffer, int length, int flags);
- /// Sends a WebSocket protocol frame.
-
- virtual int receiveBytes(void* buffer, int length, int flags);
- /// Receives a WebSocket protocol frame.
-
- virtual int receiveBytes(Poco::Buffer<char>& buffer, int flags);
- /// Receives a WebSocket protocol frame.
-
- virtual SocketImpl* acceptConnection(SocketAddress& clientAddr);
- virtual void connect(const SocketAddress& address);
- virtual void connect(const SocketAddress& address, const Poco::Timespan& timeout);
- virtual void connectNB(const SocketAddress& address);
- virtual void bind(const SocketAddress& address, bool reuseAddress = false);
- virtual void bind(const SocketAddress& address, bool reuseAddress, bool reusePort);
- virtual void bind6(const SocketAddress& address, bool reuseAddress = false, bool ipV6Only = false);
- virtual void bind6(const SocketAddress& address, bool reuseAddress, bool reusePort, bool ipV6Only);
- virtual void listen(int backlog = 64);
- virtual void close();
- virtual void shutdownReceive();
- virtual void shutdownSend();
- virtual void shutdown();
- virtual int sendTo(const void* buffer, int length, const SocketAddress& address, int flags = 0);
- virtual int receiveFrom(void* buffer, int length, SocketAddress& address, int flags = 0);
- virtual void sendUrgent(unsigned char data);
- virtual int available();
- virtual bool secure() const;
- virtual void setSendTimeout(const Poco::Timespan& timeout);
- virtual Poco::Timespan getSendTimeout();
- virtual void setReceiveTimeout(const Poco::Timespan& timeout);
- virtual Poco::Timespan getReceiveTimeout();
-
- // Internal
- int frameFlags() const;
- /// Returns the frame flags of the most recently received frame.
-
- bool mustMaskPayload() const;
- /// Returns true if the payload must be masked.
-
- void setMaxPayloadSize(int maxPayloadSize);
- /// Sets the maximum payload size for receiveFrame().
- ///
- /// The default is std::numeric_limits<int>::max().
-
- int getMaxPayloadSize() const;
- /// Returns the maximum payload size for receiveFrame().
- ///
- /// The default is std::numeric_limits<int>::max().
-
-protected:
- enum
- {
- FRAME_FLAG_MASK = 0x80,
- MAX_HEADER_LENGTH = 14
- };
-
- int receiveHeader(char mask[4], bool& useMask);
- int receivePayload(char *buffer, int payloadLength, char mask[4], bool useMask);
- int receiveNBytes(void* buffer, int bytes);
- int receiveSomeBytes(char* buffer, int bytes);
- virtual ~WebSocketImpl();
-
-private:
- WebSocketImpl();
-
- StreamSocketImpl* _pStreamSocketImpl;
- int _maxPayloadSize;
- Poco::Buffer<char> _buffer;
- int _bufferOffset;
- int _frameFlags;
- bool _mustMaskPayload;
- Poco::Random _rnd;
-};
-
-
-//
-// inlines
-//
-inline int WebSocketImpl::frameFlags() const
-{
- return _frameFlags;
-}
-
-
-inline bool WebSocketImpl::mustMaskPayload() const
-{
- return _mustMaskPayload;
-}
-
-
-inline int WebSocketImpl::getMaxPayloadSize() const
-{
- return _maxPayloadSize;
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif // Net_WebSocketImpl_INCLUDED
+//
+// WebSocketImpl.h
+//
+// Library: Net
+// Package: WebSocket
+// Module: WebSocketImpl
+//
+// Definition of the StreamSocketImpl class.
+//
+// Copyright (c) 2012, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_WebSocketImpl_INCLUDED
+#define Net_WebSocketImpl_INCLUDED
+
+
+#include "Poco/Net/StreamSocketImpl.h"
+#include "Poco/Buffer.h"
+#include "Poco/Random.h"
+#include "Poco/Buffer.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class HTTPSession;
+
+
+class Net_API WebSocketImpl: public StreamSocketImpl
+ /// This class implements a WebSocket, according
+ /// to the WebSocket protocol described in RFC 6455.
+{
+public:
+ WebSocketImpl(StreamSocketImpl* pStreamSocketImpl, HTTPSession& session, bool mustMaskPayload);
+ /// Creates a WebSocketImpl.
+
+ // StreamSocketImpl
+ virtual int sendBytes(const void* buffer, int length, int flags);
+ /// Sends a WebSocket protocol frame.
+
+ virtual int receiveBytes(void* buffer, int length, int flags);
+ /// Receives a WebSocket protocol frame.
+
+ virtual int receiveBytes(Poco::Buffer<char>& buffer, int flags);
+ /// Receives a WebSocket protocol frame.
+
+ virtual SocketImpl* acceptConnection(SocketAddress& clientAddr);
+ virtual void connect(const SocketAddress& address);
+ virtual void connect(const SocketAddress& address, const Poco::Timespan& timeout);
+ virtual void connectNB(const SocketAddress& address);
+ virtual void bind(const SocketAddress& address, bool reuseAddress = false);
+ virtual void bind(const SocketAddress& address, bool reuseAddress, bool reusePort);
+ virtual void bind6(const SocketAddress& address, bool reuseAddress = false, bool ipV6Only = false);
+ virtual void bind6(const SocketAddress& address, bool reuseAddress, bool reusePort, bool ipV6Only);
+ virtual void listen(int backlog = 64);
+ virtual void close();
+ virtual void shutdownReceive();
+ virtual void shutdownSend();
+ virtual void shutdown();
+ virtual int sendTo(const void* buffer, int length, const SocketAddress& address, int flags = 0);
+ virtual int receiveFrom(void* buffer, int length, SocketAddress& address, int flags = 0);
+ virtual void sendUrgent(unsigned char data);
+ virtual int available();
+ virtual bool secure() const;
+ virtual void setSendTimeout(const Poco::Timespan& timeout);
+ virtual Poco::Timespan getSendTimeout();
+ virtual void setReceiveTimeout(const Poco::Timespan& timeout);
+ virtual Poco::Timespan getReceiveTimeout();
+
+ // Internal
+ int frameFlags() const;
+ /// Returns the frame flags of the most recently received frame.
+
+ bool mustMaskPayload() const;
+ /// Returns true if the payload must be masked.
+
+ void setMaxPayloadSize(int maxPayloadSize);
+ /// Sets the maximum payload size for receiveFrame().
+ ///
+ /// The default is std::numeric_limits<int>::max().
+
+ int getMaxPayloadSize() const;
+ /// Returns the maximum payload size for receiveFrame().
+ ///
+ /// The default is std::numeric_limits<int>::max().
+
+protected:
+ enum
+ {
+ FRAME_FLAG_MASK = 0x80,
+ MAX_HEADER_LENGTH = 14
+ };
+
+ int receiveHeader(char mask[4], bool& useMask);
+ int receivePayload(char *buffer, int payloadLength, char mask[4], bool useMask);
+ int receiveNBytes(void* buffer, int bytes);
+ int receiveSomeBytes(char* buffer, int bytes);
+ virtual ~WebSocketImpl();
+
+private:
+ WebSocketImpl();
+
+ StreamSocketImpl* _pStreamSocketImpl;
+ int _maxPayloadSize;
+ Poco::Buffer<char> _buffer;
+ int _bufferOffset;
+ int _frameFlags;
+ bool _mustMaskPayload;
+ Poco::Random _rnd;
+};
+
+
+//
+// inlines
+//
+inline int WebSocketImpl::frameFlags() const
+{
+ return _frameFlags;
+}
+
+
+inline bool WebSocketImpl::mustMaskPayload() const
+{
+ return _mustMaskPayload;
+}
+
+
+inline int WebSocketImpl::getMaxPayloadSize() const
+{
+ return _maxPayloadSize;
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_WebSocketImpl_INCLUDED
diff --git a/contrib/libs/poco/Net/src/AbstractHTTPRequestHandler.cpp b/contrib/libs/poco/Net/src/AbstractHTTPRequestHandler.cpp
index 33ebf8f9c9..ed39617e2b 100644
--- a/contrib/libs/poco/Net/src/AbstractHTTPRequestHandler.cpp
+++ b/contrib/libs/poco/Net/src/AbstractHTTPRequestHandler.cpp
@@ -1,109 +1,109 @@
-//
-// AbstractHTTPRequestHandler.cpp
-//
-// Library: Net
-// Package: HTTPServer
-// Module: AbstractHTTPRequestHandler
-//
-// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/AbstractHTTPRequestHandler.h"
-#include "Poco/Net/HTTPServerRequest.h"
-#include "Poco/Net/HTTPServerResponse.h"
-#include "Poco/Net/HTMLForm.h"
-#include "Poco/NumberFormatter.h"
-#include "Poco/Exception.h"
-
-
-using Poco::NumberFormatter;
-
-
-namespace Poco {
-namespace Net {
-
-
-AbstractHTTPRequestHandler::AbstractHTTPRequestHandler():
- _pRequest(0),
- _pResponse(0),
- _pForm(0)
-{
-}
-
-
-AbstractHTTPRequestHandler::~AbstractHTTPRequestHandler()
-{
- delete _pForm;
-}
-
-
-void AbstractHTTPRequestHandler::handleRequest(HTTPServerRequest& request, HTTPServerResponse& response)
-{
- _pRequest = &request;
- _pResponse = &response;
- if (authenticate())
- {
- try
- {
- run();
- }
- catch (Poco::Exception& exc)
- {
- if (!response.sent())
- {
- sendErrorResponse(HTTPResponse::HTTP_INTERNAL_SERVER_ERROR, exc.displayText());
- }
- }
- catch (std::exception& exc)
- {
- if (!response.sent())
- {
- sendErrorResponse(HTTPResponse::HTTP_INTERNAL_SERVER_ERROR, exc.what());
- }
- }
- }
- else
- {
- sendErrorResponse(HTTPResponse::HTTP_UNAUTHORIZED, "");
- }
-}
-
-
-bool AbstractHTTPRequestHandler::authenticate()
-{
- return true;
-}
-
-
-HTMLForm& AbstractHTTPRequestHandler::form()
-{
- if (!_pForm)
- _pForm = new HTMLForm(request(), request().stream());
-
- return *_pForm;
-}
-
-
-void AbstractHTTPRequestHandler::sendErrorResponse(HTTPResponse::HTTPStatus status, const std::string& message)
-{
- response().setStatusAndReason(status);
- std::string statusAndReason(NumberFormatter::format(static_cast<int>(response().getStatus())));
- statusAndReason += " - ";
- statusAndReason += response().getReason();
- std::string page("<HTML><HEAD><TITLE>");
- page += statusAndReason;
- page += "</TITLE></HEAD><BODY><H1>";
- page += statusAndReason;
- page += "</H1>";
- page += "<P>";
- page += message;
- page += "</P></BODY></HTML>";
- response().sendBuffer(page.data(), page.size());
-}
-
-
-} } // namespace Poco::Net
+//
+// AbstractHTTPRequestHandler.cpp
+//
+// Library: Net
+// Package: HTTPServer
+// Module: AbstractHTTPRequestHandler
+//
+// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/AbstractHTTPRequestHandler.h"
+#include "Poco/Net/HTTPServerRequest.h"
+#include "Poco/Net/HTTPServerResponse.h"
+#include "Poco/Net/HTMLForm.h"
+#include "Poco/NumberFormatter.h"
+#include "Poco/Exception.h"
+
+
+using Poco::NumberFormatter;
+
+
+namespace Poco {
+namespace Net {
+
+
+AbstractHTTPRequestHandler::AbstractHTTPRequestHandler():
+ _pRequest(0),
+ _pResponse(0),
+ _pForm(0)
+{
+}
+
+
+AbstractHTTPRequestHandler::~AbstractHTTPRequestHandler()
+{
+ delete _pForm;
+}
+
+
+void AbstractHTTPRequestHandler::handleRequest(HTTPServerRequest& request, HTTPServerResponse& response)
+{
+ _pRequest = &request;
+ _pResponse = &response;
+ if (authenticate())
+ {
+ try
+ {
+ run();
+ }
+ catch (Poco::Exception& exc)
+ {
+ if (!response.sent())
+ {
+ sendErrorResponse(HTTPResponse::HTTP_INTERNAL_SERVER_ERROR, exc.displayText());
+ }
+ }
+ catch (std::exception& exc)
+ {
+ if (!response.sent())
+ {
+ sendErrorResponse(HTTPResponse::HTTP_INTERNAL_SERVER_ERROR, exc.what());
+ }
+ }
+ }
+ else
+ {
+ sendErrorResponse(HTTPResponse::HTTP_UNAUTHORIZED, "");
+ }
+}
+
+
+bool AbstractHTTPRequestHandler::authenticate()
+{
+ return true;
+}
+
+
+HTMLForm& AbstractHTTPRequestHandler::form()
+{
+ if (!_pForm)
+ _pForm = new HTMLForm(request(), request().stream());
+
+ return *_pForm;
+}
+
+
+void AbstractHTTPRequestHandler::sendErrorResponse(HTTPResponse::HTTPStatus status, const std::string& message)
+{
+ response().setStatusAndReason(status);
+ std::string statusAndReason(NumberFormatter::format(static_cast<int>(response().getStatus())));
+ statusAndReason += " - ";
+ statusAndReason += response().getReason();
+ std::string page("<HTML><HEAD><TITLE>");
+ page += statusAndReason;
+ page += "</TITLE></HEAD><BODY><H1>";
+ page += statusAndReason;
+ page += "</H1>";
+ page += "<P>";
+ page += message;
+ page += "</P></BODY></HTML>";
+ response().sendBuffer(page.data(), page.size());
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/DNS.cpp b/contrib/libs/poco/Net/src/DNS.cpp
index 58e6225584..6ef8810aa1 100644
--- a/contrib/libs/poco/Net/src/DNS.cpp
+++ b/contrib/libs/poco/Net/src/DNS.cpp
@@ -1,867 +1,867 @@
-//
-// DNS.cpp
-//
-// Library: Net
-// Package: NetCore
-// Module: DNS
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/DNS.h"
-#include "Poco/Net/NetException.h"
-#include "Poco/Net/SocketAddress.h"
-#include "Poco/Environment.h"
-#include "Poco/NumberFormatter.h"
-#include "Poco/RWLock.h"
-#include "Poco/TextIterator.h"
-#include "Poco/TextConverter.h"
-#include "Poco/UTF8Encoding.h"
-#include "Poco/UTF32Encoding.h"
-#include "Poco/Unicode.h"
-#include "Poco/Timespan.h"
-#include "Poco/Mutex.h"
-#include <cstring>
-#include <list>
-#include <atomic>
-
-
-#if defined(POCO_HAVE_LIBRESOLV)
-#include <resolv.h>
-#endif
-
-
-/// set default DNS timeout to 60 seconds
-const Poco::Timespan Poco::Net::DNS::DEFAULT_DNS_TIMEOUT = Poco::Timespan(60, 0);
-
-#if defined(POCO_HAVE_GETADDRINFO_A)
-/** getaddrinfo иногда работает бесконечно долго.
- * Этот код использует getaddrinfo_a c некоторым таймаутом.
- *
- * При выполнении в один поток производительность ниже на 30%
- * При выполнении запросов в 4 потока производительность отличается
- * иногда в лучшую иногда в худшую сторону на ~10-20%
- */
-class GetAddrinfo
-{
-public:
- static GetAddrinfo & instance()
- {
- static GetAddrinfo impl;
- return impl;
- }
-
- int getaddrinfo(const char * name,
- const char * service,
- const struct addrinfo * hints,
- struct addrinfo ** pai,
- const Poco::Timespan * timeout_);
-
- size_t requestsNum()
- {
- Poco::ScopedLock<Poco::FastMutex> lock(mutex);
- return requests.size();
- }
-
-private:
- GetAddrinfo() {}
-
- GetAddrinfo(const GetAddrinfo &) = delete;
- const GetAddrinfo & operator=(const GetAddrinfo &) = delete;
-
- void releaseUnused()
- {
- for (auto it = requests.rbegin(); it != requests.rend();)
- {
- /// don't delete if structure is used by other thread or by internal cycle of getaddrinfo
- if (it->unused && gai_error(&(*it)) != EAI_INPROGRESS)
- {
- free(const_cast<char *>(it->ar_name));
- it->ar_name = nullptr;
- free(const_cast<char *>(it->ar_service));
- it->ar_service = nullptr;
- free(const_cast<addrinfo *>(it->ar_request));
- it->ar_request = nullptr;
- freeaddrinfo(it->ar_result);
- it->ar_result = nullptr;
-
- auto it_to_delete = --(it.base());
-
- it = decltype(it)(requests.erase(it_to_delete));
- }
- else
- break;
- }
- }
-
- void addOne(const char * name,
- const char * service,
- const struct addrinfo * hints)
- {
- requests.emplace_back();
-
- auto & request = requests.back();
-
- request.ar_name = name ? strdup(name) : nullptr;
- request.ar_service = service ? strdup(service) : nullptr;
-
- addrinfo * my_hints = nullptr;
- if (hints)
- {
- /// only ai_flags are used in Poco
- my_hints = (addrinfo *)calloc(1, sizeof(addrinfo));
- my_hints->ai_flags = hints->ai_flags;
- }
- request.ar_request = my_hints;
-
- request.ar_result = nullptr;
- }
-
-private:
- struct gaicb_ext : public gaicb
- {
- gaicb_ext()
- {
- memset(this, 0, sizeof(gaicb_ext));
- }
-
- ~gaicb_ext()
- {
- if (gai_error(this) != EAI_INPROGRESS)
- {
- free(const_cast<char *>(ar_name));
- free(const_cast<char *>(ar_service));
- free(const_cast<addrinfo *>(ar_request));
-
- freeaddrinfo(ar_result);
- }
- }
-
- std::atomic<bool> unused {false};
- };
-
- std::list<gaicb_ext> requests;
-
- Poco::FastMutex mutex;
-};
-
-int GetAddrinfo::getaddrinfo(const char * name,
- const char * service,
- const struct addrinfo * hints,
- struct addrinfo ** pai,
- const Poco::Timespan * timeout_)
-{
- if (timeout_)
- {
- timespec timeout;
- timeout.tv_sec = timeout_->totalSeconds();
- timeout.tv_nsec = timeout_->microseconds() * 1000;
-
- gaicb_ext * request_ext_ptr = nullptr;
- {
- Poco::ScopedLock<Poco::FastMutex> lock(mutex);
- addOne(name, service, hints);
- request_ext_ptr = &requests.back();
- }
- gaicb * request_ptr = request_ext_ptr;
-
- int code = getaddrinfo_a(GAI_NOWAIT, &request_ptr, 1, nullptr);
-
- if (!code)
- {
- gai_suspend(&request_ptr, 1, &timeout);
-
- *pai = request_ext_ptr->ar_result;
- /// prevent deleting result in dctor
- request_ext_ptr->ar_result = nullptr;
-
- code = gai_error(request_ext_ptr);
- }
-
- request_ext_ptr->unused = true;
-
- {
- Poco::ScopedLock<Poco::FastMutex> lock(mutex);
- releaseUnused();
- }
-
- return code;
- }
- else
- {
- return ::getaddrinfo(name, service, hints, pai);
- }
-}
-#endif
-
-
-using Poco::Environment;
-using Poco::NumberFormatter;
-using Poco::IOException;
-
-
-namespace Poco {
-namespace Net {
-
-
-typedef Poco::UInt32 punycode_uint;
-
-
-enum
-{
- punycode_success = 0,
- punycode_overflow = -1,
- punycode_big_output = -2,
- punycode_bad_input = -3
-};
-
-
-static int punycode_encode(size_t input_length, const punycode_uint input[], size_t* output_length, char output[]);
-static int punycode_decode(size_t input_length, const char input[], size_t* output_length, punycode_uint output[]);
-
-
-#if defined(POCO_HAVE_LIBRESOLV)
-static Poco::RWLock resolverLock;
-#endif
-
-
-HostEntry DNS::hostByName(const std::string& hostname, const Poco::Timespan * timeout_, unsigned
-#ifdef POCO_HAVE_ADDRINFO
- hintFlags
-#endif
- )
-{
-#if defined(POCO_HAVE_LIBRESOLV)
- Poco::ScopedReadRWLock readLock(resolverLock);
-#endif
-
-#if defined(POCO_HAVE_ADDRINFO)
- struct addrinfo* pAI;
- struct addrinfo hints;
- std::memset(&hints, 0, sizeof(hints));
- hints.ai_flags = hintFlags;
-#if defined(POCO_HAVE_GETADDRINFO_A)
- int rc = GetAddrinfo::instance().getaddrinfo(hostname.c_str(), NULL, &hints, &pAI, timeout_);
-#else
- int rc = getaddrinfo(hostname.c_str(), NULL, &hints, &pAI);
-#endif
- if (rc == 0)
- {
- HostEntry result(pAI);
- freeaddrinfo(pAI);
- return result;
- }
- else
- {
- aierror(rc, hostname);
- }
-#elif defined(POCO_VXWORKS)
- int addr = hostGetByName(const_cast<char*>(hostname.c_str()));
- if (addr != ERROR)
- {
- return HostEntry(hostname, IPAddress(&addr, sizeof(addr)));
- }
-#else
- struct hostent* he = gethostbyname(hostname.c_str());
- if (he)
- {
- return HostEntry(he);
- }
-#endif
- error(lastError(), hostname); // will throw an appropriate exception
- throw NetException(); // to silence compiler
-}
-
-
-HostEntry DNS::hostByAddress(const IPAddress& address, const Poco::Timespan * timeout_, unsigned
-#ifdef POCO_HAVE_ADDRINFO
- hintFlags
-#endif
- )
-{
-#if defined(POCO_HAVE_LIBRESOLV)
- Poco::ScopedReadRWLock readLock(resolverLock);
-#endif
-
-#if defined(POCO_HAVE_ADDRINFO)
- SocketAddress sa(address, 0);
- static char fqname[1024];
- int rc = getnameinfo(sa.addr(), sa.length(), fqname, sizeof(fqname), NULL, 0, NI_NAMEREQD);
- if (rc == 0)
- {
- struct addrinfo* pAI;
- struct addrinfo hints;
- std::memset(&hints, 0, sizeof(hints));
- hints.ai_flags = hintFlags;
-#if defined(POCO_HAVE_GETADDRINFO_A)
- int rc = GetAddrinfo::instance().getaddrinfo(fqname, NULL, &hints, &pAI, timeout_);
-#else
- int rc = getaddrinfo(fqname, NULL, &hints, &pAI);
-#endif
- if (rc == 0)
- {
- HostEntry result(pAI);
- freeaddrinfo(pAI);
- return result;
- }
- else
- {
- aierror(rc, address.toString());
- }
- }
- else
- {
- aierror(rc, address.toString());
- }
-#elif defined(POCO_VXWORKS)
- char name[MAXHOSTNAMELEN + 1];
- if (hostGetByAddr(*reinterpret_cast<const int*>(address.addr()), name) == OK)
- {
- return HostEntry(std::string(name), address);
- }
-#else
- struct hostent* he = gethostbyaddr(reinterpret_cast<const char*>(address.addr()), address.length(), address.af());
- if (he)
- {
- return HostEntry(he);
- }
-#endif
- int err = lastError();
- error(err, address.toString()); // will throw an appropriate exception
- throw NetException(); // to silence compiler
-}
-
-
-HostEntry DNS::resolve(const std::string& address)
-{
- IPAddress ip;
- if (IPAddress::tryParse(address, ip))
- {
- return hostByAddress(ip);
- }
- else if (isIDN(address))
- {
- std::string encoded = encodeIDN(address);
- return hostByName(encoded);
- }
- else
- {
- return hostByName(address);
- }
-}
-
-
-IPAddress DNS::resolveOne(const std::string& address)
-{
- const HostEntry& entry = resolve(address);
- if (!entry.addresses().empty())
- return entry.addresses()[0];
- else
- throw NoAddressFoundException(address);
-}
-
-
-HostEntry DNS::thisHost()
-{
- return hostByName(hostName());
-}
-
-
-void DNS::reload()
-{
-#if defined(POCO_HAVE_LIBRESOLV)
- Poco::ScopedWriteRWLock writeLock(resolverLock);
- res_init();
-#endif
-}
-
-
-std::string DNS::hostName()
-{
- char buffer[256];
- int rc = gethostname(buffer, sizeof(buffer));
- if (rc == 0)
- return std::string(buffer);
- else
- throw NetException("Cannot get host name");
-}
-
-
-bool DNS::isIDN(const std::string& hostname)
-{
- for (std::string::const_iterator it = hostname.begin(); it != hostname.end(); ++it)
- {
- if (static_cast<unsigned char>(*it) >= 0x80) return true;
- }
- return false;
-}
-
-
-bool DNS::isEncodedIDN(const std::string& hostname)
-{
- return hostname.compare(0, 4, "xn--") == 0 || hostname.find(".xn--") != std::string::npos;
-}
-
-
-std::string DNS::encodeIDN(const std::string& idn)
-{
- std::string encoded;
- std::string::const_iterator it = idn.begin();
- std::string::const_iterator end = idn.end();
- while (it != end)
- {
- std::string label;
- bool mustEncode = false;
- while (it != end && *it != '.')
- {
- if (static_cast<unsigned char>(*it) >= 0x80) mustEncode = true;
- label += *it++;
- }
- if (mustEncode)
- encoded += encodeIDNLabel(label);
- else
- encoded += label;
- if (it != end) encoded += *it++;
- }
- return encoded;
-}
-
-
-std::string DNS::decodeIDN(const std::string& encodedIDN)
-{
- std::string decoded;
- std::string::const_iterator it = encodedIDN.begin();
- std::string::const_iterator end = encodedIDN.end();
- while (it != end)
- {
- std::string label;
- while (it != end && *it != '.')
- {
- label += *it++;
- }
- decoded += decodeIDNLabel(label);
- if (it != end) decoded += *it++;
- }
- return decoded;
-}
-
-
-std::string DNS::encodeIDNLabel(const std::string& label)
-{
- std::string encoded = "xn--";
- std::vector<Poco::UInt32> uniLabel;
- Poco::UTF8Encoding utf8;
- Poco::TextIterator it(label, utf8);
- Poco::TextIterator end(label);
- while (it != end)
- {
- int ch = *it;
- if (ch < 0) throw DNSException("Invalid UTF-8 character in IDN label", label);
- if (Poco::Unicode::isUpper(ch))
- {
- ch = Poco::Unicode::toLower(ch);
- }
- uniLabel.push_back(static_cast<Poco::UInt32>(ch));
- ++it;
- }
- char buffer[64];
- std::size_t size = 64;
- int rc = punycode_encode(uniLabel.size(), &uniLabel[0], &size, buffer);
- if (rc == punycode_success)
- encoded.append(buffer, size);
- else
- throw DNSException("Failed to encode IDN label", label);
- return encoded;
-}
-
-
-std::string DNS::decodeIDNLabel(const std::string& encodedIDN)
-{
- std::string decoded;
- if (encodedIDN.compare(0, 4, "xn--") == 0)
- {
- std::size_t size = 64;
- punycode_uint buffer[64];
- int rc = punycode_decode(encodedIDN.size() - 4, encodedIDN.data() + 4, &size, buffer);
- if (rc == punycode_success)
- {
- Poco::UTF32Encoding utf32;
- Poco::UTF8Encoding utf8;
- Poco::TextConverter converter(utf32, utf8);
- converter.convert(buffer, static_cast<int>(size*sizeof(punycode_uint)), decoded);
- }
- else throw DNSException("Failed to decode IDN label: ", encodedIDN);
- }
- else
- {
- decoded = encodedIDN;
- }
- return decoded;
-}
-
-
-int DNS::lastError()
-{
-#if defined(_WIN32)
- return GetLastError();
-#elif defined(POCO_VXWORKS)
- return errno;
-#else
- return h_errno;
-#endif
-}
-
-
-void DNS::error(int code, const std::string& arg)
-{
- switch (code)
- {
- case POCO_ESYSNOTREADY:
- throw NetException("Net subsystem not ready");
- case POCO_ENOTINIT:
- throw NetException("Net subsystem not initialized");
- case POCO_HOST_NOT_FOUND:
- throw HostNotFoundException(arg);
- case POCO_TRY_AGAIN:
- throw DNSException("Temporary DNS error while resolving", arg);
- case POCO_NO_RECOVERY:
- throw DNSException("Non recoverable DNS error while resolving", arg);
- case POCO_NO_DATA:
- throw NoAddressFoundException(arg);
- default:
- throw IOException(NumberFormatter::format(code));
- }
-}
-
-
-void DNS::aierror(int code, const std::string& arg)
-{
-#if defined(POCO_HAVE_IPv6) || defined(POCO_HAVE_ADDRINFO)
- switch (code)
- {
- case EAI_AGAIN:
- throw DNSException("Temporary DNS error while resolving", arg);
- case EAI_FAIL:
- throw DNSException("Non recoverable DNS error while resolving", arg);
-#if !defined(_WIN32) // EAI_NODATA and EAI_NONAME have the same value
-#if defined(EAI_NODATA) // deprecated in favor of EAI_NONAME on FreeBSD
- case EAI_NODATA:
- throw NoAddressFoundException(arg);
-#endif
-#endif
- case EAI_NONAME:
- throw HostNotFoundException(arg);
-#if defined(EAI_SYSTEM)
- case EAI_SYSTEM:
- error(lastError(), arg);
- break;
-#endif
-#if defined(_WIN32)
- case WSANO_DATA: // may happen on XP
- throw HostNotFoundException(arg);
-#endif
- default:
-#if defined(POCO_HAVE_ADDRINFO)
- throw DNSException(gai_strerror(code), NumberFormatter::format(code), code);
-#else
- throw DNSException("EAI", NumberFormatter::format(code), code);
-#endif
- }
-#endif // POCO_HAVE_IPv6 || defined(POCO_HAVE_ADDRINFO)
-}
-
-
-/*
- Code copied from http://www.nicemice.net/idn/punycode-spec.gz on
- 2018-02-17 with SHA-1 a966a8017f6be579d74a50a226accc7607c40133
- labeled punycode-spec 1.0.3 (2006-Mar-23-Thu).
-
- Modified for POCO C++ Libraries by Guenter Obiltschnig.
-
- License on the original code:
-
- punycode-spec 1.0.3 (2006-Mar-23-Thu)
- http://www.nicemice.net/idn/
- Adam M. Costello
- http://www.nicemice.net/amc/
-
- B. Disclaimer and license
-
- Regarding this entire document or any portion of it (including
- the pseudocode and C code), the author makes no guarantees and
- is not responsible for any damage resulting from its use. The
- author grants irrevocable permission to anyone to use, modify,
- and distribute it in any way that does not diminish the rights
- of anyone else to use, modify, and distribute it, provided that
- redistributed derivative works do not contain misleading author or
- version information. Derivative works need not be licensed under
- similar terms.
-
- C. Punycode sample implementation
-
- punycode-sample.c 2.0.0 (2004-Mar-21-Sun)
- http://www.nicemice.net/idn/
- Adam M. Costello
- http://www.nicemice.net/amc/
-
- This is ANSI C code (C89) implementing Punycode 1.0.x.
-*/
-
-
-/*** Bootstring parameters for Punycode ***/
-
-enum
-{
- base = 36,
- tmin = 1,
- tmax = 26,
- skew = 38,
- damp = 700,
- initial_bias = 72,
- initial_n = 0x80,
- delimiter = 0x2D
-};
-
-/* basic(cp) tests whether cp is a basic code point: */
-#define basic(cp) ((punycode_uint)(cp) < 0x80)
-
-/* delim(cp) tests whether cp is a delimiter: */
-#define delim(cp) ((cp) == delimiter)
-
-/* encode_digit(d,flag) returns the basic code point whose value */
-/* (when used for representing integers) is d, which needs to be in */
-/* the range 0 to base-1. The lowercase form is used unless flag is */
-/* nonzero, in which case the uppercase form is used. The behavior */
-/* is undefined if flag is nonzero and digit d has no uppercase form. */
-
-static char encode_digit(punycode_uint d, int flag)
-{
- return static_cast<char>(d + 22 + 75 * (d < 26) - ((flag != 0) << 5));
- /* 0..25 map to ASCII a..z or A..Z */
- /* 26..35 map to ASCII 0..9 */
-}
-
-/* decode_digit(cp) returns the numeric value of a basic code */
-/* point (for use in representing integers) in the range 0 to */
-/* base-1, or base if cp does not represent a value. */
-
-static unsigned decode_digit(int cp)
-{
- return (unsigned) (cp - 48 < 10 ? cp - 22 : cp - 65 < 26 ? cp - 65 :
- cp - 97 < 26 ? cp - 97 : base);
-}
-
-/*** Platform-specific constants ***/
-
-/* maxint is the maximum value of a punycode_uint variable: */
-static const punycode_uint maxint = punycode_uint (-1);
-/* Because maxint is unsigned, -1 becomes the maximum value. */
-
-/*** Bias adaptation function ***/
-
-static punycode_uint adapt(punycode_uint delta, punycode_uint numpoints, int firsttime);
-
-static punycode_uint adapt(punycode_uint delta, punycode_uint numpoints, int firsttime)
-{
- punycode_uint k;
-
- delta = firsttime ? delta / damp : delta >> 1;
- /* delta >> 1 is a faster way of doing delta / 2 */
- delta += delta / numpoints;
-
- for (k = 0; delta > ((base - tmin) * tmax) / 2; k += base)
- {
- delta /= base - tmin;
- }
-
- return k + (base - tmin + 1) * delta / (delta + skew);
-}
-
-/*** Main encode function ***/
-
-int punycode_encode(size_t input_length_orig, const punycode_uint input[], size_t *output_length, char output[])
-{
- punycode_uint input_length, n, delta, h, b, bias, j, m, q, k, t;
- size_t out, max_out;
-
- /* The Punycode spec assumes that the input length is the same type */
- /* of integer as a code point, so we need to convert the size_t to */
- /* a punycode_uint, which could overflow. */
-
- if (input_length_orig > maxint) return punycode_overflow;
- input_length = (punycode_uint) input_length_orig;
-
- /* Initialize the state: */
-
- n = initial_n;
- delta = 0;
- out = 0;
- max_out = *output_length;
- bias = initial_bias;
-
- /* Handle the basic code points: */
-
- for (j = 0; j < input_length; ++j)
- {
- if (basic(input[j]))
- {
- if (max_out - out < 2) return punycode_big_output;
- output[out++] = (char) input[j];
- }
- /* else if (input[j] < n) return punycode_bad_input; */
- /* (not needed for Punycode with unsigned code points) */
- }
-
- h = b = (punycode_uint) out;
- /* cannot overflow because out <= input_length <= maxint */
-
- /* h is the number of code points that have been handled, b is the */
- /* number of basic code points, and out is the number of ASCII code */
- /* points that have been output. */
-
- if (b > 0) output[out++] = delimiter;
-
- /* Main encoding loop: */
-
- while (h < input_length)
- {
- /* All non-basic code points < n have been */
- /* handled already. Find the next larger one: */
-
- for (m = maxint, j = 0; j < input_length; ++j)
- {
- /* if (basic(input[j])) continue; */
- /* (not needed for Punycode) */
- if (input[j] >= n && input[j] < m) m = input[j];
- }
-
- /* Increase delta enough to advance the decoder's */
- /* <n,i> state to <m,0>, but guard against overflow: */
-
- if (m - n > (maxint - delta) / (h + 1)) return punycode_overflow;
- delta += (m - n) * (h + 1);
- n = m;
-
- for (j = 0; j < input_length; ++j)
- {
- /* Punycode does not need to check whether input[j] is basic: */
- if (input[j] < n /* || basic(input[j]) */ )
- {
- if (++delta == 0) return punycode_overflow;
- }
-
- if (input[j] == n)
- {
- /* Represent delta as a generalized variable-length integer: */
-
- for (q = delta, k = base; ; k += base)
- {
- if (out >= max_out) return punycode_big_output;
- t = k <= bias /* + tmin */ ? tmin : /* +tmin not needed */
- k >= bias + tmax ? tmax : k - bias;
- if (q < t) break;
- output[out++] = encode_digit(t + (q - t) % (base - t), 0);
- q = (q - t) / (base - t);
- }
-
- output[out++] = encode_digit(q, 0);
- bias = adapt(delta, h + 1, h == b);
- delta = 0;
- ++h;
- }
- }
-
- ++delta, ++n;
- }
-
- *output_length = out;
- return punycode_success;
-}
-
-/*** Main decode function ***/
-
-int punycode_decode(size_t input_length, const char input[], size_t *output_length, punycode_uint output[])
-{
- punycode_uint n, out, i, max_out, bias, oldi, w, k, digit, t;
- size_t b, j, in;
-
- /* Initialize the state: */
-
- n = initial_n;
- out = i = 0;
- max_out = *output_length > maxint ? maxint : (punycode_uint) *output_length;
- bias = initial_bias;
-
- /* Handle the basic code points: Let b be the number of input code */
- /* points before the last delimiter, or 0 if there is none, then */
- /* copy the first b code points to the output. */
-
- for (b = j = 0; j < input_length; ++j)
- {
- if (delim(input[j])) b = j;
- }
- if (b > max_out) return punycode_big_output;
-
- for (j = 0; j < b; ++j)
- {
- if (!basic(input[j])) return punycode_bad_input;
- output[out++] = input[j];
- }
-
- /* Main decoding loop: Start just after the last delimiter if any */
- /* basic code points were copied; start at the beginning otherwise. */
-
- for (in = b > 0 ? b + 1 : 0; in < input_length; ++out)
- {
- /* in is the index of the next ASCII code point to be consumed, */
- /* and out is the number of code points in the output array. */
-
- /* Decode a generalized variable-length integer into delta, */
- /* which gets added to i. The overflow checking is easier */
- /* if we increase i as we go, then subtract off its starting */
- /* value at the end to obtain delta. */
-
- for (oldi = i, w = 1, k = base; ; k += base)
- {
- if (in >= input_length) return punycode_bad_input;
- digit = decode_digit(input[in++]);
- if (digit >= base) return punycode_bad_input;
- if (digit > (maxint - i) / w) return punycode_overflow;
- i += digit * w;
- t = k <= bias /* + tmin */ ? tmin : /* +tmin not needed */
- k >= bias + tmax ? tmax : k - bias;
- if (digit < t) break;
- if (w > maxint / (base - t)) return punycode_overflow;
- w *= (base - t);
- }
-
- bias = adapt(i - oldi, out + 1, oldi == 0);
-
- /* i was supposed to wrap around from out+1 to 0, */
- /* incrementing n each time, so we'll fix that now: */
-
- if (i / (out + 1) > maxint - n) return punycode_overflow;
- n += i / (out + 1);
- i %= (out + 1);
-
- /* Insert n at position i of the output: */
-
- /* not needed for Punycode: */
- /* if (basic(n)) return punycode_bad_input; */
- if (out >= max_out) return punycode_big_output;
-
- std::memmove(output + i + 1, output + i, (out - i) * sizeof *output);
- output[i++] = n;
- }
-
- *output_length = (size_t) out;
- /* cannot overflow because out <= old value of *output_length */
- return punycode_success;
-}
-
-
-} } // namespace Poco::Net
+//
+// DNS.cpp
+//
+// Library: Net
+// Package: NetCore
+// Module: DNS
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/DNS.h"
+#include "Poco/Net/NetException.h"
+#include "Poco/Net/SocketAddress.h"
+#include "Poco/Environment.h"
+#include "Poco/NumberFormatter.h"
+#include "Poco/RWLock.h"
+#include "Poco/TextIterator.h"
+#include "Poco/TextConverter.h"
+#include "Poco/UTF8Encoding.h"
+#include "Poco/UTF32Encoding.h"
+#include "Poco/Unicode.h"
+#include "Poco/Timespan.h"
+#include "Poco/Mutex.h"
+#include <cstring>
+#include <list>
+#include <atomic>
+
+
+#if defined(POCO_HAVE_LIBRESOLV)
+#include <resolv.h>
+#endif
+
+
+/// set default DNS timeout to 60 seconds
+const Poco::Timespan Poco::Net::DNS::DEFAULT_DNS_TIMEOUT = Poco::Timespan(60, 0);
+
+#if defined(POCO_HAVE_GETADDRINFO_A)
+/** getaddrinfo иногда работает бесконечно долго.
+ * Этот код использует getaddrinfo_a c некоторым таймаутом.
+ *
+ * При выполнении в один поток производительность ниже на 30%
+ * При выполнении запросов в 4 потока производительность отличается
+ * иногда в лучшую иногда в худшую сторону на ~10-20%
+ */
+class GetAddrinfo
+{
+public:
+ static GetAddrinfo & instance()
+ {
+ static GetAddrinfo impl;
+ return impl;
+ }
+
+ int getaddrinfo(const char * name,
+ const char * service,
+ const struct addrinfo * hints,
+ struct addrinfo ** pai,
+ const Poco::Timespan * timeout_);
+
+ size_t requestsNum()
+ {
+ Poco::ScopedLock<Poco::FastMutex> lock(mutex);
+ return requests.size();
+ }
+
+private:
+ GetAddrinfo() {}
+
+ GetAddrinfo(const GetAddrinfo &) = delete;
+ const GetAddrinfo & operator=(const GetAddrinfo &) = delete;
+
+ void releaseUnused()
+ {
+ for (auto it = requests.rbegin(); it != requests.rend();)
+ {
+ /// don't delete if structure is used by other thread or by internal cycle of getaddrinfo
+ if (it->unused && gai_error(&(*it)) != EAI_INPROGRESS)
+ {
+ free(const_cast<char *>(it->ar_name));
+ it->ar_name = nullptr;
+ free(const_cast<char *>(it->ar_service));
+ it->ar_service = nullptr;
+ free(const_cast<addrinfo *>(it->ar_request));
+ it->ar_request = nullptr;
+ freeaddrinfo(it->ar_result);
+ it->ar_result = nullptr;
+
+ auto it_to_delete = --(it.base());
+
+ it = decltype(it)(requests.erase(it_to_delete));
+ }
+ else
+ break;
+ }
+ }
+
+ void addOne(const char * name,
+ const char * service,
+ const struct addrinfo * hints)
+ {
+ requests.emplace_back();
+
+ auto & request = requests.back();
+
+ request.ar_name = name ? strdup(name) : nullptr;
+ request.ar_service = service ? strdup(service) : nullptr;
+
+ addrinfo * my_hints = nullptr;
+ if (hints)
+ {
+ /// only ai_flags are used in Poco
+ my_hints = (addrinfo *)calloc(1, sizeof(addrinfo));
+ my_hints->ai_flags = hints->ai_flags;
+ }
+ request.ar_request = my_hints;
+
+ request.ar_result = nullptr;
+ }
+
+private:
+ struct gaicb_ext : public gaicb
+ {
+ gaicb_ext()
+ {
+ memset(this, 0, sizeof(gaicb_ext));
+ }
+
+ ~gaicb_ext()
+ {
+ if (gai_error(this) != EAI_INPROGRESS)
+ {
+ free(const_cast<char *>(ar_name));
+ free(const_cast<char *>(ar_service));
+ free(const_cast<addrinfo *>(ar_request));
+
+ freeaddrinfo(ar_result);
+ }
+ }
+
+ std::atomic<bool> unused {false};
+ };
+
+ std::list<gaicb_ext> requests;
+
+ Poco::FastMutex mutex;
+};
+
+int GetAddrinfo::getaddrinfo(const char * name,
+ const char * service,
+ const struct addrinfo * hints,
+ struct addrinfo ** pai,
+ const Poco::Timespan * timeout_)
+{
+ if (timeout_)
+ {
+ timespec timeout;
+ timeout.tv_sec = timeout_->totalSeconds();
+ timeout.tv_nsec = timeout_->microseconds() * 1000;
+
+ gaicb_ext * request_ext_ptr = nullptr;
+ {
+ Poco::ScopedLock<Poco::FastMutex> lock(mutex);
+ addOne(name, service, hints);
+ request_ext_ptr = &requests.back();
+ }
+ gaicb * request_ptr = request_ext_ptr;
+
+ int code = getaddrinfo_a(GAI_NOWAIT, &request_ptr, 1, nullptr);
+
+ if (!code)
+ {
+ gai_suspend(&request_ptr, 1, &timeout);
+
+ *pai = request_ext_ptr->ar_result;
+ /// prevent deleting result in dctor
+ request_ext_ptr->ar_result = nullptr;
+
+ code = gai_error(request_ext_ptr);
+ }
+
+ request_ext_ptr->unused = true;
+
+ {
+ Poco::ScopedLock<Poco::FastMutex> lock(mutex);
+ releaseUnused();
+ }
+
+ return code;
+ }
+ else
+ {
+ return ::getaddrinfo(name, service, hints, pai);
+ }
+}
+#endif
+
+
+using Poco::Environment;
+using Poco::NumberFormatter;
+using Poco::IOException;
+
+
+namespace Poco {
+namespace Net {
+
+
+typedef Poco::UInt32 punycode_uint;
+
+
+enum
+{
+ punycode_success = 0,
+ punycode_overflow = -1,
+ punycode_big_output = -2,
+ punycode_bad_input = -3
+};
+
+
+static int punycode_encode(size_t input_length, const punycode_uint input[], size_t* output_length, char output[]);
+static int punycode_decode(size_t input_length, const char input[], size_t* output_length, punycode_uint output[]);
+
+
+#if defined(POCO_HAVE_LIBRESOLV)
+static Poco::RWLock resolverLock;
+#endif
+
+
+HostEntry DNS::hostByName(const std::string& hostname, const Poco::Timespan * timeout_, unsigned
+#ifdef POCO_HAVE_ADDRINFO
+ hintFlags
+#endif
+ )
+{
+#if defined(POCO_HAVE_LIBRESOLV)
+ Poco::ScopedReadRWLock readLock(resolverLock);
+#endif
+
+#if defined(POCO_HAVE_ADDRINFO)
+ struct addrinfo* pAI;
+ struct addrinfo hints;
+ std::memset(&hints, 0, sizeof(hints));
+ hints.ai_flags = hintFlags;
+#if defined(POCO_HAVE_GETADDRINFO_A)
+ int rc = GetAddrinfo::instance().getaddrinfo(hostname.c_str(), NULL, &hints, &pAI, timeout_);
+#else
+ int rc = getaddrinfo(hostname.c_str(), NULL, &hints, &pAI);
+#endif
+ if (rc == 0)
+ {
+ HostEntry result(pAI);
+ freeaddrinfo(pAI);
+ return result;
+ }
+ else
+ {
+ aierror(rc, hostname);
+ }
+#elif defined(POCO_VXWORKS)
+ int addr = hostGetByName(const_cast<char*>(hostname.c_str()));
+ if (addr != ERROR)
+ {
+ return HostEntry(hostname, IPAddress(&addr, sizeof(addr)));
+ }
+#else
+ struct hostent* he = gethostbyname(hostname.c_str());
+ if (he)
+ {
+ return HostEntry(he);
+ }
+#endif
+ error(lastError(), hostname); // will throw an appropriate exception
+ throw NetException(); // to silence compiler
+}
+
+
+HostEntry DNS::hostByAddress(const IPAddress& address, const Poco::Timespan * timeout_, unsigned
+#ifdef POCO_HAVE_ADDRINFO
+ hintFlags
+#endif
+ )
+{
+#if defined(POCO_HAVE_LIBRESOLV)
+ Poco::ScopedReadRWLock readLock(resolverLock);
+#endif
+
+#if defined(POCO_HAVE_ADDRINFO)
+ SocketAddress sa(address, 0);
+ static char fqname[1024];
+ int rc = getnameinfo(sa.addr(), sa.length(), fqname, sizeof(fqname), NULL, 0, NI_NAMEREQD);
+ if (rc == 0)
+ {
+ struct addrinfo* pAI;
+ struct addrinfo hints;
+ std::memset(&hints, 0, sizeof(hints));
+ hints.ai_flags = hintFlags;
+#if defined(POCO_HAVE_GETADDRINFO_A)
+ int rc = GetAddrinfo::instance().getaddrinfo(fqname, NULL, &hints, &pAI, timeout_);
+#else
+ int rc = getaddrinfo(fqname, NULL, &hints, &pAI);
+#endif
+ if (rc == 0)
+ {
+ HostEntry result(pAI);
+ freeaddrinfo(pAI);
+ return result;
+ }
+ else
+ {
+ aierror(rc, address.toString());
+ }
+ }
+ else
+ {
+ aierror(rc, address.toString());
+ }
+#elif defined(POCO_VXWORKS)
+ char name[MAXHOSTNAMELEN + 1];
+ if (hostGetByAddr(*reinterpret_cast<const int*>(address.addr()), name) == OK)
+ {
+ return HostEntry(std::string(name), address);
+ }
+#else
+ struct hostent* he = gethostbyaddr(reinterpret_cast<const char*>(address.addr()), address.length(), address.af());
+ if (he)
+ {
+ return HostEntry(he);
+ }
+#endif
+ int err = lastError();
+ error(err, address.toString()); // will throw an appropriate exception
+ throw NetException(); // to silence compiler
+}
+
+
+HostEntry DNS::resolve(const std::string& address)
+{
+ IPAddress ip;
+ if (IPAddress::tryParse(address, ip))
+ {
+ return hostByAddress(ip);
+ }
+ else if (isIDN(address))
+ {
+ std::string encoded = encodeIDN(address);
+ return hostByName(encoded);
+ }
+ else
+ {
+ return hostByName(address);
+ }
+}
+
+
+IPAddress DNS::resolveOne(const std::string& address)
+{
+ const HostEntry& entry = resolve(address);
+ if (!entry.addresses().empty())
+ return entry.addresses()[0];
+ else
+ throw NoAddressFoundException(address);
+}
+
+
+HostEntry DNS::thisHost()
+{
+ return hostByName(hostName());
+}
+
+
+void DNS::reload()
+{
+#if defined(POCO_HAVE_LIBRESOLV)
+ Poco::ScopedWriteRWLock writeLock(resolverLock);
+ res_init();
+#endif
+}
+
+
+std::string DNS::hostName()
+{
+ char buffer[256];
+ int rc = gethostname(buffer, sizeof(buffer));
+ if (rc == 0)
+ return std::string(buffer);
+ else
+ throw NetException("Cannot get host name");
+}
+
+
+bool DNS::isIDN(const std::string& hostname)
+{
+ for (std::string::const_iterator it = hostname.begin(); it != hostname.end(); ++it)
+ {
+ if (static_cast<unsigned char>(*it) >= 0x80) return true;
+ }
+ return false;
+}
+
+
+bool DNS::isEncodedIDN(const std::string& hostname)
+{
+ return hostname.compare(0, 4, "xn--") == 0 || hostname.find(".xn--") != std::string::npos;
+}
+
+
+std::string DNS::encodeIDN(const std::string& idn)
+{
+ std::string encoded;
+ std::string::const_iterator it = idn.begin();
+ std::string::const_iterator end = idn.end();
+ while (it != end)
+ {
+ std::string label;
+ bool mustEncode = false;
+ while (it != end && *it != '.')
+ {
+ if (static_cast<unsigned char>(*it) >= 0x80) mustEncode = true;
+ label += *it++;
+ }
+ if (mustEncode)
+ encoded += encodeIDNLabel(label);
+ else
+ encoded += label;
+ if (it != end) encoded += *it++;
+ }
+ return encoded;
+}
+
+
+std::string DNS::decodeIDN(const std::string& encodedIDN)
+{
+ std::string decoded;
+ std::string::const_iterator it = encodedIDN.begin();
+ std::string::const_iterator end = encodedIDN.end();
+ while (it != end)
+ {
+ std::string label;
+ while (it != end && *it != '.')
+ {
+ label += *it++;
+ }
+ decoded += decodeIDNLabel(label);
+ if (it != end) decoded += *it++;
+ }
+ return decoded;
+}
+
+
+std::string DNS::encodeIDNLabel(const std::string& label)
+{
+ std::string encoded = "xn--";
+ std::vector<Poco::UInt32> uniLabel;
+ Poco::UTF8Encoding utf8;
+ Poco::TextIterator it(label, utf8);
+ Poco::TextIterator end(label);
+ while (it != end)
+ {
+ int ch = *it;
+ if (ch < 0) throw DNSException("Invalid UTF-8 character in IDN label", label);
+ if (Poco::Unicode::isUpper(ch))
+ {
+ ch = Poco::Unicode::toLower(ch);
+ }
+ uniLabel.push_back(static_cast<Poco::UInt32>(ch));
+ ++it;
+ }
+ char buffer[64];
+ std::size_t size = 64;
+ int rc = punycode_encode(uniLabel.size(), &uniLabel[0], &size, buffer);
+ if (rc == punycode_success)
+ encoded.append(buffer, size);
+ else
+ throw DNSException("Failed to encode IDN label", label);
+ return encoded;
+}
+
+
+std::string DNS::decodeIDNLabel(const std::string& encodedIDN)
+{
+ std::string decoded;
+ if (encodedIDN.compare(0, 4, "xn--") == 0)
+ {
+ std::size_t size = 64;
+ punycode_uint buffer[64];
+ int rc = punycode_decode(encodedIDN.size() - 4, encodedIDN.data() + 4, &size, buffer);
+ if (rc == punycode_success)
+ {
+ Poco::UTF32Encoding utf32;
+ Poco::UTF8Encoding utf8;
+ Poco::TextConverter converter(utf32, utf8);
+ converter.convert(buffer, static_cast<int>(size*sizeof(punycode_uint)), decoded);
+ }
+ else throw DNSException("Failed to decode IDN label: ", encodedIDN);
+ }
+ else
+ {
+ decoded = encodedIDN;
+ }
+ return decoded;
+}
+
+
+int DNS::lastError()
+{
+#if defined(_WIN32)
+ return GetLastError();
+#elif defined(POCO_VXWORKS)
+ return errno;
+#else
+ return h_errno;
+#endif
+}
+
+
+void DNS::error(int code, const std::string& arg)
+{
+ switch (code)
+ {
+ case POCO_ESYSNOTREADY:
+ throw NetException("Net subsystem not ready");
+ case POCO_ENOTINIT:
+ throw NetException("Net subsystem not initialized");
+ case POCO_HOST_NOT_FOUND:
+ throw HostNotFoundException(arg);
+ case POCO_TRY_AGAIN:
+ throw DNSException("Temporary DNS error while resolving", arg);
+ case POCO_NO_RECOVERY:
+ throw DNSException("Non recoverable DNS error while resolving", arg);
+ case POCO_NO_DATA:
+ throw NoAddressFoundException(arg);
+ default:
+ throw IOException(NumberFormatter::format(code));
+ }
+}
+
+
+void DNS::aierror(int code, const std::string& arg)
+{
+#if defined(POCO_HAVE_IPv6) || defined(POCO_HAVE_ADDRINFO)
+ switch (code)
+ {
+ case EAI_AGAIN:
+ throw DNSException("Temporary DNS error while resolving", arg);
+ case EAI_FAIL:
+ throw DNSException("Non recoverable DNS error while resolving", arg);
+#if !defined(_WIN32) // EAI_NODATA and EAI_NONAME have the same value
+#if defined(EAI_NODATA) // deprecated in favor of EAI_NONAME on FreeBSD
+ case EAI_NODATA:
+ throw NoAddressFoundException(arg);
+#endif
+#endif
+ case EAI_NONAME:
+ throw HostNotFoundException(arg);
+#if defined(EAI_SYSTEM)
+ case EAI_SYSTEM:
+ error(lastError(), arg);
+ break;
+#endif
+#if defined(_WIN32)
+ case WSANO_DATA: // may happen on XP
+ throw HostNotFoundException(arg);
+#endif
+ default:
+#if defined(POCO_HAVE_ADDRINFO)
+ throw DNSException(gai_strerror(code), NumberFormatter::format(code), code);
+#else
+ throw DNSException("EAI", NumberFormatter::format(code), code);
+#endif
+ }
+#endif // POCO_HAVE_IPv6 || defined(POCO_HAVE_ADDRINFO)
+}
+
+
+/*
+ Code copied from http://www.nicemice.net/idn/punycode-spec.gz on
+ 2018-02-17 with SHA-1 a966a8017f6be579d74a50a226accc7607c40133
+ labeled punycode-spec 1.0.3 (2006-Mar-23-Thu).
+
+ Modified for POCO C++ Libraries by Guenter Obiltschnig.
+
+ License on the original code:
+
+ punycode-spec 1.0.3 (2006-Mar-23-Thu)
+ http://www.nicemice.net/idn/
+ Adam M. Costello
+ http://www.nicemice.net/amc/
+
+ B. Disclaimer and license
+
+ Regarding this entire document or any portion of it (including
+ the pseudocode and C code), the author makes no guarantees and
+ is not responsible for any damage resulting from its use. The
+ author grants irrevocable permission to anyone to use, modify,
+ and distribute it in any way that does not diminish the rights
+ of anyone else to use, modify, and distribute it, provided that
+ redistributed derivative works do not contain misleading author or
+ version information. Derivative works need not be licensed under
+ similar terms.
+
+ C. Punycode sample implementation
+
+ punycode-sample.c 2.0.0 (2004-Mar-21-Sun)
+ http://www.nicemice.net/idn/
+ Adam M. Costello
+ http://www.nicemice.net/amc/
+
+ This is ANSI C code (C89) implementing Punycode 1.0.x.
+*/
+
+
+/*** Bootstring parameters for Punycode ***/
+
+enum
+{
+ base = 36,
+ tmin = 1,
+ tmax = 26,
+ skew = 38,
+ damp = 700,
+ initial_bias = 72,
+ initial_n = 0x80,
+ delimiter = 0x2D
+};
+
+/* basic(cp) tests whether cp is a basic code point: */
+#define basic(cp) ((punycode_uint)(cp) < 0x80)
+
+/* delim(cp) tests whether cp is a delimiter: */
+#define delim(cp) ((cp) == delimiter)
+
+/* encode_digit(d,flag) returns the basic code point whose value */
+/* (when used for representing integers) is d, which needs to be in */
+/* the range 0 to base-1. The lowercase form is used unless flag is */
+/* nonzero, in which case the uppercase form is used. The behavior */
+/* is undefined if flag is nonzero and digit d has no uppercase form. */
+
+static char encode_digit(punycode_uint d, int flag)
+{
+ return static_cast<char>(d + 22 + 75 * (d < 26) - ((flag != 0) << 5));
+ /* 0..25 map to ASCII a..z or A..Z */
+ /* 26..35 map to ASCII 0..9 */
+}
+
+/* decode_digit(cp) returns the numeric value of a basic code */
+/* point (for use in representing integers) in the range 0 to */
+/* base-1, or base if cp does not represent a value. */
+
+static unsigned decode_digit(int cp)
+{
+ return (unsigned) (cp - 48 < 10 ? cp - 22 : cp - 65 < 26 ? cp - 65 :
+ cp - 97 < 26 ? cp - 97 : base);
+}
+
+/*** Platform-specific constants ***/
+
+/* maxint is the maximum value of a punycode_uint variable: */
+static const punycode_uint maxint = punycode_uint (-1);
+/* Because maxint is unsigned, -1 becomes the maximum value. */
+
+/*** Bias adaptation function ***/
+
+static punycode_uint adapt(punycode_uint delta, punycode_uint numpoints, int firsttime);
+
+static punycode_uint adapt(punycode_uint delta, punycode_uint numpoints, int firsttime)
+{
+ punycode_uint k;
+
+ delta = firsttime ? delta / damp : delta >> 1;
+ /* delta >> 1 is a faster way of doing delta / 2 */
+ delta += delta / numpoints;
+
+ for (k = 0; delta > ((base - tmin) * tmax) / 2; k += base)
+ {
+ delta /= base - tmin;
+ }
+
+ return k + (base - tmin + 1) * delta / (delta + skew);
+}
+
+/*** Main encode function ***/
+
+int punycode_encode(size_t input_length_orig, const punycode_uint input[], size_t *output_length, char output[])
+{
+ punycode_uint input_length, n, delta, h, b, bias, j, m, q, k, t;
+ size_t out, max_out;
+
+ /* The Punycode spec assumes that the input length is the same type */
+ /* of integer as a code point, so we need to convert the size_t to */
+ /* a punycode_uint, which could overflow. */
+
+ if (input_length_orig > maxint) return punycode_overflow;
+ input_length = (punycode_uint) input_length_orig;
+
+ /* Initialize the state: */
+
+ n = initial_n;
+ delta = 0;
+ out = 0;
+ max_out = *output_length;
+ bias = initial_bias;
+
+ /* Handle the basic code points: */
+
+ for (j = 0; j < input_length; ++j)
+ {
+ if (basic(input[j]))
+ {
+ if (max_out - out < 2) return punycode_big_output;
+ output[out++] = (char) input[j];
+ }
+ /* else if (input[j] < n) return punycode_bad_input; */
+ /* (not needed for Punycode with unsigned code points) */
+ }
+
+ h = b = (punycode_uint) out;
+ /* cannot overflow because out <= input_length <= maxint */
+
+ /* h is the number of code points that have been handled, b is the */
+ /* number of basic code points, and out is the number of ASCII code */
+ /* points that have been output. */
+
+ if (b > 0) output[out++] = delimiter;
+
+ /* Main encoding loop: */
+
+ while (h < input_length)
+ {
+ /* All non-basic code points < n have been */
+ /* handled already. Find the next larger one: */
+
+ for (m = maxint, j = 0; j < input_length; ++j)
+ {
+ /* if (basic(input[j])) continue; */
+ /* (not needed for Punycode) */
+ if (input[j] >= n && input[j] < m) m = input[j];
+ }
+
+ /* Increase delta enough to advance the decoder's */
+ /* <n,i> state to <m,0>, but guard against overflow: */
+
+ if (m - n > (maxint - delta) / (h + 1)) return punycode_overflow;
+ delta += (m - n) * (h + 1);
+ n = m;
+
+ for (j = 0; j < input_length; ++j)
+ {
+ /* Punycode does not need to check whether input[j] is basic: */
+ if (input[j] < n /* || basic(input[j]) */ )
+ {
+ if (++delta == 0) return punycode_overflow;
+ }
+
+ if (input[j] == n)
+ {
+ /* Represent delta as a generalized variable-length integer: */
+
+ for (q = delta, k = base; ; k += base)
+ {
+ if (out >= max_out) return punycode_big_output;
+ t = k <= bias /* + tmin */ ? tmin : /* +tmin not needed */
+ k >= bias + tmax ? tmax : k - bias;
+ if (q < t) break;
+ output[out++] = encode_digit(t + (q - t) % (base - t), 0);
+ q = (q - t) / (base - t);
+ }
+
+ output[out++] = encode_digit(q, 0);
+ bias = adapt(delta, h + 1, h == b);
+ delta = 0;
+ ++h;
+ }
+ }
+
+ ++delta, ++n;
+ }
+
+ *output_length = out;
+ return punycode_success;
+}
+
+/*** Main decode function ***/
+
+int punycode_decode(size_t input_length, const char input[], size_t *output_length, punycode_uint output[])
+{
+ punycode_uint n, out, i, max_out, bias, oldi, w, k, digit, t;
+ size_t b, j, in;
+
+ /* Initialize the state: */
+
+ n = initial_n;
+ out = i = 0;
+ max_out = *output_length > maxint ? maxint : (punycode_uint) *output_length;
+ bias = initial_bias;
+
+ /* Handle the basic code points: Let b be the number of input code */
+ /* points before the last delimiter, or 0 if there is none, then */
+ /* copy the first b code points to the output. */
+
+ for (b = j = 0; j < input_length; ++j)
+ {
+ if (delim(input[j])) b = j;
+ }
+ if (b > max_out) return punycode_big_output;
+
+ for (j = 0; j < b; ++j)
+ {
+ if (!basic(input[j])) return punycode_bad_input;
+ output[out++] = input[j];
+ }
+
+ /* Main decoding loop: Start just after the last delimiter if any */
+ /* basic code points were copied; start at the beginning otherwise. */
+
+ for (in = b > 0 ? b + 1 : 0; in < input_length; ++out)
+ {
+ /* in is the index of the next ASCII code point to be consumed, */
+ /* and out is the number of code points in the output array. */
+
+ /* Decode a generalized variable-length integer into delta, */
+ /* which gets added to i. The overflow checking is easier */
+ /* if we increase i as we go, then subtract off its starting */
+ /* value at the end to obtain delta. */
+
+ for (oldi = i, w = 1, k = base; ; k += base)
+ {
+ if (in >= input_length) return punycode_bad_input;
+ digit = decode_digit(input[in++]);
+ if (digit >= base) return punycode_bad_input;
+ if (digit > (maxint - i) / w) return punycode_overflow;
+ i += digit * w;
+ t = k <= bias /* + tmin */ ? tmin : /* +tmin not needed */
+ k >= bias + tmax ? tmax : k - bias;
+ if (digit < t) break;
+ if (w > maxint / (base - t)) return punycode_overflow;
+ w *= (base - t);
+ }
+
+ bias = adapt(i - oldi, out + 1, oldi == 0);
+
+ /* i was supposed to wrap around from out+1 to 0, */
+ /* incrementing n each time, so we'll fix that now: */
+
+ if (i / (out + 1) > maxint - n) return punycode_overflow;
+ n += i / (out + 1);
+ i %= (out + 1);
+
+ /* Insert n at position i of the output: */
+
+ /* not needed for Punycode: */
+ /* if (basic(n)) return punycode_bad_input; */
+ if (out >= max_out) return punycode_big_output;
+
+ std::memmove(output + i + 1, output + i, (out - i) * sizeof *output);
+ output[i++] = n;
+ }
+
+ *output_length = (size_t) out;
+ /* cannot overflow because out <= old value of *output_length */
+ return punycode_success;
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/DatagramSocket.cpp b/contrib/libs/poco/Net/src/DatagramSocket.cpp
index 2e0a6d1e1d..8d7cc92e3e 100644
--- a/contrib/libs/poco/Net/src/DatagramSocket.cpp
+++ b/contrib/libs/poco/Net/src/DatagramSocket.cpp
@@ -1,114 +1,114 @@
-//
-// DatagramSocket.cpp
-//
-// Library: Net
-// Package: Sockets
-// Module: DatagramSocket
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/DatagramSocket.h"
-#include "Poco/Net/DatagramSocketImpl.h"
-#include "Poco/Exception.h"
-
-
-using Poco::InvalidArgumentException;
-
-
-namespace Poco {
-namespace Net {
-
-
-DatagramSocket::DatagramSocket(): Socket(new DatagramSocketImpl)
-{
-}
-
-
-DatagramSocket::DatagramSocket(SocketAddress::Family family): Socket(new DatagramSocketImpl(family))
-{
-}
-
-
-DatagramSocket::DatagramSocket(const SocketAddress& address, bool reuseAddress): Socket(new DatagramSocketImpl(address.family()))
-{
- bind(address, reuseAddress);
-}
-
-
-DatagramSocket::DatagramSocket(const Socket& socket): Socket(socket)
-{
- if (!dynamic_cast<DatagramSocketImpl*>(impl()))
- throw InvalidArgumentException("Cannot assign incompatible socket");
-}
-
-
-DatagramSocket::DatagramSocket(SocketImpl* pImpl): Socket(pImpl)
-{
- if (!dynamic_cast<DatagramSocketImpl*>(impl()))
- throw InvalidArgumentException("Cannot assign incompatible socket");
-}
-
-
-DatagramSocket::~DatagramSocket()
-{
-}
-
-
-DatagramSocket& DatagramSocket::operator = (const Socket& socket)
-{
- if (dynamic_cast<DatagramSocketImpl*>(socket.impl()))
- Socket::operator = (socket);
- else
- throw InvalidArgumentException("Cannot assign incompatible socket");
- return *this;
-}
-
-
-void DatagramSocket::connect(const SocketAddress& address)
-{
- impl()->connect(address);
-}
-
-
-void DatagramSocket::bind(const SocketAddress& address, bool reuseAddress)
-{
- impl()->bind(address, reuseAddress);
-}
-
-
-void DatagramSocket::bind(const SocketAddress& address, bool reuseAddress, bool reusePort)
-{
- impl()->bind(address, reuseAddress, reusePort);
-}
-
-
-int DatagramSocket::sendBytes(const void* buffer, int length, int flags)
-{
- return impl()->sendBytes(buffer, length, flags);
-}
-
-
-int DatagramSocket::receiveBytes(void* buffer, int length, int flags)
-{
- return impl()->receiveBytes(buffer, length, flags);
-}
-
-
-int DatagramSocket::sendTo(const void* buffer, int length, const SocketAddress& address, int flags)
-{
- return impl()->sendTo(buffer, length, address, flags);
-}
-
-
-int DatagramSocket::receiveFrom(void* buffer, int length, SocketAddress& address, int flags)
-{
- return impl()->receiveFrom(buffer, length, address, flags);
-}
-
-
-} } // namespace Poco::Net
+//
+// DatagramSocket.cpp
+//
+// Library: Net
+// Package: Sockets
+// Module: DatagramSocket
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/DatagramSocket.h"
+#include "Poco/Net/DatagramSocketImpl.h"
+#include "Poco/Exception.h"
+
+
+using Poco::InvalidArgumentException;
+
+
+namespace Poco {
+namespace Net {
+
+
+DatagramSocket::DatagramSocket(): Socket(new DatagramSocketImpl)
+{
+}
+
+
+DatagramSocket::DatagramSocket(SocketAddress::Family family): Socket(new DatagramSocketImpl(family))
+{
+}
+
+
+DatagramSocket::DatagramSocket(const SocketAddress& address, bool reuseAddress): Socket(new DatagramSocketImpl(address.family()))
+{
+ bind(address, reuseAddress);
+}
+
+
+DatagramSocket::DatagramSocket(const Socket& socket): Socket(socket)
+{
+ if (!dynamic_cast<DatagramSocketImpl*>(impl()))
+ throw InvalidArgumentException("Cannot assign incompatible socket");
+}
+
+
+DatagramSocket::DatagramSocket(SocketImpl* pImpl): Socket(pImpl)
+{
+ if (!dynamic_cast<DatagramSocketImpl*>(impl()))
+ throw InvalidArgumentException("Cannot assign incompatible socket");
+}
+
+
+DatagramSocket::~DatagramSocket()
+{
+}
+
+
+DatagramSocket& DatagramSocket::operator = (const Socket& socket)
+{
+ if (dynamic_cast<DatagramSocketImpl*>(socket.impl()))
+ Socket::operator = (socket);
+ else
+ throw InvalidArgumentException("Cannot assign incompatible socket");
+ return *this;
+}
+
+
+void DatagramSocket::connect(const SocketAddress& address)
+{
+ impl()->connect(address);
+}
+
+
+void DatagramSocket::bind(const SocketAddress& address, bool reuseAddress)
+{
+ impl()->bind(address, reuseAddress);
+}
+
+
+void DatagramSocket::bind(const SocketAddress& address, bool reuseAddress, bool reusePort)
+{
+ impl()->bind(address, reuseAddress, reusePort);
+}
+
+
+int DatagramSocket::sendBytes(const void* buffer, int length, int flags)
+{
+ return impl()->sendBytes(buffer, length, flags);
+}
+
+
+int DatagramSocket::receiveBytes(void* buffer, int length, int flags)
+{
+ return impl()->receiveBytes(buffer, length, flags);
+}
+
+
+int DatagramSocket::sendTo(const void* buffer, int length, const SocketAddress& address, int flags)
+{
+ return impl()->sendTo(buffer, length, address, flags);
+}
+
+
+int DatagramSocket::receiveFrom(void* buffer, int length, SocketAddress& address, int flags)
+{
+ return impl()->receiveFrom(buffer, length, address, flags);
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/DatagramSocketImpl.cpp b/contrib/libs/poco/Net/src/DatagramSocketImpl.cpp
index 7cfee05ede..9b86ebe611 100644
--- a/contrib/libs/poco/Net/src/DatagramSocketImpl.cpp
+++ b/contrib/libs/poco/Net/src/DatagramSocketImpl.cpp
@@ -1,63 +1,63 @@
-//
-// DatagramSocketImpl.cpp
-//
-// Library: Net
-// Package: Sockets
-// Module: DatagramSocketImpl
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/DatagramSocketImpl.h"
-#include "Poco/Net/NetException.h"
-
-
-using Poco::InvalidArgumentException;
-
-
-namespace Poco {
-namespace Net {
-
-
-DatagramSocketImpl::DatagramSocketImpl()
-{
-}
-
-
-DatagramSocketImpl::DatagramSocketImpl(SocketAddress::Family family)
-{
- if (family == SocketAddress::IPv4)
- init(AF_INET);
-#if defined(POCO_HAVE_IPv6)
- else if (family == SocketAddress::IPv6)
- init(AF_INET6);
-#endif
-#if defined(POCO_OS_FAMILY_UNIX)
- else if (family == SocketAddress::UNIX_LOCAL)
- init(AF_UNIX);
-#endif
- else throw InvalidArgumentException("Invalid or unsupported address family passed to DatagramSocketImpl");
-}
-
-
-DatagramSocketImpl::DatagramSocketImpl(poco_socket_t sockfd): SocketImpl(sockfd)
-{
-}
-
-
-DatagramSocketImpl::~DatagramSocketImpl()
-{
-}
-
-
-void DatagramSocketImpl::init(int af)
-{
- initSocket(af, SOCK_DGRAM);
-}
-
-
-} } // namespace Poco::Net
+//
+// DatagramSocketImpl.cpp
+//
+// Library: Net
+// Package: Sockets
+// Module: DatagramSocketImpl
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/DatagramSocketImpl.h"
+#include "Poco/Net/NetException.h"
+
+
+using Poco::InvalidArgumentException;
+
+
+namespace Poco {
+namespace Net {
+
+
+DatagramSocketImpl::DatagramSocketImpl()
+{
+}
+
+
+DatagramSocketImpl::DatagramSocketImpl(SocketAddress::Family family)
+{
+ if (family == SocketAddress::IPv4)
+ init(AF_INET);
+#if defined(POCO_HAVE_IPv6)
+ else if (family == SocketAddress::IPv6)
+ init(AF_INET6);
+#endif
+#if defined(POCO_OS_FAMILY_UNIX)
+ else if (family == SocketAddress::UNIX_LOCAL)
+ init(AF_UNIX);
+#endif
+ else throw InvalidArgumentException("Invalid or unsupported address family passed to DatagramSocketImpl");
+}
+
+
+DatagramSocketImpl::DatagramSocketImpl(poco_socket_t sockfd): SocketImpl(sockfd)
+{
+}
+
+
+DatagramSocketImpl::~DatagramSocketImpl()
+{
+}
+
+
+void DatagramSocketImpl::init(int af)
+{
+ initSocket(af, SOCK_DGRAM);
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/DialogSocket.cpp b/contrib/libs/poco/Net/src/DialogSocket.cpp
index 7b7e2adf01..030280c6c3 100644
--- a/contrib/libs/poco/Net/src/DialogSocket.cpp
+++ b/contrib/libs/poco/Net/src/DialogSocket.cpp
@@ -1,295 +1,295 @@
-//
-// DialogSocket.cpp
-//
-// Library: Net
-// Package: Sockets
-// Module: DialogSocket
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/DialogSocket.h"
-#include "Poco/Exception.h"
-#include "Poco/Ascii.h"
-#include <cstring>
-
-
-namespace Poco {
-namespace Net {
-
-
-DialogSocket::DialogSocket():
- _pBuffer(0),
- _pNext(0),
- _pEnd(0)
-{
- allocBuffer();
-}
-
-
-DialogSocket::DialogSocket(const SocketAddress& address):
- StreamSocket(address),
- _pBuffer(0),
- _pNext(0),
- _pEnd(0)
-{
- allocBuffer();
-}
-
-
-DialogSocket::DialogSocket(const Socket& socket):
- StreamSocket(socket),
- _pBuffer(0),
- _pNext(0),
- _pEnd(0)
-{
- allocBuffer();
-}
-
-
-DialogSocket::DialogSocket(const DialogSocket& socket):
- StreamSocket(socket),
- _pBuffer(0),
- _pNext(0),
- _pEnd(0)
-{
- allocBuffer();
-}
-
-
-DialogSocket::~DialogSocket()
-{
- delete [] _pBuffer;
-}
-
-
-DialogSocket& DialogSocket::operator = (const Socket& socket)
-{
- StreamSocket::operator = (socket);
- _pNext = _pBuffer;
- _pEnd = _pBuffer;
- return *this;
-}
-
-
-DialogSocket& DialogSocket::operator = (const DialogSocket& socket)
-{
- StreamSocket::operator = (socket);
- _pNext = _pBuffer;
- _pEnd = _pBuffer;
- return *this;
-}
-
-
-void DialogSocket::sendByte(unsigned char ch)
-{
- sendBytes(&ch, 1);
-}
-
-
-void DialogSocket::sendString(const char* str)
-{
- sendBytes(str, (int) std::strlen(str));
-}
-
-
-void DialogSocket::sendString(const std::string& str)
-{
- sendBytes(str.data(), (int) str.length());
-}
-
-
-void DialogSocket::sendMessage(const std::string& message)
-{
- std::string line;
- line.reserve(message.length() + 2);
- line.append(message);
- line.append("\r\n");
- sendString(line);
-}
-
-
-void DialogSocket::sendMessage(const std::string& message, const std::string& arg)
-{
- std::string line;
- line.reserve(message.length() + arg.length() + 3);
- line.append(message);
- if (!arg.empty())
- {
- line.append(" ");
- line.append(arg);
- }
- line.append("\r\n");
- sendString(line);
-}
-
-
-void DialogSocket::sendMessage(const std::string& message, const std::string& arg1, const std::string& arg2)
-{
- std::string line;
- line.reserve(message.length() + arg1.length() +arg2.length() + 4);
- line.append(message);
- line.append(" ");
- line.append(arg1);
- if (!arg2.empty())
- {
- line.append(" ");
- line.append(arg2);
- }
- line.append("\r\n");
- sendString(line);
-}
-
-
-bool DialogSocket::receiveMessage(std::string& message)
-{
- message.clear();
- return receiveLine(message, MAX_LINE_LENGTH);
-}
-
-
-int DialogSocket::receiveStatusMessage(std::string& message)
-{
- message.clear();
- int status = receiveStatusLine(message, MAX_LINE_LENGTH);
- if (status < 0)
- {
- while (status <= 0)
- {
- message += '\n';
- status = receiveStatusLine(message, message.length() + MAX_LINE_LENGTH);
- }
- }
- return status;
-}
-
-
-int DialogSocket::get()
-{
- refill();
- if (_pNext != _pEnd)
- return std::char_traits<char>::to_int_type(*_pNext++);
- else
- return EOF_CHAR;
-}
-
-
-int DialogSocket::peek()
-{
- refill();
- if (_pNext != _pEnd)
- return std::char_traits<char>::to_int_type(*_pNext);
- else
- return EOF_CHAR;
-}
-
-
-void DialogSocket::synch()
-{
- sendUrgent(TELNET_DM);
-}
-
-
-void DialogSocket::sendTelnetCommand(unsigned char command)
-{
- unsigned char buffer[2];
- buffer[0] = TELNET_IAC;
- buffer[1] = command;
- sendBytes(buffer, 2);
-}
-
-
-void DialogSocket::sendTelnetCommand(unsigned char command, unsigned char arg)
-{
- unsigned char buffer[3];
- buffer[0] = TELNET_IAC;
- buffer[1] = command;
- buffer[2] = arg;
- sendBytes(buffer, 3);
-}
-
-
-void DialogSocket::refill()
-{
- if (_pNext == _pEnd)
- {
- int n = receiveBytes(_pBuffer, RECEIVE_BUFFER_SIZE);
- if (n > 0)
- {
- _pNext = _pBuffer;
- _pEnd = _pBuffer + n;
- }
- }
-}
-
-
-void DialogSocket::allocBuffer()
-{
- _pBuffer = new char [RECEIVE_BUFFER_SIZE];
- _pNext = _pBuffer;
- _pEnd = _pBuffer;
-}
-
-
-bool DialogSocket::receiveLine(std::string& line, std::size_t lineLengthLimit)
-{
- // An old wisdom goes: be strict in what you emit
- // and generous in what you accept.
- int ch = get();
- while (ch != EOF_CHAR && ch != '\r' && ch != '\n')
- {
- if (lineLengthLimit == 0 || line.size() < lineLengthLimit)
- line += (char) ch;
- else
- throw Poco::IOException("Line too long");
- ch = get();
- }
- if (ch == '\r' && peek() == '\n')
- get();
- else if (ch == EOF_CHAR)
- return false;
- return true;
-}
-
-
-int DialogSocket::receiveStatusLine(std::string& line, std::size_t lineLengthLimit)
-{
- int status = 0;
- int ch = get();
- if (ch != EOF_CHAR) line += (char) ch;
- int n = 0;
- while (Poco::Ascii::isDigit(ch) && n < 3)
- {
- status *= 10;
- status += ch - '0';
- ++n;
- ch = get();
- if (ch != EOF_CHAR) line += (char) ch;
- }
- if (n == 3)
- {
- if (ch == '-')
- status = -status;
- }
- else status = 0;
- if (ch != EOF_CHAR) receiveLine(line, lineLengthLimit);
- return status;
-}
-
-
-int DialogSocket::receiveRawBytes(void* buffer, int length)
-{
- refill();
- int n = static_cast<int>(_pEnd - _pNext);
- if (n > length) n = length;
- std::memcpy(buffer, _pNext, n);
- _pNext += n;
- return n;
-}
-
-
-} } // namespace Poco::Net
+//
+// DialogSocket.cpp
+//
+// Library: Net
+// Package: Sockets
+// Module: DialogSocket
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/DialogSocket.h"
+#include "Poco/Exception.h"
+#include "Poco/Ascii.h"
+#include <cstring>
+
+
+namespace Poco {
+namespace Net {
+
+
+DialogSocket::DialogSocket():
+ _pBuffer(0),
+ _pNext(0),
+ _pEnd(0)
+{
+ allocBuffer();
+}
+
+
+DialogSocket::DialogSocket(const SocketAddress& address):
+ StreamSocket(address),
+ _pBuffer(0),
+ _pNext(0),
+ _pEnd(0)
+{
+ allocBuffer();
+}
+
+
+DialogSocket::DialogSocket(const Socket& socket):
+ StreamSocket(socket),
+ _pBuffer(0),
+ _pNext(0),
+ _pEnd(0)
+{
+ allocBuffer();
+}
+
+
+DialogSocket::DialogSocket(const DialogSocket& socket):
+ StreamSocket(socket),
+ _pBuffer(0),
+ _pNext(0),
+ _pEnd(0)
+{
+ allocBuffer();
+}
+
+
+DialogSocket::~DialogSocket()
+{
+ delete [] _pBuffer;
+}
+
+
+DialogSocket& DialogSocket::operator = (const Socket& socket)
+{
+ StreamSocket::operator = (socket);
+ _pNext = _pBuffer;
+ _pEnd = _pBuffer;
+ return *this;
+}
+
+
+DialogSocket& DialogSocket::operator = (const DialogSocket& socket)
+{
+ StreamSocket::operator = (socket);
+ _pNext = _pBuffer;
+ _pEnd = _pBuffer;
+ return *this;
+}
+
+
+void DialogSocket::sendByte(unsigned char ch)
+{
+ sendBytes(&ch, 1);
+}
+
+
+void DialogSocket::sendString(const char* str)
+{
+ sendBytes(str, (int) std::strlen(str));
+}
+
+
+void DialogSocket::sendString(const std::string& str)
+{
+ sendBytes(str.data(), (int) str.length());
+}
+
+
+void DialogSocket::sendMessage(const std::string& message)
+{
+ std::string line;
+ line.reserve(message.length() + 2);
+ line.append(message);
+ line.append("\r\n");
+ sendString(line);
+}
+
+
+void DialogSocket::sendMessage(const std::string& message, const std::string& arg)
+{
+ std::string line;
+ line.reserve(message.length() + arg.length() + 3);
+ line.append(message);
+ if (!arg.empty())
+ {
+ line.append(" ");
+ line.append(arg);
+ }
+ line.append("\r\n");
+ sendString(line);
+}
+
+
+void DialogSocket::sendMessage(const std::string& message, const std::string& arg1, const std::string& arg2)
+{
+ std::string line;
+ line.reserve(message.length() + arg1.length() +arg2.length() + 4);
+ line.append(message);
+ line.append(" ");
+ line.append(arg1);
+ if (!arg2.empty())
+ {
+ line.append(" ");
+ line.append(arg2);
+ }
+ line.append("\r\n");
+ sendString(line);
+}
+
+
+bool DialogSocket::receiveMessage(std::string& message)
+{
+ message.clear();
+ return receiveLine(message, MAX_LINE_LENGTH);
+}
+
+
+int DialogSocket::receiveStatusMessage(std::string& message)
+{
+ message.clear();
+ int status = receiveStatusLine(message, MAX_LINE_LENGTH);
+ if (status < 0)
+ {
+ while (status <= 0)
+ {
+ message += '\n';
+ status = receiveStatusLine(message, message.length() + MAX_LINE_LENGTH);
+ }
+ }
+ return status;
+}
+
+
+int DialogSocket::get()
+{
+ refill();
+ if (_pNext != _pEnd)
+ return std::char_traits<char>::to_int_type(*_pNext++);
+ else
+ return EOF_CHAR;
+}
+
+
+int DialogSocket::peek()
+{
+ refill();
+ if (_pNext != _pEnd)
+ return std::char_traits<char>::to_int_type(*_pNext);
+ else
+ return EOF_CHAR;
+}
+
+
+void DialogSocket::synch()
+{
+ sendUrgent(TELNET_DM);
+}
+
+
+void DialogSocket::sendTelnetCommand(unsigned char command)
+{
+ unsigned char buffer[2];
+ buffer[0] = TELNET_IAC;
+ buffer[1] = command;
+ sendBytes(buffer, 2);
+}
+
+
+void DialogSocket::sendTelnetCommand(unsigned char command, unsigned char arg)
+{
+ unsigned char buffer[3];
+ buffer[0] = TELNET_IAC;
+ buffer[1] = command;
+ buffer[2] = arg;
+ sendBytes(buffer, 3);
+}
+
+
+void DialogSocket::refill()
+{
+ if (_pNext == _pEnd)
+ {
+ int n = receiveBytes(_pBuffer, RECEIVE_BUFFER_SIZE);
+ if (n > 0)
+ {
+ _pNext = _pBuffer;
+ _pEnd = _pBuffer + n;
+ }
+ }
+}
+
+
+void DialogSocket::allocBuffer()
+{
+ _pBuffer = new char [RECEIVE_BUFFER_SIZE];
+ _pNext = _pBuffer;
+ _pEnd = _pBuffer;
+}
+
+
+bool DialogSocket::receiveLine(std::string& line, std::size_t lineLengthLimit)
+{
+ // An old wisdom goes: be strict in what you emit
+ // and generous in what you accept.
+ int ch = get();
+ while (ch != EOF_CHAR && ch != '\r' && ch != '\n')
+ {
+ if (lineLengthLimit == 0 || line.size() < lineLengthLimit)
+ line += (char) ch;
+ else
+ throw Poco::IOException("Line too long");
+ ch = get();
+ }
+ if (ch == '\r' && peek() == '\n')
+ get();
+ else if (ch == EOF_CHAR)
+ return false;
+ return true;
+}
+
+
+int DialogSocket::receiveStatusLine(std::string& line, std::size_t lineLengthLimit)
+{
+ int status = 0;
+ int ch = get();
+ if (ch != EOF_CHAR) line += (char) ch;
+ int n = 0;
+ while (Poco::Ascii::isDigit(ch) && n < 3)
+ {
+ status *= 10;
+ status += ch - '0';
+ ++n;
+ ch = get();
+ if (ch != EOF_CHAR) line += (char) ch;
+ }
+ if (n == 3)
+ {
+ if (ch == '-')
+ status = -status;
+ }
+ else status = 0;
+ if (ch != EOF_CHAR) receiveLine(line, lineLengthLimit);
+ return status;
+}
+
+
+int DialogSocket::receiveRawBytes(void* buffer, int length)
+{
+ refill();
+ int n = static_cast<int>(_pEnd - _pNext);
+ if (n > length) n = length;
+ std::memcpy(buffer, _pNext, n);
+ _pNext += n;
+ return n;
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/FTPClientSession.cpp b/contrib/libs/poco/Net/src/FTPClientSession.cpp
index ea6870ca49..e0bf448983 100644
--- a/contrib/libs/poco/Net/src/FTPClientSession.cpp
+++ b/contrib/libs/poco/Net/src/FTPClientSession.cpp
@@ -1,599 +1,599 @@
-//
-// FTPClientSession.cpp
-//
-// Library: Net
-// Package: FTP
-// Module: FTPClientSession
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/FTPClientSession.h"
-#include "Poco/Net/SocketAddress.h"
-#include "Poco/Net/SocketStream.h"
-#include "Poco/Net/ServerSocket.h"
-#include "Poco/Net/NetException.h"
-#include "Poco/NumberFormatter.h"
-#include "Poco/Ascii.h"
-
-
-using Poco::NumberFormatter;
-
-
-namespace Poco {
-namespace Net {
-
-
-FTPClientSession::FTPClientSession():
- _port(0),
- _pControlSocket(0),
- _pDataStream(0),
- _passiveMode(true),
- _fileType(TYPE_BINARY),
- _supports1738(true),
- _serverReady(false),
- _isLoggedIn(false),
- _timeout(DEFAULT_TIMEOUT)
-{
-}
-
-
-FTPClientSession::FTPClientSession(const StreamSocket& socket):
- _host(socket.address().host().toString()),
- _port(socket.address().port()),
- _pControlSocket(new DialogSocket(socket)),
- _pDataStream(0),
- _passiveMode(true),
- _fileType(TYPE_BINARY),
- _supports1738(true),
- _serverReady(false),
- _isLoggedIn(false),
- _timeout(DEFAULT_TIMEOUT)
-{
- _pControlSocket->setReceiveTimeout(_timeout);
-}
-
-
-FTPClientSession::FTPClientSession(const std::string& host,
- Poco::UInt16 port,
- const std::string& username,
- const std::string& password):
- _host(host),
- _port(port),
- _pControlSocket(new DialogSocket(SocketAddress(host, port))),
- _pDataStream(0),
- _passiveMode(true),
- _fileType(TYPE_BINARY),
- _supports1738(true),
- _serverReady(false),
- _isLoggedIn(false),
- _timeout(DEFAULT_TIMEOUT)
-{
- if (!username.empty())
- login(username, password);
- else
- _pControlSocket->setReceiveTimeout(_timeout);
-}
-
-
-FTPClientSession::~FTPClientSession()
-{
- try
- {
- close();
- }
- catch (...)
- {
- }
-}
-
-
-void FTPClientSession::setTimeout(const Poco::Timespan& timeout)
-{
- if (!isOpen())
- throw FTPException("Connection is closed.");
-
- _timeout = timeout;
- _pControlSocket->setReceiveTimeout(timeout);
-}
-
-
-Poco::Timespan FTPClientSession::getTimeout() const
-{
- return _timeout;
-}
-
-
-void FTPClientSession::setPassive(bool flag, bool useRFC1738)
-{
- _passiveMode = flag;
- _supports1738 = useRFC1738;
-}
-
-
-bool FTPClientSession::getPassive() const
-{
- return _passiveMode;
-}
-
-
-void FTPClientSession::open(const std::string& host,
- Poco::UInt16 port,
- const std::string& username,
- const std::string& password)
-{
- _host = host;
- _port = port;
- if (!username.empty())
- {
- login(username, password);
- }
- else
- {
- _pControlSocket = new DialogSocket(SocketAddress(_host, _port));
- _pControlSocket->setReceiveTimeout(_timeout);
- }
-}
-
-
-void FTPClientSession::login(const std::string& username, const std::string& password)
-{
- if (_isLoggedIn) logout();
-
- int status = FTP_POSITIVE_COMPLETION * 100;
- std::string response;
- if (!_pControlSocket)
- {
- _pControlSocket = new DialogSocket(SocketAddress(_host, _port));
- _pControlSocket->setReceiveTimeout(_timeout);
- }
-
- if (!_serverReady)
- {
- status = _pControlSocket->receiveStatusMessage(response);
- if (!isPositiveCompletion(status))
- throw FTPException("Cannot login to server", response, status);
-
- _serverReady = true;
- }
-
- status = sendCommand("USER", username, response);
- if (isPositiveIntermediate(status))
- status = sendCommand("PASS", password, response);
- if (!isPositiveCompletion(status))
- throw FTPException("Login denied", response, status);
-
- setFileType(_fileType);
- _isLoggedIn = true;
-}
-
-
-void FTPClientSession::logout()
-{
- if (!isOpen())
- throw FTPException("Connection is closed.");
-
- if (_isLoggedIn)
- {
- try { endTransfer(); }
- catch (...) { }
- _isLoggedIn = false;
- std::string response;
- sendCommand("QUIT", response);
- }
-}
-
-
-void FTPClientSession::close()
-{
- try { logout(); }
- catch (...) {}
- _serverReady = false;
- if (_pControlSocket)
- {
- _pControlSocket->close();
- delete _pControlSocket;
- _pControlSocket = 0;
- }
-}
-
-
-void FTPClientSession::setFileType(FTPClientSession::FileType type)
-{
- std::string response;
- int status = sendCommand("TYPE", (type == TYPE_TEXT ? "A" : "I"), response);
- if (!isPositiveCompletion(status)) throw FTPException("Cannot set file type", response, status);
- _fileType = type;
-}
-
-
-FTPClientSession::FileType FTPClientSession::getFileType() const
-{
- return _fileType;
-}
-
-
-std::string FTPClientSession::systemType()
-{
- std::string response;
- int status = sendCommand("SYST", response);
- if (isPositiveCompletion(status))
- return response.substr(4);
- else
- throw FTPException("Cannot get remote system type", response, status);
-}
-
-
-void FTPClientSession::setWorkingDirectory(const std::string& path)
-{
- std::string response;
- int status = sendCommand("CWD", path, response);
+//
+// FTPClientSession.cpp
+//
+// Library: Net
+// Package: FTP
+// Module: FTPClientSession
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/FTPClientSession.h"
+#include "Poco/Net/SocketAddress.h"
+#include "Poco/Net/SocketStream.h"
+#include "Poco/Net/ServerSocket.h"
+#include "Poco/Net/NetException.h"
+#include "Poco/NumberFormatter.h"
+#include "Poco/Ascii.h"
+
+
+using Poco::NumberFormatter;
+
+
+namespace Poco {
+namespace Net {
+
+
+FTPClientSession::FTPClientSession():
+ _port(0),
+ _pControlSocket(0),
+ _pDataStream(0),
+ _passiveMode(true),
+ _fileType(TYPE_BINARY),
+ _supports1738(true),
+ _serverReady(false),
+ _isLoggedIn(false),
+ _timeout(DEFAULT_TIMEOUT)
+{
+}
+
+
+FTPClientSession::FTPClientSession(const StreamSocket& socket):
+ _host(socket.address().host().toString()),
+ _port(socket.address().port()),
+ _pControlSocket(new DialogSocket(socket)),
+ _pDataStream(0),
+ _passiveMode(true),
+ _fileType(TYPE_BINARY),
+ _supports1738(true),
+ _serverReady(false),
+ _isLoggedIn(false),
+ _timeout(DEFAULT_TIMEOUT)
+{
+ _pControlSocket->setReceiveTimeout(_timeout);
+}
+
+
+FTPClientSession::FTPClientSession(const std::string& host,
+ Poco::UInt16 port,
+ const std::string& username,
+ const std::string& password):
+ _host(host),
+ _port(port),
+ _pControlSocket(new DialogSocket(SocketAddress(host, port))),
+ _pDataStream(0),
+ _passiveMode(true),
+ _fileType(TYPE_BINARY),
+ _supports1738(true),
+ _serverReady(false),
+ _isLoggedIn(false),
+ _timeout(DEFAULT_TIMEOUT)
+{
+ if (!username.empty())
+ login(username, password);
+ else
+ _pControlSocket->setReceiveTimeout(_timeout);
+}
+
+
+FTPClientSession::~FTPClientSession()
+{
+ try
+ {
+ close();
+ }
+ catch (...)
+ {
+ }
+}
+
+
+void FTPClientSession::setTimeout(const Poco::Timespan& timeout)
+{
+ if (!isOpen())
+ throw FTPException("Connection is closed.");
+
+ _timeout = timeout;
+ _pControlSocket->setReceiveTimeout(timeout);
+}
+
+
+Poco::Timespan FTPClientSession::getTimeout() const
+{
+ return _timeout;
+}
+
+
+void FTPClientSession::setPassive(bool flag, bool useRFC1738)
+{
+ _passiveMode = flag;
+ _supports1738 = useRFC1738;
+}
+
+
+bool FTPClientSession::getPassive() const
+{
+ return _passiveMode;
+}
+
+
+void FTPClientSession::open(const std::string& host,
+ Poco::UInt16 port,
+ const std::string& username,
+ const std::string& password)
+{
+ _host = host;
+ _port = port;
+ if (!username.empty())
+ {
+ login(username, password);
+ }
+ else
+ {
+ _pControlSocket = new DialogSocket(SocketAddress(_host, _port));
+ _pControlSocket->setReceiveTimeout(_timeout);
+ }
+}
+
+
+void FTPClientSession::login(const std::string& username, const std::string& password)
+{
+ if (_isLoggedIn) logout();
+
+ int status = FTP_POSITIVE_COMPLETION * 100;
+ std::string response;
+ if (!_pControlSocket)
+ {
+ _pControlSocket = new DialogSocket(SocketAddress(_host, _port));
+ _pControlSocket->setReceiveTimeout(_timeout);
+ }
+
+ if (!_serverReady)
+ {
+ status = _pControlSocket->receiveStatusMessage(response);
+ if (!isPositiveCompletion(status))
+ throw FTPException("Cannot login to server", response, status);
+
+ _serverReady = true;
+ }
+
+ status = sendCommand("USER", username, response);
+ if (isPositiveIntermediate(status))
+ status = sendCommand("PASS", password, response);
+ if (!isPositiveCompletion(status))
+ throw FTPException("Login denied", response, status);
+
+ setFileType(_fileType);
+ _isLoggedIn = true;
+}
+
+
+void FTPClientSession::logout()
+{
+ if (!isOpen())
+ throw FTPException("Connection is closed.");
+
+ if (_isLoggedIn)
+ {
+ try { endTransfer(); }
+ catch (...) { }
+ _isLoggedIn = false;
+ std::string response;
+ sendCommand("QUIT", response);
+ }
+}
+
+
+void FTPClientSession::close()
+{
+ try { logout(); }
+ catch (...) {}
+ _serverReady = false;
+ if (_pControlSocket)
+ {
+ _pControlSocket->close();
+ delete _pControlSocket;
+ _pControlSocket = 0;
+ }
+}
+
+
+void FTPClientSession::setFileType(FTPClientSession::FileType type)
+{
+ std::string response;
+ int status = sendCommand("TYPE", (type == TYPE_TEXT ? "A" : "I"), response);
+ if (!isPositiveCompletion(status)) throw FTPException("Cannot set file type", response, status);
+ _fileType = type;
+}
+
+
+FTPClientSession::FileType FTPClientSession::getFileType() const
+{
+ return _fileType;
+}
+
+
+std::string FTPClientSession::systemType()
+{
+ std::string response;
+ int status = sendCommand("SYST", response);
+ if (isPositiveCompletion(status))
+ return response.substr(4);
+ else
+ throw FTPException("Cannot get remote system type", response, status);
+}
+
+
+void FTPClientSession::setWorkingDirectory(const std::string& path)
+{
+ std::string response;
+ int status = sendCommand("CWD", path, response);
+ if (!isPositiveCompletion(status))
+ throw FTPException("Cannot change directory", response, status);
+}
+
+
+std::string FTPClientSession::getWorkingDirectory()
+{
+ std::string response;
+ int status = sendCommand("PWD", response);
+ if (isPositiveCompletion(status))
+ return extractPath(response);
+ else
+ throw FTPException("Cannot get current working directory", response, status);
+}
+
+
+void FTPClientSession::cdup()
+{
+ std::string response;
+ int status = sendCommand("CDUP", response);
+ if (!isPositiveCompletion(status))
+ throw FTPException("Cannot change directory", response, status);
+}
+
+
+void FTPClientSession::rename(const std::string& oldName, const std::string& newName)
+{
+ std::string response;
+ int status = sendCommand("RNFR", oldName, response);
+ if (!isPositiveIntermediate(status))
+ throw FTPException(std::string("Cannot rename ") + oldName, response, status);
+ status = sendCommand("RNTO", newName, response);
+ if (!isPositiveCompletion(status))
+ throw FTPException(std::string("Cannot rename to ") + newName, response, status);
+}
+
+
+void FTPClientSession::remove(const std::string& path)
+{
+ std::string response;
+ int status = sendCommand("DELE", path, response);
+ if (!isPositiveCompletion(status))
+ throw FTPException(std::string("Cannot remove " + path), response, status);
+}
+
+
+void FTPClientSession::createDirectory(const std::string& path)
+{
+ std::string response;
+ int status = sendCommand("MKD", path, response);
if (!isPositiveCompletion(status))
- throw FTPException("Cannot change directory", response, status);
-}
-
-
-std::string FTPClientSession::getWorkingDirectory()
-{
- std::string response;
- int status = sendCommand("PWD", response);
- if (isPositiveCompletion(status))
- return extractPath(response);
- else
- throw FTPException("Cannot get current working directory", response, status);
-}
-
-
-void FTPClientSession::cdup()
-{
- std::string response;
- int status = sendCommand("CDUP", response);
+ throw FTPException(std::string("Cannot create directory ") + path, response, status);
+}
+
+
+void FTPClientSession::removeDirectory(const std::string& path)
+{
+ std::string response;
+ int status = sendCommand("RMD", path, response);
if (!isPositiveCompletion(status))
- throw FTPException("Cannot change directory", response, status);
-}
-
-
-void FTPClientSession::rename(const std::string& oldName, const std::string& newName)
-{
- std::string response;
- int status = sendCommand("RNFR", oldName, response);
- if (!isPositiveIntermediate(status))
- throw FTPException(std::string("Cannot rename ") + oldName, response, status);
- status = sendCommand("RNTO", newName, response);
- if (!isPositiveCompletion(status))
- throw FTPException(std::string("Cannot rename to ") + newName, response, status);
-}
-
-
-void FTPClientSession::remove(const std::string& path)
-{
- std::string response;
- int status = sendCommand("DELE", path, response);
- if (!isPositiveCompletion(status))
- throw FTPException(std::string("Cannot remove " + path), response, status);
-}
-
-
-void FTPClientSession::createDirectory(const std::string& path)
-{
- std::string response;
- int status = sendCommand("MKD", path, response);
- if (!isPositiveCompletion(status))
- throw FTPException(std::string("Cannot create directory ") + path, response, status);
-}
-
-
-void FTPClientSession::removeDirectory(const std::string& path)
-{
- std::string response;
- int status = sendCommand("RMD", path, response);
- if (!isPositiveCompletion(status))
- throw FTPException(std::string("Cannot remove directory ") + path, response, status);
-}
-
-
-std::istream& FTPClientSession::beginDownload(const std::string& path)
-{
- if (!isOpen())
- throw FTPException("Connection is closed.");
-
- delete _pDataStream;
- _pDataStream = 0;
- _pDataStream = new SocketStream(establishDataConnection("RETR", path));
- return *_pDataStream;
-}
-
-
-void FTPClientSession::endDownload()
-{
- endTransfer();
-}
-
-
-std::ostream& FTPClientSession::beginUpload(const std::string& path)
-{
- if (!isOpen())
- throw FTPException("Connection is closed.");
-
- delete _pDataStream;
- _pDataStream = 0;
- _pDataStream = new SocketStream(establishDataConnection("STOR", path));
- return *_pDataStream;
-}
-
-
-void FTPClientSession::endUpload()
-{
- endTransfer();
-}
-
-
-std::istream& FTPClientSession::beginList(const std::string& path, bool extended)
-{
- if (!isOpen())
- throw FTPException("Connection is closed.");
-
- delete _pDataStream;
- _pDataStream = 0;
- _pDataStream = new SocketStream(establishDataConnection(extended ? "LIST" : "NLST", path));
- return *_pDataStream;
-}
-
-
-void FTPClientSession::endList()
-{
- endTransfer();
-}
-
-
-void FTPClientSession::abort()
-{
- if (!isOpen())
- throw FTPException("Connection is closed.");
-
- _pControlSocket->sendByte(DialogSocket::TELNET_IP);
- _pControlSocket->synch();
- std::string response;
- int status = sendCommand("ABOR", response);
- if (status == 426)
- status = _pControlSocket->receiveStatusMessage(response);
- if (status != 226)
- throw FTPException("Cannot abort transfer", response, status);
-}
-
-
-int FTPClientSession::sendCommand(const std::string& command, std::string& response)
-{
- if (!isOpen())
- throw FTPException("Connection is closed.");
-
- _pControlSocket->sendMessage(command);
- return _pControlSocket->receiveStatusMessage(response);
-}
-
-
-int FTPClientSession::sendCommand(const std::string& command, const std::string& arg, std::string& response)
-{
- if (!isOpen())
- throw FTPException("Connection is closed.");
-
- _pControlSocket->sendMessage(command, arg);
- return _pControlSocket->receiveStatusMessage(response);
-}
-
-
-std::string FTPClientSession::extractPath(const std::string& response)
-{
- std::string path;
- std::string::const_iterator it = response.begin();
- std::string::const_iterator end = response.end();
- while (it != end && *it != '"') ++it;
- if (it != end)
- {
- ++it;
- while (it != end)
- {
- if (*it == '"')
- {
- ++it;
- if (it == end || (it != end && *it != '"')) break;
- }
- path += *it++;
- }
- }
- return path;
-}
-
-
-StreamSocket FTPClientSession::establishDataConnection(const std::string& command, const std::string& arg)
-{
- if (_passiveMode)
- return passiveDataConnection(command, arg);
- else
- return activeDataConnection(command, arg);
-}
-
-
-StreamSocket FTPClientSession::activeDataConnection(const std::string& command, const std::string& arg)
-{
- if (!isOpen())
- throw FTPException("Connection is closed.");
-
- ServerSocket server(SocketAddress(_pControlSocket->address().host(), 0));
- sendPortCommand(server.address());
- std::string response;
- int status = sendCommand(command, arg, response);
- if (!isPositivePreliminary(status))
- throw FTPException(command + " command failed", response, status);
- if (server.poll(_timeout, Socket::SELECT_READ))
- return server.acceptConnection();
- else
- throw FTPException("The server has not initiated a data connection");
-}
-
-
-StreamSocket FTPClientSession::passiveDataConnection(const std::string& command, const std::string& arg)
-{
- SocketAddress sa(sendPassiveCommand());
- StreamSocket sock(sa);
- std::string response;
- int status = sendCommand(command, arg, response);
- if (!isPositivePreliminary(status))
- throw FTPException(command + " command failed", response, status);
- return sock;
-}
-
-
-void FTPClientSession::sendPortCommand(const SocketAddress& addr)
-{
- if (_supports1738)
- {
- if (sendEPRT(addr))
- return;
- else
- _supports1738 = false;
- }
- sendPORT(addr);
-}
-
-
-SocketAddress FTPClientSession::sendPassiveCommand()
-{
- SocketAddress addr;
- if (_supports1738)
- {
- if (sendEPSV(addr))
- return addr;
- else
- _supports1738 = false;
- }
- sendPASV(addr);
- return addr;
-}
-
-
-bool FTPClientSession::sendEPRT(const SocketAddress& addr)
-{
- std::string arg("|");
- arg += addr.af() == AF_INET ? '1' : '2';
- arg += '|';
- arg += addr.host().toString();
- arg += '|';
- arg += NumberFormatter::format(addr.port());
- arg += '|';
- std::string response;
- int status = sendCommand("EPRT", arg, response);
- if (isPositiveCompletion(status))
- return true;
- else if (isPermanentNegative(status))
- return false;
- else
- throw FTPException("EPRT command failed", response, status);
-}
-
-
-void FTPClientSession::sendPORT(const SocketAddress& addr)
-{
- std::string arg(addr.host().toString());
- for (std::string::iterator it = arg.begin(); it != arg.end(); ++it)
- {
- if (*it == '.') *it = ',';
- }
- arg += ',';
- Poco::UInt16 port = addr.port();
- arg += NumberFormatter::format(port/256);
- arg += ',';
- arg += NumberFormatter::format(port % 256);
- std::string response;
- int status = sendCommand("PORT", arg, response);
- if (!isPositiveCompletion(status))
- throw FTPException("PORT command failed", response, status);
-}
-
-
-bool FTPClientSession::sendEPSV(SocketAddress& addr)
-{
- std::string response;
- int status = sendCommand("EPSV", response);
- if (isPositiveCompletion(status))
- {
- parseExtAddress(response, addr);
- return true;
- }
- else if (isPermanentNegative(status))
- {
- return false;
- }
- else throw FTPException("EPSV command failed", response, status);
-}
-
-
-void FTPClientSession::sendPASV(SocketAddress& addr)
-{
- std::string response;
- int status = sendCommand("PASV", response);
- if (!isPositiveCompletion(status))
- throw FTPException("PASV command failed", response, status);
- parseAddress(response, addr);
-}
-
-
-void FTPClientSession::parseAddress(const std::string& str, SocketAddress& addr)
-{
- std::string::const_iterator it = str.begin();
- std::string::const_iterator end = str.end();
- while (it != end && *it != '(') ++it;
- if (it != end) ++it;
- std::string host;
- while (it != end && Poco::Ascii::isDigit(*it)) host += *it++;
- if (it != end && *it == ',') { host += '.'; ++it; }
- while (it != end && Poco::Ascii::isDigit(*it)) host += *it++;
- if (it != end && *it == ',') { host += '.'; ++it; }
- while (it != end && Poco::Ascii::isDigit(*it)) host += *it++;
- if (it != end && *it == ',') { host += '.'; ++it; }
- while (it != end && Poco::Ascii::isDigit(*it)) host += *it++;
- if (it != end && *it == ',') ++it;
- Poco::UInt16 portHi = 0;
- while (it != end && Poco::Ascii::isDigit(*it)) { portHi *= 10; portHi += *it++ - '0'; }
- if (it != end && *it == ',') ++it;
- Poco::UInt16 portLo = 0;
- while (it != end && Poco::Ascii::isDigit(*it)) { portLo *= 10; portLo += *it++ - '0'; }
- addr = SocketAddress(host, portHi*256 + portLo);
-}
-
-
-void FTPClientSession::parseExtAddress(const std::string& str, SocketAddress& addr)
-{
- std::string::const_iterator it = str.begin();
- std::string::const_iterator end = str.end();
- while (it != end && *it != '(') ++it;
- if (it != end) ++it;
- char delim = '|';
- if (it != end) delim = *it++;
- if (it != end && *it == delim) ++it;
- if (it != end && *it == delim) ++it;
- Poco::UInt16 port = 0;
- while (it != end && Poco::Ascii::isDigit(*it)) { port *= 10; port += *it++ - '0'; }
- addr = SocketAddress(_pControlSocket->peerAddress().host(), port);
-}
-
-
-void FTPClientSession::endTransfer()
-{
- if (_pDataStream)
- {
- delete _pDataStream;
- _pDataStream = 0;
- std::string response;
- int status = _pControlSocket->receiveStatusMessage(response);
- if (!isPositiveCompletion(status))
- throw FTPException("Data transfer failed", response, status);
- }
-}
-
-
-} } // namespace Poco::Net
+ throw FTPException(std::string("Cannot remove directory ") + path, response, status);
+}
+
+
+std::istream& FTPClientSession::beginDownload(const std::string& path)
+{
+ if (!isOpen())
+ throw FTPException("Connection is closed.");
+
+ delete _pDataStream;
+ _pDataStream = 0;
+ _pDataStream = new SocketStream(establishDataConnection("RETR", path));
+ return *_pDataStream;
+}
+
+
+void FTPClientSession::endDownload()
+{
+ endTransfer();
+}
+
+
+std::ostream& FTPClientSession::beginUpload(const std::string& path)
+{
+ if (!isOpen())
+ throw FTPException("Connection is closed.");
+
+ delete _pDataStream;
+ _pDataStream = 0;
+ _pDataStream = new SocketStream(establishDataConnection("STOR", path));
+ return *_pDataStream;
+}
+
+
+void FTPClientSession::endUpload()
+{
+ endTransfer();
+}
+
+
+std::istream& FTPClientSession::beginList(const std::string& path, bool extended)
+{
+ if (!isOpen())
+ throw FTPException("Connection is closed.");
+
+ delete _pDataStream;
+ _pDataStream = 0;
+ _pDataStream = new SocketStream(establishDataConnection(extended ? "LIST" : "NLST", path));
+ return *_pDataStream;
+}
+
+
+void FTPClientSession::endList()
+{
+ endTransfer();
+}
+
+
+void FTPClientSession::abort()
+{
+ if (!isOpen())
+ throw FTPException("Connection is closed.");
+
+ _pControlSocket->sendByte(DialogSocket::TELNET_IP);
+ _pControlSocket->synch();
+ std::string response;
+ int status = sendCommand("ABOR", response);
+ if (status == 426)
+ status = _pControlSocket->receiveStatusMessage(response);
+ if (status != 226)
+ throw FTPException("Cannot abort transfer", response, status);
+}
+
+
+int FTPClientSession::sendCommand(const std::string& command, std::string& response)
+{
+ if (!isOpen())
+ throw FTPException("Connection is closed.");
+
+ _pControlSocket->sendMessage(command);
+ return _pControlSocket->receiveStatusMessage(response);
+}
+
+
+int FTPClientSession::sendCommand(const std::string& command, const std::string& arg, std::string& response)
+{
+ if (!isOpen())
+ throw FTPException("Connection is closed.");
+
+ _pControlSocket->sendMessage(command, arg);
+ return _pControlSocket->receiveStatusMessage(response);
+}
+
+
+std::string FTPClientSession::extractPath(const std::string& response)
+{
+ std::string path;
+ std::string::const_iterator it = response.begin();
+ std::string::const_iterator end = response.end();
+ while (it != end && *it != '"') ++it;
+ if (it != end)
+ {
+ ++it;
+ while (it != end)
+ {
+ if (*it == '"')
+ {
+ ++it;
+ if (it == end || (it != end && *it != '"')) break;
+ }
+ path += *it++;
+ }
+ }
+ return path;
+}
+
+
+StreamSocket FTPClientSession::establishDataConnection(const std::string& command, const std::string& arg)
+{
+ if (_passiveMode)
+ return passiveDataConnection(command, arg);
+ else
+ return activeDataConnection(command, arg);
+}
+
+
+StreamSocket FTPClientSession::activeDataConnection(const std::string& command, const std::string& arg)
+{
+ if (!isOpen())
+ throw FTPException("Connection is closed.");
+
+ ServerSocket server(SocketAddress(_pControlSocket->address().host(), 0));
+ sendPortCommand(server.address());
+ std::string response;
+ int status = sendCommand(command, arg, response);
+ if (!isPositivePreliminary(status))
+ throw FTPException(command + " command failed", response, status);
+ if (server.poll(_timeout, Socket::SELECT_READ))
+ return server.acceptConnection();
+ else
+ throw FTPException("The server has not initiated a data connection");
+}
+
+
+StreamSocket FTPClientSession::passiveDataConnection(const std::string& command, const std::string& arg)
+{
+ SocketAddress sa(sendPassiveCommand());
+ StreamSocket sock(sa);
+ std::string response;
+ int status = sendCommand(command, arg, response);
+ if (!isPositivePreliminary(status))
+ throw FTPException(command + " command failed", response, status);
+ return sock;
+}
+
+
+void FTPClientSession::sendPortCommand(const SocketAddress& addr)
+{
+ if (_supports1738)
+ {
+ if (sendEPRT(addr))
+ return;
+ else
+ _supports1738 = false;
+ }
+ sendPORT(addr);
+}
+
+
+SocketAddress FTPClientSession::sendPassiveCommand()
+{
+ SocketAddress addr;
+ if (_supports1738)
+ {
+ if (sendEPSV(addr))
+ return addr;
+ else
+ _supports1738 = false;
+ }
+ sendPASV(addr);
+ return addr;
+}
+
+
+bool FTPClientSession::sendEPRT(const SocketAddress& addr)
+{
+ std::string arg("|");
+ arg += addr.af() == AF_INET ? '1' : '2';
+ arg += '|';
+ arg += addr.host().toString();
+ arg += '|';
+ arg += NumberFormatter::format(addr.port());
+ arg += '|';
+ std::string response;
+ int status = sendCommand("EPRT", arg, response);
+ if (isPositiveCompletion(status))
+ return true;
+ else if (isPermanentNegative(status))
+ return false;
+ else
+ throw FTPException("EPRT command failed", response, status);
+}
+
+
+void FTPClientSession::sendPORT(const SocketAddress& addr)
+{
+ std::string arg(addr.host().toString());
+ for (std::string::iterator it = arg.begin(); it != arg.end(); ++it)
+ {
+ if (*it == '.') *it = ',';
+ }
+ arg += ',';
+ Poco::UInt16 port = addr.port();
+ arg += NumberFormatter::format(port/256);
+ arg += ',';
+ arg += NumberFormatter::format(port % 256);
+ std::string response;
+ int status = sendCommand("PORT", arg, response);
+ if (!isPositiveCompletion(status))
+ throw FTPException("PORT command failed", response, status);
+}
+
+
+bool FTPClientSession::sendEPSV(SocketAddress& addr)
+{
+ std::string response;
+ int status = sendCommand("EPSV", response);
+ if (isPositiveCompletion(status))
+ {
+ parseExtAddress(response, addr);
+ return true;
+ }
+ else if (isPermanentNegative(status))
+ {
+ return false;
+ }
+ else throw FTPException("EPSV command failed", response, status);
+}
+
+
+void FTPClientSession::sendPASV(SocketAddress& addr)
+{
+ std::string response;
+ int status = sendCommand("PASV", response);
+ if (!isPositiveCompletion(status))
+ throw FTPException("PASV command failed", response, status);
+ parseAddress(response, addr);
+}
+
+
+void FTPClientSession::parseAddress(const std::string& str, SocketAddress& addr)
+{
+ std::string::const_iterator it = str.begin();
+ std::string::const_iterator end = str.end();
+ while (it != end && *it != '(') ++it;
+ if (it != end) ++it;
+ std::string host;
+ while (it != end && Poco::Ascii::isDigit(*it)) host += *it++;
+ if (it != end && *it == ',') { host += '.'; ++it; }
+ while (it != end && Poco::Ascii::isDigit(*it)) host += *it++;
+ if (it != end && *it == ',') { host += '.'; ++it; }
+ while (it != end && Poco::Ascii::isDigit(*it)) host += *it++;
+ if (it != end && *it == ',') { host += '.'; ++it; }
+ while (it != end && Poco::Ascii::isDigit(*it)) host += *it++;
+ if (it != end && *it == ',') ++it;
+ Poco::UInt16 portHi = 0;
+ while (it != end && Poco::Ascii::isDigit(*it)) { portHi *= 10; portHi += *it++ - '0'; }
+ if (it != end && *it == ',') ++it;
+ Poco::UInt16 portLo = 0;
+ while (it != end && Poco::Ascii::isDigit(*it)) { portLo *= 10; portLo += *it++ - '0'; }
+ addr = SocketAddress(host, portHi*256 + portLo);
+}
+
+
+void FTPClientSession::parseExtAddress(const std::string& str, SocketAddress& addr)
+{
+ std::string::const_iterator it = str.begin();
+ std::string::const_iterator end = str.end();
+ while (it != end && *it != '(') ++it;
+ if (it != end) ++it;
+ char delim = '|';
+ if (it != end) delim = *it++;
+ if (it != end && *it == delim) ++it;
+ if (it != end && *it == delim) ++it;
+ Poco::UInt16 port = 0;
+ while (it != end && Poco::Ascii::isDigit(*it)) { port *= 10; port += *it++ - '0'; }
+ addr = SocketAddress(_pControlSocket->peerAddress().host(), port);
+}
+
+
+void FTPClientSession::endTransfer()
+{
+ if (_pDataStream)
+ {
+ delete _pDataStream;
+ _pDataStream = 0;
+ std::string response;
+ int status = _pControlSocket->receiveStatusMessage(response);
+ if (!isPositiveCompletion(status))
+ throw FTPException("Data transfer failed", response, status);
+ }
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/FTPStreamFactory.cpp b/contrib/libs/poco/Net/src/FTPStreamFactory.cpp
index f93bb7cfbc..b557e2f751 100644
--- a/contrib/libs/poco/Net/src/FTPStreamFactory.cpp
+++ b/contrib/libs/poco/Net/src/FTPStreamFactory.cpp
@@ -1,243 +1,243 @@
-//
-// FTPStreamFactory.cpp
-//
-// Library: Net
-// Package: FTP
-// Module: FTPStreamFactory
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/FTPStreamFactory.h"
-#include "Poco/Net/FTPClientSession.h"
-#include "Poco/Net/NetException.h"
-#include "Poco/URI.h"
-#include "Poco/URIStreamOpener.h"
-#include "Poco/UnbufferedStreamBuf.h"
-#include "Poco/Path.h"
-
-
-using Poco::URIStreamFactory;
-using Poco::URI;
-using Poco::URIStreamOpener;
-using Poco::UnbufferedStreamBuf;
-using Poco::Path;
-
-
-namespace Poco {
-namespace Net {
-
-
-class FTPStreamBuf: public UnbufferedStreamBuf
-{
-public:
- FTPStreamBuf(std::istream& istr):
- _istr(istr)
- {
- // make sure exceptions from underlying string propagate
- _istr.exceptions(std::ios::badbit);
- }
-
- ~FTPStreamBuf()
- {
- }
-
-private:
- int readFromDevice()
- {
- return _istr.get();
- }
-
- std::istream& _istr;
-};
-
-
-class FTPIOS: public virtual std::ios
-{
-public:
- FTPIOS(std::istream& istr):
- _buf(istr)
- {
- poco_ios_init(&_buf);
- }
-
- ~FTPIOS()
- {
- }
-
- FTPStreamBuf* rdbuf()
- {
- return &_buf;
- }
-
-protected:
- FTPStreamBuf _buf;
-};
-
-
-class FTPStream: public FTPIOS, public std::istream
-{
-public:
- FTPStream(std::istream& istr, FTPClientSession* pSession):
- FTPIOS(istr),
- std::istream(&_buf),
- _pSession(pSession)
- {
- }
-
- ~FTPStream()
- {
- delete _pSession;
- }
-
-private:
- FTPClientSession* _pSession;
-};
-
-
-FTPPasswordProvider::FTPPasswordProvider()
-{
-}
-
-
-FTPPasswordProvider::~FTPPasswordProvider()
-{
-}
-
-
-std::string FTPStreamFactory::_anonymousPassword("poco@localhost");
-FTPPasswordProvider* FTPStreamFactory::_pPasswordProvider(0);
-
-
-FTPStreamFactory::FTPStreamFactory()
-{
-}
-
-
-FTPStreamFactory::~FTPStreamFactory()
-{
-}
-
-
-std::istream* FTPStreamFactory::open(const URI& uri)
-{
- poco_assert (uri.getScheme() == "ftp");
-
- FTPClientSession* pSession = new FTPClientSession(uri.getHost(), uri.getPort());
- try
- {
- std::string username;
- std::string password;
- getUserInfo(uri, username, password);
-
- std::string path;
- char type;
- getPathAndType(uri, path, type);
-
- pSession->login(username, password);
- if (type == 'a')
- pSession->setFileType(FTPClientSession::TYPE_TEXT);
-
- Path p(path, Path::PATH_UNIX);
- p.makeFile();
- for (int i = 0; i < p.depth(); ++i)
- pSession->setWorkingDirectory(p[i]);
- std::string file(p.getFileName());
- std::istream& istr = (type == 'd' ? pSession->beginList(file) : pSession->beginDownload(file));
- return new FTPStream(istr, pSession);
- }
- catch (...)
- {
- delete pSession;
- throw;
- }
-}
-
-
-void FTPStreamFactory::setAnonymousPassword(const std::string& password)
-{
- _anonymousPassword = password;
-}
-
-
-const std::string& FTPStreamFactory::getAnonymousPassword()
-{
- return _anonymousPassword;
-}
-
-
-void FTPStreamFactory::setPasswordProvider(FTPPasswordProvider* pProvider)
-{
- _pPasswordProvider = pProvider;
-}
-
-
-FTPPasswordProvider* FTPStreamFactory::getPasswordProvider()
-{
- return _pPasswordProvider;
-}
-
-
-void FTPStreamFactory::splitUserInfo(const std::string& userInfo, std::string& username, std::string& password)
-{
- std::string::size_type pos = userInfo.find(':');
- if (pos != std::string::npos)
- {
- username.assign(userInfo, 0, pos++);
- password.assign(userInfo, pos, userInfo.size() - pos);
- }
- else username = userInfo;
-}
-
-
-void FTPStreamFactory::getUserInfo(const URI& uri, std::string& username, std::string& password)
-{
- splitUserInfo(uri.getUserInfo(), username, password);
- if (username.empty())
- {
- username = "anonymous";
- password = _anonymousPassword;
- }
- else if (password.empty())
- {
- if (_pPasswordProvider)
- password = _pPasswordProvider->password(username, uri.getHost());
- else
- throw FTPException(std::string("Password required for ") + username + "@" + uri.getHost());
- }
-}
-
-
-void FTPStreamFactory::getPathAndType(const Poco::URI& uri, std::string& path, char& type)
-{
- path = uri.getPath();
- type = 'i';
- std::string::size_type pos = path.rfind(';');
- if (pos != std::string::npos)
- {
- if (path.length() == pos + 7 && path.compare(pos + 1, 5, "type=") == 0)
- {
- type = path[pos + 6];
- path.resize(pos);
- }
- }
-}
-
-
-void FTPStreamFactory::registerFactory()
-{
- URIStreamOpener::defaultOpener().registerStreamFactory("ftp", new FTPStreamFactory);
-}
-
-
-void FTPStreamFactory::unregisterFactory()
-{
- URIStreamOpener::defaultOpener().unregisterStreamFactory("ftp");
-}
-
-
-} } // namespace Poco::Net
+//
+// FTPStreamFactory.cpp
+//
+// Library: Net
+// Package: FTP
+// Module: FTPStreamFactory
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/FTPStreamFactory.h"
+#include "Poco/Net/FTPClientSession.h"
+#include "Poco/Net/NetException.h"
+#include "Poco/URI.h"
+#include "Poco/URIStreamOpener.h"
+#include "Poco/UnbufferedStreamBuf.h"
+#include "Poco/Path.h"
+
+
+using Poco::URIStreamFactory;
+using Poco::URI;
+using Poco::URIStreamOpener;
+using Poco::UnbufferedStreamBuf;
+using Poco::Path;
+
+
+namespace Poco {
+namespace Net {
+
+
+class FTPStreamBuf: public UnbufferedStreamBuf
+{
+public:
+ FTPStreamBuf(std::istream& istr):
+ _istr(istr)
+ {
+ // make sure exceptions from underlying string propagate
+ _istr.exceptions(std::ios::badbit);
+ }
+
+ ~FTPStreamBuf()
+ {
+ }
+
+private:
+ int readFromDevice()
+ {
+ return _istr.get();
+ }
+
+ std::istream& _istr;
+};
+
+
+class FTPIOS: public virtual std::ios
+{
+public:
+ FTPIOS(std::istream& istr):
+ _buf(istr)
+ {
+ poco_ios_init(&_buf);
+ }
+
+ ~FTPIOS()
+ {
+ }
+
+ FTPStreamBuf* rdbuf()
+ {
+ return &_buf;
+ }
+
+protected:
+ FTPStreamBuf _buf;
+};
+
+
+class FTPStream: public FTPIOS, public std::istream
+{
+public:
+ FTPStream(std::istream& istr, FTPClientSession* pSession):
+ FTPIOS(istr),
+ std::istream(&_buf),
+ _pSession(pSession)
+ {
+ }
+
+ ~FTPStream()
+ {
+ delete _pSession;
+ }
+
+private:
+ FTPClientSession* _pSession;
+};
+
+
+FTPPasswordProvider::FTPPasswordProvider()
+{
+}
+
+
+FTPPasswordProvider::~FTPPasswordProvider()
+{
+}
+
+
+std::string FTPStreamFactory::_anonymousPassword("poco@localhost");
+FTPPasswordProvider* FTPStreamFactory::_pPasswordProvider(0);
+
+
+FTPStreamFactory::FTPStreamFactory()
+{
+}
+
+
+FTPStreamFactory::~FTPStreamFactory()
+{
+}
+
+
+std::istream* FTPStreamFactory::open(const URI& uri)
+{
+ poco_assert (uri.getScheme() == "ftp");
+
+ FTPClientSession* pSession = new FTPClientSession(uri.getHost(), uri.getPort());
+ try
+ {
+ std::string username;
+ std::string password;
+ getUserInfo(uri, username, password);
+
+ std::string path;
+ char type;
+ getPathAndType(uri, path, type);
+
+ pSession->login(username, password);
+ if (type == 'a')
+ pSession->setFileType(FTPClientSession::TYPE_TEXT);
+
+ Path p(path, Path::PATH_UNIX);
+ p.makeFile();
+ for (int i = 0; i < p.depth(); ++i)
+ pSession->setWorkingDirectory(p[i]);
+ std::string file(p.getFileName());
+ std::istream& istr = (type == 'd' ? pSession->beginList(file) : pSession->beginDownload(file));
+ return new FTPStream(istr, pSession);
+ }
+ catch (...)
+ {
+ delete pSession;
+ throw;
+ }
+}
+
+
+void FTPStreamFactory::setAnonymousPassword(const std::string& password)
+{
+ _anonymousPassword = password;
+}
+
+
+const std::string& FTPStreamFactory::getAnonymousPassword()
+{
+ return _anonymousPassword;
+}
+
+
+void FTPStreamFactory::setPasswordProvider(FTPPasswordProvider* pProvider)
+{
+ _pPasswordProvider = pProvider;
+}
+
+
+FTPPasswordProvider* FTPStreamFactory::getPasswordProvider()
+{
+ return _pPasswordProvider;
+}
+
+
+void FTPStreamFactory::splitUserInfo(const std::string& userInfo, std::string& username, std::string& password)
+{
+ std::string::size_type pos = userInfo.find(':');
+ if (pos != std::string::npos)
+ {
+ username.assign(userInfo, 0, pos++);
+ password.assign(userInfo, pos, userInfo.size() - pos);
+ }
+ else username = userInfo;
+}
+
+
+void FTPStreamFactory::getUserInfo(const URI& uri, std::string& username, std::string& password)
+{
+ splitUserInfo(uri.getUserInfo(), username, password);
+ if (username.empty())
+ {
+ username = "anonymous";
+ password = _anonymousPassword;
+ }
+ else if (password.empty())
+ {
+ if (_pPasswordProvider)
+ password = _pPasswordProvider->password(username, uri.getHost());
+ else
+ throw FTPException(std::string("Password required for ") + username + "@" + uri.getHost());
+ }
+}
+
+
+void FTPStreamFactory::getPathAndType(const Poco::URI& uri, std::string& path, char& type)
+{
+ path = uri.getPath();
+ type = 'i';
+ std::string::size_type pos = path.rfind(';');
+ if (pos != std::string::npos)
+ {
+ if (path.length() == pos + 7 && path.compare(pos + 1, 5, "type=") == 0)
+ {
+ type = path[pos + 6];
+ path.resize(pos);
+ }
+ }
+}
+
+
+void FTPStreamFactory::registerFactory()
+{
+ URIStreamOpener::defaultOpener().registerStreamFactory("ftp", new FTPStreamFactory);
+}
+
+
+void FTPStreamFactory::unregisterFactory()
+{
+ URIStreamOpener::defaultOpener().unregisterStreamFactory("ftp");
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/FilePartSource.cpp b/contrib/libs/poco/Net/src/FilePartSource.cpp
index 4309136649..afd3a01db7 100644
--- a/contrib/libs/poco/Net/src/FilePartSource.cpp
+++ b/contrib/libs/poco/Net/src/FilePartSource.cpp
@@ -1,87 +1,87 @@
-//
-// FilePartSource.cpp
-//
-// Library: Net
-// Package: Messages
-// Module: FilePartSource
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/FilePartSource.h"
-#include "Poco/Path.h"
-#include "Poco/File.h"
-#include "Poco/Exception.h"
-
-
-using Poco::Path;
-using Poco::OpenFileException;
-
-
-namespace Poco {
-namespace Net {
-
-
-FilePartSource::FilePartSource(const std::string& path):
- _path(path), _istr(path)
-{
- Path p(path);
- _filename = p.getFileName();
- if (!_istr.good())
- throw OpenFileException(path);
-}
-
-
-FilePartSource::FilePartSource(const std::string& path, const std::string& mediaType):
- PartSource(mediaType),
- _path(path),
- _istr(path)
-{
- Path p(path);
- _filename = p.getFileName();
- if (!_istr.good())
- throw OpenFileException(path);
-}
-
-
-FilePartSource::FilePartSource(const std::string& path, const std::string& filename, const std::string& mediaType):
- PartSource(mediaType),
- _path(path),
- _filename(filename),
- _istr(path)
-{
- Path p(path);
- if (!_istr.good())
- throw OpenFileException(path);
-}
-
-
-FilePartSource::~FilePartSource()
-{
-}
-
-
-std::istream& FilePartSource::stream()
-{
- return _istr;
-}
-
-
-const std::string& FilePartSource::filename() const
-{
- return _filename;
-}
-
-
-std::streamsize FilePartSource::getContentLength() const
-{
- Poco::File p(_path);
- return static_cast<std::streamsize>(p.getSize());
-}
-
-
-} } // namespace Poco::Net
+//
+// FilePartSource.cpp
+//
+// Library: Net
+// Package: Messages
+// Module: FilePartSource
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/FilePartSource.h"
+#include "Poco/Path.h"
+#include "Poco/File.h"
+#include "Poco/Exception.h"
+
+
+using Poco::Path;
+using Poco::OpenFileException;
+
+
+namespace Poco {
+namespace Net {
+
+
+FilePartSource::FilePartSource(const std::string& path):
+ _path(path), _istr(path)
+{
+ Path p(path);
+ _filename = p.getFileName();
+ if (!_istr.good())
+ throw OpenFileException(path);
+}
+
+
+FilePartSource::FilePartSource(const std::string& path, const std::string& mediaType):
+ PartSource(mediaType),
+ _path(path),
+ _istr(path)
+{
+ Path p(path);
+ _filename = p.getFileName();
+ if (!_istr.good())
+ throw OpenFileException(path);
+}
+
+
+FilePartSource::FilePartSource(const std::string& path, const std::string& filename, const std::string& mediaType):
+ PartSource(mediaType),
+ _path(path),
+ _filename(filename),
+ _istr(path)
+{
+ Path p(path);
+ if (!_istr.good())
+ throw OpenFileException(path);
+}
+
+
+FilePartSource::~FilePartSource()
+{
+}
+
+
+std::istream& FilePartSource::stream()
+{
+ return _istr;
+}
+
+
+const std::string& FilePartSource::filename() const
+{
+ return _filename;
+}
+
+
+std::streamsize FilePartSource::getContentLength() const
+{
+ Poco::File p(_path);
+ return static_cast<std::streamsize>(p.getSize());
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/HTMLForm.cpp b/contrib/libs/poco/Net/src/HTMLForm.cpp
index 65defbe014..0518bdddd6 100644
--- a/contrib/libs/poco/Net/src/HTMLForm.cpp
+++ b/contrib/libs/poco/Net/src/HTMLForm.cpp
@@ -1,468 +1,468 @@
-//
-// HTMLForm.cpp
-//
-// Library: Net
-// Package: HTML
-// Module: HTMLForm
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/HTMLForm.h"
-#include "Poco/Net/HTTPRequest.h"
-#include "Poco/Net/PartSource.h"
-#include "Poco/Net/PartHandler.h"
-#include "Poco/Net/MultipartWriter.h"
-#include "Poco/Net/MultipartReader.h"
-#include "Poco/Net/NullPartHandler.h"
-#include "Poco/Net/NetException.h"
-#include "Poco/NullStream.h"
-#include "Poco/CountingStream.h"
-#include "Poco/StreamCopier.h"
-#include "Poco/URI.h"
-#include "Poco/String.h"
-#include "Poco/CountingStream.h"
-#include "Poco/UTF8String.h"
-#include <sstream>
-
-
-using Poco::NullInputStream;
-using Poco::StreamCopier;
-using Poco::SyntaxException;
-using Poco::URI;
-using Poco::icompare;
-
-
-namespace Poco {
-namespace Net {
-
-
-const std::string HTMLForm::ENCODING_URL = "application/x-www-form-urlencoded";
-const std::string HTMLForm::ENCODING_MULTIPART = "multipart/form-data";
-const int HTMLForm::UNKNOWN_CONTENT_LENGTH = -1;
-
-
-class HTMLFormCountingOutputStream: public CountingOutputStream
-{
-public:
- HTMLFormCountingOutputStream():
- _valid(true)
- {
- }
-
- bool isValid() const
- {
- return _valid;
- }
-
- void setValid(bool v)
- {
- _valid = v;
- }
-
-private:
- bool _valid;
-};
-
-
-HTMLForm::HTMLForm():
- _fieldLimit(DFL_FIELD_LIMIT),
- _valueLengthLimit(DFL_MAX_VALUE_LENGTH),
- _encoding(ENCODING_URL)
-{
-}
-
-
-HTMLForm::HTMLForm(const std::string& encoding):
- _fieldLimit(DFL_FIELD_LIMIT),
- _valueLengthLimit(DFL_MAX_VALUE_LENGTH),
- _encoding(encoding)
-{
-}
-
-
-HTMLForm::HTMLForm(const HTTPRequest& request, std::istream& requestBody, PartHandler& handler):
- _fieldLimit(DFL_FIELD_LIMIT),
- _valueLengthLimit(DFL_MAX_VALUE_LENGTH)
-{
- load(request, requestBody, handler);
-}
-
-
-HTMLForm::HTMLForm(const HTTPRequest& request, std::istream& requestBody):
- _fieldLimit(DFL_FIELD_LIMIT),
- _valueLengthLimit(DFL_MAX_VALUE_LENGTH)
-{
- load(request, requestBody);
-}
-
-
-HTMLForm::HTMLForm(const HTTPRequest& request):
- _fieldLimit(DFL_FIELD_LIMIT),
- _valueLengthLimit(DFL_MAX_VALUE_LENGTH)
-{
- load(request);
-}
-
-
-HTMLForm::~HTMLForm()
-{
- for (PartVec::iterator it = _parts.begin(); it != _parts.end(); ++it)
- {
- delete it->pSource;
- }
-}
-
-
-void HTMLForm::setEncoding(const std::string& encoding)
-{
- _encoding = encoding;
-}
-
-
-void HTMLForm::addPart(const std::string& name, PartSource* pSource)
-{
- poco_check_ptr (pSource);
-
- Part part;
- part.name = name;
- part.pSource = pSource;
- _parts.push_back(part);
-}
-
-
-void HTMLForm::load(const HTTPRequest& request, std::istream& requestBody, PartHandler& handler)
-{
- clear();
-
- URI uri(request.getURI());
- const std::string& query = uri.getRawQuery();
- if (!query.empty())
- {
- std::istringstream istr(query);
- readUrl(istr);
- }
-
- if (request.getMethod() == HTTPRequest::HTTP_POST || request.getMethod() == HTTPRequest::HTTP_PUT)
- {
- std::string mediaType;
- NameValueCollection params;
- MessageHeader::splitParameters(request.getContentType(), mediaType, params);
- _encoding = mediaType;
- if (_encoding == ENCODING_MULTIPART)
- {
- _boundary = params["boundary"];
- readMultipart(requestBody, handler);
- }
- else
- {
- readUrl(requestBody);
- }
- }
-}
-
-
-void HTMLForm::load(const HTTPRequest& request, std::istream& requestBody)
-{
- NullPartHandler nah;
- load(request, requestBody, nah);
-}
-
-
-void HTMLForm::load(const HTTPRequest& request)
-{
- NullPartHandler nah;
- NullInputStream nis;
- load(request, nis, nah);
-}
-
-
-void HTMLForm::read(std::istream& istr, PartHandler& handler)
-{
- if (_encoding == ENCODING_URL)
- readUrl(istr);
- else
- readMultipart(istr, handler);
-}
-
-
-void HTMLForm::read(std::istream& istr)
-{
- readUrl(istr);
-}
-
-
-void HTMLForm::read(const std::string& queryString)
-{
- std::istringstream istr(queryString);
- readUrl(istr);
-}
-
-
-void HTMLForm::prepareSubmit(HTTPRequest& request, int options)
-{
- if (request.getMethod() == HTTPRequest::HTTP_POST || request.getMethod() == HTTPRequest::HTTP_PUT)
- {
- if (_encoding == ENCODING_URL)
- {
- request.setContentType(_encoding);
- request.setChunkedTransferEncoding(false);
- Poco::CountingOutputStream ostr;
- writeUrl(ostr);
- request.setContentLength(ostr.chars());
- }
- else
- {
- _boundary = MultipartWriter::createBoundary();
- std::string ct(_encoding);
- ct.append("; boundary=\"");
- ct.append(_boundary);
- ct.append("\"");
- request.setContentType(ct);
- }
- if (request.getVersion() == HTTPMessage::HTTP_1_0)
- {
- request.setKeepAlive(false);
- request.setChunkedTransferEncoding(false);
- }
- else if (_encoding != ENCODING_URL && (options & OPT_USE_CONTENT_LENGTH) == 0)
- {
- request.setChunkedTransferEncoding(true);
- }
- if (!request.getChunkedTransferEncoding() && !request.hasContentLength())
- {
- request.setContentLength(calculateContentLength());
- }
- }
- else
- {
- std::string uri = request.getURI();
- std::ostringstream ostr;
- writeUrl(ostr);
- uri.append("?");
- uri.append(ostr.str());
- request.setURI(uri);
- }
-}
-
-
-std::streamsize HTMLForm::calculateContentLength()
-{
- if (_encoding == ENCODING_MULTIPART && _boundary.empty())
- throw HTMLFormException("Form must be prepared");
-
- HTMLFormCountingOutputStream c;
- write(c);
- if (c.isValid())
- return c.chars();
- else
- return UNKNOWN_CONTENT_LENGTH;
-}
-
-
-void HTMLForm::write(std::ostream& ostr, const std::string& boundary)
-{
- if (_encoding == ENCODING_URL)
- {
- writeUrl(ostr);
- }
- else
- {
- _boundary = boundary;
- writeMultipart(ostr);
- }
-}
-
-
-void HTMLForm::write(std::ostream& ostr)
-{
- if (_encoding == ENCODING_URL)
- writeUrl(ostr);
- else
- writeMultipart(ostr);
-}
-
-
-void HTMLForm::readUrl(std::istream& istr)
-{
- static const int eof = std::char_traits<char>::eof();
-
- int fields = 0;
- int ch = istr.get();
- bool isFirst = true;
- while (ch != eof)
- {
- if (_fieldLimit > 0 && fields == _fieldLimit)
- throw HTMLFormException("Too many form fields");
- std::string name;
- std::string value;
- while (ch != eof && ch != '=' && ch != '&')
- {
- if (ch == '+') ch = ' ';
- if (name.size() < MAX_NAME_LENGTH)
- name += (char) ch;
- else
- throw HTMLFormException("Field name too long");
- ch = istr.get();
- }
- if (ch == '=')
- {
- ch = istr.get();
- while (ch != eof && ch != '&')
- {
- if (ch == '+') ch = ' ';
- if (value.size() < _valueLengthLimit)
- value += (char) ch;
- else
- throw HTMLFormException("Field value too long");
- ch = istr.get();
- }
- }
- // remove UTF-8 byte order mark from first name, if present
- if (isFirst)
- {
- UTF8::removeBOM(name);
- }
- std::string decodedName;
- std::string decodedValue;
- URI::decode(name, decodedName);
- URI::decode(value, decodedValue);
- add(decodedName, decodedValue);
- ++fields;
- if (ch == '&') ch = istr.get();
- isFirst = false;
- }
-}
-
-
-void HTMLForm::readMultipart(std::istream& istr, PartHandler& handler)
-{
- static const int eof = std::char_traits<char>::eof();
-
- int fields = 0;
- MultipartReader reader(istr, _boundary);
- while (reader.hasNextPart())
- {
- if (_fieldLimit > 0 && fields == _fieldLimit)
- throw HTMLFormException("Too many form fields");
- MessageHeader header;
- reader.nextPart(header);
- std::string disp;
- NameValueCollection params;
- if (header.has("Content-Disposition"))
- {
- std::string cd = header.get("Content-Disposition");
- MessageHeader::splitParameters(cd, disp, params);
- }
- if (params.has("filename"))
- {
- handler.handlePart(header, reader.stream());
- // Ensure that the complete part has been read.
- while (reader.stream().good()) reader.stream().get();
- }
- else
- {
- std::string name = params["name"];
- std::string value;
- std::istream& input = reader.stream();
- int ch = istr.get();
- while (ch != eof)
- {
- if (value.size() < _valueLengthLimit)
- value += (char) ch;
- else
- throw HTMLFormException("Field value too long");
- ch = input.get();
- }
- add(name, value);
- }
- ++fields;
- }
-}
-
-
-void HTMLForm::writeUrl(std::ostream& ostr)
-{
- for (NameValueCollection::ConstIterator it = begin(); it != end(); ++it)
- {
- if (it != begin()) ostr << "&";
- std::string name;
- URI::encode(it->first, "!?#/'\",;:$&()[]*+=@", name);
- std::string value;
- URI::encode(it->second, "!?#/'\",;:$&()[]*+=@", value);
- ostr << name << "=" << value;
- }
-}
-
-
-void HTMLForm::writeMultipart(std::ostream& ostr)
-{
- HTMLFormCountingOutputStream* pCountingOutputStream(dynamic_cast<HTMLFormCountingOutputStream*>(&ostr));
-
- MultipartWriter writer(ostr, _boundary);
- for (NameValueCollection::ConstIterator it = begin(); it != end(); ++it)
- {
- MessageHeader header;
- std::string disp("form-data; name=\"");
- disp.append(it->first);
- disp.append("\"");
- header.set("Content-Disposition", disp);
- writer.nextPart(header);
- ostr << it->second;
- }
- for (PartVec::iterator ita = _parts.begin(); ita != _parts.end(); ++ita)
- {
- MessageHeader header(ita->pSource->headers());
- std::string disp("form-data; name=\"");
- disp.append(ita->name);
- disp.append("\"");
- std::string filename = ita->pSource->filename();
- if (!filename.empty())
- {
- disp.append("; filename=\"");
- disp.append(filename);
- disp.append("\"");
- }
- header.set("Content-Disposition", disp);
- header.set("Content-Type", ita->pSource->mediaType());
- writer.nextPart(header);
- if (pCountingOutputStream)
- {
- // count only, don't move stream position
- std::streamsize partlen = ita->pSource->getContentLength();
- if (partlen != PartSource::UNKNOWN_CONTENT_LENGTH)
- pCountingOutputStream->addChars(static_cast<int>(partlen));
- else
- pCountingOutputStream->setValid(false);
- }
- else
- {
- StreamCopier::copyStream(ita->pSource->stream(), ostr);
- }
- }
- writer.close();
- _boundary = writer.boundary();
-}
-
-
-void HTMLForm::setFieldLimit(int limit)
-{
- poco_assert (limit >= 0);
-
- _fieldLimit = limit;
-}
-
-
-void HTMLForm::setValueLengthLimit(int limit)
-{
- poco_assert (limit >= 0);
-
- _valueLengthLimit = limit;
-}
-
-
-} } // namespace Poco::Net
+//
+// HTMLForm.cpp
+//
+// Library: Net
+// Package: HTML
+// Module: HTMLForm
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/HTMLForm.h"
+#include "Poco/Net/HTTPRequest.h"
+#include "Poco/Net/PartSource.h"
+#include "Poco/Net/PartHandler.h"
+#include "Poco/Net/MultipartWriter.h"
+#include "Poco/Net/MultipartReader.h"
+#include "Poco/Net/NullPartHandler.h"
+#include "Poco/Net/NetException.h"
+#include "Poco/NullStream.h"
+#include "Poco/CountingStream.h"
+#include "Poco/StreamCopier.h"
+#include "Poco/URI.h"
+#include "Poco/String.h"
+#include "Poco/CountingStream.h"
+#include "Poco/UTF8String.h"
+#include <sstream>
+
+
+using Poco::NullInputStream;
+using Poco::StreamCopier;
+using Poco::SyntaxException;
+using Poco::URI;
+using Poco::icompare;
+
+
+namespace Poco {
+namespace Net {
+
+
+const std::string HTMLForm::ENCODING_URL = "application/x-www-form-urlencoded";
+const std::string HTMLForm::ENCODING_MULTIPART = "multipart/form-data";
+const int HTMLForm::UNKNOWN_CONTENT_LENGTH = -1;
+
+
+class HTMLFormCountingOutputStream: public CountingOutputStream
+{
+public:
+ HTMLFormCountingOutputStream():
+ _valid(true)
+ {
+ }
+
+ bool isValid() const
+ {
+ return _valid;
+ }
+
+ void setValid(bool v)
+ {
+ _valid = v;
+ }
+
+private:
+ bool _valid;
+};
+
+
+HTMLForm::HTMLForm():
+ _fieldLimit(DFL_FIELD_LIMIT),
+ _valueLengthLimit(DFL_MAX_VALUE_LENGTH),
+ _encoding(ENCODING_URL)
+{
+}
+
+
+HTMLForm::HTMLForm(const std::string& encoding):
+ _fieldLimit(DFL_FIELD_LIMIT),
+ _valueLengthLimit(DFL_MAX_VALUE_LENGTH),
+ _encoding(encoding)
+{
+}
+
+
+HTMLForm::HTMLForm(const HTTPRequest& request, std::istream& requestBody, PartHandler& handler):
+ _fieldLimit(DFL_FIELD_LIMIT),
+ _valueLengthLimit(DFL_MAX_VALUE_LENGTH)
+{
+ load(request, requestBody, handler);
+}
+
+
+HTMLForm::HTMLForm(const HTTPRequest& request, std::istream& requestBody):
+ _fieldLimit(DFL_FIELD_LIMIT),
+ _valueLengthLimit(DFL_MAX_VALUE_LENGTH)
+{
+ load(request, requestBody);
+}
+
+
+HTMLForm::HTMLForm(const HTTPRequest& request):
+ _fieldLimit(DFL_FIELD_LIMIT),
+ _valueLengthLimit(DFL_MAX_VALUE_LENGTH)
+{
+ load(request);
+}
+
+
+HTMLForm::~HTMLForm()
+{
+ for (PartVec::iterator it = _parts.begin(); it != _parts.end(); ++it)
+ {
+ delete it->pSource;
+ }
+}
+
+
+void HTMLForm::setEncoding(const std::string& encoding)
+{
+ _encoding = encoding;
+}
+
+
+void HTMLForm::addPart(const std::string& name, PartSource* pSource)
+{
+ poco_check_ptr (pSource);
+
+ Part part;
+ part.name = name;
+ part.pSource = pSource;
+ _parts.push_back(part);
+}
+
+
+void HTMLForm::load(const HTTPRequest& request, std::istream& requestBody, PartHandler& handler)
+{
+ clear();
+
+ URI uri(request.getURI());
+ const std::string& query = uri.getRawQuery();
+ if (!query.empty())
+ {
+ std::istringstream istr(query);
+ readUrl(istr);
+ }
+
+ if (request.getMethod() == HTTPRequest::HTTP_POST || request.getMethod() == HTTPRequest::HTTP_PUT)
+ {
+ std::string mediaType;
+ NameValueCollection params;
+ MessageHeader::splitParameters(request.getContentType(), mediaType, params);
+ _encoding = mediaType;
+ if (_encoding == ENCODING_MULTIPART)
+ {
+ _boundary = params["boundary"];
+ readMultipart(requestBody, handler);
+ }
+ else
+ {
+ readUrl(requestBody);
+ }
+ }
+}
+
+
+void HTMLForm::load(const HTTPRequest& request, std::istream& requestBody)
+{
+ NullPartHandler nah;
+ load(request, requestBody, nah);
+}
+
+
+void HTMLForm::load(const HTTPRequest& request)
+{
+ NullPartHandler nah;
+ NullInputStream nis;
+ load(request, nis, nah);
+}
+
+
+void HTMLForm::read(std::istream& istr, PartHandler& handler)
+{
+ if (_encoding == ENCODING_URL)
+ readUrl(istr);
+ else
+ readMultipart(istr, handler);
+}
+
+
+void HTMLForm::read(std::istream& istr)
+{
+ readUrl(istr);
+}
+
+
+void HTMLForm::read(const std::string& queryString)
+{
+ std::istringstream istr(queryString);
+ readUrl(istr);
+}
+
+
+void HTMLForm::prepareSubmit(HTTPRequest& request, int options)
+{
+ if (request.getMethod() == HTTPRequest::HTTP_POST || request.getMethod() == HTTPRequest::HTTP_PUT)
+ {
+ if (_encoding == ENCODING_URL)
+ {
+ request.setContentType(_encoding);
+ request.setChunkedTransferEncoding(false);
+ Poco::CountingOutputStream ostr;
+ writeUrl(ostr);
+ request.setContentLength(ostr.chars());
+ }
+ else
+ {
+ _boundary = MultipartWriter::createBoundary();
+ std::string ct(_encoding);
+ ct.append("; boundary=\"");
+ ct.append(_boundary);
+ ct.append("\"");
+ request.setContentType(ct);
+ }
+ if (request.getVersion() == HTTPMessage::HTTP_1_0)
+ {
+ request.setKeepAlive(false);
+ request.setChunkedTransferEncoding(false);
+ }
+ else if (_encoding != ENCODING_URL && (options & OPT_USE_CONTENT_LENGTH) == 0)
+ {
+ request.setChunkedTransferEncoding(true);
+ }
+ if (!request.getChunkedTransferEncoding() && !request.hasContentLength())
+ {
+ request.setContentLength(calculateContentLength());
+ }
+ }
+ else
+ {
+ std::string uri = request.getURI();
+ std::ostringstream ostr;
+ writeUrl(ostr);
+ uri.append("?");
+ uri.append(ostr.str());
+ request.setURI(uri);
+ }
+}
+
+
+std::streamsize HTMLForm::calculateContentLength()
+{
+ if (_encoding == ENCODING_MULTIPART && _boundary.empty())
+ throw HTMLFormException("Form must be prepared");
+
+ HTMLFormCountingOutputStream c;
+ write(c);
+ if (c.isValid())
+ return c.chars();
+ else
+ return UNKNOWN_CONTENT_LENGTH;
+}
+
+
+void HTMLForm::write(std::ostream& ostr, const std::string& boundary)
+{
+ if (_encoding == ENCODING_URL)
+ {
+ writeUrl(ostr);
+ }
+ else
+ {
+ _boundary = boundary;
+ writeMultipart(ostr);
+ }
+}
+
+
+void HTMLForm::write(std::ostream& ostr)
+{
+ if (_encoding == ENCODING_URL)
+ writeUrl(ostr);
+ else
+ writeMultipart(ostr);
+}
+
+
+void HTMLForm::readUrl(std::istream& istr)
+{
+ static const int eof = std::char_traits<char>::eof();
+
+ int fields = 0;
+ int ch = istr.get();
+ bool isFirst = true;
+ while (ch != eof)
+ {
+ if (_fieldLimit > 0 && fields == _fieldLimit)
+ throw HTMLFormException("Too many form fields");
+ std::string name;
+ std::string value;
+ while (ch != eof && ch != '=' && ch != '&')
+ {
+ if (ch == '+') ch = ' ';
+ if (name.size() < MAX_NAME_LENGTH)
+ name += (char) ch;
+ else
+ throw HTMLFormException("Field name too long");
+ ch = istr.get();
+ }
+ if (ch == '=')
+ {
+ ch = istr.get();
+ while (ch != eof && ch != '&')
+ {
+ if (ch == '+') ch = ' ';
+ if (value.size() < _valueLengthLimit)
+ value += (char) ch;
+ else
+ throw HTMLFormException("Field value too long");
+ ch = istr.get();
+ }
+ }
+ // remove UTF-8 byte order mark from first name, if present
+ if (isFirst)
+ {
+ UTF8::removeBOM(name);
+ }
+ std::string decodedName;
+ std::string decodedValue;
+ URI::decode(name, decodedName);
+ URI::decode(value, decodedValue);
+ add(decodedName, decodedValue);
+ ++fields;
+ if (ch == '&') ch = istr.get();
+ isFirst = false;
+ }
+}
+
+
+void HTMLForm::readMultipart(std::istream& istr, PartHandler& handler)
+{
+ static const int eof = std::char_traits<char>::eof();
+
+ int fields = 0;
+ MultipartReader reader(istr, _boundary);
+ while (reader.hasNextPart())
+ {
+ if (_fieldLimit > 0 && fields == _fieldLimit)
+ throw HTMLFormException("Too many form fields");
+ MessageHeader header;
+ reader.nextPart(header);
+ std::string disp;
+ NameValueCollection params;
+ if (header.has("Content-Disposition"))
+ {
+ std::string cd = header.get("Content-Disposition");
+ MessageHeader::splitParameters(cd, disp, params);
+ }
+ if (params.has("filename"))
+ {
+ handler.handlePart(header, reader.stream());
+ // Ensure that the complete part has been read.
+ while (reader.stream().good()) reader.stream().get();
+ }
+ else
+ {
+ std::string name = params["name"];
+ std::string value;
+ std::istream& input = reader.stream();
+ int ch = istr.get();
+ while (ch != eof)
+ {
+ if (value.size() < _valueLengthLimit)
+ value += (char) ch;
+ else
+ throw HTMLFormException("Field value too long");
+ ch = input.get();
+ }
+ add(name, value);
+ }
+ ++fields;
+ }
+}
+
+
+void HTMLForm::writeUrl(std::ostream& ostr)
+{
+ for (NameValueCollection::ConstIterator it = begin(); it != end(); ++it)
+ {
+ if (it != begin()) ostr << "&";
+ std::string name;
+ URI::encode(it->first, "!?#/'\",;:$&()[]*+=@", name);
+ std::string value;
+ URI::encode(it->second, "!?#/'\",;:$&()[]*+=@", value);
+ ostr << name << "=" << value;
+ }
+}
+
+
+void HTMLForm::writeMultipart(std::ostream& ostr)
+{
+ HTMLFormCountingOutputStream* pCountingOutputStream(dynamic_cast<HTMLFormCountingOutputStream*>(&ostr));
+
+ MultipartWriter writer(ostr, _boundary);
+ for (NameValueCollection::ConstIterator it = begin(); it != end(); ++it)
+ {
+ MessageHeader header;
+ std::string disp("form-data; name=\"");
+ disp.append(it->first);
+ disp.append("\"");
+ header.set("Content-Disposition", disp);
+ writer.nextPart(header);
+ ostr << it->second;
+ }
+ for (PartVec::iterator ita = _parts.begin(); ita != _parts.end(); ++ita)
+ {
+ MessageHeader header(ita->pSource->headers());
+ std::string disp("form-data; name=\"");
+ disp.append(ita->name);
+ disp.append("\"");
+ std::string filename = ita->pSource->filename();
+ if (!filename.empty())
+ {
+ disp.append("; filename=\"");
+ disp.append(filename);
+ disp.append("\"");
+ }
+ header.set("Content-Disposition", disp);
+ header.set("Content-Type", ita->pSource->mediaType());
+ writer.nextPart(header);
+ if (pCountingOutputStream)
+ {
+ // count only, don't move stream position
+ std::streamsize partlen = ita->pSource->getContentLength();
+ if (partlen != PartSource::UNKNOWN_CONTENT_LENGTH)
+ pCountingOutputStream->addChars(static_cast<int>(partlen));
+ else
+ pCountingOutputStream->setValid(false);
+ }
+ else
+ {
+ StreamCopier::copyStream(ita->pSource->stream(), ostr);
+ }
+ }
+ writer.close();
+ _boundary = writer.boundary();
+}
+
+
+void HTMLForm::setFieldLimit(int limit)
+{
+ poco_assert (limit >= 0);
+
+ _fieldLimit = limit;
+}
+
+
+void HTMLForm::setValueLengthLimit(int limit)
+{
+ poco_assert (limit >= 0);
+
+ _valueLengthLimit = limit;
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/HTTPAuthenticationParams.cpp b/contrib/libs/poco/Net/src/HTTPAuthenticationParams.cpp
index 5d97adcf67..1c01ac268f 100644
--- a/contrib/libs/poco/Net/src/HTTPAuthenticationParams.cpp
+++ b/contrib/libs/poco/Net/src/HTTPAuthenticationParams.cpp
@@ -1,316 +1,316 @@
-//
-// HTTPAuthenticationParams.cpp
-//
-// Library: Net
-// Package: HTTP
-// Module: HTTPAuthenticationParams
-//
-// Copyright (c) 2011, Anton V. Yabchinskiy (arn at bestmx dot ru).
-// Copyright (c) 2012, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Exception.h"
-#include "Poco/Net/HTTPAuthenticationParams.h"
-#include "Poco/Net/HTTPRequest.h"
-#include "Poco/Net/HTTPResponse.h"
-#include "Poco/Net/NetException.h"
-#include "Poco/String.h"
-#include "Poco/Ascii.h"
-
-
-using Poco::icompare;
-using Poco::Ascii;
-
-
-namespace
-{
- bool mustBeQuoted(const std::string& name)
- {
- return
- icompare(name, "cnonce") == 0 ||
- icompare(name, "domain") == 0 ||
- icompare(name, "nonce") == 0 ||
- icompare(name, "opaque") == 0 ||
- icompare(name, "qop") == 0 ||
- icompare(name, "realm") == 0 ||
- icompare(name, "response") == 0 ||
- icompare(name, "uri") == 0 ||
- icompare(name, "username") == 0;
- }
-
-
- void formatParameter(std::string& result, const std::string& name, const std::string& value)
- {
- result += name;
- result += '=';
- if (mustBeQuoted(name))
- {
- result += '"';
- result += value;
- result += '"';
- }
- else
- {
- result += value;
- }
- }
-}
-
-
-namespace Poco {
-namespace Net {
-
-
-const std::string HTTPAuthenticationParams::REALM("realm");
-const std::string HTTPAuthenticationParams::WWW_AUTHENTICATE("WWW-Authenticate");
-const std::string HTTPAuthenticationParams::PROXY_AUTHENTICATE("Proxy-Authenticate");
-
-
-HTTPAuthenticationParams::HTTPAuthenticationParams()
-{
-}
-
-
-HTTPAuthenticationParams::HTTPAuthenticationParams(const std::string& authInfo)
-{
+//
+// HTTPAuthenticationParams.cpp
+//
+// Library: Net
+// Package: HTTP
+// Module: HTTPAuthenticationParams
+//
+// Copyright (c) 2011, Anton V. Yabchinskiy (arn at bestmx dot ru).
+// Copyright (c) 2012, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Exception.h"
+#include "Poco/Net/HTTPAuthenticationParams.h"
+#include "Poco/Net/HTTPRequest.h"
+#include "Poco/Net/HTTPResponse.h"
+#include "Poco/Net/NetException.h"
+#include "Poco/String.h"
+#include "Poco/Ascii.h"
+
+
+using Poco::icompare;
+using Poco::Ascii;
+
+
+namespace
+{
+ bool mustBeQuoted(const std::string& name)
+ {
+ return
+ icompare(name, "cnonce") == 0 ||
+ icompare(name, "domain") == 0 ||
+ icompare(name, "nonce") == 0 ||
+ icompare(name, "opaque") == 0 ||
+ icompare(name, "qop") == 0 ||
+ icompare(name, "realm") == 0 ||
+ icompare(name, "response") == 0 ||
+ icompare(name, "uri") == 0 ||
+ icompare(name, "username") == 0;
+ }
+
+
+ void formatParameter(std::string& result, const std::string& name, const std::string& value)
+ {
+ result += name;
+ result += '=';
+ if (mustBeQuoted(name))
+ {
+ result += '"';
+ result += value;
+ result += '"';
+ }
+ else
+ {
+ result += value;
+ }
+ }
+}
+
+
+namespace Poco {
+namespace Net {
+
+
+const std::string HTTPAuthenticationParams::REALM("realm");
+const std::string HTTPAuthenticationParams::WWW_AUTHENTICATE("WWW-Authenticate");
+const std::string HTTPAuthenticationParams::PROXY_AUTHENTICATE("Proxy-Authenticate");
+
+
+HTTPAuthenticationParams::HTTPAuthenticationParams()
+{
+}
+
+
+HTTPAuthenticationParams::HTTPAuthenticationParams(const std::string& authInfo)
+{
+ fromAuthInfo(authInfo);
+}
+
+
+HTTPAuthenticationParams::HTTPAuthenticationParams(const HTTPRequest& request)
+{
+ fromRequest(request);
+}
+
+
+HTTPAuthenticationParams::HTTPAuthenticationParams(const HTTPResponse& response, const std::string& header)
+{
+ fromResponse(response, header);
+}
+
+
+HTTPAuthenticationParams::~HTTPAuthenticationParams()
+{
+}
+
+
+HTTPAuthenticationParams& HTTPAuthenticationParams::operator = (const HTTPAuthenticationParams& authParams)
+{
+ NameValueCollection::operator = (authParams);
+
+ return *this;
+}
+
+
+void HTTPAuthenticationParams::fromAuthInfo(const std::string& authInfo)
+{
+ parse(authInfo.begin(), authInfo.end());
+}
+
+
+void HTTPAuthenticationParams::fromRequest(const HTTPRequest& request)
+{
+ std::string scheme;
+ std::string authInfo;
+
+ request.getCredentials(scheme, authInfo);
+
+ if (icompare(scheme, "Digest") != 0)
+ throw InvalidArgumentException("Could not parse non-Digest authentication information", scheme);
+
fromAuthInfo(authInfo);
-}
-
-
-HTTPAuthenticationParams::HTTPAuthenticationParams(const HTTPRequest& request)
-{
- fromRequest(request);
-}
-
-
-HTTPAuthenticationParams::HTTPAuthenticationParams(const HTTPResponse& response, const std::string& header)
-{
- fromResponse(response, header);
-}
-
-
-HTTPAuthenticationParams::~HTTPAuthenticationParams()
-{
-}
-
-
-HTTPAuthenticationParams& HTTPAuthenticationParams::operator = (const HTTPAuthenticationParams& authParams)
-{
- NameValueCollection::operator = (authParams);
-
- return *this;
-}
-
-
-void HTTPAuthenticationParams::fromAuthInfo(const std::string& authInfo)
-{
- parse(authInfo.begin(), authInfo.end());
-}
-
-
-void HTTPAuthenticationParams::fromRequest(const HTTPRequest& request)
-{
- std::string scheme;
- std::string authInfo;
-
- request.getCredentials(scheme, authInfo);
-
- if (icompare(scheme, "Digest") != 0)
- throw InvalidArgumentException("Could not parse non-Digest authentication information", scheme);
-
- fromAuthInfo(authInfo);
-}
-
-
-void HTTPAuthenticationParams::fromResponse(const HTTPResponse& response, const std::string& header)
-{
- NameValueCollection::ConstIterator it = response.find(header);
- if (it == response.end())
- throw NotAuthenticatedException("HTTP response has no authentication header");
-
- bool found = false;
- while (!found && it != response.end() && icompare(it->first, header) == 0)
- {
- const std::string& header2 = it->second;
- if (icompare(header2, 0, 6, "Basic ") == 0)
- {
- parse(header2.begin() + 6, header2.end());
- found = true;
- }
- else if (icompare(header2, 0, 7, "Digest ") == 0)
- {
- parse(header2.begin() + 7, header2.end());
- found = true;
- }
- ++it;
- }
- if (!found) throw NotAuthenticatedException("No Basic or Digest authentication header found");
-}
-
-
-const std::string& HTTPAuthenticationParams::getRealm() const
-{
- return get(REALM);
-}
-
-
-void HTTPAuthenticationParams::setRealm(const std::string& realm)
-{
- set(REALM, realm);
-}
-
-
-std::string HTTPAuthenticationParams::toString() const
-{
- ConstIterator iter = begin();
- std::string result;
-
- if (iter != end())
- {
- formatParameter(result, iter->first, iter->second);
- ++iter;
- }
-
- for (; iter != end(); ++iter)
- {
- result.append(", ");
- formatParameter(result, iter->first, iter->second);
- }
-
- return result;
-}
-
-
-void HTTPAuthenticationParams::parse(std::string::const_iterator first, std::string::const_iterator last)
-{
- enum State
- {
- STATE_INITIAL = 0x0100,
- STATE_FINAL = 0x0200,
-
- STATE_SPACE = STATE_INITIAL | 0,
- STATE_TOKEN = 1,
- STATE_EQUALS = 2,
- STATE_VALUE = STATE_FINAL | 3,
- STATE_VALUE_QUOTED = 4,
- STATE_VALUE_ESCAPE = 5,
- STATE_COMMA = STATE_FINAL | 6
- };
-
- int state = STATE_SPACE;
- std::string token;
- std::string value;
-
- for (std::string::const_iterator it = first; it != last; ++it)
- {
- switch (state)
- {
- case STATE_SPACE:
- if (Ascii::isAlphaNumeric(*it) || *it == '_' || *it == '-')
- {
- token += *it;
- state = STATE_TOKEN;
- }
- else if (Ascii::isSpace(*it))
- {
- // Skip
- }
- else throw SyntaxException("Invalid authentication information");
- break;
-
- case STATE_TOKEN:
- if (*it == '=')
- {
- state = STATE_EQUALS;
- }
- else if (Ascii::isAlphaNumeric(*it) || *it == '_' || *it == '-')
- {
- token += *it;
- }
- else throw SyntaxException("Invalid authentication information");
- break;
-
- case STATE_EQUALS:
- if (Ascii::isAlphaNumeric(*it) || *it == '_')
- {
- value += *it;
- state = STATE_VALUE;
- }
- else if (*it == '"')
- {
- state = STATE_VALUE_QUOTED;
- }
- else throw SyntaxException("Invalid authentication information");
- break;
-
- case STATE_VALUE_QUOTED:
- if (*it == '\\')
- {
- state = STATE_VALUE_ESCAPE;
- }
- else if (*it == '"')
- {
- add(token, value);
- token.clear();
- value.clear();
- state = STATE_COMMA;
- }
- else
- {
- value += *it;
- }
- break;
-
- case STATE_VALUE_ESCAPE:
- value += *it;
- state = STATE_VALUE_QUOTED;
- break;
-
- case STATE_VALUE:
- if (Ascii::isSpace(*it))
- {
- add(token, value);
- token.clear();
- value.clear();
- state = STATE_COMMA;
- }
- else if (*it == ',')
- {
- add(token, value);
- token.clear();
- value.clear();
- state = STATE_SPACE;
- }
- else
- {
- value += *it;
- }
- break;
-
- case STATE_COMMA:
- if (*it == ',')
- {
- state = STATE_SPACE;
- }
- else if (Ascii::isSpace(*it))
- {
- // Skip
- }
- else throw SyntaxException("Invalid authentication information");
- break;
- }
- }
-
- if (state == STATE_VALUE)
- add(token, value);
-
- if (!(state & STATE_FINAL))
- throw SyntaxException("Invalid authentication information");
-}
-
-
-} } // namespace Poco::Net
+}
+
+
+void HTTPAuthenticationParams::fromResponse(const HTTPResponse& response, const std::string& header)
+{
+ NameValueCollection::ConstIterator it = response.find(header);
+ if (it == response.end())
+ throw NotAuthenticatedException("HTTP response has no authentication header");
+
+ bool found = false;
+ while (!found && it != response.end() && icompare(it->first, header) == 0)
+ {
+ const std::string& header2 = it->second;
+ if (icompare(header2, 0, 6, "Basic ") == 0)
+ {
+ parse(header2.begin() + 6, header2.end());
+ found = true;
+ }
+ else if (icompare(header2, 0, 7, "Digest ") == 0)
+ {
+ parse(header2.begin() + 7, header2.end());
+ found = true;
+ }
+ ++it;
+ }
+ if (!found) throw NotAuthenticatedException("No Basic or Digest authentication header found");
+}
+
+
+const std::string& HTTPAuthenticationParams::getRealm() const
+{
+ return get(REALM);
+}
+
+
+void HTTPAuthenticationParams::setRealm(const std::string& realm)
+{
+ set(REALM, realm);
+}
+
+
+std::string HTTPAuthenticationParams::toString() const
+{
+ ConstIterator iter = begin();
+ std::string result;
+
+ if (iter != end())
+ {
+ formatParameter(result, iter->first, iter->second);
+ ++iter;
+ }
+
+ for (; iter != end(); ++iter)
+ {
+ result.append(", ");
+ formatParameter(result, iter->first, iter->second);
+ }
+
+ return result;
+}
+
+
+void HTTPAuthenticationParams::parse(std::string::const_iterator first, std::string::const_iterator last)
+{
+ enum State
+ {
+ STATE_INITIAL = 0x0100,
+ STATE_FINAL = 0x0200,
+
+ STATE_SPACE = STATE_INITIAL | 0,
+ STATE_TOKEN = 1,
+ STATE_EQUALS = 2,
+ STATE_VALUE = STATE_FINAL | 3,
+ STATE_VALUE_QUOTED = 4,
+ STATE_VALUE_ESCAPE = 5,
+ STATE_COMMA = STATE_FINAL | 6
+ };
+
+ int state = STATE_SPACE;
+ std::string token;
+ std::string value;
+
+ for (std::string::const_iterator it = first; it != last; ++it)
+ {
+ switch (state)
+ {
+ case STATE_SPACE:
+ if (Ascii::isAlphaNumeric(*it) || *it == '_' || *it == '-')
+ {
+ token += *it;
+ state = STATE_TOKEN;
+ }
+ else if (Ascii::isSpace(*it))
+ {
+ // Skip
+ }
+ else throw SyntaxException("Invalid authentication information");
+ break;
+
+ case STATE_TOKEN:
+ if (*it == '=')
+ {
+ state = STATE_EQUALS;
+ }
+ else if (Ascii::isAlphaNumeric(*it) || *it == '_' || *it == '-')
+ {
+ token += *it;
+ }
+ else throw SyntaxException("Invalid authentication information");
+ break;
+
+ case STATE_EQUALS:
+ if (Ascii::isAlphaNumeric(*it) || *it == '_')
+ {
+ value += *it;
+ state = STATE_VALUE;
+ }
+ else if (*it == '"')
+ {
+ state = STATE_VALUE_QUOTED;
+ }
+ else throw SyntaxException("Invalid authentication information");
+ break;
+
+ case STATE_VALUE_QUOTED:
+ if (*it == '\\')
+ {
+ state = STATE_VALUE_ESCAPE;
+ }
+ else if (*it == '"')
+ {
+ add(token, value);
+ token.clear();
+ value.clear();
+ state = STATE_COMMA;
+ }
+ else
+ {
+ value += *it;
+ }
+ break;
+
+ case STATE_VALUE_ESCAPE:
+ value += *it;
+ state = STATE_VALUE_QUOTED;
+ break;
+
+ case STATE_VALUE:
+ if (Ascii::isSpace(*it))
+ {
+ add(token, value);
+ token.clear();
+ value.clear();
+ state = STATE_COMMA;
+ }
+ else if (*it == ',')
+ {
+ add(token, value);
+ token.clear();
+ value.clear();
+ state = STATE_SPACE;
+ }
+ else
+ {
+ value += *it;
+ }
+ break;
+
+ case STATE_COMMA:
+ if (*it == ',')
+ {
+ state = STATE_SPACE;
+ }
+ else if (Ascii::isSpace(*it))
+ {
+ // Skip
+ }
+ else throw SyntaxException("Invalid authentication information");
+ break;
+ }
+ }
+
+ if (state == STATE_VALUE)
+ add(token, value);
+
+ if (!(state & STATE_FINAL))
+ throw SyntaxException("Invalid authentication information");
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/HTTPBasicCredentials.cpp b/contrib/libs/poco/Net/src/HTTPBasicCredentials.cpp
index dace0afd5e..5b5e89897e 100644
--- a/contrib/libs/poco/Net/src/HTTPBasicCredentials.cpp
+++ b/contrib/libs/poco/Net/src/HTTPBasicCredentials.cpp
@@ -1,134 +1,134 @@
-//
-// HTTPBasicCredentials.cpp
-//
-// Library: Net
-// Package: HTTP
-// Module: HTTPBasicCredentials
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/HTTPBasicCredentials.h"
-#include "Poco/Net/HTTPRequest.h"
-#include "Poco/Net/NetException.h"
-#include "Poco/Base64Encoder.h"
-#include "Poco/Base64Decoder.h"
-#include "Poco/String.h"
-#include <sstream>
-
-
-using Poco::Base64Decoder;
-using Poco::Base64Encoder;
-using Poco::icompare;
-
-
-namespace Poco {
-namespace Net {
-
-
-const std::string HTTPBasicCredentials::SCHEME = "Basic";
-
-
-HTTPBasicCredentials::HTTPBasicCredentials()
-{
-}
-
-
-HTTPBasicCredentials::HTTPBasicCredentials(const std::string& username, const std::string& password):
- _username(username),
- _password(password)
-{
-}
-
-
-HTTPBasicCredentials::HTTPBasicCredentials(const HTTPRequest& request)
-{
- std::string scheme;
- std::string authInfo;
- request.getCredentials(scheme, authInfo);
- if (icompare(scheme, SCHEME) == 0)
- {
- parseAuthInfo(authInfo);
- }
- else throw NotAuthenticatedException("Basic authentication expected");
-}
-
-
-HTTPBasicCredentials::HTTPBasicCredentials(const std::string& authInfo)
-{
- parseAuthInfo(authInfo);
-}
-
-
-HTTPBasicCredentials::~HTTPBasicCredentials()
-{
-}
-
-
-void HTTPBasicCredentials::clear()
-{
- _username.clear();
- _password.clear();
-}
-
-
-void HTTPBasicCredentials::setUsername(const std::string& username)
-{
- _username = username;
-}
-
-
-void HTTPBasicCredentials::setPassword(const std::string& password)
-{
- _password = password;
-}
-
-
-void HTTPBasicCredentials::authenticate(HTTPRequest& request) const
-{
- std::ostringstream ostr;
- Base64Encoder encoder(ostr);
- encoder.rdbuf()->setLineLength(0);
- encoder << _username << ":" << _password;
- encoder.close();
- request.setCredentials(SCHEME, ostr.str());
-}
-
-
-void HTTPBasicCredentials::proxyAuthenticate(HTTPRequest& request) const
-{
- std::ostringstream ostr;
- Base64Encoder encoder(ostr);
- encoder.rdbuf()->setLineLength(0);
- encoder << _username << ":" << _password;
- encoder.close();
- request.setProxyCredentials(SCHEME, ostr.str());
-}
-
-
-void HTTPBasicCredentials::parseAuthInfo(const std::string& authInfo)
-{
- static const int eof = std::char_traits<char>::eof();
-
- std::istringstream istr(authInfo);
- Base64Decoder decoder(istr);
- int ch = decoder.get();
- while (ch != eof && ch != ':')
- {
- _username += (char) ch;
- ch = decoder.get();
- }
- if (ch == ':') ch = decoder.get();
- while (ch != eof)
- {
- _password += (char) ch;
- ch = decoder.get();
- }
-}
-
-
-} } // namespace Poco::Net
+//
+// HTTPBasicCredentials.cpp
+//
+// Library: Net
+// Package: HTTP
+// Module: HTTPBasicCredentials
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/HTTPBasicCredentials.h"
+#include "Poco/Net/HTTPRequest.h"
+#include "Poco/Net/NetException.h"
+#include "Poco/Base64Encoder.h"
+#include "Poco/Base64Decoder.h"
+#include "Poco/String.h"
+#include <sstream>
+
+
+using Poco::Base64Decoder;
+using Poco::Base64Encoder;
+using Poco::icompare;
+
+
+namespace Poco {
+namespace Net {
+
+
+const std::string HTTPBasicCredentials::SCHEME = "Basic";
+
+
+HTTPBasicCredentials::HTTPBasicCredentials()
+{
+}
+
+
+HTTPBasicCredentials::HTTPBasicCredentials(const std::string& username, const std::string& password):
+ _username(username),
+ _password(password)
+{
+}
+
+
+HTTPBasicCredentials::HTTPBasicCredentials(const HTTPRequest& request)
+{
+ std::string scheme;
+ std::string authInfo;
+ request.getCredentials(scheme, authInfo);
+ if (icompare(scheme, SCHEME) == 0)
+ {
+ parseAuthInfo(authInfo);
+ }
+ else throw NotAuthenticatedException("Basic authentication expected");
+}
+
+
+HTTPBasicCredentials::HTTPBasicCredentials(const std::string& authInfo)
+{
+ parseAuthInfo(authInfo);
+}
+
+
+HTTPBasicCredentials::~HTTPBasicCredentials()
+{
+}
+
+
+void HTTPBasicCredentials::clear()
+{
+ _username.clear();
+ _password.clear();
+}
+
+
+void HTTPBasicCredentials::setUsername(const std::string& username)
+{
+ _username = username;
+}
+
+
+void HTTPBasicCredentials::setPassword(const std::string& password)
+{
+ _password = password;
+}
+
+
+void HTTPBasicCredentials::authenticate(HTTPRequest& request) const
+{
+ std::ostringstream ostr;
+ Base64Encoder encoder(ostr);
+ encoder.rdbuf()->setLineLength(0);
+ encoder << _username << ":" << _password;
+ encoder.close();
+ request.setCredentials(SCHEME, ostr.str());
+}
+
+
+void HTTPBasicCredentials::proxyAuthenticate(HTTPRequest& request) const
+{
+ std::ostringstream ostr;
+ Base64Encoder encoder(ostr);
+ encoder.rdbuf()->setLineLength(0);
+ encoder << _username << ":" << _password;
+ encoder.close();
+ request.setProxyCredentials(SCHEME, ostr.str());
+}
+
+
+void HTTPBasicCredentials::parseAuthInfo(const std::string& authInfo)
+{
+ static const int eof = std::char_traits<char>::eof();
+
+ std::istringstream istr(authInfo);
+ Base64Decoder decoder(istr);
+ int ch = decoder.get();
+ while (ch != eof && ch != ':')
+ {
+ _username += (char) ch;
+ ch = decoder.get();
+ }
+ if (ch == ':') ch = decoder.get();
+ while (ch != eof)
+ {
+ _password += (char) ch;
+ ch = decoder.get();
+ }
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/HTTPBufferAllocator.cpp b/contrib/libs/poco/Net/src/HTTPBufferAllocator.cpp
index fdade27b68..2944e2a612 100644
--- a/contrib/libs/poco/Net/src/HTTPBufferAllocator.cpp
+++ b/contrib/libs/poco/Net/src/HTTPBufferAllocator.cpp
@@ -1,44 +1,44 @@
-//
-// HTTPBufferAllocator.cpp
-//
-// Library: Net
-// Package: HTTP
-// Module: HTTPBufferAllocator
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/HTTPBufferAllocator.h"
-
-
-using Poco::MemoryPool;
-
-
-namespace Poco {
-namespace Net {
-
-
-MemoryPool HTTPBufferAllocator::_pool(HTTPBufferAllocator::BUFFER_SIZE, 16);
-
-
-char* HTTPBufferAllocator::allocate(std::streamsize size)
-{
- poco_assert_dbg (size == BUFFER_SIZE);
-
- return reinterpret_cast<char*>(_pool.get());
-}
-
-
-void HTTPBufferAllocator::deallocate(char* ptr, std::streamsize size)
-{
- poco_assert_dbg (size == BUFFER_SIZE);
-
- _pool.release(ptr);
-}
-
-
-} } // namespace Poco::Net
+//
+// HTTPBufferAllocator.cpp
+//
+// Library: Net
+// Package: HTTP
+// Module: HTTPBufferAllocator
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/HTTPBufferAllocator.h"
+
+
+using Poco::MemoryPool;
+
+
+namespace Poco {
+namespace Net {
+
+
+MemoryPool HTTPBufferAllocator::_pool(HTTPBufferAllocator::BUFFER_SIZE, 16);
+
+
+char* HTTPBufferAllocator::allocate(std::streamsize size)
+{
+ poco_assert_dbg (size == BUFFER_SIZE);
+
+ return reinterpret_cast<char*>(_pool.get());
+}
+
+
+void HTTPBufferAllocator::deallocate(char* ptr, std::streamsize size)
+{
+ poco_assert_dbg (size == BUFFER_SIZE);
+
+ _pool.release(ptr);
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/HTTPChunkedStream.cpp b/contrib/libs/poco/Net/src/HTTPChunkedStream.cpp
index f035a978fd..5e8da38b9e 100644
--- a/contrib/libs/poco/Net/src/HTTPChunkedStream.cpp
+++ b/contrib/libs/poco/Net/src/HTTPChunkedStream.cpp
@@ -1,213 +1,213 @@
-//
-// HTTPChunkedStream.cpp
-//
-// Library: Net
-// Package: HTTP
-// Module: HTTPChunkedStream
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/HTTPChunkedStream.h"
-#include "Poco/Net/HTTPSession.h"
-#include "Poco/NumberFormatter.h"
-#include "Poco/NumberParser.h"
-#include "Poco/Ascii.h"
-
-
-using Poco::NumberFormatter;
-using Poco::NumberParser;
-
-
-namespace Poco {
-namespace Net {
-
-
-//
-// HTTPChunkedStreamBuf
-//
-
-
-HTTPChunkedStreamBuf::HTTPChunkedStreamBuf(HTTPSession& session, openmode mode):
- HTTPBasicStreamBuf(HTTPBufferAllocator::BUFFER_SIZE, mode),
- _session(session),
- _mode(mode),
- _chunk(0)
-{
-}
-
-
-HTTPChunkedStreamBuf::~HTTPChunkedStreamBuf()
-{
-}
-
-
-void HTTPChunkedStreamBuf::close()
-{
- if (_mode & std::ios::out)
- {
- sync();
- _session.write("0\r\n\r\n", 5);
- }
-}
-
-
-int HTTPChunkedStreamBuf::readFromDevice(char* buffer, std::streamsize length)
-{
- static const int eof = std::char_traits<char>::eof();
-
- if (_chunk == 0)
- {
- int ch = _session.get();
- while (Poco::Ascii::isSpace(ch)) ch = _session.get();
- std::string chunkLen;
- while (Poco::Ascii::isHexDigit(ch) && chunkLen.size() < 8) { chunkLen += (char) ch; ch = _session.get(); }
- if (ch != eof && !(Poco::Ascii::isSpace(ch) || ch == ';')) return eof;
- while (ch != eof && ch != '\n') ch = _session.get();
- unsigned chunk;
- if (NumberParser::tryParseHex(chunkLen, chunk))
- _chunk = (std::streamsize) chunk;
- else
- return eof;
- }
- if (_chunk > 0)
- {
- if (length > _chunk) length = _chunk;
- int n = _session.read(buffer, length);
- if (n > 0) _chunk -= n;
- return n;
- }
- else
- {
- int ch = _session.get();
- while (ch != eof && ch != '\n') ch = _session.get();
- return 0;
- }
-}
-
-
-int HTTPChunkedStreamBuf::writeToDevice(const char* buffer, std::streamsize length)
-{
- _chunkBuffer.clear();
- NumberFormatter::appendHex(_chunkBuffer, length);
- _chunkBuffer.append("\r\n", 2);
- _chunkBuffer.append(buffer, static_cast<std::string::size_type>(length));
- _chunkBuffer.append("\r\n", 2);
- _session.write(_chunkBuffer.data(), static_cast<std::streamsize>(_chunkBuffer.size()));
- return static_cast<int>(length);
-}
-
-
-//
-// HTTPChunkedIOS
-//
-
-
-HTTPChunkedIOS::HTTPChunkedIOS(HTTPSession& session, HTTPChunkedStreamBuf::openmode mode):
- _buf(session, mode)
-{
- poco_ios_init(&_buf);
-}
-
-
-HTTPChunkedIOS::~HTTPChunkedIOS()
-{
- try
- {
- _buf.close();
- }
- catch (...)
- {
- }
-}
-
-
-HTTPChunkedStreamBuf* HTTPChunkedIOS::rdbuf()
-{
- return &_buf;
-}
-
-
-//
-// HTTPChunkedInputStream
-//
-
-
-Poco::MemoryPool HTTPChunkedInputStream::_pool(sizeof(HTTPChunkedInputStream));
-
-
-HTTPChunkedInputStream::HTTPChunkedInputStream(HTTPSession& session):
- HTTPChunkedIOS(session, std::ios::in),
- std::istream(&_buf)
-{
-}
-
-
-HTTPChunkedInputStream::~HTTPChunkedInputStream()
-{
-}
-
-
-void* HTTPChunkedInputStream::operator new(std::size_t /*size*/)
-{
- return _pool.get();
-}
-
-
-void HTTPChunkedInputStream::operator delete(void* ptr)
-{
- try
- {
- _pool.release(ptr);
- }
- catch (...)
- {
- poco_unexpected();
- }
-}
-
-
-//
-// HTTPChunkedOutputStream
-//
-
-
-Poco::MemoryPool HTTPChunkedOutputStream::_pool(sizeof(HTTPChunkedOutputStream));
-
-
-HTTPChunkedOutputStream::HTTPChunkedOutputStream(HTTPSession& session):
- HTTPChunkedIOS(session, std::ios::out),
- std::ostream(&_buf)
-{
-}
-
-
-HTTPChunkedOutputStream::~HTTPChunkedOutputStream()
-{
-}
-
-
-void* HTTPChunkedOutputStream::operator new(std::size_t /*size*/)
-{
- return _pool.get();
-}
-
-
-void HTTPChunkedOutputStream::operator delete(void* ptr)
-{
- try
- {
- _pool.release(ptr);
- }
- catch (...)
- {
- poco_unexpected();
- }
-}
-
-
-} } // namespace Poco::Net
+//
+// HTTPChunkedStream.cpp
+//
+// Library: Net
+// Package: HTTP
+// Module: HTTPChunkedStream
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/HTTPChunkedStream.h"
+#include "Poco/Net/HTTPSession.h"
+#include "Poco/NumberFormatter.h"
+#include "Poco/NumberParser.h"
+#include "Poco/Ascii.h"
+
+
+using Poco::NumberFormatter;
+using Poco::NumberParser;
+
+
+namespace Poco {
+namespace Net {
+
+
+//
+// HTTPChunkedStreamBuf
+//
+
+
+HTTPChunkedStreamBuf::HTTPChunkedStreamBuf(HTTPSession& session, openmode mode):
+ HTTPBasicStreamBuf(HTTPBufferAllocator::BUFFER_SIZE, mode),
+ _session(session),
+ _mode(mode),
+ _chunk(0)
+{
+}
+
+
+HTTPChunkedStreamBuf::~HTTPChunkedStreamBuf()
+{
+}
+
+
+void HTTPChunkedStreamBuf::close()
+{
+ if (_mode & std::ios::out)
+ {
+ sync();
+ _session.write("0\r\n\r\n", 5);
+ }
+}
+
+
+int HTTPChunkedStreamBuf::readFromDevice(char* buffer, std::streamsize length)
+{
+ static const int eof = std::char_traits<char>::eof();
+
+ if (_chunk == 0)
+ {
+ int ch = _session.get();
+ while (Poco::Ascii::isSpace(ch)) ch = _session.get();
+ std::string chunkLen;
+ while (Poco::Ascii::isHexDigit(ch) && chunkLen.size() < 8) { chunkLen += (char) ch; ch = _session.get(); }
+ if (ch != eof && !(Poco::Ascii::isSpace(ch) || ch == ';')) return eof;
+ while (ch != eof && ch != '\n') ch = _session.get();
+ unsigned chunk;
+ if (NumberParser::tryParseHex(chunkLen, chunk))
+ _chunk = (std::streamsize) chunk;
+ else
+ return eof;
+ }
+ if (_chunk > 0)
+ {
+ if (length > _chunk) length = _chunk;
+ int n = _session.read(buffer, length);
+ if (n > 0) _chunk -= n;
+ return n;
+ }
+ else
+ {
+ int ch = _session.get();
+ while (ch != eof && ch != '\n') ch = _session.get();
+ return 0;
+ }
+}
+
+
+int HTTPChunkedStreamBuf::writeToDevice(const char* buffer, std::streamsize length)
+{
+ _chunkBuffer.clear();
+ NumberFormatter::appendHex(_chunkBuffer, length);
+ _chunkBuffer.append("\r\n", 2);
+ _chunkBuffer.append(buffer, static_cast<std::string::size_type>(length));
+ _chunkBuffer.append("\r\n", 2);
+ _session.write(_chunkBuffer.data(), static_cast<std::streamsize>(_chunkBuffer.size()));
+ return static_cast<int>(length);
+}
+
+
+//
+// HTTPChunkedIOS
+//
+
+
+HTTPChunkedIOS::HTTPChunkedIOS(HTTPSession& session, HTTPChunkedStreamBuf::openmode mode):
+ _buf(session, mode)
+{
+ poco_ios_init(&_buf);
+}
+
+
+HTTPChunkedIOS::~HTTPChunkedIOS()
+{
+ try
+ {
+ _buf.close();
+ }
+ catch (...)
+ {
+ }
+}
+
+
+HTTPChunkedStreamBuf* HTTPChunkedIOS::rdbuf()
+{
+ return &_buf;
+}
+
+
+//
+// HTTPChunkedInputStream
+//
+
+
+Poco::MemoryPool HTTPChunkedInputStream::_pool(sizeof(HTTPChunkedInputStream));
+
+
+HTTPChunkedInputStream::HTTPChunkedInputStream(HTTPSession& session):
+ HTTPChunkedIOS(session, std::ios::in),
+ std::istream(&_buf)
+{
+}
+
+
+HTTPChunkedInputStream::~HTTPChunkedInputStream()
+{
+}
+
+
+void* HTTPChunkedInputStream::operator new(std::size_t /*size*/)
+{
+ return _pool.get();
+}
+
+
+void HTTPChunkedInputStream::operator delete(void* ptr)
+{
+ try
+ {
+ _pool.release(ptr);
+ }
+ catch (...)
+ {
+ poco_unexpected();
+ }
+}
+
+
+//
+// HTTPChunkedOutputStream
+//
+
+
+Poco::MemoryPool HTTPChunkedOutputStream::_pool(sizeof(HTTPChunkedOutputStream));
+
+
+HTTPChunkedOutputStream::HTTPChunkedOutputStream(HTTPSession& session):
+ HTTPChunkedIOS(session, std::ios::out),
+ std::ostream(&_buf)
+{
+}
+
+
+HTTPChunkedOutputStream::~HTTPChunkedOutputStream()
+{
+}
+
+
+void* HTTPChunkedOutputStream::operator new(std::size_t /*size*/)
+{
+ return _pool.get();
+}
+
+
+void HTTPChunkedOutputStream::operator delete(void* ptr)
+{
+ try
+ {
+ _pool.release(ptr);
+ }
+ catch (...)
+ {
+ poco_unexpected();
+ }
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/HTTPClientSession.cpp b/contrib/libs/poco/Net/src/HTTPClientSession.cpp
index cca2808b1b..c2b8170343 100644
--- a/contrib/libs/poco/Net/src/HTTPClientSession.cpp
+++ b/contrib/libs/poco/Net/src/HTTPClientSession.cpp
@@ -1,470 +1,470 @@
-//
-// HTTPClientSession.cpp
-//
-// Library: Net
-// Package: HTTPClient
-// Module: HTTPClientSession
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/HTTPClientSession.h"
-#include "Poco/Net/HTTPRequest.h"
-#include "Poco/Net/HTTPResponse.h"
-#include "Poco/Net/HTTPHeaderStream.h"
-#include "Poco/Net/HTTPStream.h"
-#include "Poco/Net/HTTPFixedLengthStream.h"
-#include "Poco/Net/HTTPChunkedStream.h"
-#include "Poco/Net/HTTPBasicCredentials.h"
-#include "Poco/Net/NetException.h"
-#include "Poco/NumberFormatter.h"
-#include "Poco/CountingStream.h"
-#include "Poco/RegularExpression.h"
-#include <sstream>
-
-
-using Poco::NumberFormatter;
-using Poco::IllegalStateException;
-
-
-namespace Poco {
-namespace Net {
-
-
-HTTPClientSession::ProxyConfig HTTPClientSession::_globalProxyConfig;
-
-
-HTTPClientSession::HTTPClientSession():
- _port(HTTPSession::HTTP_PORT),
- _proxyConfig(_globalProxyConfig),
- _keepAliveTimeout(DEFAULT_KEEP_ALIVE_TIMEOUT, 0),
- _reconnect(false),
- _mustReconnect(false),
- _expectResponseBody(false),
- _responseReceived(false)
-{
-}
-
-
-HTTPClientSession::HTTPClientSession(const StreamSocket& socket):
- HTTPSession(socket),
- _port(HTTPSession::HTTP_PORT),
- _proxyConfig(_globalProxyConfig),
- _keepAliveTimeout(DEFAULT_KEEP_ALIVE_TIMEOUT, 0),
- _reconnect(false),
- _mustReconnect(false),
- _expectResponseBody(false),
- _responseReceived(false)
-{
-}
-
-
-HTTPClientSession::HTTPClientSession(const SocketAddress& address):
- _host(address.host().toString()),
- _port(address.port()),
- _proxyConfig(_globalProxyConfig),
- _keepAliveTimeout(DEFAULT_KEEP_ALIVE_TIMEOUT, 0),
- _reconnect(false),
- _mustReconnect(false),
- _expectResponseBody(false),
- _responseReceived(false)
-{
-}
-
-
-HTTPClientSession::HTTPClientSession(const std::string& host, Poco::UInt16 port):
- _host(host),
- _port(port),
- _proxyConfig(_globalProxyConfig),
- _keepAliveTimeout(DEFAULT_KEEP_ALIVE_TIMEOUT, 0),
- _reconnect(false),
- _mustReconnect(false),
- _expectResponseBody(false),
- _responseReceived(false)
-{
-}
-
-
-HTTPClientSession::HTTPClientSession(const std::string& host, Poco::UInt16 port, const ProxyConfig& proxyConfig):
- _host(host),
- _port(port),
- _proxyConfig(proxyConfig),
- _keepAliveTimeout(DEFAULT_KEEP_ALIVE_TIMEOUT, 0),
- _reconnect(false),
- _mustReconnect(false),
- _expectResponseBody(false),
- _responseReceived(false)
-{
-}
-
-
-HTTPClientSession::~HTTPClientSession()
-{
-}
-
-
-void HTTPClientSession::setHost(const std::string& host)
-{
- if (!connected())
- _host = host;
- else
- throw IllegalStateException("Cannot set the host for an already connected session");
-}
-
-
-void HTTPClientSession::setPort(Poco::UInt16 port)
-{
- if (!connected())
- _port = port;
- else
- throw IllegalStateException("Cannot set the port number for an already connected session");
-}
-
-
-void HTTPClientSession::setProxy(const std::string& host, Poco::UInt16 port)
-{
- if (!connected())
- {
- _proxyConfig.host = host;
- _proxyConfig.port = port;
- }
- else throw IllegalStateException("Cannot set the proxy host and port for an already connected session");
-}
-
-
-void HTTPClientSession::setProxyHost(const std::string& host)
-{
- if (!connected())
- _proxyConfig.host = host;
- else
- throw IllegalStateException("Cannot set the proxy host for an already connected session");
-}
-
-
-void HTTPClientSession::setProxyPort(Poco::UInt16 port)
-{
- if (!connected())
- _proxyConfig.port = port;
- else
- throw IllegalStateException("Cannot set the proxy port number for an already connected session");
-}
-
-
-void HTTPClientSession::setProxyCredentials(const std::string& username, const std::string& password)
-{
- _proxyConfig.username = username;
- _proxyConfig.password = password;
-}
-
-
-void HTTPClientSession::setProxyUsername(const std::string& username)
-{
- _proxyConfig.username = username;
-}
-
-
-void HTTPClientSession::setProxyPassword(const std::string& password)
-{
- _proxyConfig.password = password;
-}
-
-
-void HTTPClientSession::setProxyConfig(const ProxyConfig& config)
-{
- _proxyConfig = config;
-}
-
-
-void HTTPClientSession::setGlobalProxyConfig(const ProxyConfig& config)
-{
- _globalProxyConfig = config;
-}
-
-
-void HTTPClientSession::setKeepAliveTimeout(const Poco::Timespan& timeout)
-{
- _keepAliveTimeout = timeout;
-}
-
-
-std::ostream& HTTPClientSession::sendRequest(HTTPRequest& request)
-{
- _pRequestStream = 0;
- _pResponseStream = 0;
- clearException();
- _responseReceived = false;
-
- bool keepAlive = getKeepAlive();
- if (((connected() && !keepAlive) || mustReconnect()) && !_host.empty())
- {
- close();
- _mustReconnect = false;
- }
- try
- {
- if (!connected())
- reconnect();
- if (!keepAlive)
- request.setKeepAlive(false);
- if (!request.has(HTTPRequest::HOST) && !_host.empty())
- request.setHost(_host, _port);
- if (!_proxyConfig.host.empty() && !bypassProxy())
- {
- request.setURI(proxyRequestPrefix() + request.getURI());
- proxyAuthenticate(request);
- }
- _reconnect = keepAlive;
- _expectResponseBody = request.getMethod() != HTTPRequest::HTTP_HEAD;
- const std::string& method = request.getMethod();
- if (request.getChunkedTransferEncoding())
- {
- HTTPHeaderOutputStream hos(*this);
- request.write(hos);
- _pRequestStream = new HTTPChunkedOutputStream(*this);
- }
- else if (request.hasContentLength())
- {
- Poco::CountingOutputStream cs;
- request.write(cs);
-#if POCO_HAVE_INT64
- _pRequestStream = new HTTPFixedLengthOutputStream(*this, request.getContentLength64() + cs.chars());
-#else
- _pRequestStream = new HTTPFixedLengthOutputStream(*this, request.getContentLength() + cs.chars());
-#endif
- request.write(*_pRequestStream);
- }
- else if ((method != HTTPRequest::HTTP_PUT && method != HTTPRequest::HTTP_POST && method != HTTPRequest::HTTP_PATCH) || request.has(HTTPRequest::UPGRADE))
- {
- Poco::CountingOutputStream cs;
- request.write(cs);
- _pRequestStream = new HTTPFixedLengthOutputStream(*this, cs.chars());
- request.write(*_pRequestStream);
- }
- else
- {
- _pRequestStream = new HTTPOutputStream(*this);
- request.write(*_pRequestStream);
- }
- _lastRequest.update();
- return *_pRequestStream;
- }
- catch (Exception&)
- {
- close();
- throw;
- }
-}
-
-
-void HTTPClientSession::flushRequest()
-{
- _pRequestStream = 0;
- if (networkException()) networkException()->rethrow();
-}
-
-
-std::istream& HTTPClientSession::receiveResponse(HTTPResponse& response)
-{
- flushRequest();
- if (!_responseReceived)
- {
- do
- {
- response.clear();
- HTTPHeaderInputStream his(*this);
- try
- {
- response.read(his);
- }
- catch (Exception&)
- {
- close();
- if (networkException())
- networkException()->rethrow();
- else
- throw;
- throw;
- }
- }
- while (response.getStatus() == HTTPResponse::HTTP_CONTINUE);
- }
-
- _mustReconnect = getKeepAlive() && !response.getKeepAlive();
-
- if (!_expectResponseBody || response.getStatus() < 200 || response.getStatus() == HTTPResponse::HTTP_NO_CONTENT || response.getStatus() == HTTPResponse::HTTP_NOT_MODIFIED)
- _pResponseStream = new HTTPFixedLengthInputStream(*this, 0);
- else if (response.getChunkedTransferEncoding())
- _pResponseStream = new HTTPChunkedInputStream(*this);
- else if (response.hasContentLength())
-#if defined(POCO_HAVE_INT64)
- _pResponseStream = new HTTPFixedLengthInputStream(*this, response.getContentLength64());
-#else
- _pResponseStream = new HTTPFixedLengthInputStream(*this, response.getContentLength());
-#endif
- else
- _pResponseStream = new HTTPInputStream(*this);
-
- return *_pResponseStream;
-}
-
-
-bool HTTPClientSession::peekResponse(HTTPResponse& response)
-{
- poco_assert (!_responseReceived);
-
- _pRequestStream->flush();
-
- if (networkException()) networkException()->rethrow();
-
- response.clear();
- HTTPHeaderInputStream his(*this);
- try
- {
- response.read(his);
- }
- catch (Exception&)
- {
- close();
- if (networkException())
- networkException()->rethrow();
- else
- throw;
- throw;
- }
- _responseReceived = response.getStatus() != HTTPResponse::HTTP_CONTINUE;
- return !_responseReceived;
-}
-
-
-void HTTPClientSession::reset()
-{
- close();
-}
-
-
-bool HTTPClientSession::secure() const
-{
- return false;
-}
-
-
-int HTTPClientSession::write(const char* buffer, std::streamsize length)
-{
- try
- {
- int rc = HTTPSession::write(buffer, length);
- _reconnect = false;
- return rc;
- }
- catch (IOException&)
- {
- if (_reconnect)
- {
- close();
- reconnect();
- int rc = HTTPSession::write(buffer, length);
- clearException();
- _reconnect = false;
- return rc;
- }
- else throw;
- }
-}
-
-
-void HTTPClientSession::reconnect()
-{
- if (_proxyConfig.host.empty() || bypassProxy())
- {
- SocketAddress addr(_host, _port);
- connect(addr);
- }
- else
- {
- SocketAddress addr(_proxyConfig.host, _proxyConfig.port);
- connect(addr);
- }
-}
-
-
-std::string HTTPClientSession::proxyRequestPrefix() const
-{
- std::string result("http://");
- result.append(_host);
- result.append(":");
- NumberFormatter::append(result, _port);
- return result;
-}
-
-
-bool HTTPClientSession::mustReconnect() const
-{
- if (!_mustReconnect)
- {
- Poco::Timestamp now;
- return _keepAliveTimeout <= now - _lastRequest;
- }
- else return true;
-}
-
-
-void HTTPClientSession::proxyAuthenticate(HTTPRequest& request)
-{
- proxyAuthenticateImpl(request);
-}
-
-
-void HTTPClientSession::proxyAuthenticateImpl(HTTPRequest& request)
-{
- if (!_proxyConfig.username.empty())
- {
- HTTPBasicCredentials creds(_proxyConfig.username, _proxyConfig.password);
- creds.proxyAuthenticate(request);
- }
-}
-
-
-StreamSocket HTTPClientSession::proxyConnect()
-{
- ProxyConfig emptyProxyConfig;
- HTTPClientSession proxySession(getProxyHost(), getProxyPort(), emptyProxyConfig);
- proxySession.setTimeout(getTimeout());
- std::string targetAddress(_host);
- targetAddress.append(":");
- NumberFormatter::append(targetAddress, _port);
- HTTPRequest proxyRequest(HTTPRequest::HTTP_CONNECT, targetAddress, HTTPMessage::HTTP_1_1);
- HTTPResponse proxyResponse;
- proxyRequest.set("Proxy-Connection", "keep-alive");
- proxyRequest.set("Host", getHost());
- proxyAuthenticateImpl(proxyRequest);
- proxySession.setKeepAlive(true);
- proxySession.sendRequest(proxyRequest);
- proxySession.receiveResponse(proxyResponse);
- if (proxyResponse.getStatus() != HTTPResponse::HTTP_OK)
- throw HTTPException("Cannot establish proxy connection", proxyResponse.getReason());
- return proxySession.detachSocket();
-}
-
-
-void HTTPClientSession::proxyTunnel()
-{
- StreamSocket ss = proxyConnect();
- attachSocket(ss);
-}
-
-
-bool HTTPClientSession::bypassProxy() const
-{
- if (!_proxyConfig.nonProxyHosts.empty())
- {
- return RegularExpression::match(_host, _proxyConfig.nonProxyHosts, RegularExpression::RE_CASELESS | RegularExpression::RE_ANCHORED);
- }
- else return false;
-}
-
-
-} } // namespace Poco::Net
+//
+// HTTPClientSession.cpp
+//
+// Library: Net
+// Package: HTTPClient
+// Module: HTTPClientSession
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/HTTPClientSession.h"
+#include "Poco/Net/HTTPRequest.h"
+#include "Poco/Net/HTTPResponse.h"
+#include "Poco/Net/HTTPHeaderStream.h"
+#include "Poco/Net/HTTPStream.h"
+#include "Poco/Net/HTTPFixedLengthStream.h"
+#include "Poco/Net/HTTPChunkedStream.h"
+#include "Poco/Net/HTTPBasicCredentials.h"
+#include "Poco/Net/NetException.h"
+#include "Poco/NumberFormatter.h"
+#include "Poco/CountingStream.h"
+#include "Poco/RegularExpression.h"
+#include <sstream>
+
+
+using Poco::NumberFormatter;
+using Poco::IllegalStateException;
+
+
+namespace Poco {
+namespace Net {
+
+
+HTTPClientSession::ProxyConfig HTTPClientSession::_globalProxyConfig;
+
+
+HTTPClientSession::HTTPClientSession():
+ _port(HTTPSession::HTTP_PORT),
+ _proxyConfig(_globalProxyConfig),
+ _keepAliveTimeout(DEFAULT_KEEP_ALIVE_TIMEOUT, 0),
+ _reconnect(false),
+ _mustReconnect(false),
+ _expectResponseBody(false),
+ _responseReceived(false)
+{
+}
+
+
+HTTPClientSession::HTTPClientSession(const StreamSocket& socket):
+ HTTPSession(socket),
+ _port(HTTPSession::HTTP_PORT),
+ _proxyConfig(_globalProxyConfig),
+ _keepAliveTimeout(DEFAULT_KEEP_ALIVE_TIMEOUT, 0),
+ _reconnect(false),
+ _mustReconnect(false),
+ _expectResponseBody(false),
+ _responseReceived(false)
+{
+}
+
+
+HTTPClientSession::HTTPClientSession(const SocketAddress& address):
+ _host(address.host().toString()),
+ _port(address.port()),
+ _proxyConfig(_globalProxyConfig),
+ _keepAliveTimeout(DEFAULT_KEEP_ALIVE_TIMEOUT, 0),
+ _reconnect(false),
+ _mustReconnect(false),
+ _expectResponseBody(false),
+ _responseReceived(false)
+{
+}
+
+
+HTTPClientSession::HTTPClientSession(const std::string& host, Poco::UInt16 port):
+ _host(host),
+ _port(port),
+ _proxyConfig(_globalProxyConfig),
+ _keepAliveTimeout(DEFAULT_KEEP_ALIVE_TIMEOUT, 0),
+ _reconnect(false),
+ _mustReconnect(false),
+ _expectResponseBody(false),
+ _responseReceived(false)
+{
+}
+
+
+HTTPClientSession::HTTPClientSession(const std::string& host, Poco::UInt16 port, const ProxyConfig& proxyConfig):
+ _host(host),
+ _port(port),
+ _proxyConfig(proxyConfig),
+ _keepAliveTimeout(DEFAULT_KEEP_ALIVE_TIMEOUT, 0),
+ _reconnect(false),
+ _mustReconnect(false),
+ _expectResponseBody(false),
+ _responseReceived(false)
+{
+}
+
+
+HTTPClientSession::~HTTPClientSession()
+{
+}
+
+
+void HTTPClientSession::setHost(const std::string& host)
+{
+ if (!connected())
+ _host = host;
+ else
+ throw IllegalStateException("Cannot set the host for an already connected session");
+}
+
+
+void HTTPClientSession::setPort(Poco::UInt16 port)
+{
+ if (!connected())
+ _port = port;
+ else
+ throw IllegalStateException("Cannot set the port number for an already connected session");
+}
+
+
+void HTTPClientSession::setProxy(const std::string& host, Poco::UInt16 port)
+{
+ if (!connected())
+ {
+ _proxyConfig.host = host;
+ _proxyConfig.port = port;
+ }
+ else throw IllegalStateException("Cannot set the proxy host and port for an already connected session");
+}
+
+
+void HTTPClientSession::setProxyHost(const std::string& host)
+{
+ if (!connected())
+ _proxyConfig.host = host;
+ else
+ throw IllegalStateException("Cannot set the proxy host for an already connected session");
+}
+
+
+void HTTPClientSession::setProxyPort(Poco::UInt16 port)
+{
+ if (!connected())
+ _proxyConfig.port = port;
+ else
+ throw IllegalStateException("Cannot set the proxy port number for an already connected session");
+}
+
+
+void HTTPClientSession::setProxyCredentials(const std::string& username, const std::string& password)
+{
+ _proxyConfig.username = username;
+ _proxyConfig.password = password;
+}
+
+
+void HTTPClientSession::setProxyUsername(const std::string& username)
+{
+ _proxyConfig.username = username;
+}
+
+
+void HTTPClientSession::setProxyPassword(const std::string& password)
+{
+ _proxyConfig.password = password;
+}
+
+
+void HTTPClientSession::setProxyConfig(const ProxyConfig& config)
+{
+ _proxyConfig = config;
+}
+
+
+void HTTPClientSession::setGlobalProxyConfig(const ProxyConfig& config)
+{
+ _globalProxyConfig = config;
+}
+
+
+void HTTPClientSession::setKeepAliveTimeout(const Poco::Timespan& timeout)
+{
+ _keepAliveTimeout = timeout;
+}
+
+
+std::ostream& HTTPClientSession::sendRequest(HTTPRequest& request)
+{
+ _pRequestStream = 0;
+ _pResponseStream = 0;
+ clearException();
+ _responseReceived = false;
+
+ bool keepAlive = getKeepAlive();
+ if (((connected() && !keepAlive) || mustReconnect()) && !_host.empty())
+ {
+ close();
+ _mustReconnect = false;
+ }
+ try
+ {
+ if (!connected())
+ reconnect();
+ if (!keepAlive)
+ request.setKeepAlive(false);
+ if (!request.has(HTTPRequest::HOST) && !_host.empty())
+ request.setHost(_host, _port);
+ if (!_proxyConfig.host.empty() && !bypassProxy())
+ {
+ request.setURI(proxyRequestPrefix() + request.getURI());
+ proxyAuthenticate(request);
+ }
+ _reconnect = keepAlive;
+ _expectResponseBody = request.getMethod() != HTTPRequest::HTTP_HEAD;
+ const std::string& method = request.getMethod();
+ if (request.getChunkedTransferEncoding())
+ {
+ HTTPHeaderOutputStream hos(*this);
+ request.write(hos);
+ _pRequestStream = new HTTPChunkedOutputStream(*this);
+ }
+ else if (request.hasContentLength())
+ {
+ Poco::CountingOutputStream cs;
+ request.write(cs);
+#if POCO_HAVE_INT64
+ _pRequestStream = new HTTPFixedLengthOutputStream(*this, request.getContentLength64() + cs.chars());
+#else
+ _pRequestStream = new HTTPFixedLengthOutputStream(*this, request.getContentLength() + cs.chars());
+#endif
+ request.write(*_pRequestStream);
+ }
+ else if ((method != HTTPRequest::HTTP_PUT && method != HTTPRequest::HTTP_POST && method != HTTPRequest::HTTP_PATCH) || request.has(HTTPRequest::UPGRADE))
+ {
+ Poco::CountingOutputStream cs;
+ request.write(cs);
+ _pRequestStream = new HTTPFixedLengthOutputStream(*this, cs.chars());
+ request.write(*_pRequestStream);
+ }
+ else
+ {
+ _pRequestStream = new HTTPOutputStream(*this);
+ request.write(*_pRequestStream);
+ }
+ _lastRequest.update();
+ return *_pRequestStream;
+ }
+ catch (Exception&)
+ {
+ close();
+ throw;
+ }
+}
+
+
+void HTTPClientSession::flushRequest()
+{
+ _pRequestStream = 0;
+ if (networkException()) networkException()->rethrow();
+}
+
+
+std::istream& HTTPClientSession::receiveResponse(HTTPResponse& response)
+{
+ flushRequest();
+ if (!_responseReceived)
+ {
+ do
+ {
+ response.clear();
+ HTTPHeaderInputStream his(*this);
+ try
+ {
+ response.read(his);
+ }
+ catch (Exception&)
+ {
+ close();
+ if (networkException())
+ networkException()->rethrow();
+ else
+ throw;
+ throw;
+ }
+ }
+ while (response.getStatus() == HTTPResponse::HTTP_CONTINUE);
+ }
+
+ _mustReconnect = getKeepAlive() && !response.getKeepAlive();
+
+ if (!_expectResponseBody || response.getStatus() < 200 || response.getStatus() == HTTPResponse::HTTP_NO_CONTENT || response.getStatus() == HTTPResponse::HTTP_NOT_MODIFIED)
+ _pResponseStream = new HTTPFixedLengthInputStream(*this, 0);
+ else if (response.getChunkedTransferEncoding())
+ _pResponseStream = new HTTPChunkedInputStream(*this);
+ else if (response.hasContentLength())
+#if defined(POCO_HAVE_INT64)
+ _pResponseStream = new HTTPFixedLengthInputStream(*this, response.getContentLength64());
+#else
+ _pResponseStream = new HTTPFixedLengthInputStream(*this, response.getContentLength());
+#endif
+ else
+ _pResponseStream = new HTTPInputStream(*this);
+
+ return *_pResponseStream;
+}
+
+
+bool HTTPClientSession::peekResponse(HTTPResponse& response)
+{
+ poco_assert (!_responseReceived);
+
+ _pRequestStream->flush();
+
+ if (networkException()) networkException()->rethrow();
+
+ response.clear();
+ HTTPHeaderInputStream his(*this);
+ try
+ {
+ response.read(his);
+ }
+ catch (Exception&)
+ {
+ close();
+ if (networkException())
+ networkException()->rethrow();
+ else
+ throw;
+ throw;
+ }
+ _responseReceived = response.getStatus() != HTTPResponse::HTTP_CONTINUE;
+ return !_responseReceived;
+}
+
+
+void HTTPClientSession::reset()
+{
+ close();
+}
+
+
+bool HTTPClientSession::secure() const
+{
+ return false;
+}
+
+
+int HTTPClientSession::write(const char* buffer, std::streamsize length)
+{
+ try
+ {
+ int rc = HTTPSession::write(buffer, length);
+ _reconnect = false;
+ return rc;
+ }
+ catch (IOException&)
+ {
+ if (_reconnect)
+ {
+ close();
+ reconnect();
+ int rc = HTTPSession::write(buffer, length);
+ clearException();
+ _reconnect = false;
+ return rc;
+ }
+ else throw;
+ }
+}
+
+
+void HTTPClientSession::reconnect()
+{
+ if (_proxyConfig.host.empty() || bypassProxy())
+ {
+ SocketAddress addr(_host, _port);
+ connect(addr);
+ }
+ else
+ {
+ SocketAddress addr(_proxyConfig.host, _proxyConfig.port);
+ connect(addr);
+ }
+}
+
+
+std::string HTTPClientSession::proxyRequestPrefix() const
+{
+ std::string result("http://");
+ result.append(_host);
+ result.append(":");
+ NumberFormatter::append(result, _port);
+ return result;
+}
+
+
+bool HTTPClientSession::mustReconnect() const
+{
+ if (!_mustReconnect)
+ {
+ Poco::Timestamp now;
+ return _keepAliveTimeout <= now - _lastRequest;
+ }
+ else return true;
+}
+
+
+void HTTPClientSession::proxyAuthenticate(HTTPRequest& request)
+{
+ proxyAuthenticateImpl(request);
+}
+
+
+void HTTPClientSession::proxyAuthenticateImpl(HTTPRequest& request)
+{
+ if (!_proxyConfig.username.empty())
+ {
+ HTTPBasicCredentials creds(_proxyConfig.username, _proxyConfig.password);
+ creds.proxyAuthenticate(request);
+ }
+}
+
+
+StreamSocket HTTPClientSession::proxyConnect()
+{
+ ProxyConfig emptyProxyConfig;
+ HTTPClientSession proxySession(getProxyHost(), getProxyPort(), emptyProxyConfig);
+ proxySession.setTimeout(getTimeout());
+ std::string targetAddress(_host);
+ targetAddress.append(":");
+ NumberFormatter::append(targetAddress, _port);
+ HTTPRequest proxyRequest(HTTPRequest::HTTP_CONNECT, targetAddress, HTTPMessage::HTTP_1_1);
+ HTTPResponse proxyResponse;
+ proxyRequest.set("Proxy-Connection", "keep-alive");
+ proxyRequest.set("Host", getHost());
+ proxyAuthenticateImpl(proxyRequest);
+ proxySession.setKeepAlive(true);
+ proxySession.sendRequest(proxyRequest);
+ proxySession.receiveResponse(proxyResponse);
+ if (proxyResponse.getStatus() != HTTPResponse::HTTP_OK)
+ throw HTTPException("Cannot establish proxy connection", proxyResponse.getReason());
+ return proxySession.detachSocket();
+}
+
+
+void HTTPClientSession::proxyTunnel()
+{
+ StreamSocket ss = proxyConnect();
+ attachSocket(ss);
+}
+
+
+bool HTTPClientSession::bypassProxy() const
+{
+ if (!_proxyConfig.nonProxyHosts.empty())
+ {
+ return RegularExpression::match(_host, _proxyConfig.nonProxyHosts, RegularExpression::RE_CASELESS | RegularExpression::RE_ANCHORED);
+ }
+ else return false;
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/HTTPCookie.cpp b/contrib/libs/poco/Net/src/HTTPCookie.cpp
index 240fb2e452..9cbae4ad8a 100644
--- a/contrib/libs/poco/Net/src/HTTPCookie.cpp
+++ b/contrib/libs/poco/Net/src/HTTPCookie.cpp
@@ -1,343 +1,343 @@
-//
-// HTTPCookie.cpp
-//
-// Library: Net
-// Package: HTTP
-// Module: HTTPCookie
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/HTTPCookie.h"
-#include "Poco/Net/NameValueCollection.h"
-#include "Poco/Timestamp.h"
-#include "Poco/DateTime.h"
-#include "Poco/DateTimeFormatter.h"
-#include "Poco/DateTimeFormat.h"
-#include "Poco/DateTimeParser.h"
-#include "Poco/NumberFormatter.h"
-#include "Poco/NumberParser.h"
-#include "Poco/String.h"
-#include "Poco/URI.h"
-
-
-using Poco::Timestamp;
-using Poco::DateTime;
-using Poco::DateTimeFormatter;
-using Poco::DateTimeFormat;
-using Poco::DateTimeParser;
-using Poco::NumberFormatter;
-using Poco::NumberParser;
-using Poco::icompare;
-
-
-namespace Poco {
-namespace Net {
-
-
-HTTPCookie::HTTPCookie():
- _version(0),
- _secure(false),
- _maxAge(-1),
- _httpOnly(false)
-{
-}
-
-
-HTTPCookie::HTTPCookie(const std::string& name):
- _version(0),
- _name(name),
- _secure(false),
- _maxAge(-1),
- _httpOnly(false)
-{
-}
-
-
-HTTPCookie::HTTPCookie(const NameValueCollection& nvc):
- _version(0),
- _secure(false),
- _maxAge(-1),
- _httpOnly(false)
-{
- for (NameValueCollection::ConstIterator it = nvc.begin(); it != nvc.end(); ++it)
- {
- const std::string& name = it->first;
- const std::string& value = it->second;
- if (icompare(name, "comment") == 0)
- {
- setComment(value);
- }
- else if (icompare(name, "domain") == 0)
- {
- setDomain(value);
- }
- else if (icompare(name, "path") == 0)
- {
- setPath(value);
- }
- else if (icompare(name, "priority") == 0)
- {
- setPriority(value);
- }
- else if (icompare(name, "max-age") == 0)
- {
- setMaxAge(NumberParser::parse(value));
- }
- else if (icompare(name, "secure") == 0)
- {
- setSecure(true);
- }
- else if (icompare(name, "expires") == 0)
- {
- int tzd;
- DateTime exp = DateTimeParser::parse(value, tzd);
- Timestamp now;
- setMaxAge((int) ((exp.timestamp() - now) / Timestamp::resolution()));
- }
- else if (icompare(name, "version") == 0)
- {
- setVersion(NumberParser::parse(value));
- }
- else if (icompare(name, "HttpOnly") == 0)
- {
- setHttpOnly(true);
- }
- else
- {
- setName(name);
- setValue(value);
- }
- }
-}
-
-
-HTTPCookie::HTTPCookie(const std::string& name, const std::string& value):
- _version(0),
- _name(name),
- _value(value),
- _secure(false),
- _maxAge(-1),
- _httpOnly(false)
-{
-}
-
-
-HTTPCookie::HTTPCookie(const HTTPCookie& cookie):
- _version(cookie._version),
- _name(cookie._name),
- _value(cookie._value),
- _comment(cookie._comment),
- _domain(cookie._domain),
- _path(cookie._path),
- _priority(cookie._priority),
- _secure(cookie._secure),
- _maxAge(cookie._maxAge),
- _httpOnly(cookie._httpOnly)
-{
-}
-
-
-HTTPCookie::~HTTPCookie()
-{
-}
-
-
-HTTPCookie& HTTPCookie::operator = (const HTTPCookie& cookie)
-{
- if (&cookie != this)
- {
- _version = cookie._version;
- _name = cookie._name;
- _value = cookie._value;
- _comment = cookie._comment;
- _domain = cookie._domain;
- _path = cookie._path;
- _priority = cookie._priority;
- _secure = cookie._secure;
- _maxAge = cookie._maxAge;
- _httpOnly = cookie._httpOnly;
- }
- return *this;
-}
-
-
-void HTTPCookie::setVersion(int version)
-{
- _version = version;
-}
-
-
-void HTTPCookie::setName(const std::string& name)
-{
- _name = name;
-}
-
-
-void HTTPCookie::setValue(const std::string& value)
-{
- _value = value;
-}
-
-
-void HTTPCookie::setComment(const std::string& comment)
-{
- _comment = comment;
-}
-
-
-void HTTPCookie::setDomain(const std::string& domain)
-{
- _domain = domain;
-}
-
-
-void HTTPCookie::setPath(const std::string& path)
-{
- _path = path;
-}
-
-
-void HTTPCookie::setPriority(const std::string& priority)
-{
- _priority = priority;
-}
-
-
-void HTTPCookie::setSecure(bool secure)
-{
- _secure = secure;
-}
-
-
-void HTTPCookie::setMaxAge(int maxAge)
-{
- _maxAge = maxAge;
-}
-
-
-void HTTPCookie::setHttpOnly(bool flag)
-{
- _httpOnly = flag;
-}
-
-
-std::string HTTPCookie::toString() const
-{
- std::string result;
- result.reserve(256);
- result.append(_name);
- result.append("=");
- if (_version == 0)
- {
- // Netscape cookie
- result.append(_value);
- if (!_domain.empty())
- {
- result.append("; domain=");
- result.append(_domain);
- }
- if (!_path.empty())
- {
- result.append("; path=");
- result.append(_path);
- }
- if (!_priority.empty())
- {
- result.append("; Priority=");
- result.append(_priority);
- }
- if (_maxAge != -1)
- {
- Timestamp ts;
- ts += _maxAge * Timestamp::resolution();
- result.append("; expires=");
- DateTimeFormatter::append(result, ts, DateTimeFormat::HTTP_FORMAT);
- }
- if (_secure)
- {
- result.append("; secure");
- }
- if (_httpOnly)
- {
- result.append("; HttpOnly");
- }
- }
- else
- {
- // RFC 2109 cookie
- result.append("\"");
- result.append(_value);
- result.append("\"");
- if (!_comment.empty())
- {
- result.append("; Comment=\"");
- result.append(_comment);
- result.append("\"");
- }
- if (!_domain.empty())
- {
- result.append("; Domain=\"");
- result.append(_domain);
- result.append("\"");
- }
- if (!_path.empty())
- {
- result.append("; Path=\"");
- result.append(_path);
- result.append("\"");
- }
- if (!_priority.empty())
- {
- result.append("; Priority=\"");
- result.append(_priority);
- result.append("\"");
- }
-
- if (_maxAge != -1)
- {
- result.append("; Max-Age=\"");
- NumberFormatter::append(result, _maxAge);
- result.append("\"");
- }
- if (_secure)
- {
- result.append("; secure");
- }
- if (_httpOnly)
- {
- result.append("; HttpOnly");
- }
- result.append("; Version=\"1\"");
- }
- return result;
-}
-
-
-namespace
-{
- static const std::string ILLEGAL_CHARS("()[]/|\\',;");
-}
-
-
-std::string HTTPCookie::escape(const std::string& str)
-{
- std::string result;
- Poco::URI::encode(str, ILLEGAL_CHARS, result);
- return result;
-}
-
-
-std::string HTTPCookie::unescape(const std::string& str)
-{
- std::string result;
- Poco::URI::decode(str, result);
- return result;
-}
-
-
-} } // namespace Poco::Net
+//
+// HTTPCookie.cpp
+//
+// Library: Net
+// Package: HTTP
+// Module: HTTPCookie
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/HTTPCookie.h"
+#include "Poco/Net/NameValueCollection.h"
+#include "Poco/Timestamp.h"
+#include "Poco/DateTime.h"
+#include "Poco/DateTimeFormatter.h"
+#include "Poco/DateTimeFormat.h"
+#include "Poco/DateTimeParser.h"
+#include "Poco/NumberFormatter.h"
+#include "Poco/NumberParser.h"
+#include "Poco/String.h"
+#include "Poco/URI.h"
+
+
+using Poco::Timestamp;
+using Poco::DateTime;
+using Poco::DateTimeFormatter;
+using Poco::DateTimeFormat;
+using Poco::DateTimeParser;
+using Poco::NumberFormatter;
+using Poco::NumberParser;
+using Poco::icompare;
+
+
+namespace Poco {
+namespace Net {
+
+
+HTTPCookie::HTTPCookie():
+ _version(0),
+ _secure(false),
+ _maxAge(-1),
+ _httpOnly(false)
+{
+}
+
+
+HTTPCookie::HTTPCookie(const std::string& name):
+ _version(0),
+ _name(name),
+ _secure(false),
+ _maxAge(-1),
+ _httpOnly(false)
+{
+}
+
+
+HTTPCookie::HTTPCookie(const NameValueCollection& nvc):
+ _version(0),
+ _secure(false),
+ _maxAge(-1),
+ _httpOnly(false)
+{
+ for (NameValueCollection::ConstIterator it = nvc.begin(); it != nvc.end(); ++it)
+ {
+ const std::string& name = it->first;
+ const std::string& value = it->second;
+ if (icompare(name, "comment") == 0)
+ {
+ setComment(value);
+ }
+ else if (icompare(name, "domain") == 0)
+ {
+ setDomain(value);
+ }
+ else if (icompare(name, "path") == 0)
+ {
+ setPath(value);
+ }
+ else if (icompare(name, "priority") == 0)
+ {
+ setPriority(value);
+ }
+ else if (icompare(name, "max-age") == 0)
+ {
+ setMaxAge(NumberParser::parse(value));
+ }
+ else if (icompare(name, "secure") == 0)
+ {
+ setSecure(true);
+ }
+ else if (icompare(name, "expires") == 0)
+ {
+ int tzd;
+ DateTime exp = DateTimeParser::parse(value, tzd);
+ Timestamp now;
+ setMaxAge((int) ((exp.timestamp() - now) / Timestamp::resolution()));
+ }
+ else if (icompare(name, "version") == 0)
+ {
+ setVersion(NumberParser::parse(value));
+ }
+ else if (icompare(name, "HttpOnly") == 0)
+ {
+ setHttpOnly(true);
+ }
+ else
+ {
+ setName(name);
+ setValue(value);
+ }
+ }
+}
+
+
+HTTPCookie::HTTPCookie(const std::string& name, const std::string& value):
+ _version(0),
+ _name(name),
+ _value(value),
+ _secure(false),
+ _maxAge(-1),
+ _httpOnly(false)
+{
+}
+
+
+HTTPCookie::HTTPCookie(const HTTPCookie& cookie):
+ _version(cookie._version),
+ _name(cookie._name),
+ _value(cookie._value),
+ _comment(cookie._comment),
+ _domain(cookie._domain),
+ _path(cookie._path),
+ _priority(cookie._priority),
+ _secure(cookie._secure),
+ _maxAge(cookie._maxAge),
+ _httpOnly(cookie._httpOnly)
+{
+}
+
+
+HTTPCookie::~HTTPCookie()
+{
+}
+
+
+HTTPCookie& HTTPCookie::operator = (const HTTPCookie& cookie)
+{
+ if (&cookie != this)
+ {
+ _version = cookie._version;
+ _name = cookie._name;
+ _value = cookie._value;
+ _comment = cookie._comment;
+ _domain = cookie._domain;
+ _path = cookie._path;
+ _priority = cookie._priority;
+ _secure = cookie._secure;
+ _maxAge = cookie._maxAge;
+ _httpOnly = cookie._httpOnly;
+ }
+ return *this;
+}
+
+
+void HTTPCookie::setVersion(int version)
+{
+ _version = version;
+}
+
+
+void HTTPCookie::setName(const std::string& name)
+{
+ _name = name;
+}
+
+
+void HTTPCookie::setValue(const std::string& value)
+{
+ _value = value;
+}
+
+
+void HTTPCookie::setComment(const std::string& comment)
+{
+ _comment = comment;
+}
+
+
+void HTTPCookie::setDomain(const std::string& domain)
+{
+ _domain = domain;
+}
+
+
+void HTTPCookie::setPath(const std::string& path)
+{
+ _path = path;
+}
+
+
+void HTTPCookie::setPriority(const std::string& priority)
+{
+ _priority = priority;
+}
+
+
+void HTTPCookie::setSecure(bool secure)
+{
+ _secure = secure;
+}
+
+
+void HTTPCookie::setMaxAge(int maxAge)
+{
+ _maxAge = maxAge;
+}
+
+
+void HTTPCookie::setHttpOnly(bool flag)
+{
+ _httpOnly = flag;
+}
+
+
+std::string HTTPCookie::toString() const
+{
+ std::string result;
+ result.reserve(256);
+ result.append(_name);
+ result.append("=");
+ if (_version == 0)
+ {
+ // Netscape cookie
+ result.append(_value);
+ if (!_domain.empty())
+ {
+ result.append("; domain=");
+ result.append(_domain);
+ }
+ if (!_path.empty())
+ {
+ result.append("; path=");
+ result.append(_path);
+ }
+ if (!_priority.empty())
+ {
+ result.append("; Priority=");
+ result.append(_priority);
+ }
+ if (_maxAge != -1)
+ {
+ Timestamp ts;
+ ts += _maxAge * Timestamp::resolution();
+ result.append("; expires=");
+ DateTimeFormatter::append(result, ts, DateTimeFormat::HTTP_FORMAT);
+ }
+ if (_secure)
+ {
+ result.append("; secure");
+ }
+ if (_httpOnly)
+ {
+ result.append("; HttpOnly");
+ }
+ }
+ else
+ {
+ // RFC 2109 cookie
+ result.append("\"");
+ result.append(_value);
+ result.append("\"");
+ if (!_comment.empty())
+ {
+ result.append("; Comment=\"");
+ result.append(_comment);
+ result.append("\"");
+ }
+ if (!_domain.empty())
+ {
+ result.append("; Domain=\"");
+ result.append(_domain);
+ result.append("\"");
+ }
+ if (!_path.empty())
+ {
+ result.append("; Path=\"");
+ result.append(_path);
+ result.append("\"");
+ }
+ if (!_priority.empty())
+ {
+ result.append("; Priority=\"");
+ result.append(_priority);
+ result.append("\"");
+ }
+
+ if (_maxAge != -1)
+ {
+ result.append("; Max-Age=\"");
+ NumberFormatter::append(result, _maxAge);
+ result.append("\"");
+ }
+ if (_secure)
+ {
+ result.append("; secure");
+ }
+ if (_httpOnly)
+ {
+ result.append("; HttpOnly");
+ }
+ result.append("; Version=\"1\"");
+ }
+ return result;
+}
+
+
+namespace
+{
+ static const std::string ILLEGAL_CHARS("()[]/|\\',;");
+}
+
+
+std::string HTTPCookie::escape(const std::string& str)
+{
+ std::string result;
+ Poco::URI::encode(str, ILLEGAL_CHARS, result);
+ return result;
+}
+
+
+std::string HTTPCookie::unescape(const std::string& str)
+{
+ std::string result;
+ Poco::URI::decode(str, result);
+ return result;
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/HTTPCredentials.cpp b/contrib/libs/poco/Net/src/HTTPCredentials.cpp
index 36a314f246..ae1d6ea0b6 100644
--- a/contrib/libs/poco/Net/src/HTTPCredentials.cpp
+++ b/contrib/libs/poco/Net/src/HTTPCredentials.cpp
@@ -1,208 +1,208 @@
-//
-// HTTPCredentials.cpp
-//
-// Library: Net
-// Package: HTTP
-// Module: HTTPCredentials
-//
-// Copyright (c) 2011, Anton V. Yabchinskiy (arn at bestmx dot ru).
-// Copyright (c) 2012, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/HTTPAuthenticationParams.h"
-#include "Poco/Net/HTTPBasicCredentials.h"
-#include "Poco/Net/HTTPCredentials.h"
-#include "Poco/Net/HTTPRequest.h"
-#include "Poco/Net/HTTPResponse.h"
-#include "Poco/Net/NetException.h"
-#include "Poco/String.h"
-#include "Poco/Ascii.h"
-#include "Poco/URI.h"
-
-
-using Poco::icompare;
-
-
-namespace Poco {
-namespace Net {
-
-
-HTTPCredentials::HTTPCredentials()
-{
-}
-
-
-HTTPCredentials::HTTPCredentials(const std::string& username, const std::string& password):
- _digest(username, password)
-{
-}
-
-
-HTTPCredentials::~HTTPCredentials()
-{
-}
-
-
-void HTTPCredentials::fromUserInfo(const std::string& userInfo)
-{
- std::string username;
- std::string password;
-
- extractCredentials(userInfo, username, password);
- setUsername(username);
- setPassword(password);
- _digest.reset();
-}
-
-
-void HTTPCredentials::fromURI(const URI& uri)
-{
- std::string username;
- std::string password;
-
- extractCredentials(uri, username, password);
- setUsername(username);
- setPassword(password);
- _digest.reset();
-}
-
-
-void HTTPCredentials::authenticate(HTTPRequest& request, const HTTPResponse& response)
-{
- for (HTTPResponse::ConstIterator iter = response.find(HTTPAuthenticationParams::WWW_AUTHENTICATE); iter != response.end(); ++iter)
- {
- if (isBasicCredentials(iter->second))
- {
- HTTPBasicCredentials(_digest.getUsername(), _digest.getPassword()).authenticate(request);
- return;
- }
- else if (isDigestCredentials(iter->second))
- {
- _digest.authenticate(request, HTTPAuthenticationParams(iter->second.substr(7)));
- return;
+//
+// HTTPCredentials.cpp
+//
+// Library: Net
+// Package: HTTP
+// Module: HTTPCredentials
+//
+// Copyright (c) 2011, Anton V. Yabchinskiy (arn at bestmx dot ru).
+// Copyright (c) 2012, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/HTTPAuthenticationParams.h"
+#include "Poco/Net/HTTPBasicCredentials.h"
+#include "Poco/Net/HTTPCredentials.h"
+#include "Poco/Net/HTTPRequest.h"
+#include "Poco/Net/HTTPResponse.h"
+#include "Poco/Net/NetException.h"
+#include "Poco/String.h"
+#include "Poco/Ascii.h"
+#include "Poco/URI.h"
+
+
+using Poco::icompare;
+
+
+namespace Poco {
+namespace Net {
+
+
+HTTPCredentials::HTTPCredentials()
+{
+}
+
+
+HTTPCredentials::HTTPCredentials(const std::string& username, const std::string& password):
+ _digest(username, password)
+{
+}
+
+
+HTTPCredentials::~HTTPCredentials()
+{
+}
+
+
+void HTTPCredentials::fromUserInfo(const std::string& userInfo)
+{
+ std::string username;
+ std::string password;
+
+ extractCredentials(userInfo, username, password);
+ setUsername(username);
+ setPassword(password);
+ _digest.reset();
+}
+
+
+void HTTPCredentials::fromURI(const URI& uri)
+{
+ std::string username;
+ std::string password;
+
+ extractCredentials(uri, username, password);
+ setUsername(username);
+ setPassword(password);
+ _digest.reset();
+}
+
+
+void HTTPCredentials::authenticate(HTTPRequest& request, const HTTPResponse& response)
+{
+ for (HTTPResponse::ConstIterator iter = response.find(HTTPAuthenticationParams::WWW_AUTHENTICATE); iter != response.end(); ++iter)
+ {
+ if (isBasicCredentials(iter->second))
+ {
+ HTTPBasicCredentials(_digest.getUsername(), _digest.getPassword()).authenticate(request);
+ return;
}
- }
-}
-
-
-void HTTPCredentials::updateAuthInfo(HTTPRequest& request)
-{
- if (request.has(HTTPRequest::AUTHORIZATION))
- {
- const std::string& authorization = request.get(HTTPRequest::AUTHORIZATION);
-
- if (isBasicCredentials(authorization))
- {
- HTTPBasicCredentials(_digest.getUsername(), _digest.getPassword()).authenticate(request);
- }
- else if (isDigestCredentials(authorization))
- {
- _digest.updateAuthInfo(request);
+ else if (isDigestCredentials(iter->second))
+ {
+ _digest.authenticate(request, HTTPAuthenticationParams(iter->second.substr(7)));
+ return;
+ }
+ }
+}
+
+
+void HTTPCredentials::updateAuthInfo(HTTPRequest& request)
+{
+ if (request.has(HTTPRequest::AUTHORIZATION))
+ {
+ const std::string& authorization = request.get(HTTPRequest::AUTHORIZATION);
+
+ if (isBasicCredentials(authorization))
+ {
+ HTTPBasicCredentials(_digest.getUsername(), _digest.getPassword()).authenticate(request);
}
- }
-}
-
-
-void HTTPCredentials::proxyAuthenticate(HTTPRequest& request, const HTTPResponse& response)
-{
- for (HTTPResponse::ConstIterator iter = response.find(HTTPAuthenticationParams::PROXY_AUTHENTICATE); iter != response.end(); ++iter)
- {
- if (isBasicCredentials(iter->second))
- {
- HTTPBasicCredentials(_digest.getUsername(), _digest.getPassword()).proxyAuthenticate(request);
- return;
- }
- else if (isDigestCredentials(iter->second))
- {
- _digest.proxyAuthenticate(request, HTTPAuthenticationParams(iter->second.substr(7)));
- return;
+ else if (isDigestCredentials(authorization))
+ {
+ _digest.updateAuthInfo(request);
+ }
+ }
+}
+
+
+void HTTPCredentials::proxyAuthenticate(HTTPRequest& request, const HTTPResponse& response)
+{
+ for (HTTPResponse::ConstIterator iter = response.find(HTTPAuthenticationParams::PROXY_AUTHENTICATE); iter != response.end(); ++iter)
+ {
+ if (isBasicCredentials(iter->second))
+ {
+ HTTPBasicCredentials(_digest.getUsername(), _digest.getPassword()).proxyAuthenticate(request);
+ return;
}
- }
-}
-
-
-void HTTPCredentials::updateProxyAuthInfo(HTTPRequest& request)
-{
- if (request.has(HTTPRequest::PROXY_AUTHORIZATION))
- {
- const std::string& authorization = request.get(HTTPRequest::PROXY_AUTHORIZATION);
-
- if (isBasicCredentials(authorization))
- {
- HTTPBasicCredentials(_digest.getUsername(), _digest.getPassword()).proxyAuthenticate(request);
- }
- else if (isDigestCredentials(authorization))
- {
- _digest.updateProxyAuthInfo(request);
+ else if (isDigestCredentials(iter->second))
+ {
+ _digest.proxyAuthenticate(request, HTTPAuthenticationParams(iter->second.substr(7)));
+ return;
+ }
+ }
+}
+
+
+void HTTPCredentials::updateProxyAuthInfo(HTTPRequest& request)
+{
+ if (request.has(HTTPRequest::PROXY_AUTHORIZATION))
+ {
+ const std::string& authorization = request.get(HTTPRequest::PROXY_AUTHORIZATION);
+
+ if (isBasicCredentials(authorization))
+ {
+ HTTPBasicCredentials(_digest.getUsername(), _digest.getPassword()).proxyAuthenticate(request);
}
+ else if (isDigestCredentials(authorization))
+ {
+ _digest.updateProxyAuthInfo(request);
+ }
+ }
+}
+
+
+bool HTTPCredentials::isBasicCredentials(const std::string& header)
+{
+ return icompare(header, 0, 5, "Basic") == 0 && (header.size() > 5 ? Poco::Ascii::isSpace(header[5]) : true);
+}
+
+
+bool HTTPCredentials::isDigestCredentials(const std::string& header)
+{
+ return icompare(header, 0, 6, "Digest") == 0 && (header.size() > 6 ? Poco::Ascii::isSpace(header[6]) : true);
+}
+
+
+bool HTTPCredentials::hasBasicCredentials(const HTTPRequest& request)
+{
+ return request.has(HTTPRequest::AUTHORIZATION) && isBasicCredentials(request.get(HTTPRequest::AUTHORIZATION));
+}
+
+
+bool HTTPCredentials::hasDigestCredentials(const HTTPRequest& request)
+{
+ return request.has(HTTPRequest::AUTHORIZATION) && isDigestCredentials(request.get(HTTPRequest::AUTHORIZATION));
+}
+
+
+bool HTTPCredentials::hasProxyBasicCredentials(const HTTPRequest& request)
+{
+ return request.has(HTTPRequest::PROXY_AUTHORIZATION) && isBasicCredentials(request.get(HTTPRequest::PROXY_AUTHORIZATION));
+}
+
+
+bool HTTPCredentials::hasProxyDigestCredentials(const HTTPRequest& request)
+{
+ return request.has(HTTPRequest::PROXY_AUTHORIZATION) && isDigestCredentials(request.get(HTTPRequest::PROXY_AUTHORIZATION));
+}
+
+
+void HTTPCredentials::extractCredentials(const std::string& userInfo, std::string& username, std::string& password)
+{
+ const std::string::size_type p = userInfo.find(':');
+
+ if (p != std::string::npos)
+ {
+ username.assign(userInfo, 0, p);
+ password.assign(userInfo, p + 1, std::string::npos);
}
-}
-
-
-bool HTTPCredentials::isBasicCredentials(const std::string& header)
-{
- return icompare(header, 0, 5, "Basic") == 0 && (header.size() > 5 ? Poco::Ascii::isSpace(header[5]) : true);
-}
-
-
-bool HTTPCredentials::isDigestCredentials(const std::string& header)
-{
- return icompare(header, 0, 6, "Digest") == 0 && (header.size() > 6 ? Poco::Ascii::isSpace(header[6]) : true);
-}
-
-
-bool HTTPCredentials::hasBasicCredentials(const HTTPRequest& request)
-{
- return request.has(HTTPRequest::AUTHORIZATION) && isBasicCredentials(request.get(HTTPRequest::AUTHORIZATION));
-}
-
-
-bool HTTPCredentials::hasDigestCredentials(const HTTPRequest& request)
-{
- return request.has(HTTPRequest::AUTHORIZATION) && isDigestCredentials(request.get(HTTPRequest::AUTHORIZATION));
-}
-
-
-bool HTTPCredentials::hasProxyBasicCredentials(const HTTPRequest& request)
-{
- return request.has(HTTPRequest::PROXY_AUTHORIZATION) && isBasicCredentials(request.get(HTTPRequest::PROXY_AUTHORIZATION));
-}
-
-
-bool HTTPCredentials::hasProxyDigestCredentials(const HTTPRequest& request)
-{
- return request.has(HTTPRequest::PROXY_AUTHORIZATION) && isDigestCredentials(request.get(HTTPRequest::PROXY_AUTHORIZATION));
-}
-
-
-void HTTPCredentials::extractCredentials(const std::string& userInfo, std::string& username, std::string& password)
-{
- const std::string::size_type p = userInfo.find(':');
-
- if (p != std::string::npos)
- {
- username.assign(userInfo, 0, p);
- password.assign(userInfo, p + 1, std::string::npos);
- }
- else
- {
- username.assign(userInfo);
- password.clear();
- }
-}
-
-
-void HTTPCredentials::extractCredentials(const Poco::URI& uri, std::string& username, std::string& password)
-{
- if (!uri.getUserInfo().empty())
- {
- extractCredentials(uri.getUserInfo(), username, password);
- }
-}
-
-
-} } // namespace Poco::Net
+ else
+ {
+ username.assign(userInfo);
+ password.clear();
+ }
+}
+
+
+void HTTPCredentials::extractCredentials(const Poco::URI& uri, std::string& username, std::string& password)
+{
+ if (!uri.getUserInfo().empty())
+ {
+ extractCredentials(uri.getUserInfo(), username, password);
+ }
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/HTTPDigestCredentials.cpp b/contrib/libs/poco/Net/src/HTTPDigestCredentials.cpp
index 43456a683d..0d3deb5146 100644
--- a/contrib/libs/poco/Net/src/HTTPDigestCredentials.cpp
+++ b/contrib/libs/poco/Net/src/HTTPDigestCredentials.cpp
@@ -1,313 +1,313 @@
-//
-// HTTPDigestCredentials.cpp
-//
-// Library: Net
-// Package: HTTP
-// Module: HTTPDigestCredentials
-//
-// Copyright (c) 2011, Anton V. Yabchinskiy (arn at bestmx dot ru).
-// Copyright (c) 2012, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/DateTime.h"
-#include "Poco/DateTimeFormat.h"
-#include "Poco/DateTimeFormatter.h"
-#include "Poco/Exception.h"
-#include "Poco/MD5Engine.h"
-#include "Poco/Net/HTTPDigestCredentials.h"
-#include "Poco/Net/HTTPRequest.h"
-#include "Poco/Net/HTTPResponse.h"
-#include "Poco/NumberFormatter.h"
-#include "Poco/StringTokenizer.h"
-
-
-namespace
-{
- std::string digest(Poco::DigestEngine& engine,
- const std::string& a,
- const std::string& b,
- const std::string& c = std::string(),
- const std::string& d = std::string(),
- const std::string& e = std::string(),
- const std::string& f = std::string())
- {
- engine.reset();
- engine.update(a);
- engine.update(':');
- engine.update(b);
- if (!c.empty())
- {
- engine.update(':');
- engine.update(c);
- if (!d.empty())
- {
- engine.update(':');
- engine.update(d);
- engine.update(':');
- engine.update(e);
- engine.update(':');
- engine.update(f);
- }
- }
- return Poco::DigestEngine::digestToHex(engine.digest());
- }
-
- std::string formatNonceCounter(int counter)
- {
- return Poco::NumberFormatter::formatHex(counter, 8);
- }
-}
-
-
-namespace Poco {
-namespace Net {
-
-
-const std::string HTTPDigestCredentials::SCHEME = "Digest";
-const std::string HTTPDigestCredentials::DEFAULT_ALGORITHM("MD5");
-const std::string HTTPDigestCredentials::DEFAULT_QOP("");
-const std::string HTTPDigestCredentials::NONCE_PARAM("nonce");
-const std::string HTTPDigestCredentials::REALM_PARAM("realm");
-const std::string HTTPDigestCredentials::QOP_PARAM("qop");
-const std::string HTTPDigestCredentials::ALGORITHM_PARAM("algorithm");
-const std::string HTTPDigestCredentials::USERNAME_PARAM("username");
-const std::string HTTPDigestCredentials::OPAQUE_PARAM("opaque");
-const std::string HTTPDigestCredentials::URI_PARAM("uri");
-const std::string HTTPDigestCredentials::RESPONSE_PARAM("response");
-const std::string HTTPDigestCredentials::AUTH_PARAM("auth");
-const std::string HTTPDigestCredentials::CNONCE_PARAM("cnonce");
-const std::string HTTPDigestCredentials::NC_PARAM("nc");
-int HTTPDigestCredentials::_nonceCounter(0);
-Poco::FastMutex HTTPDigestCredentials::_nonceMutex;
-
-
-HTTPDigestCredentials::HTTPDigestCredentials()
-{
-}
-
-
-HTTPDigestCredentials::HTTPDigestCredentials(const std::string& username, const std::string& password):
- _username(username),
- _password(password)
-{
-}
-
-
-HTTPDigestCredentials::~HTTPDigestCredentials()
-{
-}
-
-
-void HTTPDigestCredentials::reset()
-{
- _requestAuthParams.clear();
- _nc.clear();
-}
-
-
-void HTTPDigestCredentials::setUsername(const std::string& username)
-{
- _username = username;
-}
-
-
-void HTTPDigestCredentials::setPassword(const std::string& password)
-{
- _password = password;
-}
-
-
-void HTTPDigestCredentials::clear()
-{
- _username.clear();
- _password.clear();
-}
-
-
-void HTTPDigestCredentials::authenticate(HTTPRequest& request, const HTTPResponse& response)
-{
- authenticate(request, HTTPAuthenticationParams(response));
-}
-
-
-void HTTPDigestCredentials::authenticate(HTTPRequest& request, const HTTPAuthenticationParams& responseAuthParams)
-{
- createAuthParams(request, responseAuthParams);
- request.setCredentials(SCHEME, _requestAuthParams.toString());
-}
-
-
-void HTTPDigestCredentials::updateAuthInfo(HTTPRequest& request)
-{
- updateAuthParams(request);
- request.setCredentials(SCHEME, _requestAuthParams.toString());
-}
-
-
-void HTTPDigestCredentials::proxyAuthenticate(HTTPRequest& request, const HTTPResponse& response)
-{
- proxyAuthenticate(request, HTTPAuthenticationParams(response, HTTPAuthenticationParams::PROXY_AUTHENTICATE));
-}
-
-
-void HTTPDigestCredentials::proxyAuthenticate(HTTPRequest& request, const HTTPAuthenticationParams& responseAuthParams)
-{
- createAuthParams(request, responseAuthParams);
- request.setProxyCredentials(SCHEME, _requestAuthParams.toString());
-}
-
-
-void HTTPDigestCredentials::updateProxyAuthInfo(HTTPRequest& request)
-{
- updateAuthParams(request);
- request.setProxyCredentials(SCHEME, _requestAuthParams.toString());
-}
-
-
-std::string HTTPDigestCredentials::createNonce()
-{
- Poco::FastMutex::ScopedLock lock(_nonceMutex);
-
- MD5Engine md5;
- Timestamp::TimeVal now = Timestamp().epochMicroseconds();
-
- md5.update(&_nonceCounter, sizeof(_nonceCounter));
- md5.update(&now, sizeof(now));
-
- ++_nonceCounter;
-
- return DigestEngine::digestToHex(md5.digest());
-}
-
-
-void HTTPDigestCredentials::createAuthParams(const HTTPRequest& request, const HTTPAuthenticationParams& responseAuthParams)
-{
- // Not implemented: "domain" auth parameter and integrity protection.
-
- if (!responseAuthParams.has(NONCE_PARAM) || !responseAuthParams.has(REALM_PARAM))
- throw InvalidArgumentException("Invalid HTTP authentication parameters");
-
- const std::string& algorithm = responseAuthParams.get(ALGORITHM_PARAM, DEFAULT_ALGORITHM);
-
- if (icompare(algorithm, DEFAULT_ALGORITHM) != 0)
- throw NotImplementedException("Unsupported digest algorithm", algorithm);
-
- const std::string& nonce = responseAuthParams.get(NONCE_PARAM);
- const std::string& qop = responseAuthParams.get(QOP_PARAM, DEFAULT_QOP);
- const std::string& realm = responseAuthParams.getRealm();
-
- _requestAuthParams.clear();
- _requestAuthParams.set(USERNAME_PARAM, _username);
- _requestAuthParams.set(NONCE_PARAM, nonce);
- _requestAuthParams.setRealm(realm);
- if (responseAuthParams.has(OPAQUE_PARAM))
- {
- _requestAuthParams.set(OPAQUE_PARAM, responseAuthParams.get(OPAQUE_PARAM));
- }
-
- if (qop.empty())
- {
- updateAuthParams(request);
- }
- else
- {
- Poco::StringTokenizer tok(qop, ",", Poco::StringTokenizer::TOK_TRIM);
- bool qopSupported = false;
- for (Poco::StringTokenizer::Iterator it = tok.begin(); it != tok.end(); ++it)
- {
- if (icompare(*it, AUTH_PARAM) == 0)
- {
- qopSupported = true;
- _requestAuthParams.set(CNONCE_PARAM, createNonce());
- _requestAuthParams.set(QOP_PARAM, *it);
- updateAuthParams(request);
- break;
- }
- }
- if (!qopSupported)
- throw NotImplementedException("Unsupported QoP requested", qop);
- }
-}
-
-
-void HTTPDigestCredentials::updateAuthParams(const HTTPRequest& request)
-{
- MD5Engine engine;
- const std::string& qop = _requestAuthParams.get(QOP_PARAM, DEFAULT_QOP);
- const std::string& realm = _requestAuthParams.getRealm();
- const std::string& nonce = _requestAuthParams.get(NONCE_PARAM);
-
- _requestAuthParams.set(URI_PARAM, request.getURI());
-
- if (qop.empty())
- {
- const std::string ha1 = digest(engine, _username, realm, _password);
- const std::string ha2 = digest(engine, request.getMethod(), request.getURI());
-
- _requestAuthParams.set(RESPONSE_PARAM, digest(engine, ha1, nonce, ha2));
- }
- else if (icompare(qop, AUTH_PARAM) == 0)
- {
- const std::string& cnonce = _requestAuthParams.get(CNONCE_PARAM);
-
- const std::string ha1 = digest(engine, _username, realm, _password);
- const std::string ha2 = digest(engine, request.getMethod(), request.getURI());
- const std::string nc = formatNonceCounter(updateNonceCounter(nonce));
-
- _requestAuthParams.set(NC_PARAM, nc);
- _requestAuthParams.set(RESPONSE_PARAM, digest(engine, ha1, nonce, nc, cnonce, qop, ha2));
- }
-}
-
-
-bool HTTPDigestCredentials::verifyAuthInfo(const HTTPRequest& request) const
-{
- HTTPAuthenticationParams params(request);
- return verifyAuthParams(request, params);
-}
-
-
-bool HTTPDigestCredentials::verifyAuthParams(const HTTPRequest& request, const HTTPAuthenticationParams& params) const
-{
- const std::string& nonce = params.get(NONCE_PARAM);
- const std::string& realm = params.getRealm();
- const std::string& qop = params.get(QOP_PARAM, DEFAULT_QOP);
- std::string response;
- MD5Engine engine;
- if (qop.empty())
- {
- const std::string ha1 = digest(engine, _username, realm, _password);
- const std::string ha2 = digest(engine, request.getMethod(), request.getURI());
- response = digest(engine, ha1, nonce, ha2);
- }
- else if (icompare(qop, AUTH_PARAM) == 0)
- {
- const std::string& cnonce = params.get(CNONCE_PARAM);
- const std::string& nc = params.get(NC_PARAM);
- const std::string ha1 = digest(engine, _username, realm, _password);
- const std::string ha2 = digest(engine, request.getMethod(), request.getURI());
- response = digest(engine, ha1, nonce, nc, cnonce, qop, ha2);
- }
- return response == params.get(RESPONSE_PARAM);
-}
-
-
-int HTTPDigestCredentials::updateNonceCounter(const std::string& nonce)
-{
- NonceCounterMap::iterator iter = _nc.find(nonce);
-
- if (iter == _nc.end())
- {
- iter = _nc.insert(NonceCounterMap::value_type(nonce, 0)).first;
- }
- iter->second++;
-
- return iter->second;
-}
-
-
-} } // namespace Poco::Net
+//
+// HTTPDigestCredentials.cpp
+//
+// Library: Net
+// Package: HTTP
+// Module: HTTPDigestCredentials
+//
+// Copyright (c) 2011, Anton V. Yabchinskiy (arn at bestmx dot ru).
+// Copyright (c) 2012, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/DateTime.h"
+#include "Poco/DateTimeFormat.h"
+#include "Poco/DateTimeFormatter.h"
+#include "Poco/Exception.h"
+#include "Poco/MD5Engine.h"
+#include "Poco/Net/HTTPDigestCredentials.h"
+#include "Poco/Net/HTTPRequest.h"
+#include "Poco/Net/HTTPResponse.h"
+#include "Poco/NumberFormatter.h"
+#include "Poco/StringTokenizer.h"
+
+
+namespace
+{
+ std::string digest(Poco::DigestEngine& engine,
+ const std::string& a,
+ const std::string& b,
+ const std::string& c = std::string(),
+ const std::string& d = std::string(),
+ const std::string& e = std::string(),
+ const std::string& f = std::string())
+ {
+ engine.reset();
+ engine.update(a);
+ engine.update(':');
+ engine.update(b);
+ if (!c.empty())
+ {
+ engine.update(':');
+ engine.update(c);
+ if (!d.empty())
+ {
+ engine.update(':');
+ engine.update(d);
+ engine.update(':');
+ engine.update(e);
+ engine.update(':');
+ engine.update(f);
+ }
+ }
+ return Poco::DigestEngine::digestToHex(engine.digest());
+ }
+
+ std::string formatNonceCounter(int counter)
+ {
+ return Poco::NumberFormatter::formatHex(counter, 8);
+ }
+}
+
+
+namespace Poco {
+namespace Net {
+
+
+const std::string HTTPDigestCredentials::SCHEME = "Digest";
+const std::string HTTPDigestCredentials::DEFAULT_ALGORITHM("MD5");
+const std::string HTTPDigestCredentials::DEFAULT_QOP("");
+const std::string HTTPDigestCredentials::NONCE_PARAM("nonce");
+const std::string HTTPDigestCredentials::REALM_PARAM("realm");
+const std::string HTTPDigestCredentials::QOP_PARAM("qop");
+const std::string HTTPDigestCredentials::ALGORITHM_PARAM("algorithm");
+const std::string HTTPDigestCredentials::USERNAME_PARAM("username");
+const std::string HTTPDigestCredentials::OPAQUE_PARAM("opaque");
+const std::string HTTPDigestCredentials::URI_PARAM("uri");
+const std::string HTTPDigestCredentials::RESPONSE_PARAM("response");
+const std::string HTTPDigestCredentials::AUTH_PARAM("auth");
+const std::string HTTPDigestCredentials::CNONCE_PARAM("cnonce");
+const std::string HTTPDigestCredentials::NC_PARAM("nc");
+int HTTPDigestCredentials::_nonceCounter(0);
+Poco::FastMutex HTTPDigestCredentials::_nonceMutex;
+
+
+HTTPDigestCredentials::HTTPDigestCredentials()
+{
+}
+
+
+HTTPDigestCredentials::HTTPDigestCredentials(const std::string& username, const std::string& password):
+ _username(username),
+ _password(password)
+{
+}
+
+
+HTTPDigestCredentials::~HTTPDigestCredentials()
+{
+}
+
+
+void HTTPDigestCredentials::reset()
+{
+ _requestAuthParams.clear();
+ _nc.clear();
+}
+
+
+void HTTPDigestCredentials::setUsername(const std::string& username)
+{
+ _username = username;
+}
+
+
+void HTTPDigestCredentials::setPassword(const std::string& password)
+{
+ _password = password;
+}
+
+
+void HTTPDigestCredentials::clear()
+{
+ _username.clear();
+ _password.clear();
+}
+
+
+void HTTPDigestCredentials::authenticate(HTTPRequest& request, const HTTPResponse& response)
+{
+ authenticate(request, HTTPAuthenticationParams(response));
+}
+
+
+void HTTPDigestCredentials::authenticate(HTTPRequest& request, const HTTPAuthenticationParams& responseAuthParams)
+{
+ createAuthParams(request, responseAuthParams);
+ request.setCredentials(SCHEME, _requestAuthParams.toString());
+}
+
+
+void HTTPDigestCredentials::updateAuthInfo(HTTPRequest& request)
+{
+ updateAuthParams(request);
+ request.setCredentials(SCHEME, _requestAuthParams.toString());
+}
+
+
+void HTTPDigestCredentials::proxyAuthenticate(HTTPRequest& request, const HTTPResponse& response)
+{
+ proxyAuthenticate(request, HTTPAuthenticationParams(response, HTTPAuthenticationParams::PROXY_AUTHENTICATE));
+}
+
+
+void HTTPDigestCredentials::proxyAuthenticate(HTTPRequest& request, const HTTPAuthenticationParams& responseAuthParams)
+{
+ createAuthParams(request, responseAuthParams);
+ request.setProxyCredentials(SCHEME, _requestAuthParams.toString());
+}
+
+
+void HTTPDigestCredentials::updateProxyAuthInfo(HTTPRequest& request)
+{
+ updateAuthParams(request);
+ request.setProxyCredentials(SCHEME, _requestAuthParams.toString());
+}
+
+
+std::string HTTPDigestCredentials::createNonce()
+{
+ Poco::FastMutex::ScopedLock lock(_nonceMutex);
+
+ MD5Engine md5;
+ Timestamp::TimeVal now = Timestamp().epochMicroseconds();
+
+ md5.update(&_nonceCounter, sizeof(_nonceCounter));
+ md5.update(&now, sizeof(now));
+
+ ++_nonceCounter;
+
+ return DigestEngine::digestToHex(md5.digest());
+}
+
+
+void HTTPDigestCredentials::createAuthParams(const HTTPRequest& request, const HTTPAuthenticationParams& responseAuthParams)
+{
+ // Not implemented: "domain" auth parameter and integrity protection.
+
+ if (!responseAuthParams.has(NONCE_PARAM) || !responseAuthParams.has(REALM_PARAM))
+ throw InvalidArgumentException("Invalid HTTP authentication parameters");
+
+ const std::string& algorithm = responseAuthParams.get(ALGORITHM_PARAM, DEFAULT_ALGORITHM);
+
+ if (icompare(algorithm, DEFAULT_ALGORITHM) != 0)
+ throw NotImplementedException("Unsupported digest algorithm", algorithm);
+
+ const std::string& nonce = responseAuthParams.get(NONCE_PARAM);
+ const std::string& qop = responseAuthParams.get(QOP_PARAM, DEFAULT_QOP);
+ const std::string& realm = responseAuthParams.getRealm();
+
+ _requestAuthParams.clear();
+ _requestAuthParams.set(USERNAME_PARAM, _username);
+ _requestAuthParams.set(NONCE_PARAM, nonce);
+ _requestAuthParams.setRealm(realm);
+ if (responseAuthParams.has(OPAQUE_PARAM))
+ {
+ _requestAuthParams.set(OPAQUE_PARAM, responseAuthParams.get(OPAQUE_PARAM));
+ }
+
+ if (qop.empty())
+ {
+ updateAuthParams(request);
+ }
+ else
+ {
+ Poco::StringTokenizer tok(qop, ",", Poco::StringTokenizer::TOK_TRIM);
+ bool qopSupported = false;
+ for (Poco::StringTokenizer::Iterator it = tok.begin(); it != tok.end(); ++it)
+ {
+ if (icompare(*it, AUTH_PARAM) == 0)
+ {
+ qopSupported = true;
+ _requestAuthParams.set(CNONCE_PARAM, createNonce());
+ _requestAuthParams.set(QOP_PARAM, *it);
+ updateAuthParams(request);
+ break;
+ }
+ }
+ if (!qopSupported)
+ throw NotImplementedException("Unsupported QoP requested", qop);
+ }
+}
+
+
+void HTTPDigestCredentials::updateAuthParams(const HTTPRequest& request)
+{
+ MD5Engine engine;
+ const std::string& qop = _requestAuthParams.get(QOP_PARAM, DEFAULT_QOP);
+ const std::string& realm = _requestAuthParams.getRealm();
+ const std::string& nonce = _requestAuthParams.get(NONCE_PARAM);
+
+ _requestAuthParams.set(URI_PARAM, request.getURI());
+
+ if (qop.empty())
+ {
+ const std::string ha1 = digest(engine, _username, realm, _password);
+ const std::string ha2 = digest(engine, request.getMethod(), request.getURI());
+
+ _requestAuthParams.set(RESPONSE_PARAM, digest(engine, ha1, nonce, ha2));
+ }
+ else if (icompare(qop, AUTH_PARAM) == 0)
+ {
+ const std::string& cnonce = _requestAuthParams.get(CNONCE_PARAM);
+
+ const std::string ha1 = digest(engine, _username, realm, _password);
+ const std::string ha2 = digest(engine, request.getMethod(), request.getURI());
+ const std::string nc = formatNonceCounter(updateNonceCounter(nonce));
+
+ _requestAuthParams.set(NC_PARAM, nc);
+ _requestAuthParams.set(RESPONSE_PARAM, digest(engine, ha1, nonce, nc, cnonce, qop, ha2));
+ }
+}
+
+
+bool HTTPDigestCredentials::verifyAuthInfo(const HTTPRequest& request) const
+{
+ HTTPAuthenticationParams params(request);
+ return verifyAuthParams(request, params);
+}
+
+
+bool HTTPDigestCredentials::verifyAuthParams(const HTTPRequest& request, const HTTPAuthenticationParams& params) const
+{
+ const std::string& nonce = params.get(NONCE_PARAM);
+ const std::string& realm = params.getRealm();
+ const std::string& qop = params.get(QOP_PARAM, DEFAULT_QOP);
+ std::string response;
+ MD5Engine engine;
+ if (qop.empty())
+ {
+ const std::string ha1 = digest(engine, _username, realm, _password);
+ const std::string ha2 = digest(engine, request.getMethod(), request.getURI());
+ response = digest(engine, ha1, nonce, ha2);
+ }
+ else if (icompare(qop, AUTH_PARAM) == 0)
+ {
+ const std::string& cnonce = params.get(CNONCE_PARAM);
+ const std::string& nc = params.get(NC_PARAM);
+ const std::string ha1 = digest(engine, _username, realm, _password);
+ const std::string ha2 = digest(engine, request.getMethod(), request.getURI());
+ response = digest(engine, ha1, nonce, nc, cnonce, qop, ha2);
+ }
+ return response == params.get(RESPONSE_PARAM);
+}
+
+
+int HTTPDigestCredentials::updateNonceCounter(const std::string& nonce)
+{
+ NonceCounterMap::iterator iter = _nc.find(nonce);
+
+ if (iter == _nc.end())
+ {
+ iter = _nc.insert(NonceCounterMap::value_type(nonce, 0)).first;
+ }
+ iter->second++;
+
+ return iter->second;
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/HTTPFixedLengthStream.cpp b/contrib/libs/poco/Net/src/HTTPFixedLengthStream.cpp
index e287de9f83..3273fe6c00 100644
--- a/contrib/libs/poco/Net/src/HTTPFixedLengthStream.cpp
+++ b/contrib/libs/poco/Net/src/HTTPFixedLengthStream.cpp
@@ -1,181 +1,181 @@
-//
-// HTTPFixedLengthStream.cpp
-//
-// Library: Net
-// Package: HTTP
-// Module: HTTPFixedLengthStream
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/HTTPFixedLengthStream.h"
-#include "Poco/Net/HTTPSession.h"
-
-
-using Poco::BufferedStreamBuf;
-
-
-namespace Poco {
-namespace Net {
-
-
-//
-// HTTPFixedLengthStreamBuf
-//
-
-
-HTTPFixedLengthStreamBuf::HTTPFixedLengthStreamBuf(HTTPSession& session, ContentLength length, openmode mode):
- HTTPBasicStreamBuf(HTTPBufferAllocator::BUFFER_SIZE, mode),
- _session(session),
- _length(length),
- _count(0)
-{
-}
-
-
-HTTPFixedLengthStreamBuf::~HTTPFixedLengthStreamBuf()
-{
-}
-
-
-int HTTPFixedLengthStreamBuf::readFromDevice(char* buffer, std::streamsize length)
-{
- int n = 0;
- if (_count < _length)
- {
- if (_count + length > _length)
- length = static_cast<std::streamsize>(_length - _count);
- n = _session.read(buffer, length);
- if (n > 0) _count += n;
- }
- return n;
-}
-
-
-int HTTPFixedLengthStreamBuf::writeToDevice(const char* buffer, std::streamsize length)
-{
- int n = 0;
- if (_count < _length)
- {
- if (_count + length > _length)
- length = static_cast<std::streamsize>(_length - _count);
- n = _session.write(buffer, length);
- if (n > 0) _count += n;
- }
- return n;
-}
-
-
-//
-// HTTPFixedLengthIOS
-//
-
-
-HTTPFixedLengthIOS::HTTPFixedLengthIOS(HTTPSession& session, HTTPFixedLengthStreamBuf::ContentLength length, HTTPFixedLengthStreamBuf::openmode mode):
- _buf(session, length, mode)
-{
- poco_ios_init(&_buf);
-}
-
-
-HTTPFixedLengthIOS::~HTTPFixedLengthIOS()
-{
- try
- {
- _buf.sync();
- }
- catch (...)
- {
- }
-}
-
-
-HTTPFixedLengthStreamBuf* HTTPFixedLengthIOS::rdbuf()
-{
- return &_buf;
-}
-
-
-//
-// HTTPFixedLengthInputStream
-//
-
-
-Poco::MemoryPool HTTPFixedLengthInputStream::_pool(sizeof(HTTPFixedLengthInputStream));
-
-
-HTTPFixedLengthInputStream::HTTPFixedLengthInputStream(HTTPSession& session, HTTPFixedLengthStreamBuf::ContentLength length):
- HTTPFixedLengthIOS(session, length, std::ios::in),
- std::istream(&_buf)
-{
-}
-
-
-HTTPFixedLengthInputStream::~HTTPFixedLengthInputStream()
-{
-}
-
-
-void* HTTPFixedLengthInputStream::operator new(std::size_t /*size*/)
-{
- return _pool.get();
-}
-
-
-void HTTPFixedLengthInputStream::operator delete(void* ptr)
-{
- try
- {
- _pool.release(ptr);
- }
- catch (...)
- {
- poco_unexpected();
- }
-}
-
-
-//
-// HTTPFixedLengthOutputStream
-//
-
-
-Poco::MemoryPool HTTPFixedLengthOutputStream::_pool(sizeof(HTTPFixedLengthOutputStream));
-
-
-HTTPFixedLengthOutputStream::HTTPFixedLengthOutputStream(HTTPSession& session, HTTPFixedLengthStreamBuf::ContentLength length):
- HTTPFixedLengthIOS(session, length, std::ios::out),
- std::ostream(&_buf)
-{
-}
-
-
-HTTPFixedLengthOutputStream::~HTTPFixedLengthOutputStream()
-{
-}
-
-
-void* HTTPFixedLengthOutputStream::operator new(std::size_t /*size*/)
-{
- return _pool.get();
-}
-
-
-void HTTPFixedLengthOutputStream::operator delete(void* ptr)
-{
- try
- {
- _pool.release(ptr);
- }
- catch (...)
- {
- poco_unexpected();
- }
-}
-
-
-} } // namespace Poco::Net
+//
+// HTTPFixedLengthStream.cpp
+//
+// Library: Net
+// Package: HTTP
+// Module: HTTPFixedLengthStream
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/HTTPFixedLengthStream.h"
+#include "Poco/Net/HTTPSession.h"
+
+
+using Poco::BufferedStreamBuf;
+
+
+namespace Poco {
+namespace Net {
+
+
+//
+// HTTPFixedLengthStreamBuf
+//
+
+
+HTTPFixedLengthStreamBuf::HTTPFixedLengthStreamBuf(HTTPSession& session, ContentLength length, openmode mode):
+ HTTPBasicStreamBuf(HTTPBufferAllocator::BUFFER_SIZE, mode),
+ _session(session),
+ _length(length),
+ _count(0)
+{
+}
+
+
+HTTPFixedLengthStreamBuf::~HTTPFixedLengthStreamBuf()
+{
+}
+
+
+int HTTPFixedLengthStreamBuf::readFromDevice(char* buffer, std::streamsize length)
+{
+ int n = 0;
+ if (_count < _length)
+ {
+ if (_count + length > _length)
+ length = static_cast<std::streamsize>(_length - _count);
+ n = _session.read(buffer, length);
+ if (n > 0) _count += n;
+ }
+ return n;
+}
+
+
+int HTTPFixedLengthStreamBuf::writeToDevice(const char* buffer, std::streamsize length)
+{
+ int n = 0;
+ if (_count < _length)
+ {
+ if (_count + length > _length)
+ length = static_cast<std::streamsize>(_length - _count);
+ n = _session.write(buffer, length);
+ if (n > 0) _count += n;
+ }
+ return n;
+}
+
+
+//
+// HTTPFixedLengthIOS
+//
+
+
+HTTPFixedLengthIOS::HTTPFixedLengthIOS(HTTPSession& session, HTTPFixedLengthStreamBuf::ContentLength length, HTTPFixedLengthStreamBuf::openmode mode):
+ _buf(session, length, mode)
+{
+ poco_ios_init(&_buf);
+}
+
+
+HTTPFixedLengthIOS::~HTTPFixedLengthIOS()
+{
+ try
+ {
+ _buf.sync();
+ }
+ catch (...)
+ {
+ }
+}
+
+
+HTTPFixedLengthStreamBuf* HTTPFixedLengthIOS::rdbuf()
+{
+ return &_buf;
+}
+
+
+//
+// HTTPFixedLengthInputStream
+//
+
+
+Poco::MemoryPool HTTPFixedLengthInputStream::_pool(sizeof(HTTPFixedLengthInputStream));
+
+
+HTTPFixedLengthInputStream::HTTPFixedLengthInputStream(HTTPSession& session, HTTPFixedLengthStreamBuf::ContentLength length):
+ HTTPFixedLengthIOS(session, length, std::ios::in),
+ std::istream(&_buf)
+{
+}
+
+
+HTTPFixedLengthInputStream::~HTTPFixedLengthInputStream()
+{
+}
+
+
+void* HTTPFixedLengthInputStream::operator new(std::size_t /*size*/)
+{
+ return _pool.get();
+}
+
+
+void HTTPFixedLengthInputStream::operator delete(void* ptr)
+{
+ try
+ {
+ _pool.release(ptr);
+ }
+ catch (...)
+ {
+ poco_unexpected();
+ }
+}
+
+
+//
+// HTTPFixedLengthOutputStream
+//
+
+
+Poco::MemoryPool HTTPFixedLengthOutputStream::_pool(sizeof(HTTPFixedLengthOutputStream));
+
+
+HTTPFixedLengthOutputStream::HTTPFixedLengthOutputStream(HTTPSession& session, HTTPFixedLengthStreamBuf::ContentLength length):
+ HTTPFixedLengthIOS(session, length, std::ios::out),
+ std::ostream(&_buf)
+{
+}
+
+
+HTTPFixedLengthOutputStream::~HTTPFixedLengthOutputStream()
+{
+}
+
+
+void* HTTPFixedLengthOutputStream::operator new(std::size_t /*size*/)
+{
+ return _pool.get();
+}
+
+
+void HTTPFixedLengthOutputStream::operator delete(void* ptr)
+{
+ try
+ {
+ _pool.release(ptr);
+ }
+ catch (...)
+ {
+ poco_unexpected();
+ }
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/HTTPHeaderStream.cpp b/contrib/libs/poco/Net/src/HTTPHeaderStream.cpp
index 2b53e96815..7d8279bc80 100644
--- a/contrib/libs/poco/Net/src/HTTPHeaderStream.cpp
+++ b/contrib/libs/poco/Net/src/HTTPHeaderStream.cpp
@@ -1,180 +1,180 @@
-//
-// HTTPHeaderStream.cpp
-//
-// Library: Net
-// Package: HTTP
-// Module: HTTPHeaderStream
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/HTTPHeaderStream.h"
-#include "Poco/Net/HTTPSession.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-//
-// HTTPHeaderStreamBuf
-//
-
-
-HTTPHeaderStreamBuf::HTTPHeaderStreamBuf(HTTPSession& session, openmode mode):
- HTTPBasicStreamBuf(HTTPBufferAllocator::BUFFER_SIZE, mode),
- _session(session),
+//
+// HTTPHeaderStream.cpp
+//
+// Library: Net
+// Package: HTTP
+// Module: HTTPHeaderStream
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/HTTPHeaderStream.h"
+#include "Poco/Net/HTTPSession.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+//
+// HTTPHeaderStreamBuf
+//
+
+
+HTTPHeaderStreamBuf::HTTPHeaderStreamBuf(HTTPSession& session, openmode mode):
+ HTTPBasicStreamBuf(HTTPBufferAllocator::BUFFER_SIZE, mode),
+ _session(session),
_end(false),
_line_ended(true)
-{
-}
-
-
-HTTPHeaderStreamBuf::~HTTPHeaderStreamBuf()
-{
-}
-
-
-int HTTPHeaderStreamBuf::readFromDevice(char* buffer, std::streamsize length)
-{
- // read line-by-line; an empty line denotes the end of the headers.
- static const int eof = std::char_traits<char>::eof();
-
- if (_end) return 0;
-
- int n = 0;
- int ch = _session.get();
- while (ch != eof && ch != '\n' && n < length - 1)
- {
- *buffer++ = (char) ch; ++n;
- ch = _session.get();
- }
- if (ch != eof)
- {
- *buffer++ = (char) ch; ++n;
+{
+}
+
+
+HTTPHeaderStreamBuf::~HTTPHeaderStreamBuf()
+{
+}
+
+
+int HTTPHeaderStreamBuf::readFromDevice(char* buffer, std::streamsize length)
+{
+ // read line-by-line; an empty line denotes the end of the headers.
+ static const int eof = std::char_traits<char>::eof();
+
+ if (_end) return 0;
+
+ int n = 0;
+ int ch = _session.get();
+ while (ch != eof && ch != '\n' && n < length - 1)
+ {
+ *buffer++ = (char) ch; ++n;
+ ch = _session.get();
+ }
+ if (ch != eof)
+ {
+ *buffer++ = (char) ch; ++n;
if (n == 2) _end = _line_ended;
- }
+ }
_line_ended = (ch == '\n');
- return n;
-}
-
-
-int HTTPHeaderStreamBuf::writeToDevice(const char* buffer, std::streamsize length)
-{
- return _session.write(buffer, length);
-}
-
-
-//
-// HTTPHeaderIOS
-//
-
-
-HTTPHeaderIOS::HTTPHeaderIOS(HTTPSession& session, HTTPHeaderStreamBuf::openmode mode):
- _buf(session, mode)
-{
- poco_ios_init(&_buf);
-}
-
-
-HTTPHeaderIOS::~HTTPHeaderIOS()
-{
- try
- {
- _buf.sync();
- }
- catch (...)
- {
- }
-}
-
-
-HTTPHeaderStreamBuf* HTTPHeaderIOS::rdbuf()
-{
- return &_buf;
-}
-
-
-//
-// HTTPHeaderInputStream
-//
-
-
-Poco::MemoryPool HTTPHeaderInputStream::_pool(sizeof(HTTPHeaderInputStream));
-
-
-HTTPHeaderInputStream::HTTPHeaderInputStream(HTTPSession& session):
- HTTPHeaderIOS(session, std::ios::in),
- std::istream(&_buf)
-{
-}
-
-
-HTTPHeaderInputStream::~HTTPHeaderInputStream()
-{
-}
-
-
-void* HTTPHeaderInputStream::operator new(std::size_t /*size*/)
-{
- return _pool.get();
-}
-
-
-void HTTPHeaderInputStream::operator delete(void* ptr)
-{
- try
- {
- _pool.release(ptr);
- }
- catch (...)
- {
- poco_unexpected();
- }
-}
-
-
-//
-// HTTPHeaderOutputStream
-//
-
-
-Poco::MemoryPool HTTPHeaderOutputStream::_pool(sizeof(HTTPHeaderOutputStream));
-
-
-HTTPHeaderOutputStream::HTTPHeaderOutputStream(HTTPSession& session):
- HTTPHeaderIOS(session, std::ios::out),
- std::ostream(&_buf)
-{
-}
-
-
-HTTPHeaderOutputStream::~HTTPHeaderOutputStream()
-{
-}
-
-
-void* HTTPHeaderOutputStream::operator new(std::size_t /*size*/)
-{
- return _pool.get();
-}
-
-
-void HTTPHeaderOutputStream::operator delete(void* ptr)
-{
- try
- {
- _pool.release(ptr);
- }
- catch (...)
- {
- poco_unexpected();
- }
-}
-
-
-} } // namespace Poco::Net
+ return n;
+}
+
+
+int HTTPHeaderStreamBuf::writeToDevice(const char* buffer, std::streamsize length)
+{
+ return _session.write(buffer, length);
+}
+
+
+//
+// HTTPHeaderIOS
+//
+
+
+HTTPHeaderIOS::HTTPHeaderIOS(HTTPSession& session, HTTPHeaderStreamBuf::openmode mode):
+ _buf(session, mode)
+{
+ poco_ios_init(&_buf);
+}
+
+
+HTTPHeaderIOS::~HTTPHeaderIOS()
+{
+ try
+ {
+ _buf.sync();
+ }
+ catch (...)
+ {
+ }
+}
+
+
+HTTPHeaderStreamBuf* HTTPHeaderIOS::rdbuf()
+{
+ return &_buf;
+}
+
+
+//
+// HTTPHeaderInputStream
+//
+
+
+Poco::MemoryPool HTTPHeaderInputStream::_pool(sizeof(HTTPHeaderInputStream));
+
+
+HTTPHeaderInputStream::HTTPHeaderInputStream(HTTPSession& session):
+ HTTPHeaderIOS(session, std::ios::in),
+ std::istream(&_buf)
+{
+}
+
+
+HTTPHeaderInputStream::~HTTPHeaderInputStream()
+{
+}
+
+
+void* HTTPHeaderInputStream::operator new(std::size_t /*size*/)
+{
+ return _pool.get();
+}
+
+
+void HTTPHeaderInputStream::operator delete(void* ptr)
+{
+ try
+ {
+ _pool.release(ptr);
+ }
+ catch (...)
+ {
+ poco_unexpected();
+ }
+}
+
+
+//
+// HTTPHeaderOutputStream
+//
+
+
+Poco::MemoryPool HTTPHeaderOutputStream::_pool(sizeof(HTTPHeaderOutputStream));
+
+
+HTTPHeaderOutputStream::HTTPHeaderOutputStream(HTTPSession& session):
+ HTTPHeaderIOS(session, std::ios::out),
+ std::ostream(&_buf)
+{
+}
+
+
+HTTPHeaderOutputStream::~HTTPHeaderOutputStream()
+{
+}
+
+
+void* HTTPHeaderOutputStream::operator new(std::size_t /*size*/)
+{
+ return _pool.get();
+}
+
+
+void HTTPHeaderOutputStream::operator delete(void* ptr)
+{
+ try
+ {
+ _pool.release(ptr);
+ }
+ catch (...)
+ {
+ poco_unexpected();
+ }
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/HTTPIOStream.cpp b/contrib/libs/poco/Net/src/HTTPIOStream.cpp
index 1342109741..c6492aed8f 100644
--- a/contrib/libs/poco/Net/src/HTTPIOStream.cpp
+++ b/contrib/libs/poco/Net/src/HTTPIOStream.cpp
@@ -1,65 +1,65 @@
-//
-// HTTPIOStream.cpp
-//
-// Library: Net
-// Package: HTTP
-// Module: HTTPIOStream
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/HTTPIOStream.h"
-#include "Poco/Net/HTTPClientSession.h"
-
-
-using Poco::UnbufferedStreamBuf;
-
-
-namespace Poco {
-namespace Net {
-
-
-HTTPResponseStreamBuf::HTTPResponseStreamBuf(std::istream& istr):
- _istr(istr)
-{
- // make sure exceptions from underlying string propagate
- _istr.exceptions(std::ios::badbit);
-}
-
-
-HTTPResponseStreamBuf::~HTTPResponseStreamBuf()
-{
-}
-
-
-HTTPResponseIOS::HTTPResponseIOS(std::istream& istr):
- _buf(istr)
-{
- poco_ios_init(&_buf);
-}
-
-
-HTTPResponseIOS::~HTTPResponseIOS()
-{
-}
-
-
-HTTPResponseStream::HTTPResponseStream(std::istream& istr, HTTPClientSession* pSession):
- HTTPResponseIOS(istr),
- std::istream(&_buf),
- _pSession(pSession)
-{
-}
-
-
-HTTPResponseStream::~HTTPResponseStream()
-{
- delete _pSession;
-}
-
-
-} } // namespace Poco::Net
+//
+// HTTPIOStream.cpp
+//
+// Library: Net
+// Package: HTTP
+// Module: HTTPIOStream
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/HTTPIOStream.h"
+#include "Poco/Net/HTTPClientSession.h"
+
+
+using Poco::UnbufferedStreamBuf;
+
+
+namespace Poco {
+namespace Net {
+
+
+HTTPResponseStreamBuf::HTTPResponseStreamBuf(std::istream& istr):
+ _istr(istr)
+{
+ // make sure exceptions from underlying string propagate
+ _istr.exceptions(std::ios::badbit);
+}
+
+
+HTTPResponseStreamBuf::~HTTPResponseStreamBuf()
+{
+}
+
+
+HTTPResponseIOS::HTTPResponseIOS(std::istream& istr):
+ _buf(istr)
+{
+ poco_ios_init(&_buf);
+}
+
+
+HTTPResponseIOS::~HTTPResponseIOS()
+{
+}
+
+
+HTTPResponseStream::HTTPResponseStream(std::istream& istr, HTTPClientSession* pSession):
+ HTTPResponseIOS(istr),
+ std::istream(&_buf),
+ _pSession(pSession)
+{
+}
+
+
+HTTPResponseStream::~HTTPResponseStream()
+{
+ delete _pSession;
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/HTTPMessage.cpp b/contrib/libs/poco/Net/src/HTTPMessage.cpp
index 6bddcc94f3..debda04c3b 100644
--- a/contrib/libs/poco/Net/src/HTTPMessage.cpp
+++ b/contrib/libs/poco/Net/src/HTTPMessage.cpp
@@ -1,184 +1,184 @@
-//
-// HTTPMessage.cpp
-//
-// Library: Net
-// Package: HTTP
-// Module: HTTPMessage
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/HTTPMessage.h"
-#include "Poco/Net/MediaType.h"
-#include "Poco/NumberFormatter.h"
-#include "Poco/NumberParser.h"
-#include "Poco/String.h"
-
-
-using Poco::NumberFormatter;
-using Poco::NumberParser;
-using Poco::icompare;
-
-
-namespace Poco {
-namespace Net {
-
-
-const std::string HTTPMessage::HTTP_1_0 = "HTTP/1.0";
-const std::string HTTPMessage::HTTP_1_1 = "HTTP/1.1";
-const std::string HTTPMessage::IDENTITY_TRANSFER_ENCODING = "identity";
-const std::string HTTPMessage::CHUNKED_TRANSFER_ENCODING = "chunked";
-const int HTTPMessage::UNKNOWN_CONTENT_LENGTH = -1;
-const std::string HTTPMessage::UNKNOWN_CONTENT_TYPE;
-const std::string HTTPMessage::CONTENT_LENGTH = "Content-Length";
-const std::string HTTPMessage::CONTENT_TYPE = "Content-Type";
-const std::string HTTPMessage::TRANSFER_ENCODING = "Transfer-Encoding";
-const std::string HTTPMessage::CONNECTION = "Connection";
-const std::string HTTPMessage::CONNECTION_KEEP_ALIVE = "Keep-Alive";
-const std::string HTTPMessage::CONNECTION_CLOSE = "Close";
-const std::string HTTPMessage::EMPTY;
-
-
-HTTPMessage::HTTPMessage():
- _version(HTTP_1_0)
-{
-}
-
-
-HTTPMessage::HTTPMessage(const std::string& version):
- _version(version)
-{
-}
-
-
-HTTPMessage::~HTTPMessage()
-{
-}
-
-
-void HTTPMessage::setVersion(const std::string& version)
-{
- _version = version;
-}
-
-
-void HTTPMessage::setContentLength(std::streamsize length)
-{
- if (length != UNKNOWN_CONTENT_LENGTH)
- set(CONTENT_LENGTH, NumberFormatter::format(length));
- else
- erase(CONTENT_LENGTH);
-}
-
-
-std::streamsize HTTPMessage::getContentLength() const
-{
- const std::string& contentLength = get(CONTENT_LENGTH, EMPTY);
- if (!contentLength.empty())
- {
- if (sizeof(std::streamsize) == sizeof(Poco::Int64))
- return static_cast<std::streamsize>(NumberParser::parse64(contentLength));
- else
- return static_cast<std::streamsize>(NumberParser::parse(contentLength));
- }
- else return UNKNOWN_CONTENT_LENGTH;
-}
-
-
-#if defined(POCO_HAVE_INT64)
-void HTTPMessage::setContentLength64(Poco::Int64 length)
-{
- if (length != UNKNOWN_CONTENT_LENGTH)
- set(CONTENT_LENGTH, NumberFormatter::format(length));
- else
- erase(CONTENT_LENGTH);
-}
-
-
-Poco::Int64 HTTPMessage::getContentLength64() const
-{
- const std::string& contentLength = get(CONTENT_LENGTH, EMPTY);
- if (!contentLength.empty())
- {
- return NumberParser::parse64(contentLength);
- }
- else return UNKNOWN_CONTENT_LENGTH;
-}
-#endif // defined(POCO_HAVE_INT64)
-
-
-void HTTPMessage::setTransferEncoding(const std::string& transferEncoding)
-{
- if (icompare(transferEncoding, IDENTITY_TRANSFER_ENCODING) == 0)
- erase(TRANSFER_ENCODING);
- else
- set(TRANSFER_ENCODING, transferEncoding);
-}
-
-
-const std::string& HTTPMessage::getTransferEncoding() const
-{
- return get(TRANSFER_ENCODING, IDENTITY_TRANSFER_ENCODING);
-}
-
-
-void HTTPMessage::setChunkedTransferEncoding(bool flag)
-{
- if (flag)
- setTransferEncoding(CHUNKED_TRANSFER_ENCODING);
- else
- setTransferEncoding(IDENTITY_TRANSFER_ENCODING);
-}
-
-
-bool HTTPMessage::getChunkedTransferEncoding() const
-{
- return icompare(getTransferEncoding(), CHUNKED_TRANSFER_ENCODING) == 0;
-}
-
-
-void HTTPMessage::setContentType(const std::string& mediaType)
-{
- if (mediaType.empty())
- erase(CONTENT_TYPE);
- else
- set(CONTENT_TYPE, mediaType);
-}
-
-
-void HTTPMessage::setContentType(const MediaType& mediaType)
-{
- setContentType(mediaType.toString());
-}
-
-
-const std::string& HTTPMessage::getContentType() const
-{
- return get(CONTENT_TYPE, UNKNOWN_CONTENT_TYPE);
-}
-
-
-void HTTPMessage::setKeepAlive(bool keepAlive)
-{
- if (keepAlive)
- set(CONNECTION, CONNECTION_KEEP_ALIVE);
- else
- set(CONNECTION, CONNECTION_CLOSE);
-}
-
-
-bool HTTPMessage::getKeepAlive() const
-{
- const std::string& connection = get(CONNECTION, EMPTY);
- if (!connection.empty())
- return icompare(connection, CONNECTION_CLOSE) != 0;
- else
- return getVersion() == HTTP_1_1;
-}
-
-
-} } // namespace Poco::Net
+//
+// HTTPMessage.cpp
+//
+// Library: Net
+// Package: HTTP
+// Module: HTTPMessage
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/HTTPMessage.h"
+#include "Poco/Net/MediaType.h"
+#include "Poco/NumberFormatter.h"
+#include "Poco/NumberParser.h"
+#include "Poco/String.h"
+
+
+using Poco::NumberFormatter;
+using Poco::NumberParser;
+using Poco::icompare;
+
+
+namespace Poco {
+namespace Net {
+
+
+const std::string HTTPMessage::HTTP_1_0 = "HTTP/1.0";
+const std::string HTTPMessage::HTTP_1_1 = "HTTP/1.1";
+const std::string HTTPMessage::IDENTITY_TRANSFER_ENCODING = "identity";
+const std::string HTTPMessage::CHUNKED_TRANSFER_ENCODING = "chunked";
+const int HTTPMessage::UNKNOWN_CONTENT_LENGTH = -1;
+const std::string HTTPMessage::UNKNOWN_CONTENT_TYPE;
+const std::string HTTPMessage::CONTENT_LENGTH = "Content-Length";
+const std::string HTTPMessage::CONTENT_TYPE = "Content-Type";
+const std::string HTTPMessage::TRANSFER_ENCODING = "Transfer-Encoding";
+const std::string HTTPMessage::CONNECTION = "Connection";
+const std::string HTTPMessage::CONNECTION_KEEP_ALIVE = "Keep-Alive";
+const std::string HTTPMessage::CONNECTION_CLOSE = "Close";
+const std::string HTTPMessage::EMPTY;
+
+
+HTTPMessage::HTTPMessage():
+ _version(HTTP_1_0)
+{
+}
+
+
+HTTPMessage::HTTPMessage(const std::string& version):
+ _version(version)
+{
+}
+
+
+HTTPMessage::~HTTPMessage()
+{
+}
+
+
+void HTTPMessage::setVersion(const std::string& version)
+{
+ _version = version;
+}
+
+
+void HTTPMessage::setContentLength(std::streamsize length)
+{
+ if (length != UNKNOWN_CONTENT_LENGTH)
+ set(CONTENT_LENGTH, NumberFormatter::format(length));
+ else
+ erase(CONTENT_LENGTH);
+}
+
+
+std::streamsize HTTPMessage::getContentLength() const
+{
+ const std::string& contentLength = get(CONTENT_LENGTH, EMPTY);
+ if (!contentLength.empty())
+ {
+ if (sizeof(std::streamsize) == sizeof(Poco::Int64))
+ return static_cast<std::streamsize>(NumberParser::parse64(contentLength));
+ else
+ return static_cast<std::streamsize>(NumberParser::parse(contentLength));
+ }
+ else return UNKNOWN_CONTENT_LENGTH;
+}
+
+
+#if defined(POCO_HAVE_INT64)
+void HTTPMessage::setContentLength64(Poco::Int64 length)
+{
+ if (length != UNKNOWN_CONTENT_LENGTH)
+ set(CONTENT_LENGTH, NumberFormatter::format(length));
+ else
+ erase(CONTENT_LENGTH);
+}
+
+
+Poco::Int64 HTTPMessage::getContentLength64() const
+{
+ const std::string& contentLength = get(CONTENT_LENGTH, EMPTY);
+ if (!contentLength.empty())
+ {
+ return NumberParser::parse64(contentLength);
+ }
+ else return UNKNOWN_CONTENT_LENGTH;
+}
+#endif // defined(POCO_HAVE_INT64)
+
+
+void HTTPMessage::setTransferEncoding(const std::string& transferEncoding)
+{
+ if (icompare(transferEncoding, IDENTITY_TRANSFER_ENCODING) == 0)
+ erase(TRANSFER_ENCODING);
+ else
+ set(TRANSFER_ENCODING, transferEncoding);
+}
+
+
+const std::string& HTTPMessage::getTransferEncoding() const
+{
+ return get(TRANSFER_ENCODING, IDENTITY_TRANSFER_ENCODING);
+}
+
+
+void HTTPMessage::setChunkedTransferEncoding(bool flag)
+{
+ if (flag)
+ setTransferEncoding(CHUNKED_TRANSFER_ENCODING);
+ else
+ setTransferEncoding(IDENTITY_TRANSFER_ENCODING);
+}
+
+
+bool HTTPMessage::getChunkedTransferEncoding() const
+{
+ return icompare(getTransferEncoding(), CHUNKED_TRANSFER_ENCODING) == 0;
+}
+
+
+void HTTPMessage::setContentType(const std::string& mediaType)
+{
+ if (mediaType.empty())
+ erase(CONTENT_TYPE);
+ else
+ set(CONTENT_TYPE, mediaType);
+}
+
+
+void HTTPMessage::setContentType(const MediaType& mediaType)
+{
+ setContentType(mediaType.toString());
+}
+
+
+const std::string& HTTPMessage::getContentType() const
+{
+ return get(CONTENT_TYPE, UNKNOWN_CONTENT_TYPE);
+}
+
+
+void HTTPMessage::setKeepAlive(bool keepAlive)
+{
+ if (keepAlive)
+ set(CONNECTION, CONNECTION_KEEP_ALIVE);
+ else
+ set(CONNECTION, CONNECTION_CLOSE);
+}
+
+
+bool HTTPMessage::getKeepAlive() const
+{
+ const std::string& connection = get(CONNECTION, EMPTY);
+ if (!connection.empty())
+ return icompare(connection, CONNECTION_CLOSE) != 0;
+ else
+ return getVersion() == HTTP_1_1;
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/HTTPRequest.cpp b/contrib/libs/poco/Net/src/HTTPRequest.cpp
index d9b161e828..52b3cf2f71 100644
--- a/contrib/libs/poco/Net/src/HTTPRequest.cpp
+++ b/contrib/libs/poco/Net/src/HTTPRequest.cpp
@@ -1,277 +1,277 @@
-//
-// HTTPRequest.cpp
-//
-// Library: Net
-// Package: HTTP
-// Module: HTTPRequest
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/HTTPRequest.h"
-#include "Poco/Net/NetException.h"
-#include "Poco/Net/NameValueCollection.h"
-#include "Poco/NumberFormatter.h"
-#include "Poco/Ascii.h"
-#include "Poco/String.h"
-
-
-using Poco::NumberFormatter;
-
-
-namespace Poco {
-namespace Net {
-
-
-const std::string HTTPRequest::HTTP_GET = "GET";
-const std::string HTTPRequest::HTTP_HEAD = "HEAD";
-const std::string HTTPRequest::HTTP_PUT = "PUT";
-const std::string HTTPRequest::HTTP_POST = "POST";
-const std::string HTTPRequest::HTTP_OPTIONS = "OPTIONS";
-const std::string HTTPRequest::HTTP_DELETE = "DELETE";
-const std::string HTTPRequest::HTTP_TRACE = "TRACE";
-const std::string HTTPRequest::HTTP_CONNECT = "CONNECT";
-const std::string HTTPRequest::HTTP_PATCH = "PATCH";
-const std::string HTTPRequest::HOST = "Host";
-const std::string HTTPRequest::COOKIE = "Cookie";
-const std::string HTTPRequest::AUTHORIZATION = "Authorization";
-const std::string HTTPRequest::PROXY_AUTHORIZATION = "Proxy-Authorization";
-const std::string HTTPRequest::UPGRADE = "Upgrade";
-const std::string HTTPRequest::EXPECT = "Expect";
-
-
-HTTPRequest::HTTPRequest():
- _method(HTTP_GET),
- _uri("/")
-{
-}
-
-
-HTTPRequest::HTTPRequest(const std::string& version):
- HTTPMessage(version),
- _method(HTTP_GET),
- _uri("/")
-{
-}
-
-
-HTTPRequest::HTTPRequest(const std::string& method, const std::string& uri):
- _method(method),
- _uri(uri)
-{
-}
-
-
-HTTPRequest::HTTPRequest(const std::string& method, const std::string& uri, const std::string& version):
- HTTPMessage(version),
- _method(method),
- _uri(uri)
-{
-}
-
-
-HTTPRequest::~HTTPRequest()
-{
-}
-
-
-void HTTPRequest::setMethod(const std::string& method)
-{
- _method = method;
-}
-
-
-void HTTPRequest::setURI(const std::string& uri)
-{
- _uri = uri;
-}
-
-
-void HTTPRequest::setHost(const std::string& host)
-{
- set(HOST, host);
-}
-
-
-void HTTPRequest::setHost(const std::string& host, Poco::UInt16 port)
-{
- std::string value;
- if (host.find(':') != std::string::npos)
- {
- // IPv6 address
- value.append("[");
- value.append(host);
- value.append("]");
- }
- else
- {
- value.append(host);
- }
-
- if (port != 80 && port != 443)
- {
- value.append(":");
- NumberFormatter::append(value, port);
- }
- setHost(value);
-}
-
-
-const std::string& HTTPRequest::getHost() const
-{
- return get(HOST);
-}
-
-
-void HTTPRequest::setCookies(const NameValueCollection& cookies)
-{
- std::string cookie;
- cookie.reserve(64);
- for (NameValueCollection::ConstIterator it = cookies.begin(); it != cookies.end(); ++it)
- {
- if (it != cookies.begin())
- cookie.append("; ");
- cookie.append(it->first);
- cookie.append("=");
- cookie.append(it->second);
- }
- add(COOKIE, cookie);
-}
-
-
-void HTTPRequest::getCookies(NameValueCollection& cookies) const
-{
- NameValueCollection::ConstIterator it = find(COOKIE);
- while (it != end() && Poco::icompare(it->first, COOKIE) == 0)
- {
- splitParameters(it->second.begin(), it->second.end(), cookies);
- ++it;
- }
-}
-
-
-bool HTTPRequest::hasCredentials() const
-{
- return has(AUTHORIZATION);
-}
-
-
-void HTTPRequest::getCredentials(std::string& scheme, std::string& authInfo) const
-{
- getCredentials(AUTHORIZATION, scheme, authInfo);
-}
-
-
-void HTTPRequest::setCredentials(const std::string& scheme, const std::string& authInfo)
-{
- setCredentials(AUTHORIZATION, scheme, authInfo);
-}
-
-
-bool HTTPRequest::hasProxyCredentials() const
-{
- return has(PROXY_AUTHORIZATION);
-}
-
-
-void HTTPRequest::getProxyCredentials(std::string& scheme, std::string& authInfo) const
-{
- getCredentials(PROXY_AUTHORIZATION, scheme, authInfo);
-}
-
-
-void HTTPRequest::setProxyCredentials(const std::string& scheme, const std::string& authInfo)
-{
- setCredentials(PROXY_AUTHORIZATION, scheme, authInfo);
-}
-
-
-void HTTPRequest::write(std::ostream& ostr) const
-{
- ostr << _method << " " << _uri << " " << getVersion() << "\r\n";
- HTTPMessage::write(ostr);
- ostr << "\r\n";
-}
-
-
-void HTTPRequest::read(std::istream& istr)
-{
- static const int eof = std::char_traits<char>::eof();
-
- std::string method;
- std::string uri;
- std::string version;
- method.reserve(16);
- uri.reserve(64);
- version.reserve(16);
- int ch = istr.get();
- if (istr.bad()) throw NetException("Error reading HTTP request header");
- if (ch == eof) throw NoMessageException();
- while (Poco::Ascii::isSpace(ch)) ch = istr.get();
- if (ch == eof) throw MessageException("No HTTP request header");
- while (!Poco::Ascii::isSpace(ch) && ch != eof && method.length() < MAX_METHOD_LENGTH) { method += (char) ch; ch = istr.get(); }
- if (!Poco::Ascii::isSpace(ch)) throw MessageException("HTTP request method invalid or too long");
- while (Poco::Ascii::isSpace(ch)) ch = istr.get();
- while (!Poco::Ascii::isSpace(ch) && ch != eof && uri.length() < MAX_URI_LENGTH) { uri += (char) ch; ch = istr.get(); }
- if (!Poco::Ascii::isSpace(ch)) throw MessageException("HTTP request URI invalid or too long");
- while (Poco::Ascii::isSpace(ch)) ch = istr.get();
- while (!Poco::Ascii::isSpace(ch) && ch != eof && version.length() < MAX_VERSION_LENGTH) { version += (char) ch; ch = istr.get(); }
- if (!Poco::Ascii::isSpace(ch)) throw MessageException("Invalid HTTP version string");
- while (ch != '\n' && ch != eof) { ch = istr.get(); }
- HTTPMessage::read(istr);
- ch = istr.get();
- while (ch != '\n' && ch != eof) { ch = istr.get(); }
- setMethod(method);
- setURI(uri);
- setVersion(version);
-}
-
-
-void HTTPRequest::getCredentials(const std::string& header, std::string& scheme, std::string& authInfo) const
-{
- scheme.clear();
- authInfo.clear();
- if (has(header))
- {
- const std::string& auth = get(header);
- std::string::const_iterator it = auth.begin();
- std::string::const_iterator end = auth.end();
- while (it != end && Poco::Ascii::isSpace(*it)) ++it;
- while (it != end && !Poco::Ascii::isSpace(*it)) scheme += *it++;
- while (it != end && Poco::Ascii::isSpace(*it)) ++it;
- while (it != end) authInfo += *it++;
- }
- else throw NotAuthenticatedException();
-}
-
-
-void HTTPRequest::setCredentials(const std::string& header, const std::string& scheme, const std::string& authInfo)
-{
- std::string auth(scheme);
- auth.append(" ");
- auth.append(authInfo);
- set(header, auth);
-}
-
-
-bool HTTPRequest::getExpectContinue() const
-{
- const std::string& expect = get(EXPECT, EMPTY);
- return !expect.empty() && icompare(expect, "100-continue") == 0;
-}
-
-
-void HTTPRequest::setExpectContinue(bool expectContinue)
-{
- if (expectContinue)
- set(EXPECT, "100-continue");
- else
- erase(EXPECT);
-}
-
-
-} } // namespace Poco::Net
+//
+// HTTPRequest.cpp
+//
+// Library: Net
+// Package: HTTP
+// Module: HTTPRequest
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/HTTPRequest.h"
+#include "Poco/Net/NetException.h"
+#include "Poco/Net/NameValueCollection.h"
+#include "Poco/NumberFormatter.h"
+#include "Poco/Ascii.h"
+#include "Poco/String.h"
+
+
+using Poco::NumberFormatter;
+
+
+namespace Poco {
+namespace Net {
+
+
+const std::string HTTPRequest::HTTP_GET = "GET";
+const std::string HTTPRequest::HTTP_HEAD = "HEAD";
+const std::string HTTPRequest::HTTP_PUT = "PUT";
+const std::string HTTPRequest::HTTP_POST = "POST";
+const std::string HTTPRequest::HTTP_OPTIONS = "OPTIONS";
+const std::string HTTPRequest::HTTP_DELETE = "DELETE";
+const std::string HTTPRequest::HTTP_TRACE = "TRACE";
+const std::string HTTPRequest::HTTP_CONNECT = "CONNECT";
+const std::string HTTPRequest::HTTP_PATCH = "PATCH";
+const std::string HTTPRequest::HOST = "Host";
+const std::string HTTPRequest::COOKIE = "Cookie";
+const std::string HTTPRequest::AUTHORIZATION = "Authorization";
+const std::string HTTPRequest::PROXY_AUTHORIZATION = "Proxy-Authorization";
+const std::string HTTPRequest::UPGRADE = "Upgrade";
+const std::string HTTPRequest::EXPECT = "Expect";
+
+
+HTTPRequest::HTTPRequest():
+ _method(HTTP_GET),
+ _uri("/")
+{
+}
+
+
+HTTPRequest::HTTPRequest(const std::string& version):
+ HTTPMessage(version),
+ _method(HTTP_GET),
+ _uri("/")
+{
+}
+
+
+HTTPRequest::HTTPRequest(const std::string& method, const std::string& uri):
+ _method(method),
+ _uri(uri)
+{
+}
+
+
+HTTPRequest::HTTPRequest(const std::string& method, const std::string& uri, const std::string& version):
+ HTTPMessage(version),
+ _method(method),
+ _uri(uri)
+{
+}
+
+
+HTTPRequest::~HTTPRequest()
+{
+}
+
+
+void HTTPRequest::setMethod(const std::string& method)
+{
+ _method = method;
+}
+
+
+void HTTPRequest::setURI(const std::string& uri)
+{
+ _uri = uri;
+}
+
+
+void HTTPRequest::setHost(const std::string& host)
+{
+ set(HOST, host);
+}
+
+
+void HTTPRequest::setHost(const std::string& host, Poco::UInt16 port)
+{
+ std::string value;
+ if (host.find(':') != std::string::npos)
+ {
+ // IPv6 address
+ value.append("[");
+ value.append(host);
+ value.append("]");
+ }
+ else
+ {
+ value.append(host);
+ }
+
+ if (port != 80 && port != 443)
+ {
+ value.append(":");
+ NumberFormatter::append(value, port);
+ }
+ setHost(value);
+}
+
+
+const std::string& HTTPRequest::getHost() const
+{
+ return get(HOST);
+}
+
+
+void HTTPRequest::setCookies(const NameValueCollection& cookies)
+{
+ std::string cookie;
+ cookie.reserve(64);
+ for (NameValueCollection::ConstIterator it = cookies.begin(); it != cookies.end(); ++it)
+ {
+ if (it != cookies.begin())
+ cookie.append("; ");
+ cookie.append(it->first);
+ cookie.append("=");
+ cookie.append(it->second);
+ }
+ add(COOKIE, cookie);
+}
+
+
+void HTTPRequest::getCookies(NameValueCollection& cookies) const
+{
+ NameValueCollection::ConstIterator it = find(COOKIE);
+ while (it != end() && Poco::icompare(it->first, COOKIE) == 0)
+ {
+ splitParameters(it->second.begin(), it->second.end(), cookies);
+ ++it;
+ }
+}
+
+
+bool HTTPRequest::hasCredentials() const
+{
+ return has(AUTHORIZATION);
+}
+
+
+void HTTPRequest::getCredentials(std::string& scheme, std::string& authInfo) const
+{
+ getCredentials(AUTHORIZATION, scheme, authInfo);
+}
+
+
+void HTTPRequest::setCredentials(const std::string& scheme, const std::string& authInfo)
+{
+ setCredentials(AUTHORIZATION, scheme, authInfo);
+}
+
+
+bool HTTPRequest::hasProxyCredentials() const
+{
+ return has(PROXY_AUTHORIZATION);
+}
+
+
+void HTTPRequest::getProxyCredentials(std::string& scheme, std::string& authInfo) const
+{
+ getCredentials(PROXY_AUTHORIZATION, scheme, authInfo);
+}
+
+
+void HTTPRequest::setProxyCredentials(const std::string& scheme, const std::string& authInfo)
+{
+ setCredentials(PROXY_AUTHORIZATION, scheme, authInfo);
+}
+
+
+void HTTPRequest::write(std::ostream& ostr) const
+{
+ ostr << _method << " " << _uri << " " << getVersion() << "\r\n";
+ HTTPMessage::write(ostr);
+ ostr << "\r\n";
+}
+
+
+void HTTPRequest::read(std::istream& istr)
+{
+ static const int eof = std::char_traits<char>::eof();
+
+ std::string method;
+ std::string uri;
+ std::string version;
+ method.reserve(16);
+ uri.reserve(64);
+ version.reserve(16);
+ int ch = istr.get();
+ if (istr.bad()) throw NetException("Error reading HTTP request header");
+ if (ch == eof) throw NoMessageException();
+ while (Poco::Ascii::isSpace(ch)) ch = istr.get();
+ if (ch == eof) throw MessageException("No HTTP request header");
+ while (!Poco::Ascii::isSpace(ch) && ch != eof && method.length() < MAX_METHOD_LENGTH) { method += (char) ch; ch = istr.get(); }
+ if (!Poco::Ascii::isSpace(ch)) throw MessageException("HTTP request method invalid or too long");
+ while (Poco::Ascii::isSpace(ch)) ch = istr.get();
+ while (!Poco::Ascii::isSpace(ch) && ch != eof && uri.length() < MAX_URI_LENGTH) { uri += (char) ch; ch = istr.get(); }
+ if (!Poco::Ascii::isSpace(ch)) throw MessageException("HTTP request URI invalid or too long");
+ while (Poco::Ascii::isSpace(ch)) ch = istr.get();
+ while (!Poco::Ascii::isSpace(ch) && ch != eof && version.length() < MAX_VERSION_LENGTH) { version += (char) ch; ch = istr.get(); }
+ if (!Poco::Ascii::isSpace(ch)) throw MessageException("Invalid HTTP version string");
+ while (ch != '\n' && ch != eof) { ch = istr.get(); }
+ HTTPMessage::read(istr);
+ ch = istr.get();
+ while (ch != '\n' && ch != eof) { ch = istr.get(); }
+ setMethod(method);
+ setURI(uri);
+ setVersion(version);
+}
+
+
+void HTTPRequest::getCredentials(const std::string& header, std::string& scheme, std::string& authInfo) const
+{
+ scheme.clear();
+ authInfo.clear();
+ if (has(header))
+ {
+ const std::string& auth = get(header);
+ std::string::const_iterator it = auth.begin();
+ std::string::const_iterator end = auth.end();
+ while (it != end && Poco::Ascii::isSpace(*it)) ++it;
+ while (it != end && !Poco::Ascii::isSpace(*it)) scheme += *it++;
+ while (it != end && Poco::Ascii::isSpace(*it)) ++it;
+ while (it != end) authInfo += *it++;
+ }
+ else throw NotAuthenticatedException();
+}
+
+
+void HTTPRequest::setCredentials(const std::string& header, const std::string& scheme, const std::string& authInfo)
+{
+ std::string auth(scheme);
+ auth.append(" ");
+ auth.append(authInfo);
+ set(header, auth);
+}
+
+
+bool HTTPRequest::getExpectContinue() const
+{
+ const std::string& expect = get(EXPECT, EMPTY);
+ return !expect.empty() && icompare(expect, "100-continue") == 0;
+}
+
+
+void HTTPRequest::setExpectContinue(bool expectContinue)
+{
+ if (expectContinue)
+ set(EXPECT, "100-continue");
+ else
+ erase(EXPECT);
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/HTTPRequestHandler.cpp b/contrib/libs/poco/Net/src/HTTPRequestHandler.cpp
index 19d6c4a4ac..1d73ff8227 100644
--- a/contrib/libs/poco/Net/src/HTTPRequestHandler.cpp
+++ b/contrib/libs/poco/Net/src/HTTPRequestHandler.cpp
@@ -1,32 +1,32 @@
-//
-// HTTPRequestHandler.cpp
-//
-// Library: Net
-// Package: HTTPServer
-// Module: HTTPRequestHandler
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/HTTPRequestHandler.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-HTTPRequestHandler::HTTPRequestHandler()
-{
-}
-
-
-HTTPRequestHandler::~HTTPRequestHandler()
-{
-}
-
-
-} } // namespace Poco::Net
+//
+// HTTPRequestHandler.cpp
+//
+// Library: Net
+// Package: HTTPServer
+// Module: HTTPRequestHandler
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/HTTPRequestHandler.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+HTTPRequestHandler::HTTPRequestHandler()
+{
+}
+
+
+HTTPRequestHandler::~HTTPRequestHandler()
+{
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/HTTPRequestHandlerFactory.cpp b/contrib/libs/poco/Net/src/HTTPRequestHandlerFactory.cpp
index 7381029ab0..d6f44f070b 100644
--- a/contrib/libs/poco/Net/src/HTTPRequestHandlerFactory.cpp
+++ b/contrib/libs/poco/Net/src/HTTPRequestHandlerFactory.cpp
@@ -1,32 +1,32 @@
-//
-// HTTPRequestHandlerFactory.cpp
-//
-// Library: Net
-// Package: HTTPServer
-// Module: HTTPRequestHandlerFactory
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/HTTPRequestHandlerFactory.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-HTTPRequestHandlerFactory::HTTPRequestHandlerFactory()
-{
-}
-
-
-HTTPRequestHandlerFactory::~HTTPRequestHandlerFactory()
-{
-}
-
-
-} } // namespace Poco::Net
+//
+// HTTPRequestHandlerFactory.cpp
+//
+// Library: Net
+// Package: HTTPServer
+// Module: HTTPRequestHandlerFactory
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/HTTPRequestHandlerFactory.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+HTTPRequestHandlerFactory::HTTPRequestHandlerFactory()
+{
+}
+
+
+HTTPRequestHandlerFactory::~HTTPRequestHandlerFactory()
+{
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/HTTPResponse.cpp b/contrib/libs/poco/Net/src/HTTPResponse.cpp
index 1670b01049..70093ac07e 100644
--- a/contrib/libs/poco/Net/src/HTTPResponse.cpp
+++ b/contrib/libs/poco/Net/src/HTTPResponse.cpp
@@ -1,390 +1,390 @@
-//
-// HTTPResponse.cpp
-//
-// Library: Net
-// Package: HTTP
-// Module: HTTPResponse
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/HTTPResponse.h"
-#include "Poco/Net/NetException.h"
-#include "Poco/NumberFormatter.h"
-#include "Poco/NumberParser.h"
-#include "Poco/DateTime.h"
-#include "Poco/DateTimeFormatter.h"
-#include "Poco/DateTimeFormat.h"
-#include "Poco/DateTimeParser.h"
-#include "Poco/Ascii.h"
-#include "Poco/String.h"
-
-
-using Poco::DateTime;
-using Poco::NumberFormatter;
-using Poco::NumberParser;
-using Poco::DateTimeFormatter;
-using Poco::DateTimeFormat;
-using Poco::DateTimeParser;
-
-
-namespace Poco {
-namespace Net {
-
-
-const std::string HTTPResponse::HTTP_REASON_CONTINUE = "Continue";
-const std::string HTTPResponse::HTTP_REASON_SWITCHING_PROTOCOLS = "Switching Protocols";
-const std::string HTTPResponse::HTTP_REASON_PROCESSING = "Processing";
-const std::string HTTPResponse::HTTP_REASON_OK = "OK";
-const std::string HTTPResponse::HTTP_REASON_CREATED = "Created";
-const std::string HTTPResponse::HTTP_REASON_ACCEPTED = "Accepted";
-const std::string HTTPResponse::HTTP_REASON_NONAUTHORITATIVE = "Non-Authoritative Information";
-const std::string HTTPResponse::HTTP_REASON_NO_CONTENT = "No Content";
-const std::string HTTPResponse::HTTP_REASON_RESET_CONTENT = "Reset Content";
-const std::string HTTPResponse::HTTP_REASON_PARTIAL_CONTENT = "Partial Content";
-const std::string HTTPResponse::HTTP_REASON_MULTI_STATUS = "Multi Status";
-const std::string HTTPResponse::HTTP_REASON_ALREADY_REPORTED = "Already Reported";
-const std::string HTTPResponse::HTTP_REASON_IM_USED = "IM Used";
-const std::string HTTPResponse::HTTP_REASON_MULTIPLE_CHOICES = "Multiple Choices";
-const std::string HTTPResponse::HTTP_REASON_MOVED_PERMANENTLY = "Moved Permanently";
-const std::string HTTPResponse::HTTP_REASON_FOUND = "Found";
-const std::string HTTPResponse::HTTP_REASON_SEE_OTHER = "See Other";
-const std::string HTTPResponse::HTTP_REASON_NOT_MODIFIED = "Not Modified";
-const std::string HTTPResponse::HTTP_REASON_USE_PROXY = "Use Proxy";
-const std::string HTTPResponse::HTTP_REASON_TEMPORARY_REDIRECT = "Temporary Redirect";
-const std::string HTTPResponse::HTTP_REASON_PERMANENT_REDIRECT = "Permanent Redirect";
-const std::string HTTPResponse::HTTP_REASON_BAD_REQUEST = "Bad Request";
-const std::string HTTPResponse::HTTP_REASON_UNAUTHORIZED = "Unauthorized";
-const std::string HTTPResponse::HTTP_REASON_PAYMENT_REQUIRED = "Payment Required";
-const std::string HTTPResponse::HTTP_REASON_FORBIDDEN = "Forbidden";
-const std::string HTTPResponse::HTTP_REASON_NOT_FOUND = "Not Found";
-const std::string HTTPResponse::HTTP_REASON_METHOD_NOT_ALLOWED = "Method Not Allowed";
-const std::string HTTPResponse::HTTP_REASON_NOT_ACCEPTABLE = "Not Acceptable";
-const std::string HTTPResponse::HTTP_REASON_PROXY_AUTHENTICATION_REQUIRED = "Proxy Authentication Required";
-const std::string HTTPResponse::HTTP_REASON_REQUEST_TIMEOUT = "Request Time-out";
-const std::string HTTPResponse::HTTP_REASON_CONFLICT = "Conflict";
-const std::string HTTPResponse::HTTP_REASON_GONE = "Gone";
-const std::string HTTPResponse::HTTP_REASON_LENGTH_REQUIRED = "Length Required";
-const std::string HTTPResponse::HTTP_REASON_PRECONDITION_FAILED = "Precondition Failed";
-const std::string HTTPResponse::HTTP_REASON_REQUEST_ENTITY_TOO_LARGE = "Request Entity Too Large";
-const std::string HTTPResponse::HTTP_REASON_REQUEST_URI_TOO_LONG = "Request-URI Too Large";
-const std::string HTTPResponse::HTTP_REASON_UNSUPPORTED_MEDIA_TYPE = "Unsupported Media Type";
-const std::string HTTPResponse::HTTP_REASON_REQUESTED_RANGE_NOT_SATISFIABLE = "Requested Range Not Satisfiable";
-const std::string HTTPResponse::HTTP_REASON_EXPECTATION_FAILED = "Expectation Failed";
-const std::string HTTPResponse::HTTP_REASON_IM_A_TEAPOT = "I'm a Teapot";
-const std::string HTTPResponse::HTTP_REASON_ENCHANCE_YOUR_CALM = "Enchance Your Calm";
-const std::string HTTPResponse::HTTP_REASON_MISDIRECTED_REQUEST = "Misdirected Request";
-const std::string HTTPResponse::HTTP_REASON_UNPROCESSABLE_ENTITY = "Unprocessable Entity";
-const std::string HTTPResponse::HTTP_REASON_LOCKED = "Locked";
-const std::string HTTPResponse::HTTP_REASON_FAILED_DEPENDENCY = "Failed Dependency";
-const std::string HTTPResponse::HTTP_REASON_UPGRADE_REQUIRED = "Upgrade Required";
-const std::string HTTPResponse::HTTP_REASON_PRECONDITION_REQUIRED = "Precondition Required";
-const std::string HTTPResponse::HTTP_REASON_TOO_MANY_REQUESTS = "Too Many Requests";
-const std::string HTTPResponse::HTTP_REASON_REQUEST_HEADER_FIELDS_TOO_LARGE = "Request Header Fields Too Large";
-const std::string HTTPResponse::HTTP_REASON_UNAVAILABLE_FOR_LEGAL_REASONS = "Unavailable For Legal Reasons";
-const std::string HTTPResponse::HTTP_REASON_INTERNAL_SERVER_ERROR = "Internal Server Error";
-const std::string HTTPResponse::HTTP_REASON_NOT_IMPLEMENTED = "Not Implemented";
-const std::string HTTPResponse::HTTP_REASON_BAD_GATEWAY = "Bad Gateway";
-const std::string HTTPResponse::HTTP_REASON_SERVICE_UNAVAILABLE = "Service Unavailable";
-const std::string HTTPResponse::HTTP_REASON_GATEWAY_TIMEOUT = "Gateway Time-Out";
-const std::string HTTPResponse::HTTP_REASON_VERSION_NOT_SUPPORTED = "HTTP Version Not Supported";
-const std::string HTTPResponse::HTTP_REASON_VARIANT_ALSO_NEGOTIATES = "Variant Also Negotiates";
-const std::string HTTPResponse::HTTP_REASON_INSUFFICIENT_STORAGE = "Insufficient Storage";
-const std::string HTTPResponse::HTTP_REASON_LOOP_DETECTED = "Loop Detected";
-const std::string HTTPResponse::HTTP_REASON_NOT_EXTENDED = "Not Extended";
-const std::string HTTPResponse::HTTP_REASON_NETWORK_AUTHENTICATION_REQUIRED = "Network Authentication Required";
-const std::string HTTPResponse::HTTP_REASON_UNKNOWN = "???";
-const std::string HTTPResponse::DATE = "Date";
-const std::string HTTPResponse::SET_COOKIE = "Set-Cookie";
-
-
-HTTPResponse::HTTPResponse():
- _status(HTTP_OK),
- _reason(getReasonForStatus(HTTP_OK))
-{
-}
-
-
-HTTPResponse::HTTPResponse(HTTPStatus status, const std::string& reason):
- _status(status),
- _reason(reason)
-{
-}
-
-
-
-HTTPResponse::HTTPResponse(const std::string& version, HTTPStatus status, const std::string& reason):
- HTTPMessage(version),
- _status(status),
- _reason(reason)
-{
-}
-
-
-HTTPResponse::HTTPResponse(HTTPStatus status):
- _status(status),
- _reason(getReasonForStatus(status))
-{
-}
-
-
-HTTPResponse::HTTPResponse(const std::string& version, HTTPStatus status):
- HTTPMessage(version),
- _status(status),
- _reason(getReasonForStatus(status))
-{
-}
-
-
-HTTPResponse::~HTTPResponse()
-{
-}
-
-
-void HTTPResponse::setStatus(HTTPStatus status)
-{
- _status = status;
-}
-
-
-void HTTPResponse::setStatus(const std::string& status)
-{
- setStatus((HTTPStatus) NumberParser::parse(status));
-}
-
-
-void HTTPResponse::setReason(const std::string& reason)
-{
- _reason = reason;
-}
-
-
-void HTTPResponse::setStatusAndReason(HTTPStatus status, const std::string& reason)
-{
- _status = status;
- _reason = reason;
-}
-
-
-void HTTPResponse::setStatusAndReason(HTTPStatus status)
-{
- setStatusAndReason(status, getReasonForStatus(status));
-}
-
-
-void HTTPResponse::setDate(const Poco::Timestamp& dateTime)
-{
- set(DATE, DateTimeFormatter::format(dateTime, DateTimeFormat::HTTP_FORMAT));
-}
-
-
-Poco::Timestamp HTTPResponse::getDate() const
-{
- const std::string& dateTime = get(DATE);
- int tzd;
- return DateTimeParser::parse(dateTime, tzd).timestamp();
-}
-
-
-void HTTPResponse::addCookie(const HTTPCookie& cookie)
-{
- add(SET_COOKIE, cookie.toString());
-}
-
-
-void HTTPResponse::getCookies(std::vector<HTTPCookie>& cookies) const
-{
- cookies.clear();
- NameValueCollection::ConstIterator it = find(SET_COOKIE);
- while (it != end() && Poco::icompare(it->first, SET_COOKIE) == 0)
- {
- NameValueCollection nvc;
- splitParameters(it->second.begin(), it->second.end(), nvc);
- cookies.push_back(HTTPCookie(nvc));
- ++it;
- }
-}
-
-
-void HTTPResponse::write(std::ostream& ostr) const
-{
- beginWrite(ostr);
- ostr << "\r\n";
-}
-
-
-void HTTPResponse::beginWrite(std::ostream& ostr) const
-{
- ostr << getVersion() << " " << static_cast<int>(_status) << " " << _reason << "\r\n";
- HTTPMessage::write(ostr);
-}
-
-
-void HTTPResponse::read(std::istream& istr)
-{
- static const int eof = std::char_traits<char>::eof();
-
- std::string version;
- std::string status;
- std::string reason;
-
- int ch = istr.get();
- if (istr.bad()) throw NetException("Error reading HTTP response header");
- if (ch == eof) throw NoMessageException();
- while (Poco::Ascii::isSpace(ch)) ch = istr.get();
- if (ch == eof) throw MessageException("No HTTP response header");
- while (!Poco::Ascii::isSpace(ch) && ch != eof && version.length() < MAX_VERSION_LENGTH) { version += (char) ch; ch = istr.get(); }
- if (!Poco::Ascii::isSpace(ch)) throw MessageException("Invalid HTTP version string");
- while (Poco::Ascii::isSpace(ch)) ch = istr.get();
- while (!Poco::Ascii::isSpace(ch) && ch != eof && status.length() < MAX_STATUS_LENGTH) { status += (char) ch; ch = istr.get(); }
- if (!Poco::Ascii::isSpace(ch)) throw MessageException("Invalid HTTP status code");
- while (Poco::Ascii::isSpace(ch) && ch != '\r' && ch != '\n' && ch != eof) ch = istr.get();
- while (ch != '\r' && ch != '\n' && ch != eof && reason.length() < MAX_REASON_LENGTH) { reason += (char) ch; ch = istr.get(); }
- if (!Poco::Ascii::isSpace(ch)) throw MessageException("HTTP reason string too long");
- if (ch == '\r') ch = istr.get();
- if (ch != '\n') throw MessageException("Unterminated HTTP response line");
-
- HTTPMessage::read(istr);
- ch = istr.get();
- while (ch != '\n' && ch != eof) { ch = istr.get(); }
- setVersion(version);
- setStatus(status);
- setReason(reason);
-}
-
-
-const std::string& HTTPResponse::getReasonForStatus(HTTPStatus status)
-{
- switch (status)
- {
- case HTTP_CONTINUE:
- return HTTP_REASON_CONTINUE;
- case HTTP_SWITCHING_PROTOCOLS:
- return HTTP_REASON_SWITCHING_PROTOCOLS;
- case HTTP_PROCESSING:
- return HTTP_REASON_PROCESSING;
- case HTTP_OK:
- return HTTP_REASON_OK;
- case HTTP_CREATED:
- return HTTP_REASON_CREATED;
- case HTTP_ACCEPTED:
- return HTTP_REASON_ACCEPTED;
- case HTTP_NONAUTHORITATIVE:
- return HTTP_REASON_NONAUTHORITATIVE;
- case HTTP_NO_CONTENT:
- return HTTP_REASON_NO_CONTENT;
- case HTTP_RESET_CONTENT:
- return HTTP_REASON_RESET_CONTENT;
- case HTTP_PARTIAL_CONTENT:
- return HTTP_REASON_PARTIAL_CONTENT;
- case HTTP_MULTI_STATUS:
- return HTTP_REASON_MULTI_STATUS;
- case HTTP_ALREADY_REPORTED:
- return HTTP_REASON_ALREADY_REPORTED;
- case HTTP_IM_USED:
- return HTTP_REASON_IM_USED;
- case HTTP_MULTIPLE_CHOICES:
- return HTTP_REASON_MULTIPLE_CHOICES;
- case HTTP_MOVED_PERMANENTLY:
- return HTTP_REASON_MOVED_PERMANENTLY;
- case HTTP_FOUND:
- return HTTP_REASON_FOUND;
- case HTTP_SEE_OTHER:
- return HTTP_REASON_SEE_OTHER;
- case HTTP_NOT_MODIFIED:
- return HTTP_REASON_NOT_MODIFIED;
- case HTTP_USE_PROXY:
- return HTTP_REASON_USE_PROXY;
- case HTTP_TEMPORARY_REDIRECT:
- return HTTP_REASON_TEMPORARY_REDIRECT;
- case HTTP_BAD_REQUEST:
- return HTTP_REASON_BAD_REQUEST;
- case HTTP_UNAUTHORIZED:
- return HTTP_REASON_UNAUTHORIZED;
- case HTTP_PAYMENT_REQUIRED:
- return HTTP_REASON_PAYMENT_REQUIRED;
- case HTTP_FORBIDDEN:
- return HTTP_REASON_FORBIDDEN;
- case HTTP_NOT_FOUND:
- return HTTP_REASON_NOT_FOUND;
- case HTTP_METHOD_NOT_ALLOWED:
- return HTTP_REASON_METHOD_NOT_ALLOWED;
- case HTTP_NOT_ACCEPTABLE:
- return HTTP_REASON_NOT_ACCEPTABLE;
- case HTTP_PROXY_AUTHENTICATION_REQUIRED:
- return HTTP_REASON_PROXY_AUTHENTICATION_REQUIRED;
- case HTTP_REQUEST_TIMEOUT:
- return HTTP_REASON_REQUEST_TIMEOUT;
- case HTTP_CONFLICT:
- return HTTP_REASON_CONFLICT;
- case HTTP_GONE:
- return HTTP_REASON_GONE;
- case HTTP_LENGTH_REQUIRED:
- return HTTP_REASON_LENGTH_REQUIRED;
- case HTTP_PRECONDITION_FAILED:
- return HTTP_REASON_PRECONDITION_FAILED;
- case HTTP_REQUEST_ENTITY_TOO_LARGE:
- return HTTP_REASON_REQUEST_ENTITY_TOO_LARGE;
- case HTTP_REQUEST_URI_TOO_LONG:
- return HTTP_REASON_REQUEST_URI_TOO_LONG;
- case HTTP_UNSUPPORTED_MEDIA_TYPE:
- return HTTP_REASON_UNSUPPORTED_MEDIA_TYPE;
- case HTTP_REQUESTED_RANGE_NOT_SATISFIABLE:
- return HTTP_REASON_REQUESTED_RANGE_NOT_SATISFIABLE;
- case HTTP_EXPECTATION_FAILED:
- return HTTP_REASON_EXPECTATION_FAILED;
- case HTTP_IM_A_TEAPOT:
- return HTTP_REASON_IM_A_TEAPOT;
- case HTTP_ENCHANCE_YOUR_CALM:
- return HTTP_REASON_ENCHANCE_YOUR_CALM;
- case HTTP_MISDIRECTED_REQUEST:
- return HTTP_REASON_MISDIRECTED_REQUEST;
- case HTTP_UNPROCESSABLE_ENTITY:
- return HTTP_REASON_UNPROCESSABLE_ENTITY;
- case HTTP_LOCKED:
- return HTTP_REASON_LOCKED;
- case HTTP_FAILED_DEPENDENCY:
- return HTTP_REASON_FAILED_DEPENDENCY;
- case HTTP_UPGRADE_REQUIRED:
- return HTTP_REASON_UPGRADE_REQUIRED;
- case HTTP_PRECONDITION_REQUIRED:
- return HTTP_REASON_PRECONDITION_REQUIRED;
- case HTTP_TOO_MANY_REQUESTS:
- return HTTP_REASON_TOO_MANY_REQUESTS;
- case HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE:
- return HTTP_REASON_REQUEST_HEADER_FIELDS_TOO_LARGE;
- case HTTP_UNAVAILABLE_FOR_LEGAL_REASONS:
- return HTTP_REASON_UNAVAILABLE_FOR_LEGAL_REASONS;
- case HTTP_INTERNAL_SERVER_ERROR:
- return HTTP_REASON_INTERNAL_SERVER_ERROR;
- case HTTP_NOT_IMPLEMENTED:
- return HTTP_REASON_NOT_IMPLEMENTED;
- case HTTP_BAD_GATEWAY:
- return HTTP_REASON_BAD_GATEWAY;
- case HTTP_SERVICE_UNAVAILABLE:
- return HTTP_REASON_SERVICE_UNAVAILABLE;
- case HTTP_GATEWAY_TIMEOUT:
- return HTTP_REASON_GATEWAY_TIMEOUT;
- case HTTP_VERSION_NOT_SUPPORTED:
- return HTTP_REASON_VERSION_NOT_SUPPORTED;
- case HTTP_VARIANT_ALSO_NEGOTIATES:
- return HTTP_REASON_VARIANT_ALSO_NEGOTIATES;
- case HTTP_INSUFFICIENT_STORAGE:
- return HTTP_REASON_INSUFFICIENT_STORAGE;
- case HTTP_LOOP_DETECTED:
- return HTTP_REASON_LOOP_DETECTED;
- case HTTP_NOT_EXTENDED:
- return HTTP_REASON_NOT_EXTENDED;
- case HTTP_NETWORK_AUTHENTICATION_REQUIRED:
- return HTTP_REASON_NETWORK_AUTHENTICATION_REQUIRED;
- default:
- return HTTP_REASON_UNKNOWN;
- }
-}
-
-
-} } // namespace Poco::Net
+//
+// HTTPResponse.cpp
+//
+// Library: Net
+// Package: HTTP
+// Module: HTTPResponse
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/HTTPResponse.h"
+#include "Poco/Net/NetException.h"
+#include "Poco/NumberFormatter.h"
+#include "Poco/NumberParser.h"
+#include "Poco/DateTime.h"
+#include "Poco/DateTimeFormatter.h"
+#include "Poco/DateTimeFormat.h"
+#include "Poco/DateTimeParser.h"
+#include "Poco/Ascii.h"
+#include "Poco/String.h"
+
+
+using Poco::DateTime;
+using Poco::NumberFormatter;
+using Poco::NumberParser;
+using Poco::DateTimeFormatter;
+using Poco::DateTimeFormat;
+using Poco::DateTimeParser;
+
+
+namespace Poco {
+namespace Net {
+
+
+const std::string HTTPResponse::HTTP_REASON_CONTINUE = "Continue";
+const std::string HTTPResponse::HTTP_REASON_SWITCHING_PROTOCOLS = "Switching Protocols";
+const std::string HTTPResponse::HTTP_REASON_PROCESSING = "Processing";
+const std::string HTTPResponse::HTTP_REASON_OK = "OK";
+const std::string HTTPResponse::HTTP_REASON_CREATED = "Created";
+const std::string HTTPResponse::HTTP_REASON_ACCEPTED = "Accepted";
+const std::string HTTPResponse::HTTP_REASON_NONAUTHORITATIVE = "Non-Authoritative Information";
+const std::string HTTPResponse::HTTP_REASON_NO_CONTENT = "No Content";
+const std::string HTTPResponse::HTTP_REASON_RESET_CONTENT = "Reset Content";
+const std::string HTTPResponse::HTTP_REASON_PARTIAL_CONTENT = "Partial Content";
+const std::string HTTPResponse::HTTP_REASON_MULTI_STATUS = "Multi Status";
+const std::string HTTPResponse::HTTP_REASON_ALREADY_REPORTED = "Already Reported";
+const std::string HTTPResponse::HTTP_REASON_IM_USED = "IM Used";
+const std::string HTTPResponse::HTTP_REASON_MULTIPLE_CHOICES = "Multiple Choices";
+const std::string HTTPResponse::HTTP_REASON_MOVED_PERMANENTLY = "Moved Permanently";
+const std::string HTTPResponse::HTTP_REASON_FOUND = "Found";
+const std::string HTTPResponse::HTTP_REASON_SEE_OTHER = "See Other";
+const std::string HTTPResponse::HTTP_REASON_NOT_MODIFIED = "Not Modified";
+const std::string HTTPResponse::HTTP_REASON_USE_PROXY = "Use Proxy";
+const std::string HTTPResponse::HTTP_REASON_TEMPORARY_REDIRECT = "Temporary Redirect";
+const std::string HTTPResponse::HTTP_REASON_PERMANENT_REDIRECT = "Permanent Redirect";
+const std::string HTTPResponse::HTTP_REASON_BAD_REQUEST = "Bad Request";
+const std::string HTTPResponse::HTTP_REASON_UNAUTHORIZED = "Unauthorized";
+const std::string HTTPResponse::HTTP_REASON_PAYMENT_REQUIRED = "Payment Required";
+const std::string HTTPResponse::HTTP_REASON_FORBIDDEN = "Forbidden";
+const std::string HTTPResponse::HTTP_REASON_NOT_FOUND = "Not Found";
+const std::string HTTPResponse::HTTP_REASON_METHOD_NOT_ALLOWED = "Method Not Allowed";
+const std::string HTTPResponse::HTTP_REASON_NOT_ACCEPTABLE = "Not Acceptable";
+const std::string HTTPResponse::HTTP_REASON_PROXY_AUTHENTICATION_REQUIRED = "Proxy Authentication Required";
+const std::string HTTPResponse::HTTP_REASON_REQUEST_TIMEOUT = "Request Time-out";
+const std::string HTTPResponse::HTTP_REASON_CONFLICT = "Conflict";
+const std::string HTTPResponse::HTTP_REASON_GONE = "Gone";
+const std::string HTTPResponse::HTTP_REASON_LENGTH_REQUIRED = "Length Required";
+const std::string HTTPResponse::HTTP_REASON_PRECONDITION_FAILED = "Precondition Failed";
+const std::string HTTPResponse::HTTP_REASON_REQUEST_ENTITY_TOO_LARGE = "Request Entity Too Large";
+const std::string HTTPResponse::HTTP_REASON_REQUEST_URI_TOO_LONG = "Request-URI Too Large";
+const std::string HTTPResponse::HTTP_REASON_UNSUPPORTED_MEDIA_TYPE = "Unsupported Media Type";
+const std::string HTTPResponse::HTTP_REASON_REQUESTED_RANGE_NOT_SATISFIABLE = "Requested Range Not Satisfiable";
+const std::string HTTPResponse::HTTP_REASON_EXPECTATION_FAILED = "Expectation Failed";
+const std::string HTTPResponse::HTTP_REASON_IM_A_TEAPOT = "I'm a Teapot";
+const std::string HTTPResponse::HTTP_REASON_ENCHANCE_YOUR_CALM = "Enchance Your Calm";
+const std::string HTTPResponse::HTTP_REASON_MISDIRECTED_REQUEST = "Misdirected Request";
+const std::string HTTPResponse::HTTP_REASON_UNPROCESSABLE_ENTITY = "Unprocessable Entity";
+const std::string HTTPResponse::HTTP_REASON_LOCKED = "Locked";
+const std::string HTTPResponse::HTTP_REASON_FAILED_DEPENDENCY = "Failed Dependency";
+const std::string HTTPResponse::HTTP_REASON_UPGRADE_REQUIRED = "Upgrade Required";
+const std::string HTTPResponse::HTTP_REASON_PRECONDITION_REQUIRED = "Precondition Required";
+const std::string HTTPResponse::HTTP_REASON_TOO_MANY_REQUESTS = "Too Many Requests";
+const std::string HTTPResponse::HTTP_REASON_REQUEST_HEADER_FIELDS_TOO_LARGE = "Request Header Fields Too Large";
+const std::string HTTPResponse::HTTP_REASON_UNAVAILABLE_FOR_LEGAL_REASONS = "Unavailable For Legal Reasons";
+const std::string HTTPResponse::HTTP_REASON_INTERNAL_SERVER_ERROR = "Internal Server Error";
+const std::string HTTPResponse::HTTP_REASON_NOT_IMPLEMENTED = "Not Implemented";
+const std::string HTTPResponse::HTTP_REASON_BAD_GATEWAY = "Bad Gateway";
+const std::string HTTPResponse::HTTP_REASON_SERVICE_UNAVAILABLE = "Service Unavailable";
+const std::string HTTPResponse::HTTP_REASON_GATEWAY_TIMEOUT = "Gateway Time-Out";
+const std::string HTTPResponse::HTTP_REASON_VERSION_NOT_SUPPORTED = "HTTP Version Not Supported";
+const std::string HTTPResponse::HTTP_REASON_VARIANT_ALSO_NEGOTIATES = "Variant Also Negotiates";
+const std::string HTTPResponse::HTTP_REASON_INSUFFICIENT_STORAGE = "Insufficient Storage";
+const std::string HTTPResponse::HTTP_REASON_LOOP_DETECTED = "Loop Detected";
+const std::string HTTPResponse::HTTP_REASON_NOT_EXTENDED = "Not Extended";
+const std::string HTTPResponse::HTTP_REASON_NETWORK_AUTHENTICATION_REQUIRED = "Network Authentication Required";
+const std::string HTTPResponse::HTTP_REASON_UNKNOWN = "???";
+const std::string HTTPResponse::DATE = "Date";
+const std::string HTTPResponse::SET_COOKIE = "Set-Cookie";
+
+
+HTTPResponse::HTTPResponse():
+ _status(HTTP_OK),
+ _reason(getReasonForStatus(HTTP_OK))
+{
+}
+
+
+HTTPResponse::HTTPResponse(HTTPStatus status, const std::string& reason):
+ _status(status),
+ _reason(reason)
+{
+}
+
+
+
+HTTPResponse::HTTPResponse(const std::string& version, HTTPStatus status, const std::string& reason):
+ HTTPMessage(version),
+ _status(status),
+ _reason(reason)
+{
+}
+
+
+HTTPResponse::HTTPResponse(HTTPStatus status):
+ _status(status),
+ _reason(getReasonForStatus(status))
+{
+}
+
+
+HTTPResponse::HTTPResponse(const std::string& version, HTTPStatus status):
+ HTTPMessage(version),
+ _status(status),
+ _reason(getReasonForStatus(status))
+{
+}
+
+
+HTTPResponse::~HTTPResponse()
+{
+}
+
+
+void HTTPResponse::setStatus(HTTPStatus status)
+{
+ _status = status;
+}
+
+
+void HTTPResponse::setStatus(const std::string& status)
+{
+ setStatus((HTTPStatus) NumberParser::parse(status));
+}
+
+
+void HTTPResponse::setReason(const std::string& reason)
+{
+ _reason = reason;
+}
+
+
+void HTTPResponse::setStatusAndReason(HTTPStatus status, const std::string& reason)
+{
+ _status = status;
+ _reason = reason;
+}
+
+
+void HTTPResponse::setStatusAndReason(HTTPStatus status)
+{
+ setStatusAndReason(status, getReasonForStatus(status));
+}
+
+
+void HTTPResponse::setDate(const Poco::Timestamp& dateTime)
+{
+ set(DATE, DateTimeFormatter::format(dateTime, DateTimeFormat::HTTP_FORMAT));
+}
+
+
+Poco::Timestamp HTTPResponse::getDate() const
+{
+ const std::string& dateTime = get(DATE);
+ int tzd;
+ return DateTimeParser::parse(dateTime, tzd).timestamp();
+}
+
+
+void HTTPResponse::addCookie(const HTTPCookie& cookie)
+{
+ add(SET_COOKIE, cookie.toString());
+}
+
+
+void HTTPResponse::getCookies(std::vector<HTTPCookie>& cookies) const
+{
+ cookies.clear();
+ NameValueCollection::ConstIterator it = find(SET_COOKIE);
+ while (it != end() && Poco::icompare(it->first, SET_COOKIE) == 0)
+ {
+ NameValueCollection nvc;
+ splitParameters(it->second.begin(), it->second.end(), nvc);
+ cookies.push_back(HTTPCookie(nvc));
+ ++it;
+ }
+}
+
+
+void HTTPResponse::write(std::ostream& ostr) const
+{
+ beginWrite(ostr);
+ ostr << "\r\n";
+}
+
+
+void HTTPResponse::beginWrite(std::ostream& ostr) const
+{
+ ostr << getVersion() << " " << static_cast<int>(_status) << " " << _reason << "\r\n";
+ HTTPMessage::write(ostr);
+}
+
+
+void HTTPResponse::read(std::istream& istr)
+{
+ static const int eof = std::char_traits<char>::eof();
+
+ std::string version;
+ std::string status;
+ std::string reason;
+
+ int ch = istr.get();
+ if (istr.bad()) throw NetException("Error reading HTTP response header");
+ if (ch == eof) throw NoMessageException();
+ while (Poco::Ascii::isSpace(ch)) ch = istr.get();
+ if (ch == eof) throw MessageException("No HTTP response header");
+ while (!Poco::Ascii::isSpace(ch) && ch != eof && version.length() < MAX_VERSION_LENGTH) { version += (char) ch; ch = istr.get(); }
+ if (!Poco::Ascii::isSpace(ch)) throw MessageException("Invalid HTTP version string");
+ while (Poco::Ascii::isSpace(ch)) ch = istr.get();
+ while (!Poco::Ascii::isSpace(ch) && ch != eof && status.length() < MAX_STATUS_LENGTH) { status += (char) ch; ch = istr.get(); }
+ if (!Poco::Ascii::isSpace(ch)) throw MessageException("Invalid HTTP status code");
+ while (Poco::Ascii::isSpace(ch) && ch != '\r' && ch != '\n' && ch != eof) ch = istr.get();
+ while (ch != '\r' && ch != '\n' && ch != eof && reason.length() < MAX_REASON_LENGTH) { reason += (char) ch; ch = istr.get(); }
+ if (!Poco::Ascii::isSpace(ch)) throw MessageException("HTTP reason string too long");
+ if (ch == '\r') ch = istr.get();
+ if (ch != '\n') throw MessageException("Unterminated HTTP response line");
+
+ HTTPMessage::read(istr);
+ ch = istr.get();
+ while (ch != '\n' && ch != eof) { ch = istr.get(); }
+ setVersion(version);
+ setStatus(status);
+ setReason(reason);
+}
+
+
+const std::string& HTTPResponse::getReasonForStatus(HTTPStatus status)
+{
+ switch (status)
+ {
+ case HTTP_CONTINUE:
+ return HTTP_REASON_CONTINUE;
+ case HTTP_SWITCHING_PROTOCOLS:
+ return HTTP_REASON_SWITCHING_PROTOCOLS;
+ case HTTP_PROCESSING:
+ return HTTP_REASON_PROCESSING;
+ case HTTP_OK:
+ return HTTP_REASON_OK;
+ case HTTP_CREATED:
+ return HTTP_REASON_CREATED;
+ case HTTP_ACCEPTED:
+ return HTTP_REASON_ACCEPTED;
+ case HTTP_NONAUTHORITATIVE:
+ return HTTP_REASON_NONAUTHORITATIVE;
+ case HTTP_NO_CONTENT:
+ return HTTP_REASON_NO_CONTENT;
+ case HTTP_RESET_CONTENT:
+ return HTTP_REASON_RESET_CONTENT;
+ case HTTP_PARTIAL_CONTENT:
+ return HTTP_REASON_PARTIAL_CONTENT;
+ case HTTP_MULTI_STATUS:
+ return HTTP_REASON_MULTI_STATUS;
+ case HTTP_ALREADY_REPORTED:
+ return HTTP_REASON_ALREADY_REPORTED;
+ case HTTP_IM_USED:
+ return HTTP_REASON_IM_USED;
+ case HTTP_MULTIPLE_CHOICES:
+ return HTTP_REASON_MULTIPLE_CHOICES;
+ case HTTP_MOVED_PERMANENTLY:
+ return HTTP_REASON_MOVED_PERMANENTLY;
+ case HTTP_FOUND:
+ return HTTP_REASON_FOUND;
+ case HTTP_SEE_OTHER:
+ return HTTP_REASON_SEE_OTHER;
+ case HTTP_NOT_MODIFIED:
+ return HTTP_REASON_NOT_MODIFIED;
+ case HTTP_USE_PROXY:
+ return HTTP_REASON_USE_PROXY;
+ case HTTP_TEMPORARY_REDIRECT:
+ return HTTP_REASON_TEMPORARY_REDIRECT;
+ case HTTP_BAD_REQUEST:
+ return HTTP_REASON_BAD_REQUEST;
+ case HTTP_UNAUTHORIZED:
+ return HTTP_REASON_UNAUTHORIZED;
+ case HTTP_PAYMENT_REQUIRED:
+ return HTTP_REASON_PAYMENT_REQUIRED;
+ case HTTP_FORBIDDEN:
+ return HTTP_REASON_FORBIDDEN;
+ case HTTP_NOT_FOUND:
+ return HTTP_REASON_NOT_FOUND;
+ case HTTP_METHOD_NOT_ALLOWED:
+ return HTTP_REASON_METHOD_NOT_ALLOWED;
+ case HTTP_NOT_ACCEPTABLE:
+ return HTTP_REASON_NOT_ACCEPTABLE;
+ case HTTP_PROXY_AUTHENTICATION_REQUIRED:
+ return HTTP_REASON_PROXY_AUTHENTICATION_REQUIRED;
+ case HTTP_REQUEST_TIMEOUT:
+ return HTTP_REASON_REQUEST_TIMEOUT;
+ case HTTP_CONFLICT:
+ return HTTP_REASON_CONFLICT;
+ case HTTP_GONE:
+ return HTTP_REASON_GONE;
+ case HTTP_LENGTH_REQUIRED:
+ return HTTP_REASON_LENGTH_REQUIRED;
+ case HTTP_PRECONDITION_FAILED:
+ return HTTP_REASON_PRECONDITION_FAILED;
+ case HTTP_REQUEST_ENTITY_TOO_LARGE:
+ return HTTP_REASON_REQUEST_ENTITY_TOO_LARGE;
+ case HTTP_REQUEST_URI_TOO_LONG:
+ return HTTP_REASON_REQUEST_URI_TOO_LONG;
+ case HTTP_UNSUPPORTED_MEDIA_TYPE:
+ return HTTP_REASON_UNSUPPORTED_MEDIA_TYPE;
+ case HTTP_REQUESTED_RANGE_NOT_SATISFIABLE:
+ return HTTP_REASON_REQUESTED_RANGE_NOT_SATISFIABLE;
+ case HTTP_EXPECTATION_FAILED:
+ return HTTP_REASON_EXPECTATION_FAILED;
+ case HTTP_IM_A_TEAPOT:
+ return HTTP_REASON_IM_A_TEAPOT;
+ case HTTP_ENCHANCE_YOUR_CALM:
+ return HTTP_REASON_ENCHANCE_YOUR_CALM;
+ case HTTP_MISDIRECTED_REQUEST:
+ return HTTP_REASON_MISDIRECTED_REQUEST;
+ case HTTP_UNPROCESSABLE_ENTITY:
+ return HTTP_REASON_UNPROCESSABLE_ENTITY;
+ case HTTP_LOCKED:
+ return HTTP_REASON_LOCKED;
+ case HTTP_FAILED_DEPENDENCY:
+ return HTTP_REASON_FAILED_DEPENDENCY;
+ case HTTP_UPGRADE_REQUIRED:
+ return HTTP_REASON_UPGRADE_REQUIRED;
+ case HTTP_PRECONDITION_REQUIRED:
+ return HTTP_REASON_PRECONDITION_REQUIRED;
+ case HTTP_TOO_MANY_REQUESTS:
+ return HTTP_REASON_TOO_MANY_REQUESTS;
+ case HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE:
+ return HTTP_REASON_REQUEST_HEADER_FIELDS_TOO_LARGE;
+ case HTTP_UNAVAILABLE_FOR_LEGAL_REASONS:
+ return HTTP_REASON_UNAVAILABLE_FOR_LEGAL_REASONS;
+ case HTTP_INTERNAL_SERVER_ERROR:
+ return HTTP_REASON_INTERNAL_SERVER_ERROR;
+ case HTTP_NOT_IMPLEMENTED:
+ return HTTP_REASON_NOT_IMPLEMENTED;
+ case HTTP_BAD_GATEWAY:
+ return HTTP_REASON_BAD_GATEWAY;
+ case HTTP_SERVICE_UNAVAILABLE:
+ return HTTP_REASON_SERVICE_UNAVAILABLE;
+ case HTTP_GATEWAY_TIMEOUT:
+ return HTTP_REASON_GATEWAY_TIMEOUT;
+ case HTTP_VERSION_NOT_SUPPORTED:
+ return HTTP_REASON_VERSION_NOT_SUPPORTED;
+ case HTTP_VARIANT_ALSO_NEGOTIATES:
+ return HTTP_REASON_VARIANT_ALSO_NEGOTIATES;
+ case HTTP_INSUFFICIENT_STORAGE:
+ return HTTP_REASON_INSUFFICIENT_STORAGE;
+ case HTTP_LOOP_DETECTED:
+ return HTTP_REASON_LOOP_DETECTED;
+ case HTTP_NOT_EXTENDED:
+ return HTTP_REASON_NOT_EXTENDED;
+ case HTTP_NETWORK_AUTHENTICATION_REQUIRED:
+ return HTTP_REASON_NETWORK_AUTHENTICATION_REQUIRED;
+ default:
+ return HTTP_REASON_UNKNOWN;
+ }
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/HTTPServer.cpp b/contrib/libs/poco/Net/src/HTTPServer.cpp
index 27c54bbe9f..31aa83d1be 100644
--- a/contrib/libs/poco/Net/src/HTTPServer.cpp
+++ b/contrib/libs/poco/Net/src/HTTPServer.cpp
@@ -1,56 +1,56 @@
-//
-// HTTPServer.cpp
-//
-// Library: Net
-// Package: HTTPServer
-// Module: HTTPServer
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/HTTPServer.h"
-#include "Poco/Net/HTTPServerConnectionFactory.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-HTTPServer::HTTPServer(HTTPRequestHandlerFactory::Ptr pFactory, Poco::UInt16 portNumber, HTTPServerParams::Ptr pParams):
- TCPServer(new HTTPServerConnectionFactory(pParams, pFactory), portNumber, pParams),
- _pFactory(pFactory)
-{
-}
-
-
-HTTPServer::HTTPServer(HTTPRequestHandlerFactory::Ptr pFactory, const ServerSocket& socket, HTTPServerParams::Ptr pParams):
- TCPServer(new HTTPServerConnectionFactory(pParams, pFactory), socket, pParams),
- _pFactory(pFactory)
-{
-}
-
-
-HTTPServer::HTTPServer(HTTPRequestHandlerFactory::Ptr pFactory, Poco::ThreadPool& threadPool, const ServerSocket& socket, HTTPServerParams::Ptr pParams):
- TCPServer(new HTTPServerConnectionFactory(pParams, pFactory), threadPool, socket, pParams),
- _pFactory(pFactory)
-{
-}
-
-
-HTTPServer::~HTTPServer()
-{
-}
-
-
-void HTTPServer::stopAll(bool abortCurrent)
-{
- stop();
- _pFactory->serverStopped(this, abortCurrent);
-}
-
-
-} } // namespace Poco::Net
+//
+// HTTPServer.cpp
+//
+// Library: Net
+// Package: HTTPServer
+// Module: HTTPServer
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/HTTPServer.h"
+#include "Poco/Net/HTTPServerConnectionFactory.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+HTTPServer::HTTPServer(HTTPRequestHandlerFactory::Ptr pFactory, Poco::UInt16 portNumber, HTTPServerParams::Ptr pParams):
+ TCPServer(new HTTPServerConnectionFactory(pParams, pFactory), portNumber, pParams),
+ _pFactory(pFactory)
+{
+}
+
+
+HTTPServer::HTTPServer(HTTPRequestHandlerFactory::Ptr pFactory, const ServerSocket& socket, HTTPServerParams::Ptr pParams):
+ TCPServer(new HTTPServerConnectionFactory(pParams, pFactory), socket, pParams),
+ _pFactory(pFactory)
+{
+}
+
+
+HTTPServer::HTTPServer(HTTPRequestHandlerFactory::Ptr pFactory, Poco::ThreadPool& threadPool, const ServerSocket& socket, HTTPServerParams::Ptr pParams):
+ TCPServer(new HTTPServerConnectionFactory(pParams, pFactory), threadPool, socket, pParams),
+ _pFactory(pFactory)
+{
+}
+
+
+HTTPServer::~HTTPServer()
+{
+}
+
+
+void HTTPServer::stopAll(bool abortCurrent)
+{
+ stop();
+ _pFactory->serverStopped(this, abortCurrent);
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/HTTPServerConnection.cpp b/contrib/libs/poco/Net/src/HTTPServerConnection.cpp
index 6984b2f616..a6c27ce8c9 100644
--- a/contrib/libs/poco/Net/src/HTTPServerConnection.cpp
+++ b/contrib/libs/poco/Net/src/HTTPServerConnection.cpp
@@ -1,180 +1,180 @@
-//
-// HTTPServerConnection.cpp
-//
-// Library: Net
-// Package: HTTPServer
-// Module: HTTPServerConnection
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/HTTPServerConnection.h"
-#include "Poco/Net/HTTPServerSession.h"
-#include "Poco/Net/HTTPServerRequestImpl.h"
-#include "Poco/Net/HTTPServerResponseImpl.h"
-#include "Poco/Net/HTTPRequestHandler.h"
-#include "Poco/Net/HTTPRequestHandlerFactory.h"
-#include "Poco/Net/NetException.h"
-#include "Poco/NumberFormatter.h"
-#include "Poco/Timestamp.h"
-#include "Poco/Delegate.h"
-#include <memory>
-
-
-namespace Poco {
-namespace Net {
-
-
-HTTPServerConnection::HTTPServerConnection(const StreamSocket& socket, HTTPServerParams::Ptr pParams, HTTPRequestHandlerFactory::Ptr pFactory):
- TCPServerConnection(socket),
- _pParams(pParams),
- _pFactory(pFactory),
- _stopped(false)
-{
- poco_check_ptr (pFactory);
-
- _pFactory->serverStopped += Poco::delegate(this, &HTTPServerConnection::onServerStopped);
-}
-
-
-HTTPServerConnection::~HTTPServerConnection()
-{
- try
- {
- _pFactory->serverStopped -= Poco::delegate(this, &HTTPServerConnection::onServerStopped);
- }
- catch (...)
- {
- poco_unexpected();
- }
-}
-
-
-void HTTPServerConnection::run()
-{
- std::string server = _pParams->getSoftwareVersion();
- HTTPServerSession session(socket(), _pParams);
- while (!_stopped && session.hasMoreRequests())
- {
- try
- {
- Poco::FastMutex::ScopedLock lock(_mutex);
- if (!_stopped)
- {
- HTTPServerResponseImpl response(session);
- HTTPServerRequestImpl request(response, session, _pParams);
-
- Poco::Timestamp now;
- response.setDate(now);
- response.setVersion(request.getVersion());
- response.setKeepAlive(_pParams->getKeepAlive() && request.getKeepAlive() && session.canKeepAlive());
- if (!server.empty())
- response.set("Server", server);
- try
- {
-#ifndef POCO_ENABLE_CPP11
- std::auto_ptr<HTTPRequestHandler> pHandler(_pFactory->createRequestHandler(request));
-#else
- std::unique_ptr<HTTPRequestHandler> pHandler(_pFactory->createRequestHandler(request));
-#endif
- if (pHandler.get())
- {
- if (request.getExpectContinue() && response.getStatus() == HTTPResponse::HTTP_OK)
- response.sendContinue();
-
- pHandler->handleRequest(request, response);
- session.setKeepAlive(_pParams->getKeepAlive() && response.getKeepAlive() && session.canKeepAlive());
- }
- else sendErrorResponse(session, HTTPResponse::HTTP_NOT_IMPLEMENTED);
- }
- catch (Poco::Exception&)
- {
- if (!response.sent())
- {
- try
- {
- sendErrorResponse(session, HTTPResponse::HTTP_INTERNAL_SERVER_ERROR);
- }
- catch (...)
- {
- }
- }
- throw;
- }
- }
- }
- catch (NoMessageException&)
- {
- break;
- }
- catch (MessageException&)
- {
- sendErrorResponse(session, HTTPResponse::HTTP_BAD_REQUEST);
- }
- catch (Poco::Exception&)
- {
- if (session.networkException())
- {
- session.networkException()->rethrow();
- }
- else throw;
- }
- }
-}
-
-
-void HTTPServerConnection::sendErrorResponse(HTTPServerSession& session, HTTPResponse::HTTPStatus status)
-{
- HTTPServerResponseImpl response(session);
- response.setVersion(HTTPMessage::HTTP_1_1);
- response.setStatusAndReason(status);
- response.setKeepAlive(false);
- response.send();
- session.setKeepAlive(false);
-}
-
-
-void HTTPServerConnection::onServerStopped(const bool& abortCurrent)
-{
- _stopped = true;
- if (abortCurrent)
- {
- try
- {
- // Note: On Windows, select() will not return if one of its socket is being
- // shut down. Therefore we have to call close(), which works better.
- // On other platforms, we do the more graceful thing.
-#if defined(_WIN32)
- socket().close();
-#else
- socket().shutdown();
-#endif
- }
- catch (...)
- {
- }
- }
- else
- {
- Poco::FastMutex::ScopedLock lock(_mutex);
-
- try
- {
-#if defined(_WIN32)
- socket().close();
-#else
- socket().shutdown();
-#endif
- }
- catch (...)
- {
- }
- }
-}
-
-
-} } // namespace Poco::Net
+//
+// HTTPServerConnection.cpp
+//
+// Library: Net
+// Package: HTTPServer
+// Module: HTTPServerConnection
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/HTTPServerConnection.h"
+#include "Poco/Net/HTTPServerSession.h"
+#include "Poco/Net/HTTPServerRequestImpl.h"
+#include "Poco/Net/HTTPServerResponseImpl.h"
+#include "Poco/Net/HTTPRequestHandler.h"
+#include "Poco/Net/HTTPRequestHandlerFactory.h"
+#include "Poco/Net/NetException.h"
+#include "Poco/NumberFormatter.h"
+#include "Poco/Timestamp.h"
+#include "Poco/Delegate.h"
+#include <memory>
+
+
+namespace Poco {
+namespace Net {
+
+
+HTTPServerConnection::HTTPServerConnection(const StreamSocket& socket, HTTPServerParams::Ptr pParams, HTTPRequestHandlerFactory::Ptr pFactory):
+ TCPServerConnection(socket),
+ _pParams(pParams),
+ _pFactory(pFactory),
+ _stopped(false)
+{
+ poco_check_ptr (pFactory);
+
+ _pFactory->serverStopped += Poco::delegate(this, &HTTPServerConnection::onServerStopped);
+}
+
+
+HTTPServerConnection::~HTTPServerConnection()
+{
+ try
+ {
+ _pFactory->serverStopped -= Poco::delegate(this, &HTTPServerConnection::onServerStopped);
+ }
+ catch (...)
+ {
+ poco_unexpected();
+ }
+}
+
+
+void HTTPServerConnection::run()
+{
+ std::string server = _pParams->getSoftwareVersion();
+ HTTPServerSession session(socket(), _pParams);
+ while (!_stopped && session.hasMoreRequests())
+ {
+ try
+ {
+ Poco::FastMutex::ScopedLock lock(_mutex);
+ if (!_stopped)
+ {
+ HTTPServerResponseImpl response(session);
+ HTTPServerRequestImpl request(response, session, _pParams);
+
+ Poco::Timestamp now;
+ response.setDate(now);
+ response.setVersion(request.getVersion());
+ response.setKeepAlive(_pParams->getKeepAlive() && request.getKeepAlive() && session.canKeepAlive());
+ if (!server.empty())
+ response.set("Server", server);
+ try
+ {
+#ifndef POCO_ENABLE_CPP11
+ std::auto_ptr<HTTPRequestHandler> pHandler(_pFactory->createRequestHandler(request));
+#else
+ std::unique_ptr<HTTPRequestHandler> pHandler(_pFactory->createRequestHandler(request));
+#endif
+ if (pHandler.get())
+ {
+ if (request.getExpectContinue() && response.getStatus() == HTTPResponse::HTTP_OK)
+ response.sendContinue();
+
+ pHandler->handleRequest(request, response);
+ session.setKeepAlive(_pParams->getKeepAlive() && response.getKeepAlive() && session.canKeepAlive());
+ }
+ else sendErrorResponse(session, HTTPResponse::HTTP_NOT_IMPLEMENTED);
+ }
+ catch (Poco::Exception&)
+ {
+ if (!response.sent())
+ {
+ try
+ {
+ sendErrorResponse(session, HTTPResponse::HTTP_INTERNAL_SERVER_ERROR);
+ }
+ catch (...)
+ {
+ }
+ }
+ throw;
+ }
+ }
+ }
+ catch (NoMessageException&)
+ {
+ break;
+ }
+ catch (MessageException&)
+ {
+ sendErrorResponse(session, HTTPResponse::HTTP_BAD_REQUEST);
+ }
+ catch (Poco::Exception&)
+ {
+ if (session.networkException())
+ {
+ session.networkException()->rethrow();
+ }
+ else throw;
+ }
+ }
+}
+
+
+void HTTPServerConnection::sendErrorResponse(HTTPServerSession& session, HTTPResponse::HTTPStatus status)
+{
+ HTTPServerResponseImpl response(session);
+ response.setVersion(HTTPMessage::HTTP_1_1);
+ response.setStatusAndReason(status);
+ response.setKeepAlive(false);
+ response.send();
+ session.setKeepAlive(false);
+}
+
+
+void HTTPServerConnection::onServerStopped(const bool& abortCurrent)
+{
+ _stopped = true;
+ if (abortCurrent)
+ {
+ try
+ {
+ // Note: On Windows, select() will not return if one of its socket is being
+ // shut down. Therefore we have to call close(), which works better.
+ // On other platforms, we do the more graceful thing.
+#if defined(_WIN32)
+ socket().close();
+#else
+ socket().shutdown();
+#endif
+ }
+ catch (...)
+ {
+ }
+ }
+ else
+ {
+ Poco::FastMutex::ScopedLock lock(_mutex);
+
+ try
+ {
+#if defined(_WIN32)
+ socket().close();
+#else
+ socket().shutdown();
+#endif
+ }
+ catch (...)
+ {
+ }
+ }
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/HTTPServerConnectionFactory.cpp b/contrib/libs/poco/Net/src/HTTPServerConnectionFactory.cpp
index eff734af03..8e17288f3b 100644
--- a/contrib/libs/poco/Net/src/HTTPServerConnectionFactory.cpp
+++ b/contrib/libs/poco/Net/src/HTTPServerConnectionFactory.cpp
@@ -1,43 +1,43 @@
-//
-// HTTPServerConnectionFactory.cpp
-//
-// Library: Net
-// Package: HTTPServer
-// Module: HTTPServerConnectionFactory
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/HTTPServerConnectionFactory.h"
-#include "Poco/Net/HTTPServerConnection.h"
-#include "Poco/Net/HTTPRequestHandlerFactory.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-HTTPServerConnectionFactory::HTTPServerConnectionFactory(HTTPServerParams::Ptr pParams, HTTPRequestHandlerFactory::Ptr pFactory):
- _pParams(pParams),
- _pFactory(pFactory)
-{
- poco_check_ptr (pFactory);
-}
-
-
-HTTPServerConnectionFactory::~HTTPServerConnectionFactory()
-{
-}
-
-
-TCPServerConnection* HTTPServerConnectionFactory::createConnection(const StreamSocket& socket)
-{
- return new HTTPServerConnection(socket, _pParams, _pFactory);
-}
-
-
-} } // namespace Poco::Net
+//
+// HTTPServerConnectionFactory.cpp
+//
+// Library: Net
+// Package: HTTPServer
+// Module: HTTPServerConnectionFactory
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/HTTPServerConnectionFactory.h"
+#include "Poco/Net/HTTPServerConnection.h"
+#include "Poco/Net/HTTPRequestHandlerFactory.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+HTTPServerConnectionFactory::HTTPServerConnectionFactory(HTTPServerParams::Ptr pParams, HTTPRequestHandlerFactory::Ptr pFactory):
+ _pParams(pParams),
+ _pFactory(pFactory)
+{
+ poco_check_ptr (pFactory);
+}
+
+
+HTTPServerConnectionFactory::~HTTPServerConnectionFactory()
+{
+}
+
+
+TCPServerConnection* HTTPServerConnectionFactory::createConnection(const StreamSocket& socket)
+{
+ return new HTTPServerConnection(socket, _pParams, _pFactory);
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/HTTPServerParams.cpp b/contrib/libs/poco/Net/src/HTTPServerParams.cpp
index 87ae54d990..cc87161111 100644
--- a/contrib/libs/poco/Net/src/HTTPServerParams.cpp
+++ b/contrib/libs/poco/Net/src/HTTPServerParams.cpp
@@ -1,73 +1,73 @@
-//
-// HTTPServerParams.cpp
-//
-// Library: Net
-// Package: HTTPServer
-// Module: HTTPServerParams
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/HTTPServerParams.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-HTTPServerParams::HTTPServerParams():
- _timeout(60000000),
- _keepAlive(true),
- _maxKeepAliveRequests(0),
- _keepAliveTimeout(15000000)
-{
-}
-
-
-HTTPServerParams::~HTTPServerParams()
-{
-}
-
-
-void HTTPServerParams::setServerName(const std::string& serverName)
-{
- _serverName = serverName;
-}
-
-
-void HTTPServerParams::setSoftwareVersion(const std::string& softwareVersion)
-{
- _softwareVersion = softwareVersion;
-}
-
-
-void HTTPServerParams::setTimeout(const Poco::Timespan& timeout)
-{
- _timeout = timeout;
-}
-
-
-void HTTPServerParams::setKeepAlive(bool keepAlive)
-{
- _keepAlive = keepAlive;
-}
-
-
-void HTTPServerParams::setKeepAliveTimeout(const Poco::Timespan& timeout)
-{
- _keepAliveTimeout = timeout;
-}
-
-
-void HTTPServerParams::setMaxKeepAliveRequests(int maxKeepAliveRequests)
-{
- poco_assert (maxKeepAliveRequests >= 0);
- _maxKeepAliveRequests = maxKeepAliveRequests;
-}
-
-
-} } // namespace Poco::Net
+//
+// HTTPServerParams.cpp
+//
+// Library: Net
+// Package: HTTPServer
+// Module: HTTPServerParams
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/HTTPServerParams.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+HTTPServerParams::HTTPServerParams():
+ _timeout(60000000),
+ _keepAlive(true),
+ _maxKeepAliveRequests(0),
+ _keepAliveTimeout(15000000)
+{
+}
+
+
+HTTPServerParams::~HTTPServerParams()
+{
+}
+
+
+void HTTPServerParams::setServerName(const std::string& serverName)
+{
+ _serverName = serverName;
+}
+
+
+void HTTPServerParams::setSoftwareVersion(const std::string& softwareVersion)
+{
+ _softwareVersion = softwareVersion;
+}
+
+
+void HTTPServerParams::setTimeout(const Poco::Timespan& timeout)
+{
+ _timeout = timeout;
+}
+
+
+void HTTPServerParams::setKeepAlive(bool keepAlive)
+{
+ _keepAlive = keepAlive;
+}
+
+
+void HTTPServerParams::setKeepAliveTimeout(const Poco::Timespan& timeout)
+{
+ _keepAliveTimeout = timeout;
+}
+
+
+void HTTPServerParams::setMaxKeepAliveRequests(int maxKeepAliveRequests)
+{
+ poco_assert (maxKeepAliveRequests >= 0);
+ _maxKeepAliveRequests = maxKeepAliveRequests;
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/HTTPServerRequest.cpp b/contrib/libs/poco/Net/src/HTTPServerRequest.cpp
index f5f78f90be..de3d46481a 100644
--- a/contrib/libs/poco/Net/src/HTTPServerRequest.cpp
+++ b/contrib/libs/poco/Net/src/HTTPServerRequest.cpp
@@ -1,32 +1,32 @@
-//
-// HTTPServerRequest.cpp
-//
-// Library: Net
-// Package: HTTPServer
-// Module: HTTPServerRequest
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/HTTPServerRequest.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-HTTPServerRequest::HTTPServerRequest()
-{
-}
-
-
-HTTPServerRequest::~HTTPServerRequest()
-{
-}
-
-
-} } // namespace Poco::Net
+//
+// HTTPServerRequest.cpp
+//
+// Library: Net
+// Package: HTTPServer
+// Module: HTTPServerRequest
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/HTTPServerRequest.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+HTTPServerRequest::HTTPServerRequest()
+{
+}
+
+
+HTTPServerRequest::~HTTPServerRequest()
+{
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/HTTPServerRequestImpl.cpp b/contrib/libs/poco/Net/src/HTTPServerRequestImpl.cpp
index aee484089b..d8ea7398c9 100644
--- a/contrib/libs/poco/Net/src/HTTPServerRequestImpl.cpp
+++ b/contrib/libs/poco/Net/src/HTTPServerRequestImpl.cpp
@@ -1,88 +1,88 @@
-//
-// HTTPServerRequestImpl.cpp
-//
-// Library: Net
-// Package: HTTPServer
-// Module: HTTPServerRequestImpl
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/HTTPServerRequestImpl.h"
-#include "Poco/Net/HTTPServerResponseImpl.h"
-#include "Poco/Net/HTTPServerSession.h"
-#include "Poco/Net/HTTPHeaderStream.h"
-#include "Poco/Net/HTTPStream.h"
-#include "Poco/Net/HTTPFixedLengthStream.h"
-#include "Poco/Net/HTTPChunkedStream.h"
-#include "Poco/Net/HTTPServerParams.h"
-#include "Poco/Net/StreamSocket.h"
-#include "Poco/String.h"
-
-
-using Poco::icompare;
-
-
-namespace Poco {
-namespace Net {
-
-
-HTTPServerRequestImpl::HTTPServerRequestImpl(HTTPServerResponseImpl& response, HTTPServerSession& session, HTTPServerParams* pParams):
- _response(response),
- _session(session),
- _pStream(0),
- _pParams(pParams, true)
-{
- response.attachRequest(this);
-
- HTTPHeaderInputStream hs(session);
- read(hs);
-
- // Now that we know socket is still connected, obtain addresses
- _clientAddress = session.clientAddress();
- _serverAddress = session.serverAddress();
-
- if (getChunkedTransferEncoding())
- _pStream = new HTTPChunkedInputStream(session);
- else if (hasContentLength())
-#if defined(POCO_HAVE_INT64)
- _pStream = new HTTPFixedLengthInputStream(session, getContentLength64());
-#else
- _pStream = new HTTPFixedLengthInputStream(session, getContentLength());
-#endif
- else if (getMethod() == HTTPRequest::HTTP_GET || getMethod() == HTTPRequest::HTTP_HEAD || getMethod() == HTTPRequest::HTTP_DELETE)
- _pStream = new HTTPFixedLengthInputStream(session, 0);
- else
- _pStream = new HTTPInputStream(session);
-}
-
-
-HTTPServerRequestImpl::~HTTPServerRequestImpl()
-{
- delete _pStream;
-}
-
-
-bool HTTPServerRequestImpl::secure() const
-{
- return _session.socket().secure();
-}
-
-
-StreamSocket& HTTPServerRequestImpl::socket()
-{
- return _session.socket();
-}
-
-
-StreamSocket HTTPServerRequestImpl::detachSocket()
-{
- return _session.detachSocket();
-}
-
-
-} } // namespace Poco::Net
+//
+// HTTPServerRequestImpl.cpp
+//
+// Library: Net
+// Package: HTTPServer
+// Module: HTTPServerRequestImpl
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/HTTPServerRequestImpl.h"
+#include "Poco/Net/HTTPServerResponseImpl.h"
+#include "Poco/Net/HTTPServerSession.h"
+#include "Poco/Net/HTTPHeaderStream.h"
+#include "Poco/Net/HTTPStream.h"
+#include "Poco/Net/HTTPFixedLengthStream.h"
+#include "Poco/Net/HTTPChunkedStream.h"
+#include "Poco/Net/HTTPServerParams.h"
+#include "Poco/Net/StreamSocket.h"
+#include "Poco/String.h"
+
+
+using Poco::icompare;
+
+
+namespace Poco {
+namespace Net {
+
+
+HTTPServerRequestImpl::HTTPServerRequestImpl(HTTPServerResponseImpl& response, HTTPServerSession& session, HTTPServerParams* pParams):
+ _response(response),
+ _session(session),
+ _pStream(0),
+ _pParams(pParams, true)
+{
+ response.attachRequest(this);
+
+ HTTPHeaderInputStream hs(session);
+ read(hs);
+
+ // Now that we know socket is still connected, obtain addresses
+ _clientAddress = session.clientAddress();
+ _serverAddress = session.serverAddress();
+
+ if (getChunkedTransferEncoding())
+ _pStream = new HTTPChunkedInputStream(session);
+ else if (hasContentLength())
+#if defined(POCO_HAVE_INT64)
+ _pStream = new HTTPFixedLengthInputStream(session, getContentLength64());
+#else
+ _pStream = new HTTPFixedLengthInputStream(session, getContentLength());
+#endif
+ else if (getMethod() == HTTPRequest::HTTP_GET || getMethod() == HTTPRequest::HTTP_HEAD || getMethod() == HTTPRequest::HTTP_DELETE)
+ _pStream = new HTTPFixedLengthInputStream(session, 0);
+ else
+ _pStream = new HTTPInputStream(session);
+}
+
+
+HTTPServerRequestImpl::~HTTPServerRequestImpl()
+{
+ delete _pStream;
+}
+
+
+bool HTTPServerRequestImpl::secure() const
+{
+ return _session.socket().secure();
+}
+
+
+StreamSocket& HTTPServerRequestImpl::socket()
+{
+ return _session.socket();
+}
+
+
+StreamSocket HTTPServerRequestImpl::detachSocket()
+{
+ return _session.detachSocket();
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/HTTPServerResponse.cpp b/contrib/libs/poco/Net/src/HTTPServerResponse.cpp
index 9208d3b2cb..e5550a3222 100644
--- a/contrib/libs/poco/Net/src/HTTPServerResponse.cpp
+++ b/contrib/libs/poco/Net/src/HTTPServerResponse.cpp
@@ -1,32 +1,32 @@
-//
-// HTTPServerResponse.cpp
-//
-// Library: Net
-// Package: HTTPServer
-// Module: HTTPServerResponse
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/HTTPServerResponse.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-HTTPServerResponse::HTTPServerResponse()
-{
-}
-
-
-HTTPServerResponse::~HTTPServerResponse()
-{
-}
-
-
-} } // namespace Poco::Net
+//
+// HTTPServerResponse.cpp
+//
+// Library: Net
+// Package: HTTPServer
+// Module: HTTPServerResponse
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/HTTPServerResponse.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+HTTPServerResponse::HTTPServerResponse()
+{
+}
+
+
+HTTPServerResponse::~HTTPServerResponse()
+{
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/HTTPServerResponseImpl.cpp b/contrib/libs/poco/Net/src/HTTPServerResponseImpl.cpp
index d3e5b04837..fb6783c633 100644
--- a/contrib/libs/poco/Net/src/HTTPServerResponseImpl.cpp
+++ b/contrib/libs/poco/Net/src/HTTPServerResponseImpl.cpp
@@ -1,221 +1,221 @@
-//
-// HTTPServerResponseImpl.cpp
-//
-// Library: Net
-// Package: HTTPServer
-// Module: HTTPServerResponseImpl
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/HTTPServerResponseImpl.h"
-#include "Poco/Net/HTTPServerRequestImpl.h"
-#include "Poco/Net/HTTPServerSession.h"
-#include "Poco/Net/HTTPHeaderStream.h"
-#include "Poco/Net/HTTPStream.h"
-#include "Poco/Net/HTTPFixedLengthStream.h"
-#include "Poco/Net/HTTPChunkedStream.h"
-#include "Poco/File.h"
-#include "Poco/Timestamp.h"
-#include "Poco/NumberFormatter.h"
-#include "Poco/StreamCopier.h"
-#include "Poco/CountingStream.h"
-#include "Poco/Exception.h"
-#include "Poco/FileStream.h"
-#include "Poco/DateTimeFormatter.h"
-#include "Poco/DateTimeFormat.h"
-
-
-using Poco::File;
-using Poco::Timestamp;
-using Poco::NumberFormatter;
-using Poco::StreamCopier;
-using Poco::OpenFileException;
-using Poco::DateTimeFormatter;
-using Poco::DateTimeFormat;
-
-
-namespace Poco {
-namespace Net {
-
-
-HTTPServerResponseImpl::HTTPServerResponseImpl(HTTPServerSession& session):
- _session(session),
- _pRequest(0),
- _pStream(0),
- _pHeaderStream(0)
-{
-}
-
-
-HTTPServerResponseImpl::~HTTPServerResponseImpl()
-{
- if (_pHeaderStream && _pHeaderStream != _pStream)
- delete _pHeaderStream;
- if (_pStream)
- delete _pStream;
-}
-
-
-void HTTPServerResponseImpl::sendContinue()
-{
- HTTPHeaderOutputStream hs(_session);
- hs << getVersion() << " 100 Continue\r\n\r\n";
-}
-
-
-std::ostream& HTTPServerResponseImpl::send()
-{
- poco_assert (!_pStream);
-
- if ((_pRequest && _pRequest->getMethod() == HTTPRequest::HTTP_HEAD) ||
- getStatus() < 200 ||
- getStatus() == HTTPResponse::HTTP_NO_CONTENT ||
- getStatus() == HTTPResponse::HTTP_NOT_MODIFIED)
- {
- Poco::CountingOutputStream cs;
- write(cs);
- _pStream = new HTTPFixedLengthOutputStream(_session, cs.chars());
- write(*_pStream);
- }
- else if (getChunkedTransferEncoding())
- {
- HTTPHeaderOutputStream hs(_session);
- write(hs);
- _pStream = new HTTPChunkedOutputStream(_session);
- }
- else if (hasContentLength())
- {
- Poco::CountingOutputStream cs;
- write(cs);
-#if defined(POCO_HAVE_INT64)
- _pStream = new HTTPFixedLengthOutputStream(_session, getContentLength64() + cs.chars());
-#else
- _pStream = new HTTPFixedLengthOutputStream(_session, getContentLength() + cs.chars());
-#endif
- write(*_pStream);
- }
- else
- {
- _pStream = new HTTPOutputStream(_session);
- setKeepAlive(false);
- write(*_pStream);
- }
- return *_pStream;
-}
-
-
-std::pair<std::ostream *, std::ostream *> HTTPServerResponseImpl::beginSend()
-{
- poco_assert (!_pStream);
- poco_assert (!_pHeaderStream);
-
- // NOTE Code is not exception safe.
-
- if ((_pRequest && _pRequest->getMethod() == HTTPRequest::HTTP_HEAD) ||
- getStatus() < 200 ||
- getStatus() == HTTPResponse::HTTP_NO_CONTENT ||
- getStatus() == HTTPResponse::HTTP_NOT_MODIFIED)
- {
- throw Exception("HTTPServerResponse::beginSend is invalid for HEAD request");
- }
- else if (getChunkedTransferEncoding())
- {
- _pHeaderStream = new HTTPHeaderOutputStream(_session);
- beginWrite(*_pHeaderStream);
- _pStream = new HTTPChunkedOutputStream(_session);
- }
- else if (hasContentLength())
- {
- throw Exception("HTTPServerResponse::beginSend is invalid for response with Content-Length header");
- }
- else
- {
- _pStream = new HTTPOutputStream(_session);
- _pHeaderStream = _pStream;
- setKeepAlive(false);
- beginWrite(*_pStream);
- }
-
- return std::make_pair(_pHeaderStream, _pStream);
-}
-
-
-void HTTPServerResponseImpl::sendFile(const std::string& path, const std::string& mediaType)
-{
- poco_assert (!_pStream);
-
- File f(path);
- Timestamp dateTime = f.getLastModified();
- File::FileSize length = f.getSize();
- set("Last-Modified", DateTimeFormatter::format(dateTime, DateTimeFormat::HTTP_FORMAT));
-#if defined(POCO_HAVE_INT64)
- setContentLength64(length);
-#else
- setContentLength(static_cast<int>(length));
-#endif
- setContentType(mediaType);
- setChunkedTransferEncoding(false);
-
- Poco::FileInputStream istr(path);
- if (istr.good())
- {
- _pStream = new HTTPHeaderOutputStream(_session);
- write(*_pStream);
- if (_pRequest && _pRequest->getMethod() != HTTPRequest::HTTP_HEAD)
- {
- StreamCopier::copyStream(istr, *_pStream);
- }
- }
- else throw OpenFileException(path);
-}
-
-
-void HTTPServerResponseImpl::sendBuffer(const void* pBuffer, std::size_t length)
-{
- poco_assert (!_pStream);
-
- setContentLength(static_cast<int>(length));
- setChunkedTransferEncoding(false);
-
- _pStream = new HTTPHeaderOutputStream(_session);
- write(*_pStream);
- if (_pRequest && _pRequest->getMethod() != HTTPRequest::HTTP_HEAD)
- {
- _pStream->write(static_cast<const char*>(pBuffer), static_cast<std::streamsize>(length));
- }
-}
-
-
-void HTTPServerResponseImpl::redirect(const std::string& uri, HTTPStatus status)
-{
- poco_assert (!_pStream);
-
- setContentLength(0);
- setChunkedTransferEncoding(false);
-
- setStatusAndReason(status);
- set("Location", uri);
-
- _pStream = new HTTPHeaderOutputStream(_session);
- write(*_pStream);
-}
-
-
-void HTTPServerResponseImpl::requireAuthentication(const std::string& realm)
-{
- poco_assert (!_pStream);
-
- setStatusAndReason(HTTPResponse::HTTP_UNAUTHORIZED);
- std::string auth("Basic realm=\"");
- auth.append(realm);
- auth.append("\"");
- set("WWW-Authenticate", auth);
-}
-
-
-} } // namespace Poco::Net
+//
+// HTTPServerResponseImpl.cpp
+//
+// Library: Net
+// Package: HTTPServer
+// Module: HTTPServerResponseImpl
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/HTTPServerResponseImpl.h"
+#include "Poco/Net/HTTPServerRequestImpl.h"
+#include "Poco/Net/HTTPServerSession.h"
+#include "Poco/Net/HTTPHeaderStream.h"
+#include "Poco/Net/HTTPStream.h"
+#include "Poco/Net/HTTPFixedLengthStream.h"
+#include "Poco/Net/HTTPChunkedStream.h"
+#include "Poco/File.h"
+#include "Poco/Timestamp.h"
+#include "Poco/NumberFormatter.h"
+#include "Poco/StreamCopier.h"
+#include "Poco/CountingStream.h"
+#include "Poco/Exception.h"
+#include "Poco/FileStream.h"
+#include "Poco/DateTimeFormatter.h"
+#include "Poco/DateTimeFormat.h"
+
+
+using Poco::File;
+using Poco::Timestamp;
+using Poco::NumberFormatter;
+using Poco::StreamCopier;
+using Poco::OpenFileException;
+using Poco::DateTimeFormatter;
+using Poco::DateTimeFormat;
+
+
+namespace Poco {
+namespace Net {
+
+
+HTTPServerResponseImpl::HTTPServerResponseImpl(HTTPServerSession& session):
+ _session(session),
+ _pRequest(0),
+ _pStream(0),
+ _pHeaderStream(0)
+{
+}
+
+
+HTTPServerResponseImpl::~HTTPServerResponseImpl()
+{
+ if (_pHeaderStream && _pHeaderStream != _pStream)
+ delete _pHeaderStream;
+ if (_pStream)
+ delete _pStream;
+}
+
+
+void HTTPServerResponseImpl::sendContinue()
+{
+ HTTPHeaderOutputStream hs(_session);
+ hs << getVersion() << " 100 Continue\r\n\r\n";
+}
+
+
+std::ostream& HTTPServerResponseImpl::send()
+{
+ poco_assert (!_pStream);
+
+ if ((_pRequest && _pRequest->getMethod() == HTTPRequest::HTTP_HEAD) ||
+ getStatus() < 200 ||
+ getStatus() == HTTPResponse::HTTP_NO_CONTENT ||
+ getStatus() == HTTPResponse::HTTP_NOT_MODIFIED)
+ {
+ Poco::CountingOutputStream cs;
+ write(cs);
+ _pStream = new HTTPFixedLengthOutputStream(_session, cs.chars());
+ write(*_pStream);
+ }
+ else if (getChunkedTransferEncoding())
+ {
+ HTTPHeaderOutputStream hs(_session);
+ write(hs);
+ _pStream = new HTTPChunkedOutputStream(_session);
+ }
+ else if (hasContentLength())
+ {
+ Poco::CountingOutputStream cs;
+ write(cs);
+#if defined(POCO_HAVE_INT64)
+ _pStream = new HTTPFixedLengthOutputStream(_session, getContentLength64() + cs.chars());
+#else
+ _pStream = new HTTPFixedLengthOutputStream(_session, getContentLength() + cs.chars());
+#endif
+ write(*_pStream);
+ }
+ else
+ {
+ _pStream = new HTTPOutputStream(_session);
+ setKeepAlive(false);
+ write(*_pStream);
+ }
+ return *_pStream;
+}
+
+
+std::pair<std::ostream *, std::ostream *> HTTPServerResponseImpl::beginSend()
+{
+ poco_assert (!_pStream);
+ poco_assert (!_pHeaderStream);
+
+ // NOTE Code is not exception safe.
+
+ if ((_pRequest && _pRequest->getMethod() == HTTPRequest::HTTP_HEAD) ||
+ getStatus() < 200 ||
+ getStatus() == HTTPResponse::HTTP_NO_CONTENT ||
+ getStatus() == HTTPResponse::HTTP_NOT_MODIFIED)
+ {
+ throw Exception("HTTPServerResponse::beginSend is invalid for HEAD request");
+ }
+ else if (getChunkedTransferEncoding())
+ {
+ _pHeaderStream = new HTTPHeaderOutputStream(_session);
+ beginWrite(*_pHeaderStream);
+ _pStream = new HTTPChunkedOutputStream(_session);
+ }
+ else if (hasContentLength())
+ {
+ throw Exception("HTTPServerResponse::beginSend is invalid for response with Content-Length header");
+ }
+ else
+ {
+ _pStream = new HTTPOutputStream(_session);
+ _pHeaderStream = _pStream;
+ setKeepAlive(false);
+ beginWrite(*_pStream);
+ }
+
+ return std::make_pair(_pHeaderStream, _pStream);
+}
+
+
+void HTTPServerResponseImpl::sendFile(const std::string& path, const std::string& mediaType)
+{
+ poco_assert (!_pStream);
+
+ File f(path);
+ Timestamp dateTime = f.getLastModified();
+ File::FileSize length = f.getSize();
+ set("Last-Modified", DateTimeFormatter::format(dateTime, DateTimeFormat::HTTP_FORMAT));
+#if defined(POCO_HAVE_INT64)
+ setContentLength64(length);
+#else
+ setContentLength(static_cast<int>(length));
+#endif
+ setContentType(mediaType);
+ setChunkedTransferEncoding(false);
+
+ Poco::FileInputStream istr(path);
+ if (istr.good())
+ {
+ _pStream = new HTTPHeaderOutputStream(_session);
+ write(*_pStream);
+ if (_pRequest && _pRequest->getMethod() != HTTPRequest::HTTP_HEAD)
+ {
+ StreamCopier::copyStream(istr, *_pStream);
+ }
+ }
+ else throw OpenFileException(path);
+}
+
+
+void HTTPServerResponseImpl::sendBuffer(const void* pBuffer, std::size_t length)
+{
+ poco_assert (!_pStream);
+
+ setContentLength(static_cast<int>(length));
+ setChunkedTransferEncoding(false);
+
+ _pStream = new HTTPHeaderOutputStream(_session);
+ write(*_pStream);
+ if (_pRequest && _pRequest->getMethod() != HTTPRequest::HTTP_HEAD)
+ {
+ _pStream->write(static_cast<const char*>(pBuffer), static_cast<std::streamsize>(length));
+ }
+}
+
+
+void HTTPServerResponseImpl::redirect(const std::string& uri, HTTPStatus status)
+{
+ poco_assert (!_pStream);
+
+ setContentLength(0);
+ setChunkedTransferEncoding(false);
+
+ setStatusAndReason(status);
+ set("Location", uri);
+
+ _pStream = new HTTPHeaderOutputStream(_session);
+ write(*_pStream);
+}
+
+
+void HTTPServerResponseImpl::requireAuthentication(const std::string& realm)
+{
+ poco_assert (!_pStream);
+
+ setStatusAndReason(HTTPResponse::HTTP_UNAUTHORIZED);
+ std::string auth("Basic realm=\"");
+ auth.append(realm);
+ auth.append("\"");
+ set("WWW-Authenticate", auth);
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/HTTPServerSession.cpp b/contrib/libs/poco/Net/src/HTTPServerSession.cpp
index 09ca185a41..f6d3c4e5b9 100644
--- a/contrib/libs/poco/Net/src/HTTPServerSession.cpp
+++ b/contrib/libs/poco/Net/src/HTTPServerSession.cpp
@@ -1,70 +1,70 @@
-//
-// HTTPServerSession.cpp
-//
-// Library: Net
-// Package: HTTPServer
-// Module: HTTPServerSession
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/HTTPServerSession.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-HTTPServerSession::HTTPServerSession(const StreamSocket& socket, HTTPServerParams::Ptr pParams):
- HTTPSession(socket, pParams->getKeepAlive()),
- _firstRequest(true),
- _keepAliveTimeout(pParams->getKeepAliveTimeout()),
- _maxKeepAliveRequests(pParams->getMaxKeepAliveRequests())
-{
- setTimeout(pParams->getTimeout());
- this->socket().setReceiveTimeout(pParams->getTimeout());
-}
-
-
-HTTPServerSession::~HTTPServerSession()
-{
-}
-
-
-bool HTTPServerSession::hasMoreRequests()
-{
- if (!socket().impl()->initialized()) return false;
-
- if (_firstRequest)
- {
- _firstRequest = false;
- --_maxKeepAliveRequests;
- return socket().poll(getTimeout(), Socket::SELECT_READ);
- }
- else if (_maxKeepAliveRequests != 0 && getKeepAlive())
- {
- if (_maxKeepAliveRequests > 0)
- --_maxKeepAliveRequests;
- return buffered() > 0 || socket().poll(_keepAliveTimeout, Socket::SELECT_READ);
- }
- else return false;
-}
-
-
-SocketAddress HTTPServerSession::clientAddress()
-{
- return socket().peerAddress();
-}
-
-
-SocketAddress HTTPServerSession::serverAddress()
-{
- return socket().address();
-}
-
-
-} } // namespace Poco::Net
+//
+// HTTPServerSession.cpp
+//
+// Library: Net
+// Package: HTTPServer
+// Module: HTTPServerSession
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/HTTPServerSession.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+HTTPServerSession::HTTPServerSession(const StreamSocket& socket, HTTPServerParams::Ptr pParams):
+ HTTPSession(socket, pParams->getKeepAlive()),
+ _firstRequest(true),
+ _keepAliveTimeout(pParams->getKeepAliveTimeout()),
+ _maxKeepAliveRequests(pParams->getMaxKeepAliveRequests())
+{
+ setTimeout(pParams->getTimeout());
+ this->socket().setReceiveTimeout(pParams->getTimeout());
+}
+
+
+HTTPServerSession::~HTTPServerSession()
+{
+}
+
+
+bool HTTPServerSession::hasMoreRequests()
+{
+ if (!socket().impl()->initialized()) return false;
+
+ if (_firstRequest)
+ {
+ _firstRequest = false;
+ --_maxKeepAliveRequests;
+ return socket().poll(getTimeout(), Socket::SELECT_READ);
+ }
+ else if (_maxKeepAliveRequests != 0 && getKeepAlive())
+ {
+ if (_maxKeepAliveRequests > 0)
+ --_maxKeepAliveRequests;
+ return buffered() > 0 || socket().poll(_keepAliveTimeout, Socket::SELECT_READ);
+ }
+ else return false;
+}
+
+
+SocketAddress HTTPServerSession::clientAddress()
+{
+ return socket().peerAddress();
+}
+
+
+SocketAddress HTTPServerSession::serverAddress()
+{
+ return socket().address();
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/HTTPSession.cpp b/contrib/libs/poco/Net/src/HTTPSession.cpp
index eaf1e9188d..cb6fdc25e9 100644
--- a/contrib/libs/poco/Net/src/HTTPSession.cpp
+++ b/contrib/libs/poco/Net/src/HTTPSession.cpp
@@ -1,261 +1,261 @@
-//
-// HTTPSession.cpp
-//
-// Library: Net
-// Package: HTTP
-// Module: HTTPSession
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/HTTPSession.h"
-#include "Poco/Net/HTTPBufferAllocator.h"
-#include "Poco/Net/NetException.h"
-#include <cstring>
-
-
-using Poco::TimeoutException;
-
-
-namespace Poco {
-namespace Net {
-
-
-HTTPSession::HTTPSession():
- _pBuffer(0),
- _pCurrent(0),
- _pEnd(0),
- _keepAlive(false),
- _connectionTimeout(HTTP_DEFAULT_CONNECTION_TIMEOUT),
- _receiveTimeout(HTTP_DEFAULT_TIMEOUT),
- _sendTimeout(HTTP_DEFAULT_TIMEOUT),
- _pException(0)
-{
-}
-
-
-HTTPSession::HTTPSession(const StreamSocket& socket):
- _socket(socket),
- _pBuffer(0),
- _pCurrent(0),
- _pEnd(0),
- _keepAlive(false),
- _connectionTimeout(HTTP_DEFAULT_CONNECTION_TIMEOUT),
- _receiveTimeout(HTTP_DEFAULT_TIMEOUT),
- _sendTimeout(HTTP_DEFAULT_TIMEOUT),
- _pException(0)
-{
-}
-
-
-HTTPSession::HTTPSession(const StreamSocket& socket, bool keepAlive):
- _socket(socket),
- _pBuffer(0),
- _pCurrent(0),
- _pEnd(0),
- _keepAlive(keepAlive),
- _connectionTimeout(HTTP_DEFAULT_CONNECTION_TIMEOUT),
- _receiveTimeout(HTTP_DEFAULT_TIMEOUT),
- _sendTimeout(HTTP_DEFAULT_TIMEOUT),
- _pException(0)
-{
-}
-
-
-HTTPSession::~HTTPSession()
-{
- try
- {
- if (_pBuffer) HTTPBufferAllocator::deallocate(_pBuffer, HTTPBufferAllocator::BUFFER_SIZE);
- }
- catch (...)
- {
- poco_unexpected();
- }
- try
- {
- close();
- }
- catch (...)
- {
- }
- delete _pException;
-}
-
-
-void HTTPSession::setKeepAlive(bool keepAlive)
-{
- _keepAlive = keepAlive;
-}
-
-
-void HTTPSession::setTimeout(const Poco::Timespan& timeout)
-{
- setTimeout(timeout, timeout, timeout);
-}
-
-
-void HTTPSession::setTimeout(const Poco::Timespan& connectionTimeout, const Poco::Timespan& sendTimeout, const Poco::Timespan& receiveTimeout)
-{
- _connectionTimeout = connectionTimeout;
- _sendTimeout = sendTimeout;
- _receiveTimeout = receiveTimeout;
-}
-
-
-int HTTPSession::get()
-{
- if (_pCurrent == _pEnd)
- refill();
-
- if (_pCurrent < _pEnd)
- return *_pCurrent++;
- else
- return std::char_traits<char>::eof();
-}
-
-
-int HTTPSession::peek()
-{
- if (_pCurrent == _pEnd)
- refill();
-
- if (_pCurrent < _pEnd)
- return *_pCurrent;
- else
- return std::char_traits<char>::eof();
-}
-
-
-int HTTPSession::read(char* buffer, std::streamsize length)
-{
- if (_pCurrent < _pEnd)
- {
- int n = (int) (_pEnd - _pCurrent);
- if (n > length) n = (int) length;
- std::memcpy(buffer, _pCurrent, n);
- _pCurrent += n;
- return n;
- }
- else return receive(buffer, (int) length);
-}
-
-
-int HTTPSession::write(const char* buffer, std::streamsize length)
-{
- try
- {
- return _socket.sendBytes(buffer, (int) length);
- }
- catch (Poco::Exception& exc)
- {
- setException(exc);
- throw;
- }
-}
-
-
-int HTTPSession::receive(char* buffer, int length)
-{
- try
- {
- return _socket.receiveBytes(buffer, length);
- }
- catch (Poco::Exception& exc)
- {
- setException(exc);
- throw;
- }
-}
-
-
-void HTTPSession::refill()
-{
- if (!_pBuffer)
- {
- _pBuffer = HTTPBufferAllocator::allocate(HTTPBufferAllocator::BUFFER_SIZE);
- }
- _pCurrent = _pEnd = _pBuffer;
- int n = receive(_pBuffer, HTTPBufferAllocator::BUFFER_SIZE);
- _pEnd += n;
-}
-
-
-bool HTTPSession::connected() const
-{
- return _socket.impl()->initialized();
-}
-
-
-void HTTPSession::connect(const SocketAddress& address)
-{
- _socket.connect(address, _connectionTimeout);
- _socket.setReceiveTimeout(_receiveTimeout);
- _socket.setSendTimeout(_sendTimeout);
- _socket.setNoDelay(true);
- // There may be leftover data from a previous (failed) request in the buffer,
- // so we clear it.
- _pCurrent = _pEnd = _pBuffer;
-}
-
-
-void HTTPSession::abort()
-{
- _socket.shutdown();
- close();
-}
-
-
-void HTTPSession::close()
-{
- _socket.close();
-}
-
-
-void HTTPSession::setException(const Poco::Exception& exc)
-{
- delete _pException;
- _pException = exc.clone();
-}
-
-
-void HTTPSession::clearException()
-{
- delete _pException;
- _pException = 0;
-}
-
-
-StreamSocket HTTPSession::detachSocket()
-{
- StreamSocket oldSocket(_socket);
- StreamSocket newSocket;
- _socket = newSocket;
- return oldSocket;
-}
-
-
-void HTTPSession::attachSocket(const StreamSocket& socket)
-{
- _socket = socket;
-}
-
-
-void HTTPSession::attachSessionData(const Poco::Any& data)
-{
- _data = data;
-}
-
-
-void HTTPSession::drainBuffer(Poco::Buffer<char>& buffer)
-{
- buffer.assign(_pCurrent, static_cast<std::size_t>(_pEnd - _pCurrent));
- _pCurrent = _pEnd;
-}
-
-
-} } // namespace Poco::Net
+//
+// HTTPSession.cpp
+//
+// Library: Net
+// Package: HTTP
+// Module: HTTPSession
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/HTTPSession.h"
+#include "Poco/Net/HTTPBufferAllocator.h"
+#include "Poco/Net/NetException.h"
+#include <cstring>
+
+
+using Poco::TimeoutException;
+
+
+namespace Poco {
+namespace Net {
+
+
+HTTPSession::HTTPSession():
+ _pBuffer(0),
+ _pCurrent(0),
+ _pEnd(0),
+ _keepAlive(false),
+ _connectionTimeout(HTTP_DEFAULT_CONNECTION_TIMEOUT),
+ _receiveTimeout(HTTP_DEFAULT_TIMEOUT),
+ _sendTimeout(HTTP_DEFAULT_TIMEOUT),
+ _pException(0)
+{
+}
+
+
+HTTPSession::HTTPSession(const StreamSocket& socket):
+ _socket(socket),
+ _pBuffer(0),
+ _pCurrent(0),
+ _pEnd(0),
+ _keepAlive(false),
+ _connectionTimeout(HTTP_DEFAULT_CONNECTION_TIMEOUT),
+ _receiveTimeout(HTTP_DEFAULT_TIMEOUT),
+ _sendTimeout(HTTP_DEFAULT_TIMEOUT),
+ _pException(0)
+{
+}
+
+
+HTTPSession::HTTPSession(const StreamSocket& socket, bool keepAlive):
+ _socket(socket),
+ _pBuffer(0),
+ _pCurrent(0),
+ _pEnd(0),
+ _keepAlive(keepAlive),
+ _connectionTimeout(HTTP_DEFAULT_CONNECTION_TIMEOUT),
+ _receiveTimeout(HTTP_DEFAULT_TIMEOUT),
+ _sendTimeout(HTTP_DEFAULT_TIMEOUT),
+ _pException(0)
+{
+}
+
+
+HTTPSession::~HTTPSession()
+{
+ try
+ {
+ if (_pBuffer) HTTPBufferAllocator::deallocate(_pBuffer, HTTPBufferAllocator::BUFFER_SIZE);
+ }
+ catch (...)
+ {
+ poco_unexpected();
+ }
+ try
+ {
+ close();
+ }
+ catch (...)
+ {
+ }
+ delete _pException;
+}
+
+
+void HTTPSession::setKeepAlive(bool keepAlive)
+{
+ _keepAlive = keepAlive;
+}
+
+
+void HTTPSession::setTimeout(const Poco::Timespan& timeout)
+{
+ setTimeout(timeout, timeout, timeout);
+}
+
+
+void HTTPSession::setTimeout(const Poco::Timespan& connectionTimeout, const Poco::Timespan& sendTimeout, const Poco::Timespan& receiveTimeout)
+{
+ _connectionTimeout = connectionTimeout;
+ _sendTimeout = sendTimeout;
+ _receiveTimeout = receiveTimeout;
+}
+
+
+int HTTPSession::get()
+{
+ if (_pCurrent == _pEnd)
+ refill();
+
+ if (_pCurrent < _pEnd)
+ return *_pCurrent++;
+ else
+ return std::char_traits<char>::eof();
+}
+
+
+int HTTPSession::peek()
+{
+ if (_pCurrent == _pEnd)
+ refill();
+
+ if (_pCurrent < _pEnd)
+ return *_pCurrent;
+ else
+ return std::char_traits<char>::eof();
+}
+
+
+int HTTPSession::read(char* buffer, std::streamsize length)
+{
+ if (_pCurrent < _pEnd)
+ {
+ int n = (int) (_pEnd - _pCurrent);
+ if (n > length) n = (int) length;
+ std::memcpy(buffer, _pCurrent, n);
+ _pCurrent += n;
+ return n;
+ }
+ else return receive(buffer, (int) length);
+}
+
+
+int HTTPSession::write(const char* buffer, std::streamsize length)
+{
+ try
+ {
+ return _socket.sendBytes(buffer, (int) length);
+ }
+ catch (Poco::Exception& exc)
+ {
+ setException(exc);
+ throw;
+ }
+}
+
+
+int HTTPSession::receive(char* buffer, int length)
+{
+ try
+ {
+ return _socket.receiveBytes(buffer, length);
+ }
+ catch (Poco::Exception& exc)
+ {
+ setException(exc);
+ throw;
+ }
+}
+
+
+void HTTPSession::refill()
+{
+ if (!_pBuffer)
+ {
+ _pBuffer = HTTPBufferAllocator::allocate(HTTPBufferAllocator::BUFFER_SIZE);
+ }
+ _pCurrent = _pEnd = _pBuffer;
+ int n = receive(_pBuffer, HTTPBufferAllocator::BUFFER_SIZE);
+ _pEnd += n;
+}
+
+
+bool HTTPSession::connected() const
+{
+ return _socket.impl()->initialized();
+}
+
+
+void HTTPSession::connect(const SocketAddress& address)
+{
+ _socket.connect(address, _connectionTimeout);
+ _socket.setReceiveTimeout(_receiveTimeout);
+ _socket.setSendTimeout(_sendTimeout);
+ _socket.setNoDelay(true);
+ // There may be leftover data from a previous (failed) request in the buffer,
+ // so we clear it.
+ _pCurrent = _pEnd = _pBuffer;
+}
+
+
+void HTTPSession::abort()
+{
+ _socket.shutdown();
+ close();
+}
+
+
+void HTTPSession::close()
+{
+ _socket.close();
+}
+
+
+void HTTPSession::setException(const Poco::Exception& exc)
+{
+ delete _pException;
+ _pException = exc.clone();
+}
+
+
+void HTTPSession::clearException()
+{
+ delete _pException;
+ _pException = 0;
+}
+
+
+StreamSocket HTTPSession::detachSocket()
+{
+ StreamSocket oldSocket(_socket);
+ StreamSocket newSocket;
+ _socket = newSocket;
+ return oldSocket;
+}
+
+
+void HTTPSession::attachSocket(const StreamSocket& socket)
+{
+ _socket = socket;
+}
+
+
+void HTTPSession::attachSessionData(const Poco::Any& data)
+{
+ _data = data;
+}
+
+
+void HTTPSession::drainBuffer(Poco::Buffer<char>& buffer)
+{
+ buffer.assign(_pCurrent, static_cast<std::size_t>(_pEnd - _pCurrent));
+ _pCurrent = _pEnd;
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/HTTPSessionFactory.cpp b/contrib/libs/poco/Net/src/HTTPSessionFactory.cpp
index 9e12c0a3ff..e4a62da68b 100644
--- a/contrib/libs/poco/Net/src/HTTPSessionFactory.cpp
+++ b/contrib/libs/poco/Net/src/HTTPSessionFactory.cpp
@@ -1,146 +1,146 @@
-//
-// HTTPSessionFactory.cpp
-//
-// Library: Net
-// Package: HTTPClient
-// Module: HTTPSessionFactory
-//
-// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/HTTPSessionFactory.h"
-#include "Poco/Net/HTTPSessionInstantiator.h"
-#include "Poco/Exception.h"
-
-
-using Poco::SingletonHolder;
-using Poco::FastMutex;
-using Poco::NotFoundException;
-using Poco::ExistsException;
-
-
-namespace Poco {
-namespace Net {
-
-
-HTTPSessionFactory::HTTPSessionFactory():
- _proxyPort(0)
-{
-}
-
-
-HTTPSessionFactory::HTTPSessionFactory(const std::string& proxyHost, Poco::UInt16 proxyPort):
- _proxyHost(proxyHost),
- _proxyPort(proxyPort)
-{
-}
-
-
-HTTPSessionFactory::~HTTPSessionFactory()
-{
- for (Instantiators::iterator it = _instantiators.begin(); it != _instantiators.end(); ++it)
- {
- delete it->second.pIn;
- }
-}
-
-
-void HTTPSessionFactory::registerProtocol(const std::string& protocol, HTTPSessionInstantiator* pSessionInstantiator)
-{
- poco_assert_dbg(pSessionInstantiator);
-
- FastMutex::ScopedLock lock(_mutex);
- std::pair<Instantiators::iterator, bool> tmp = _instantiators.insert(make_pair(protocol, InstantiatorInfo(pSessionInstantiator)));
- if (!tmp.second)
- {
- ++tmp.first->second.cnt;
- delete pSessionInstantiator;
- }
-}
-
-
-void HTTPSessionFactory::unregisterProtocol(const std::string& protocol)
-{
- FastMutex::ScopedLock lock(_mutex);
-
- Instantiators::iterator it = _instantiators.find(protocol);
- if (it != _instantiators.end())
- {
- if (it->second.cnt == 1)
- {
- delete it->second.pIn;
- _instantiators.erase(it);
- }
- else --it->second.cnt;
- }
- else throw NotFoundException("No HTTPSessionInstantiator registered for", protocol);
-}
-
-
-bool HTTPSessionFactory::supportsProtocol(const std::string& protocol)
-{
- FastMutex::ScopedLock lock(_mutex);
-
- Instantiators::iterator it = _instantiators.find(protocol);
- return it != _instantiators.end();
-}
-
-
-HTTPClientSession* HTTPSessionFactory::createClientSession(const Poco::URI& uri)
-{
- FastMutex::ScopedLock lock(_mutex);
-
- if (uri.isRelative()) throw Poco::UnknownURISchemeException("Relative URIs are not supported by HTTPSessionFactory.");
-
- Instantiators::iterator it = _instantiators.find(uri.getScheme());
- if (it != _instantiators.end())
- {
- it->second.pIn->setProxy(_proxyHost, _proxyPort);
- it->second.pIn->setProxyCredentials(_proxyUsername, _proxyPassword);
- return it->second.pIn->createClientSession(uri);
- }
- else throw Poco::UnknownURISchemeException(uri.getScheme());
-}
-
-
-void HTTPSessionFactory::setProxy(const std::string& host, Poco::UInt16 port)
-{
- FastMutex::ScopedLock lock(_mutex);
-
- _proxyHost = host;
- _proxyPort = port;
-}
-
-
-void HTTPSessionFactory::setProxyCredentials(const std::string& username, const std::string& password)
-{
- FastMutex::ScopedLock lock(_mutex);
-
- _proxyUsername = username;
- _proxyPassword = password;
-}
-
-
-namespace
-{
- static SingletonHolder<HTTPSessionFactory> singleton;
-}
-
-
-HTTPSessionFactory& HTTPSessionFactory::defaultFactory()
-{
- return *singleton.get();
-}
-
-
-HTTPSessionFactory::InstantiatorInfo::InstantiatorInfo(HTTPSessionInstantiator* pInst): pIn(pInst), cnt(1)
-{
- poco_check_ptr (pIn);
-}
-
-
-} } // namespace Poco::Net
+//
+// HTTPSessionFactory.cpp
+//
+// Library: Net
+// Package: HTTPClient
+// Module: HTTPSessionFactory
+//
+// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/HTTPSessionFactory.h"
+#include "Poco/Net/HTTPSessionInstantiator.h"
+#include "Poco/Exception.h"
+
+
+using Poco::SingletonHolder;
+using Poco::FastMutex;
+using Poco::NotFoundException;
+using Poco::ExistsException;
+
+
+namespace Poco {
+namespace Net {
+
+
+HTTPSessionFactory::HTTPSessionFactory():
+ _proxyPort(0)
+{
+}
+
+
+HTTPSessionFactory::HTTPSessionFactory(const std::string& proxyHost, Poco::UInt16 proxyPort):
+ _proxyHost(proxyHost),
+ _proxyPort(proxyPort)
+{
+}
+
+
+HTTPSessionFactory::~HTTPSessionFactory()
+{
+ for (Instantiators::iterator it = _instantiators.begin(); it != _instantiators.end(); ++it)
+ {
+ delete it->second.pIn;
+ }
+}
+
+
+void HTTPSessionFactory::registerProtocol(const std::string& protocol, HTTPSessionInstantiator* pSessionInstantiator)
+{
+ poco_assert_dbg(pSessionInstantiator);
+
+ FastMutex::ScopedLock lock(_mutex);
+ std::pair<Instantiators::iterator, bool> tmp = _instantiators.insert(make_pair(protocol, InstantiatorInfo(pSessionInstantiator)));
+ if (!tmp.second)
+ {
+ ++tmp.first->second.cnt;
+ delete pSessionInstantiator;
+ }
+}
+
+
+void HTTPSessionFactory::unregisterProtocol(const std::string& protocol)
+{
+ FastMutex::ScopedLock lock(_mutex);
+
+ Instantiators::iterator it = _instantiators.find(protocol);
+ if (it != _instantiators.end())
+ {
+ if (it->second.cnt == 1)
+ {
+ delete it->second.pIn;
+ _instantiators.erase(it);
+ }
+ else --it->second.cnt;
+ }
+ else throw NotFoundException("No HTTPSessionInstantiator registered for", protocol);
+}
+
+
+bool HTTPSessionFactory::supportsProtocol(const std::string& protocol)
+{
+ FastMutex::ScopedLock lock(_mutex);
+
+ Instantiators::iterator it = _instantiators.find(protocol);
+ return it != _instantiators.end();
+}
+
+
+HTTPClientSession* HTTPSessionFactory::createClientSession(const Poco::URI& uri)
+{
+ FastMutex::ScopedLock lock(_mutex);
+
+ if (uri.isRelative()) throw Poco::UnknownURISchemeException("Relative URIs are not supported by HTTPSessionFactory.");
+
+ Instantiators::iterator it = _instantiators.find(uri.getScheme());
+ if (it != _instantiators.end())
+ {
+ it->second.pIn->setProxy(_proxyHost, _proxyPort);
+ it->second.pIn->setProxyCredentials(_proxyUsername, _proxyPassword);
+ return it->second.pIn->createClientSession(uri);
+ }
+ else throw Poco::UnknownURISchemeException(uri.getScheme());
+}
+
+
+void HTTPSessionFactory::setProxy(const std::string& host, Poco::UInt16 port)
+{
+ FastMutex::ScopedLock lock(_mutex);
+
+ _proxyHost = host;
+ _proxyPort = port;
+}
+
+
+void HTTPSessionFactory::setProxyCredentials(const std::string& username, const std::string& password)
+{
+ FastMutex::ScopedLock lock(_mutex);
+
+ _proxyUsername = username;
+ _proxyPassword = password;
+}
+
+
+namespace
+{
+ static SingletonHolder<HTTPSessionFactory> singleton;
+}
+
+
+HTTPSessionFactory& HTTPSessionFactory::defaultFactory()
+{
+ return *singleton.get();
+}
+
+
+HTTPSessionFactory::InstantiatorInfo::InstantiatorInfo(HTTPSessionInstantiator* pInst): pIn(pInst), cnt(1)
+{
+ poco_check_ptr (pIn);
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/HTTPSessionInstantiator.cpp b/contrib/libs/poco/Net/src/HTTPSessionInstantiator.cpp
index 5f7145fe76..d2f291f6b5 100644
--- a/contrib/libs/poco/Net/src/HTTPSessionInstantiator.cpp
+++ b/contrib/libs/poco/Net/src/HTTPSessionInstantiator.cpp
@@ -1,77 +1,77 @@
-//
-// HTTPSessionInstantiator.cpp
-//
-// Library: Net
-// Package: HTTPClient
-// Module: HTTPSessionInstantiator
-//
-// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/HTTPSessionInstantiator.h"
-#include "Poco/Net/HTTPSessionFactory.h"
-#include "Poco/Net/HTTPClientSession.h"
-
-
-using Poco::URI;
-
-
-namespace Poco {
-namespace Net {
-
-
-HTTPSessionInstantiator::HTTPSessionInstantiator():
- _proxyPort(0)
-{
-}
-
-
-HTTPSessionInstantiator::~HTTPSessionInstantiator()
-{
-}
-
-
-HTTPClientSession* HTTPSessionInstantiator::createClientSession(const Poco::URI& uri)
-{
- poco_assert (uri.getScheme() == "http");
- HTTPClientSession* pSession = new HTTPClientSession(uri.getHost(), uri.getPort());
- if (!proxyHost().empty())
- {
- pSession->setProxy(proxyHost(), proxyPort());
- pSession->setProxyCredentials(proxyUsername(), proxyPassword());
- }
- return pSession;
-}
-
-
-void HTTPSessionInstantiator::registerInstantiator()
-{
- HTTPSessionFactory::defaultFactory().registerProtocol("http", new HTTPSessionInstantiator);
-}
-
-
-void HTTPSessionInstantiator::unregisterInstantiator()
-{
- HTTPSessionFactory::defaultFactory().unregisterProtocol("http");
-}
-
-
-void HTTPSessionInstantiator::setProxy(const std::string& host, Poco::UInt16 port)
-{
- _proxyHost = host;
- _proxyPort = port;
-}
-
-
-void HTTPSessionInstantiator::setProxyCredentials(const std::string& username, const std::string& password)
-{
- _proxyUsername = username;
- _proxyPassword = password;
-}
-
-
-} } // namespace Poco::Net
+//
+// HTTPSessionInstantiator.cpp
+//
+// Library: Net
+// Package: HTTPClient
+// Module: HTTPSessionInstantiator
+//
+// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/HTTPSessionInstantiator.h"
+#include "Poco/Net/HTTPSessionFactory.h"
+#include "Poco/Net/HTTPClientSession.h"
+
+
+using Poco::URI;
+
+
+namespace Poco {
+namespace Net {
+
+
+HTTPSessionInstantiator::HTTPSessionInstantiator():
+ _proxyPort(0)
+{
+}
+
+
+HTTPSessionInstantiator::~HTTPSessionInstantiator()
+{
+}
+
+
+HTTPClientSession* HTTPSessionInstantiator::createClientSession(const Poco::URI& uri)
+{
+ poco_assert (uri.getScheme() == "http");
+ HTTPClientSession* pSession = new HTTPClientSession(uri.getHost(), uri.getPort());
+ if (!proxyHost().empty())
+ {
+ pSession->setProxy(proxyHost(), proxyPort());
+ pSession->setProxyCredentials(proxyUsername(), proxyPassword());
+ }
+ return pSession;
+}
+
+
+void HTTPSessionInstantiator::registerInstantiator()
+{
+ HTTPSessionFactory::defaultFactory().registerProtocol("http", new HTTPSessionInstantiator);
+}
+
+
+void HTTPSessionInstantiator::unregisterInstantiator()
+{
+ HTTPSessionFactory::defaultFactory().unregisterProtocol("http");
+}
+
+
+void HTTPSessionInstantiator::setProxy(const std::string& host, Poco::UInt16 port)
+{
+ _proxyHost = host;
+ _proxyPort = port;
+}
+
+
+void HTTPSessionInstantiator::setProxyCredentials(const std::string& username, const std::string& password)
+{
+ _proxyUsername = username;
+ _proxyPassword = password;
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/HTTPStream.cpp b/contrib/libs/poco/Net/src/HTTPStream.cpp
index 67e76945c4..2faeb422b0 100644
--- a/contrib/libs/poco/Net/src/HTTPStream.cpp
+++ b/contrib/libs/poco/Net/src/HTTPStream.cpp
@@ -1,173 +1,173 @@
-//
-// HTTPStream.cpp
-//
-// Library: Net
-// Package: HTTP
-// Module: HTTPStream
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/HTTPStream.h"
-#include "Poco/Net/HTTPSession.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-//
-// HTTPStreamBuf
-//
-
-
-HTTPStreamBuf::HTTPStreamBuf(HTTPSession& session, openmode mode):
- HTTPBasicStreamBuf(HTTPBufferAllocator::BUFFER_SIZE, mode),
- _session(session),
- _mode(mode)
-{
-}
-
-
-HTTPStreamBuf::~HTTPStreamBuf()
-{
-}
-
-
-void HTTPStreamBuf::close()
-{
- if (_mode & std::ios::out)
- {
- sync();
- if (!_session.getKeepAlive())
- _session.socket().shutdownSend();
- }
-}
-
-
-int HTTPStreamBuf::readFromDevice(char* buffer, std::streamsize length)
-{
- return _session.read(buffer, length);
-}
-
-
-int HTTPStreamBuf::writeToDevice(const char* buffer, std::streamsize length)
-{
-
- return _session.write(buffer, length);
-}
-
-
-//
-// HTTPIOS
-//
-
-
-HTTPIOS::HTTPIOS(HTTPSession& session, HTTPStreamBuf::openmode mode):
- _buf(session, mode)
-{
- poco_ios_init(&_buf);
-}
-
-
-HTTPIOS::~HTTPIOS()
-{
- try
- {
- _buf.close();
- }
- catch (...)
- {
- }
-}
-
-
-HTTPStreamBuf* HTTPIOS::rdbuf()
-{
- return &_buf;
-}
-
-
-//
-// HTTPInputStream
-//
-
-
-Poco::MemoryPool HTTPInputStream::_pool(sizeof(HTTPInputStream));
-
-
-HTTPInputStream::HTTPInputStream(HTTPSession& session):
- HTTPIOS(session, std::ios::in),
- std::istream(&_buf)
-{
-}
-
-
-HTTPInputStream::~HTTPInputStream()
-{
-}
-
-
-void* HTTPInputStream::operator new(std::size_t /*size*/)
-{
- return _pool.get();
-}
-
-
-void HTTPInputStream::operator delete(void* ptr)
-{
- try
- {
- _pool.release(ptr);
- }
- catch (...)
- {
- poco_unexpected();
- }
-}
-
-
-//
-// HTTPOutputStream
-//
-
-
-Poco::MemoryPool HTTPOutputStream::_pool(sizeof(HTTPOutputStream));
-
-
-HTTPOutputStream::HTTPOutputStream(HTTPSession& session):
- HTTPIOS(session, std::ios::out),
- std::ostream(&_buf)
-{
-}
-
-
-HTTPOutputStream::~HTTPOutputStream()
-{
-}
-
-
-void* HTTPOutputStream::operator new(std::size_t /*size*/)
-{
- return _pool.get();
-}
-
-
-void HTTPOutputStream::operator delete(void* ptr)
-{
- try
- {
- _pool.release(ptr);
- }
- catch (...)
- {
- poco_unexpected();
- }
-}
-
-
-} } // namespace Poco::Net
+//
+// HTTPStream.cpp
+//
+// Library: Net
+// Package: HTTP
+// Module: HTTPStream
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/HTTPStream.h"
+#include "Poco/Net/HTTPSession.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+//
+// HTTPStreamBuf
+//
+
+
+HTTPStreamBuf::HTTPStreamBuf(HTTPSession& session, openmode mode):
+ HTTPBasicStreamBuf(HTTPBufferAllocator::BUFFER_SIZE, mode),
+ _session(session),
+ _mode(mode)
+{
+}
+
+
+HTTPStreamBuf::~HTTPStreamBuf()
+{
+}
+
+
+void HTTPStreamBuf::close()
+{
+ if (_mode & std::ios::out)
+ {
+ sync();
+ if (!_session.getKeepAlive())
+ _session.socket().shutdownSend();
+ }
+}
+
+
+int HTTPStreamBuf::readFromDevice(char* buffer, std::streamsize length)
+{
+ return _session.read(buffer, length);
+}
+
+
+int HTTPStreamBuf::writeToDevice(const char* buffer, std::streamsize length)
+{
+
+ return _session.write(buffer, length);
+}
+
+
+//
+// HTTPIOS
+//
+
+
+HTTPIOS::HTTPIOS(HTTPSession& session, HTTPStreamBuf::openmode mode):
+ _buf(session, mode)
+{
+ poco_ios_init(&_buf);
+}
+
+
+HTTPIOS::~HTTPIOS()
+{
+ try
+ {
+ _buf.close();
+ }
+ catch (...)
+ {
+ }
+}
+
+
+HTTPStreamBuf* HTTPIOS::rdbuf()
+{
+ return &_buf;
+}
+
+
+//
+// HTTPInputStream
+//
+
+
+Poco::MemoryPool HTTPInputStream::_pool(sizeof(HTTPInputStream));
+
+
+HTTPInputStream::HTTPInputStream(HTTPSession& session):
+ HTTPIOS(session, std::ios::in),
+ std::istream(&_buf)
+{
+}
+
+
+HTTPInputStream::~HTTPInputStream()
+{
+}
+
+
+void* HTTPInputStream::operator new(std::size_t /*size*/)
+{
+ return _pool.get();
+}
+
+
+void HTTPInputStream::operator delete(void* ptr)
+{
+ try
+ {
+ _pool.release(ptr);
+ }
+ catch (...)
+ {
+ poco_unexpected();
+ }
+}
+
+
+//
+// HTTPOutputStream
+//
+
+
+Poco::MemoryPool HTTPOutputStream::_pool(sizeof(HTTPOutputStream));
+
+
+HTTPOutputStream::HTTPOutputStream(HTTPSession& session):
+ HTTPIOS(session, std::ios::out),
+ std::ostream(&_buf)
+{
+}
+
+
+HTTPOutputStream::~HTTPOutputStream()
+{
+}
+
+
+void* HTTPOutputStream::operator new(std::size_t /*size*/)
+{
+ return _pool.get();
+}
+
+
+void HTTPOutputStream::operator delete(void* ptr)
+{
+ try
+ {
+ _pool.release(ptr);
+ }
+ catch (...)
+ {
+ poco_unexpected();
+ }
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/HTTPStreamFactory.cpp b/contrib/libs/poco/Net/src/HTTPStreamFactory.cpp
index 5832cf1cc8..ee77d98ec4 100644
--- a/contrib/libs/poco/Net/src/HTTPStreamFactory.cpp
+++ b/contrib/libs/poco/Net/src/HTTPStreamFactory.cpp
@@ -1,187 +1,187 @@
-//
-// HTTPStreamFactory.cpp
-//
-// Library: Net
-// Package: HTTP
-// Module: HTTPStreamFactory
-//
-// Copyright (c) 2005-2012, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/HTTPStreamFactory.h"
-#include "Poco/Net/HTTPClientSession.h"
-#include "Poco/Net/HTTPIOStream.h"
-#include "Poco/Net/HTTPRequest.h"
-#include "Poco/Net/HTTPResponse.h"
-#include "Poco/Net/HTTPCredentials.h"
-#include "Poco/Net/NetException.h"
-#include "Poco/URI.h"
-#include "Poco/URIStreamOpener.h"
-#include "Poco/UnbufferedStreamBuf.h"
-#include "Poco/NullStream.h"
-#include "Poco/StreamCopier.h"
-#include "Poco/Format.h"
-#include "Poco/Version.h"
-
-
-using Poco::URIStreamFactory;
-using Poco::URI;
-using Poco::URIStreamOpener;
-using Poco::UnbufferedStreamBuf;
-
-
-namespace Poco {
-namespace Net {
-
-
-HTTPStreamFactory::HTTPStreamFactory():
- _proxyPort(HTTPSession::HTTP_PORT)
-{
-}
-
-
-HTTPStreamFactory::HTTPStreamFactory(const std::string& proxyHost, Poco::UInt16 proxyPort):
- _proxyHost(proxyHost),
- _proxyPort(proxyPort)
-{
-}
-
-
-HTTPStreamFactory::HTTPStreamFactory(const std::string& proxyHost, Poco::UInt16 proxyPort, const std::string& proxyUsername, const std::string& proxyPassword):
- _proxyHost(proxyHost),
- _proxyPort(proxyPort),
- _proxyUsername(proxyUsername),
- _proxyPassword(proxyPassword)
-{
-}
-
-
-HTTPStreamFactory::~HTTPStreamFactory()
-{
-}
-
-
-std::istream* HTTPStreamFactory::open(const URI& uri)
-{
- poco_assert (uri.getScheme() == "http");
-
- URI resolvedURI(uri);
- URI proxyUri;
- HTTPClientSession* pSession = 0;
- HTTPResponse res;
- bool retry = false;
- bool authorize = false;
- std::string username;
- std::string password;
-
- try
- {
- do
- {
- if (!pSession)
- {
- pSession = new HTTPClientSession(resolvedURI.getHost(), resolvedURI.getPort());
-
- if (proxyUri.empty())
- {
- if (!_proxyHost.empty())
- {
- pSession->setProxy(_proxyHost, _proxyPort);
- pSession->setProxyCredentials(_proxyUsername, _proxyPassword);
- }
- }
- else
- {
- pSession->setProxy(proxyUri.getHost(), proxyUri.getPort());
- if (!_proxyUsername.empty())
- {
- pSession->setProxyCredentials(_proxyUsername, _proxyPassword);
- }
- }
- }
-
- std::string path = resolvedURI.getPathAndQuery();
- if (path.empty()) path = "/";
- HTTPRequest req(HTTPRequest::HTTP_GET, path, HTTPMessage::HTTP_1_1);
-
- if (authorize)
- {
- HTTPCredentials::extractCredentials(uri, username, password);
- HTTPCredentials cred(username, password);
- cred.authenticate(req, res);
- }
-
- req.set("User-Agent", Poco::format("poco/%d.%d.%d",
- (POCO_VERSION >> 24) & 0xFF,
- (POCO_VERSION >> 16) & 0xFF,
- (POCO_VERSION >> 8) & 0xFF));
- req.set("Accept", "*/*");
-
- pSession->sendRequest(req);
- std::istream& rs = pSession->receiveResponse(res);
- bool moved = (res.getStatus() == HTTPResponse::HTTP_MOVED_PERMANENTLY ||
- res.getStatus() == HTTPResponse::HTTP_FOUND ||
- res.getStatus() == HTTPResponse::HTTP_SEE_OTHER ||
- res.getStatus() == HTTPResponse::HTTP_TEMPORARY_REDIRECT);
- if (moved)
- {
- resolvedURI.resolve(res.get("Location"));
- if (!username.empty())
- {
- resolvedURI.setUserInfo(username + ":" + password);
- }
- throw URIRedirection(resolvedURI.toString());
- }
- else if (res.getStatus() == HTTPResponse::HTTP_OK)
- {
- return new HTTPResponseStream(rs, pSession);
- }
- else if (res.getStatus() == HTTPResponse::HTTP_USE_PROXY && !retry)
- {
- // The requested resource MUST be accessed through the proxy
- // given by the Location field. The Location field gives the
- // URI of the proxy. The recipient is expected to repeat this
- // single request via the proxy. 305 responses MUST only be generated by origin servers.
- // only use for one single request!
- proxyUri.resolve(res.get("Location"));
- delete pSession;
- pSession = 0;
- retry = true; // only allow useproxy once
- }
- else if (res.getStatus() == HTTPResponse::HTTP_UNAUTHORIZED && !authorize)
- {
- authorize = true;
- retry = true;
- Poco::NullOutputStream null;
- Poco::StreamCopier::copyStream(rs, null);
- }
- else throw HTTPException(res.getReason(), uri.toString());
- }
- while (retry);
- throw HTTPException("Too many redirects", uri.toString());
- }
- catch (...)
- {
- delete pSession;
- throw;
- }
-}
-
-
-void HTTPStreamFactory::registerFactory()
-{
- URIStreamOpener::defaultOpener().registerStreamFactory("http", new HTTPStreamFactory);
-}
-
-
-void HTTPStreamFactory::unregisterFactory()
-{
- URIStreamOpener::defaultOpener().unregisterStreamFactory("http");
-}
-
-
-} } // namespace Poco::Net
+//
+// HTTPStreamFactory.cpp
+//
+// Library: Net
+// Package: HTTP
+// Module: HTTPStreamFactory
+//
+// Copyright (c) 2005-2012, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/HTTPStreamFactory.h"
+#include "Poco/Net/HTTPClientSession.h"
+#include "Poco/Net/HTTPIOStream.h"
+#include "Poco/Net/HTTPRequest.h"
+#include "Poco/Net/HTTPResponse.h"
+#include "Poco/Net/HTTPCredentials.h"
+#include "Poco/Net/NetException.h"
+#include "Poco/URI.h"
+#include "Poco/URIStreamOpener.h"
+#include "Poco/UnbufferedStreamBuf.h"
+#include "Poco/NullStream.h"
+#include "Poco/StreamCopier.h"
+#include "Poco/Format.h"
+#include "Poco/Version.h"
+
+
+using Poco::URIStreamFactory;
+using Poco::URI;
+using Poco::URIStreamOpener;
+using Poco::UnbufferedStreamBuf;
+
+
+namespace Poco {
+namespace Net {
+
+
+HTTPStreamFactory::HTTPStreamFactory():
+ _proxyPort(HTTPSession::HTTP_PORT)
+{
+}
+
+
+HTTPStreamFactory::HTTPStreamFactory(const std::string& proxyHost, Poco::UInt16 proxyPort):
+ _proxyHost(proxyHost),
+ _proxyPort(proxyPort)
+{
+}
+
+
+HTTPStreamFactory::HTTPStreamFactory(const std::string& proxyHost, Poco::UInt16 proxyPort, const std::string& proxyUsername, const std::string& proxyPassword):
+ _proxyHost(proxyHost),
+ _proxyPort(proxyPort),
+ _proxyUsername(proxyUsername),
+ _proxyPassword(proxyPassword)
+{
+}
+
+
+HTTPStreamFactory::~HTTPStreamFactory()
+{
+}
+
+
+std::istream* HTTPStreamFactory::open(const URI& uri)
+{
+ poco_assert (uri.getScheme() == "http");
+
+ URI resolvedURI(uri);
+ URI proxyUri;
+ HTTPClientSession* pSession = 0;
+ HTTPResponse res;
+ bool retry = false;
+ bool authorize = false;
+ std::string username;
+ std::string password;
+
+ try
+ {
+ do
+ {
+ if (!pSession)
+ {
+ pSession = new HTTPClientSession(resolvedURI.getHost(), resolvedURI.getPort());
+
+ if (proxyUri.empty())
+ {
+ if (!_proxyHost.empty())
+ {
+ pSession->setProxy(_proxyHost, _proxyPort);
+ pSession->setProxyCredentials(_proxyUsername, _proxyPassword);
+ }
+ }
+ else
+ {
+ pSession->setProxy(proxyUri.getHost(), proxyUri.getPort());
+ if (!_proxyUsername.empty())
+ {
+ pSession->setProxyCredentials(_proxyUsername, _proxyPassword);
+ }
+ }
+ }
+
+ std::string path = resolvedURI.getPathAndQuery();
+ if (path.empty()) path = "/";
+ HTTPRequest req(HTTPRequest::HTTP_GET, path, HTTPMessage::HTTP_1_1);
+
+ if (authorize)
+ {
+ HTTPCredentials::extractCredentials(uri, username, password);
+ HTTPCredentials cred(username, password);
+ cred.authenticate(req, res);
+ }
+
+ req.set("User-Agent", Poco::format("poco/%d.%d.%d",
+ (POCO_VERSION >> 24) & 0xFF,
+ (POCO_VERSION >> 16) & 0xFF,
+ (POCO_VERSION >> 8) & 0xFF));
+ req.set("Accept", "*/*");
+
+ pSession->sendRequest(req);
+ std::istream& rs = pSession->receiveResponse(res);
+ bool moved = (res.getStatus() == HTTPResponse::HTTP_MOVED_PERMANENTLY ||
+ res.getStatus() == HTTPResponse::HTTP_FOUND ||
+ res.getStatus() == HTTPResponse::HTTP_SEE_OTHER ||
+ res.getStatus() == HTTPResponse::HTTP_TEMPORARY_REDIRECT);
+ if (moved)
+ {
+ resolvedURI.resolve(res.get("Location"));
+ if (!username.empty())
+ {
+ resolvedURI.setUserInfo(username + ":" + password);
+ }
+ throw URIRedirection(resolvedURI.toString());
+ }
+ else if (res.getStatus() == HTTPResponse::HTTP_OK)
+ {
+ return new HTTPResponseStream(rs, pSession);
+ }
+ else if (res.getStatus() == HTTPResponse::HTTP_USE_PROXY && !retry)
+ {
+ // The requested resource MUST be accessed through the proxy
+ // given by the Location field. The Location field gives the
+ // URI of the proxy. The recipient is expected to repeat this
+ // single request via the proxy. 305 responses MUST only be generated by origin servers.
+ // only use for one single request!
+ proxyUri.resolve(res.get("Location"));
+ delete pSession;
+ pSession = 0;
+ retry = true; // only allow useproxy once
+ }
+ else if (res.getStatus() == HTTPResponse::HTTP_UNAUTHORIZED && !authorize)
+ {
+ authorize = true;
+ retry = true;
+ Poco::NullOutputStream null;
+ Poco::StreamCopier::copyStream(rs, null);
+ }
+ else throw HTTPException(res.getReason(), uri.toString());
+ }
+ while (retry);
+ throw HTTPException("Too many redirects", uri.toString());
+ }
+ catch (...)
+ {
+ delete pSession;
+ throw;
+ }
+}
+
+
+void HTTPStreamFactory::registerFactory()
+{
+ URIStreamOpener::defaultOpener().registerStreamFactory("http", new HTTPStreamFactory);
+}
+
+
+void HTTPStreamFactory::unregisterFactory()
+{
+ URIStreamOpener::defaultOpener().unregisterStreamFactory("http");
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/HostEntry.cpp b/contrib/libs/poco/Net/src/HostEntry.cpp
index 212b2837d6..3257c70311 100644
--- a/contrib/libs/poco/Net/src/HostEntry.cpp
+++ b/contrib/libs/poco/Net/src/HostEntry.cpp
@@ -1,135 +1,135 @@
-//
-// HostEntry.cpp
-//
-// Library: Net
-// Package: NetCore
-// Module: HostEntry
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/HostEntry.h"
-#include "Poco/Exception.h"
-#include <algorithm>
-
-
-namespace Poco {
-namespace Net {
-
-
-HostEntry::HostEntry()
-{
-}
-
-
-HostEntry::HostEntry(struct hostent* entry)
-{
- poco_check_ptr (entry);
-
- _name = entry->h_name;
- char** alias = entry->h_aliases;
- if (alias)
- {
- while (*alias)
- {
- _aliases.push_back(std::string(*alias));
- ++alias;
- }
- }
- char** address = entry->h_addr_list;
- if (address)
- {
- while (*address)
- {
- _addresses.push_back(IPAddress(*address, entry->h_length));
- ++address;
- }
- }
-}
-
-
-#if defined(POCO_HAVE_IPv6) || defined(POCO_HAVE_ADDRINFO)
-
-
-HostEntry::HostEntry(struct addrinfo* ainfo)
-{
- poco_check_ptr (ainfo);
-
- for (struct addrinfo* ai = ainfo; ai; ai = ai->ai_next)
- {
- if (ai->ai_canonname)
- {
- _name.assign(ai->ai_canonname);
- }
- if (ai->ai_addrlen && ai->ai_addr)
- {
- switch (ai->ai_addr->sa_family)
- {
- case AF_INET:
- _addresses.push_back(IPAddress(&reinterpret_cast<struct sockaddr_in*>(ai->ai_addr)->sin_addr, sizeof(in_addr)));
- break;
-#if defined(POCO_HAVE_IPv6)
- case AF_INET6:
- _addresses.push_back(IPAddress(&reinterpret_cast<struct sockaddr_in6*>(ai->ai_addr)->sin6_addr, sizeof(in6_addr), reinterpret_cast<struct sockaddr_in6*>(ai->ai_addr)->sin6_scope_id));
- break;
-#endif
- }
- }
- }
-}
-
-
-#endif // POCO_HAVE_IPv6
-
-
-#if defined(POCO_VXWORKS)
-
-
-HostEntry::HostEntry(const std::string& name, const IPAddress& addr):
- _name(name)
-{
- _addresses.push_back(addr);
-}
-
-
-#endif // POCO_VXWORKS
-
-
-HostEntry::HostEntry(const HostEntry& entry):
- _name(entry._name),
- _aliases(entry._aliases),
- _addresses(entry._addresses)
-{
-}
-
-
-HostEntry& HostEntry::operator = (const HostEntry& entry)
-{
- if (&entry != this)
- {
- _name = entry._name;
- _aliases = entry._aliases;
- _addresses = entry._addresses;
- }
- return *this;
-}
-
-
-void HostEntry::swap(HostEntry& hostEntry)
-{
- std::swap(_name, hostEntry._name);
- std::swap(_aliases, hostEntry._aliases);
- std::swap(_addresses, hostEntry._addresses);
-}
-
-
-HostEntry::~HostEntry()
-{
-}
-
-
-} } // namespace Poco::Net
+//
+// HostEntry.cpp
+//
+// Library: Net
+// Package: NetCore
+// Module: HostEntry
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/HostEntry.h"
+#include "Poco/Exception.h"
+#include <algorithm>
+
+
+namespace Poco {
+namespace Net {
+
+
+HostEntry::HostEntry()
+{
+}
+
+
+HostEntry::HostEntry(struct hostent* entry)
+{
+ poco_check_ptr (entry);
+
+ _name = entry->h_name;
+ char** alias = entry->h_aliases;
+ if (alias)
+ {
+ while (*alias)
+ {
+ _aliases.push_back(std::string(*alias));
+ ++alias;
+ }
+ }
+ char** address = entry->h_addr_list;
+ if (address)
+ {
+ while (*address)
+ {
+ _addresses.push_back(IPAddress(*address, entry->h_length));
+ ++address;
+ }
+ }
+}
+
+
+#if defined(POCO_HAVE_IPv6) || defined(POCO_HAVE_ADDRINFO)
+
+
+HostEntry::HostEntry(struct addrinfo* ainfo)
+{
+ poco_check_ptr (ainfo);
+
+ for (struct addrinfo* ai = ainfo; ai; ai = ai->ai_next)
+ {
+ if (ai->ai_canonname)
+ {
+ _name.assign(ai->ai_canonname);
+ }
+ if (ai->ai_addrlen && ai->ai_addr)
+ {
+ switch (ai->ai_addr->sa_family)
+ {
+ case AF_INET:
+ _addresses.push_back(IPAddress(&reinterpret_cast<struct sockaddr_in*>(ai->ai_addr)->sin_addr, sizeof(in_addr)));
+ break;
+#if defined(POCO_HAVE_IPv6)
+ case AF_INET6:
+ _addresses.push_back(IPAddress(&reinterpret_cast<struct sockaddr_in6*>(ai->ai_addr)->sin6_addr, sizeof(in6_addr), reinterpret_cast<struct sockaddr_in6*>(ai->ai_addr)->sin6_scope_id));
+ break;
+#endif
+ }
+ }
+ }
+}
+
+
+#endif // POCO_HAVE_IPv6
+
+
+#if defined(POCO_VXWORKS)
+
+
+HostEntry::HostEntry(const std::string& name, const IPAddress& addr):
+ _name(name)
+{
+ _addresses.push_back(addr);
+}
+
+
+#endif // POCO_VXWORKS
+
+
+HostEntry::HostEntry(const HostEntry& entry):
+ _name(entry._name),
+ _aliases(entry._aliases),
+ _addresses(entry._addresses)
+{
+}
+
+
+HostEntry& HostEntry::operator = (const HostEntry& entry)
+{
+ if (&entry != this)
+ {
+ _name = entry._name;
+ _aliases = entry._aliases;
+ _addresses = entry._addresses;
+ }
+ return *this;
+}
+
+
+void HostEntry::swap(HostEntry& hostEntry)
+{
+ std::swap(_name, hostEntry._name);
+ std::swap(_aliases, hostEntry._aliases);
+ std::swap(_addresses, hostEntry._addresses);
+}
+
+
+HostEntry::~HostEntry()
+{
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/ICMPClient.cpp b/contrib/libs/poco/Net/src/ICMPClient.cpp
index 40596b835e..4639d6a5fa 100644
--- a/contrib/libs/poco/Net/src/ICMPClient.cpp
+++ b/contrib/libs/poco/Net/src/ICMPClient.cpp
@@ -1,150 +1,150 @@
-//
-// ICMPClient.cpp
-//
-// Library: Net
-// Package: ICMP
-// Module: ICMPClient
-//
-// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/SocketAddress.h"
-#include "Poco/Net/ICMPClient.h"
-#include "Poco/Net/ICMPSocket.h"
-#include "Poco/Net/NetException.h"
-#include "Poco/Channel.h"
-#include "Poco/Message.h"
-#include "Poco/Exception.h"
-#include <sstream>
-
-
-using Poco::Channel;
-using Poco::Message;
-using Poco::InvalidArgumentException;
-using Poco::NotImplementedException;
-using Poco::TimeoutException;
-using Poco::Exception;
-
-
-namespace Poco {
-namespace Net {
-
-
-ICMPClient::ICMPClient(SocketAddress::Family family, int dataSize, int ttl, int timeout):
- _family(family),
- _dataSize(dataSize),
- _ttl(ttl),
- _timeout(timeout)
-{
-}
-
-
-ICMPClient::~ICMPClient()
-{
-}
-
-
-int ICMPClient::ping(const std::string& address, int repeat) const
-{
- if (repeat <= 0) return 0;
-
- SocketAddress addr(address, 0);
- return ping(addr, repeat);
-}
-
-
-int ICMPClient::ping(SocketAddress& address, int repeat) const
-{
- if (repeat <= 0) return 0;
-
- ICMPSocket icmpSocket(_family, _dataSize, _ttl, _timeout);
- SocketAddress returnAddress;
-
- ICMPEventArgs eventArgs(address, repeat, icmpSocket.dataSize(), icmpSocket.ttl());
- pingBegin.notify(this, eventArgs);
-
- for (int i = 0; i < repeat; ++i)
- {
- icmpSocket.sendTo(address);
- ++eventArgs;
-
- try
- {
- int t = icmpSocket.receiveFrom(returnAddress);
- eventArgs.setReplyTime(i, t);
- pingReply.notify(this, eventArgs);
- }
- catch (TimeoutException&)
- {
- std::ostringstream os;
- os << address.host().toString() << ": Request timed out.";
- eventArgs.setError(i, os.str());
- pingError.notify(this, eventArgs);
- continue;
- }
- catch (ICMPException& ex)
- {
- std::ostringstream os;
- os << address.host().toString() << ": " << ex.what();
- eventArgs.setError(i, os.str());
- pingError.notify(this, eventArgs);
- continue;
- }
- catch (Exception& ex)
- {
- std::ostringstream os;
- os << ex.displayText();
- eventArgs.setError(i, os.str());
- pingError.notify(this, eventArgs);
- continue;
- }
- }
- pingEnd.notify(this, eventArgs);
- return eventArgs.received();
-}
-
-
-int ICMPClient::pingIPv4(const std::string& address, int repeat,
- int dataSize, int ttl, int timeout)
-{
- if (repeat <= 0) return 0;
-
- SocketAddress a(address, 0);
- return ping(a, IPAddress::IPv4, repeat, dataSize, ttl, timeout);
-}
-
-
-int ICMPClient::ping(SocketAddress& address,
- IPAddress::Family family, int repeat,
- int dataSize, int ttl, int timeout)
-{
- if (repeat <= 0) return 0;
-
- ICMPSocket icmpSocket(family, dataSize, ttl, timeout);
- SocketAddress returnAddress;
- int received = 0;
-
- for (int i = 0; i < repeat; ++i)
- {
- icmpSocket.sendTo(address);
- try
- {
- icmpSocket.receiveFrom(returnAddress);
- ++received;
- }
- catch (TimeoutException&)
- {
- }
- catch (ICMPException&)
- {
- }
- }
- return received;
-}
-
-
-} } // namespace Poco::Net
+//
+// ICMPClient.cpp
+//
+// Library: Net
+// Package: ICMP
+// Module: ICMPClient
+//
+// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/SocketAddress.h"
+#include "Poco/Net/ICMPClient.h"
+#include "Poco/Net/ICMPSocket.h"
+#include "Poco/Net/NetException.h"
+#include "Poco/Channel.h"
+#include "Poco/Message.h"
+#include "Poco/Exception.h"
+#include <sstream>
+
+
+using Poco::Channel;
+using Poco::Message;
+using Poco::InvalidArgumentException;
+using Poco::NotImplementedException;
+using Poco::TimeoutException;
+using Poco::Exception;
+
+
+namespace Poco {
+namespace Net {
+
+
+ICMPClient::ICMPClient(SocketAddress::Family family, int dataSize, int ttl, int timeout):
+ _family(family),
+ _dataSize(dataSize),
+ _ttl(ttl),
+ _timeout(timeout)
+{
+}
+
+
+ICMPClient::~ICMPClient()
+{
+}
+
+
+int ICMPClient::ping(const std::string& address, int repeat) const
+{
+ if (repeat <= 0) return 0;
+
+ SocketAddress addr(address, 0);
+ return ping(addr, repeat);
+}
+
+
+int ICMPClient::ping(SocketAddress& address, int repeat) const
+{
+ if (repeat <= 0) return 0;
+
+ ICMPSocket icmpSocket(_family, _dataSize, _ttl, _timeout);
+ SocketAddress returnAddress;
+
+ ICMPEventArgs eventArgs(address, repeat, icmpSocket.dataSize(), icmpSocket.ttl());
+ pingBegin.notify(this, eventArgs);
+
+ for (int i = 0; i < repeat; ++i)
+ {
+ icmpSocket.sendTo(address);
+ ++eventArgs;
+
+ try
+ {
+ int t = icmpSocket.receiveFrom(returnAddress);
+ eventArgs.setReplyTime(i, t);
+ pingReply.notify(this, eventArgs);
+ }
+ catch (TimeoutException&)
+ {
+ std::ostringstream os;
+ os << address.host().toString() << ": Request timed out.";
+ eventArgs.setError(i, os.str());
+ pingError.notify(this, eventArgs);
+ continue;
+ }
+ catch (ICMPException& ex)
+ {
+ std::ostringstream os;
+ os << address.host().toString() << ": " << ex.what();
+ eventArgs.setError(i, os.str());
+ pingError.notify(this, eventArgs);
+ continue;
+ }
+ catch (Exception& ex)
+ {
+ std::ostringstream os;
+ os << ex.displayText();
+ eventArgs.setError(i, os.str());
+ pingError.notify(this, eventArgs);
+ continue;
+ }
+ }
+ pingEnd.notify(this, eventArgs);
+ return eventArgs.received();
+}
+
+
+int ICMPClient::pingIPv4(const std::string& address, int repeat,
+ int dataSize, int ttl, int timeout)
+{
+ if (repeat <= 0) return 0;
+
+ SocketAddress a(address, 0);
+ return ping(a, IPAddress::IPv4, repeat, dataSize, ttl, timeout);
+}
+
+
+int ICMPClient::ping(SocketAddress& address,
+ IPAddress::Family family, int repeat,
+ int dataSize, int ttl, int timeout)
+{
+ if (repeat <= 0) return 0;
+
+ ICMPSocket icmpSocket(family, dataSize, ttl, timeout);
+ SocketAddress returnAddress;
+ int received = 0;
+
+ for (int i = 0; i < repeat; ++i)
+ {
+ icmpSocket.sendTo(address);
+ try
+ {
+ icmpSocket.receiveFrom(returnAddress);
+ ++received;
+ }
+ catch (TimeoutException&)
+ {
+ }
+ catch (ICMPException&)
+ {
+ }
+ }
+ return received;
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/ICMPEventArgs.cpp b/contrib/libs/poco/Net/src/ICMPEventArgs.cpp
index 202f9cc0c5..3a219f9d74 100644
--- a/contrib/libs/poco/Net/src/ICMPEventArgs.cpp
+++ b/contrib/libs/poco/Net/src/ICMPEventArgs.cpp
@@ -1,168 +1,168 @@
-//
-// ICMPEventArgs.cpp
-//
-// Library: Net
-// Package: ICMP
-// Module: ICMPEventArgs
-//
-// Implementation of ICMPEventArgs
-//
-// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/ICMPEventArgs.h"
-#include "Poco/Net/SocketAddress.h"
-#include "Poco/Net/DNS.h"
-#include "Poco/Exception.h"
-#include "Poco/Net/NetException.h"
-#include <numeric>
-
-
-using Poco::IOException;
-using Poco::InvalidArgumentException;
-
-
-namespace Poco {
-namespace Net {
-
-
-ICMPEventArgs::ICMPEventArgs(const SocketAddress& address, int repetitions, int dataSize, int ttl):
- _address(address),
- _sent(0),
- _dataSize(dataSize),
- _ttl(ttl),
- _rtt(repetitions, 0),
- _errors(repetitions)
-{
-}
-
-
-ICMPEventArgs::~ICMPEventArgs()
-{
-}
-
-
-std::string ICMPEventArgs::hostName() const
-{
- try
- {
- return DNS::resolve(_address.host().toString()).name();
- }
- catch (HostNotFoundException&)
- {
- }
- catch (NoAddressFoundException&)
- {
- }
- catch (DNSException&)
- {
- }
- catch (IOException&)
- {
- }
- return _address.host().toString();
-}
-
-
-std::string ICMPEventArgs::hostAddress() const
-{
- return _address.host().toString();
-}
-
-
-void ICMPEventArgs::setRepetitions(int repetitions)
-{
- _rtt.clear();
- _rtt.resize(repetitions, 0);
- _errors.assign(repetitions, "");
-}
-
-
-ICMPEventArgs& ICMPEventArgs::operator ++ ()
-{
- ++_sent;
- return *this;
-}
-
-
-ICMPEventArgs ICMPEventArgs::operator ++ (int)
-{
- ICMPEventArgs prev(*this);
- operator ++ ();
- return prev;
-}
-
-
-int ICMPEventArgs::received() const
-{
- int received = 0;
-
- for (int i = 0; i < _rtt.size(); ++i)
- {
- if (_rtt[i]) ++received;
- }
- return received;
-}
-
-
-void ICMPEventArgs::setError(int index, const std::string& text)
-{
- if (index >= _errors.size())
- throw InvalidArgumentException("Supplied index exceeds vector capacity.");
-
- _errors[index] = text;
-}
-
-
-const std::string& ICMPEventArgs::error(int index) const
-{
- if (0 == _errors.size())
- throw InvalidArgumentException("Supplied index exceeds vector capacity.");
-
- if (-1 == index) index = _sent - 1;
-
- return _errors[index];
-}
-
-
-void ICMPEventArgs::setReplyTime(int index, int time)
-{
- if (index >= _rtt.size())
- throw InvalidArgumentException("Supplied index exceeds array capacity.");
- if (0 == time) time = 1;
- _rtt[index] = time;
-}
-
-
-int ICMPEventArgs::replyTime(int index) const
-{
- if (0 == _rtt.size())
- throw InvalidArgumentException("Supplied index exceeds array capacity.");
-
- if (-1 == index) index = _sent - 1;
-
- return _rtt[index];
-}
-
-
-int ICMPEventArgs::avgRTT() const
-{
- if (0 == _rtt.size()) return 0;
-
- return (int) (std::accumulate(_rtt.begin(), _rtt.end(), 0) / _rtt.size());
-}
-
-
-float ICMPEventArgs::percent() const
-{
- if (0 == _rtt.size()) return 0;
-
- return ((float) received() / (float) _rtt.size()) * (float) 100.0;
-}
-
-
-} } // namespace Poco::Net
+//
+// ICMPEventArgs.cpp
+//
+// Library: Net
+// Package: ICMP
+// Module: ICMPEventArgs
+//
+// Implementation of ICMPEventArgs
+//
+// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/ICMPEventArgs.h"
+#include "Poco/Net/SocketAddress.h"
+#include "Poco/Net/DNS.h"
+#include "Poco/Exception.h"
+#include "Poco/Net/NetException.h"
+#include <numeric>
+
+
+using Poco::IOException;
+using Poco::InvalidArgumentException;
+
+
+namespace Poco {
+namespace Net {
+
+
+ICMPEventArgs::ICMPEventArgs(const SocketAddress& address, int repetitions, int dataSize, int ttl):
+ _address(address),
+ _sent(0),
+ _dataSize(dataSize),
+ _ttl(ttl),
+ _rtt(repetitions, 0),
+ _errors(repetitions)
+{
+}
+
+
+ICMPEventArgs::~ICMPEventArgs()
+{
+}
+
+
+std::string ICMPEventArgs::hostName() const
+{
+ try
+ {
+ return DNS::resolve(_address.host().toString()).name();
+ }
+ catch (HostNotFoundException&)
+ {
+ }
+ catch (NoAddressFoundException&)
+ {
+ }
+ catch (DNSException&)
+ {
+ }
+ catch (IOException&)
+ {
+ }
+ return _address.host().toString();
+}
+
+
+std::string ICMPEventArgs::hostAddress() const
+{
+ return _address.host().toString();
+}
+
+
+void ICMPEventArgs::setRepetitions(int repetitions)
+{
+ _rtt.clear();
+ _rtt.resize(repetitions, 0);
+ _errors.assign(repetitions, "");
+}
+
+
+ICMPEventArgs& ICMPEventArgs::operator ++ ()
+{
+ ++_sent;
+ return *this;
+}
+
+
+ICMPEventArgs ICMPEventArgs::operator ++ (int)
+{
+ ICMPEventArgs prev(*this);
+ operator ++ ();
+ return prev;
+}
+
+
+int ICMPEventArgs::received() const
+{
+ int received = 0;
+
+ for (int i = 0; i < _rtt.size(); ++i)
+ {
+ if (_rtt[i]) ++received;
+ }
+ return received;
+}
+
+
+void ICMPEventArgs::setError(int index, const std::string& text)
+{
+ if (index >= _errors.size())
+ throw InvalidArgumentException("Supplied index exceeds vector capacity.");
+
+ _errors[index] = text;
+}
+
+
+const std::string& ICMPEventArgs::error(int index) const
+{
+ if (0 == _errors.size())
+ throw InvalidArgumentException("Supplied index exceeds vector capacity.");
+
+ if (-1 == index) index = _sent - 1;
+
+ return _errors[index];
+}
+
+
+void ICMPEventArgs::setReplyTime(int index, int time)
+{
+ if (index >= _rtt.size())
+ throw InvalidArgumentException("Supplied index exceeds array capacity.");
+ if (0 == time) time = 1;
+ _rtt[index] = time;
+}
+
+
+int ICMPEventArgs::replyTime(int index) const
+{
+ if (0 == _rtt.size())
+ throw InvalidArgumentException("Supplied index exceeds array capacity.");
+
+ if (-1 == index) index = _sent - 1;
+
+ return _rtt[index];
+}
+
+
+int ICMPEventArgs::avgRTT() const
+{
+ if (0 == _rtt.size()) return 0;
+
+ return (int) (std::accumulate(_rtt.begin(), _rtt.end(), 0) / _rtt.size());
+}
+
+
+float ICMPEventArgs::percent() const
+{
+ if (0 == _rtt.size()) return 0;
+
+ return ((float) received() / (float) _rtt.size()) * (float) 100.0;
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/ICMPPacket.cpp b/contrib/libs/poco/Net/src/ICMPPacket.cpp
index a24b77cd78..a05f7260f4 100644
--- a/contrib/libs/poco/Net/src/ICMPPacket.cpp
+++ b/contrib/libs/poco/Net/src/ICMPPacket.cpp
@@ -1,110 +1,110 @@
-//
-// ICMPPacket.cpp
-//
-// Library: Net
-// Package: ICMP
-// Module: ICMPPacket
-//
-// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/ICMPPacket.h"
-#include "Poco/Net/ICMPv4PacketImpl.h"
-#include "Poco/Net/NetException.h"
-#include "Poco/Timestamp.h"
-#include "Poco/Timespan.h"
-#include "Poco/NumberFormatter.h"
-#include <sstream>
-
-
-using Poco::InvalidArgumentException;
-using Poco::NotImplementedException;
-using Poco::Timestamp;
-using Poco::Timespan;
-using Poco::NumberFormatter;
-using Poco::UInt8;
-using Poco::UInt16;
-using Poco::Int32;
-
-
-namespace Poco {
-namespace Net {
-
-
-ICMPPacket::ICMPPacket(IPAddress::Family family, int dataSize):_pImpl(0)
-{
- if (family == IPAddress::IPv4)
- _pImpl = new ICMPv4PacketImpl(dataSize);
-#if defined(POCO_HAVE_IPv6)
- else if (family == IPAddress::IPv6)
- throw NotImplementedException("ICMPv6 packets not implemented.");
-#endif
- else throw InvalidArgumentException("Invalid or unsupported address family passed to ICMPPacket");
-}
-
-
-ICMPPacket::~ICMPPacket()
-{
- delete _pImpl;
-}
-
-
-void ICMPPacket::setDataSize(int dataSize)
-{
- _pImpl->setDataSize(dataSize);
-}
-
-
-int ICMPPacket::getDataSize() const
-{
- return _pImpl->getDataSize();
-}
-
-
-int ICMPPacket::packetSize() const
-{
- return _pImpl->packetSize();
-}
-
-
-int ICMPPacket::maxPacketSize() const
-{
- return _pImpl->maxPacketSize();
-}
-
-
-const Poco::UInt8* ICMPPacket::packet()
-{
- return _pImpl->packet();
-}
-
-
-struct timeval ICMPPacket::time(Poco::UInt8* buffer, int length) const
-{
- return _pImpl->time(buffer, length);
-}
-
-
-bool ICMPPacket::validReplyID(Poco::UInt8* buffer, int length) const
-{
- return _pImpl->validReplyID(buffer, length);
-}
-
-
-std::string ICMPPacket::errorDescription(Poco::UInt8* buffer, int length)
-{
- return _pImpl->errorDescription(buffer, length);
-}
-
-
-std::string ICMPPacket::typeDescription(int typeId)
-{
- return _pImpl->typeDescription(typeId);
-}
-
-
-} } // namespace Poco::Net
+//
+// ICMPPacket.cpp
+//
+// Library: Net
+// Package: ICMP
+// Module: ICMPPacket
+//
+// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/ICMPPacket.h"
+#include "Poco/Net/ICMPv4PacketImpl.h"
+#include "Poco/Net/NetException.h"
+#include "Poco/Timestamp.h"
+#include "Poco/Timespan.h"
+#include "Poco/NumberFormatter.h"
+#include <sstream>
+
+
+using Poco::InvalidArgumentException;
+using Poco::NotImplementedException;
+using Poco::Timestamp;
+using Poco::Timespan;
+using Poco::NumberFormatter;
+using Poco::UInt8;
+using Poco::UInt16;
+using Poco::Int32;
+
+
+namespace Poco {
+namespace Net {
+
+
+ICMPPacket::ICMPPacket(IPAddress::Family family, int dataSize):_pImpl(0)
+{
+ if (family == IPAddress::IPv4)
+ _pImpl = new ICMPv4PacketImpl(dataSize);
+#if defined(POCO_HAVE_IPv6)
+ else if (family == IPAddress::IPv6)
+ throw NotImplementedException("ICMPv6 packets not implemented.");
+#endif
+ else throw InvalidArgumentException("Invalid or unsupported address family passed to ICMPPacket");
+}
+
+
+ICMPPacket::~ICMPPacket()
+{
+ delete _pImpl;
+}
+
+
+void ICMPPacket::setDataSize(int dataSize)
+{
+ _pImpl->setDataSize(dataSize);
+}
+
+
+int ICMPPacket::getDataSize() const
+{
+ return _pImpl->getDataSize();
+}
+
+
+int ICMPPacket::packetSize() const
+{
+ return _pImpl->packetSize();
+}
+
+
+int ICMPPacket::maxPacketSize() const
+{
+ return _pImpl->maxPacketSize();
+}
+
+
+const Poco::UInt8* ICMPPacket::packet()
+{
+ return _pImpl->packet();
+}
+
+
+struct timeval ICMPPacket::time(Poco::UInt8* buffer, int length) const
+{
+ return _pImpl->time(buffer, length);
+}
+
+
+bool ICMPPacket::validReplyID(Poco::UInt8* buffer, int length) const
+{
+ return _pImpl->validReplyID(buffer, length);
+}
+
+
+std::string ICMPPacket::errorDescription(Poco::UInt8* buffer, int length)
+{
+ return _pImpl->errorDescription(buffer, length);
+}
+
+
+std::string ICMPPacket::typeDescription(int typeId)
+{
+ return _pImpl->typeDescription(typeId);
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/ICMPPacketImpl.cpp b/contrib/libs/poco/Net/src/ICMPPacketImpl.cpp
index d0f2592f61..48092c0094 100644
--- a/contrib/libs/poco/Net/src/ICMPPacketImpl.cpp
+++ b/contrib/libs/poco/Net/src/ICMPPacketImpl.cpp
@@ -1,103 +1,103 @@
-//
-// ICMPPacketImpl.cpp
-//
-// Library: Net
-// Package: ICMP
-// Module: ICMPPacketImpl
-//
-// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/ICMPPacketImpl.h"
-#include "Poco/Net/NetException.h"
-#include "Poco/Timestamp.h"
-#include "Poco/Timespan.h"
-#include "Poco/NumberFormatter.h"
-#include <sstream>
-
-
-using Poco::InvalidArgumentException;
-using Poco::Timestamp;
-using Poco::Timespan;
-using Poco::NumberFormatter;
-using Poco::UInt8;
-using Poco::UInt16;
-using Poco::Int32;
-
-
-namespace Poco {
-namespace Net {
-
-
-const UInt16 ICMPPacketImpl::MAX_PACKET_SIZE = 4096;
-const UInt16 ICMPPacketImpl::MAX_SEQ_VALUE = 65535;
-
-
-ICMPPacketImpl::ICMPPacketImpl(int dataSize):
- _seq(0),
- _pPacket(new UInt8[MAX_PACKET_SIZE]),
- _dataSize(dataSize)
-{
- if (_dataSize > MAX_PACKET_SIZE)
- throw InvalidArgumentException("Packet size must be <= " + NumberFormatter::format(MAX_PACKET_SIZE));
-}
-
-
-ICMPPacketImpl::~ICMPPacketImpl()
-{
- delete [] _pPacket;
-}
-
-
-void ICMPPacketImpl::setDataSize(int dataSize)
-{
- _dataSize = dataSize;
- initPacket();
-}
-
-
-int ICMPPacketImpl::getDataSize() const
-{
- return _dataSize;
-}
-
-
-const Poco::UInt8* ICMPPacketImpl::packet(bool init)
-{
- if (init) initPacket();
- return _pPacket;
-}
-
-
-unsigned short ICMPPacketImpl::checksum(UInt16 *addr, Int32 len)
-{
- Int32 nleft = len;
- UInt16* w = addr;
- UInt16 answer;
- Int32 sum = 0;
-
- while (nleft > 1)
- {
- sum += *w++;
- nleft -= sizeof(UInt16);
- }
-
- if (nleft == 1)
- {
- UInt16 u = 0;
- *(UInt8*) (&u) = *(UInt8*) w;
- sum += u;
- }
-
- sum = (sum >> 16) + (sum & 0xffff);
- sum += (sum >> 16);
- answer = static_cast<UInt16>(~sum);
- return answer;
-}
-
-
-} } // namespace Poco::Net
+//
+// ICMPPacketImpl.cpp
+//
+// Library: Net
+// Package: ICMP
+// Module: ICMPPacketImpl
+//
+// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/ICMPPacketImpl.h"
+#include "Poco/Net/NetException.h"
+#include "Poco/Timestamp.h"
+#include "Poco/Timespan.h"
+#include "Poco/NumberFormatter.h"
+#include <sstream>
+
+
+using Poco::InvalidArgumentException;
+using Poco::Timestamp;
+using Poco::Timespan;
+using Poco::NumberFormatter;
+using Poco::UInt8;
+using Poco::UInt16;
+using Poco::Int32;
+
+
+namespace Poco {
+namespace Net {
+
+
+const UInt16 ICMPPacketImpl::MAX_PACKET_SIZE = 4096;
+const UInt16 ICMPPacketImpl::MAX_SEQ_VALUE = 65535;
+
+
+ICMPPacketImpl::ICMPPacketImpl(int dataSize):
+ _seq(0),
+ _pPacket(new UInt8[MAX_PACKET_SIZE]),
+ _dataSize(dataSize)
+{
+ if (_dataSize > MAX_PACKET_SIZE)
+ throw InvalidArgumentException("Packet size must be <= " + NumberFormatter::format(MAX_PACKET_SIZE));
+}
+
+
+ICMPPacketImpl::~ICMPPacketImpl()
+{
+ delete [] _pPacket;
+}
+
+
+void ICMPPacketImpl::setDataSize(int dataSize)
+{
+ _dataSize = dataSize;
+ initPacket();
+}
+
+
+int ICMPPacketImpl::getDataSize() const
+{
+ return _dataSize;
+}
+
+
+const Poco::UInt8* ICMPPacketImpl::packet(bool init)
+{
+ if (init) initPacket();
+ return _pPacket;
+}
+
+
+unsigned short ICMPPacketImpl::checksum(UInt16 *addr, Int32 len)
+{
+ Int32 nleft = len;
+ UInt16* w = addr;
+ UInt16 answer;
+ Int32 sum = 0;
+
+ while (nleft > 1)
+ {
+ sum += *w++;
+ nleft -= sizeof(UInt16);
+ }
+
+ if (nleft == 1)
+ {
+ UInt16 u = 0;
+ *(UInt8*) (&u) = *(UInt8*) w;
+ sum += u;
+ }
+
+ sum = (sum >> 16) + (sum & 0xffff);
+ sum += (sum >> 16);
+ answer = static_cast<UInt16>(~sum);
+ return answer;
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/ICMPSocket.cpp b/contrib/libs/poco/Net/src/ICMPSocket.cpp
index d09e8c0ef1..4e66c237ae 100644
--- a/contrib/libs/poco/Net/src/ICMPSocket.cpp
+++ b/contrib/libs/poco/Net/src/ICMPSocket.cpp
@@ -1,94 +1,94 @@
-//
-// ICMPSocket.cpp
-//
-// Library: Net
-// Package: ICMP
-// Module: ICMPSocket
-//
-// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/ICMPSocket.h"
-#include "Poco/Net/ICMPSocketImpl.h"
-#include "Poco/Exception.h"
-
-
-using Poco::InvalidArgumentException;
-
-
-namespace Poco {
-namespace Net {
-
-
-ICMPSocket::ICMPSocket(IPAddress::Family family, int dataSize, int ttl, int timeout):
- Socket(new ICMPSocketImpl(family, dataSize, ttl, timeout))
-{
-}
-
-
-ICMPSocket::ICMPSocket(const Socket& socket):
- Socket(socket)
-{
- if (!dynamic_cast<ICMPSocketImpl*>(impl()))
- throw InvalidArgumentException("Cannot assign incompatible socket");
-}
-
-
-ICMPSocket::ICMPSocket(SocketImpl* pImpl):
- Socket(pImpl)
-{
- if (!dynamic_cast<ICMPSocketImpl*>(impl()))
- throw InvalidArgumentException("Cannot assign incompatible socket");
-}
-
-
-ICMPSocket::~ICMPSocket()
-{
-}
-
-
-ICMPSocket& ICMPSocket::operator = (const Socket& socket)
-{
- if (dynamic_cast<ICMPSocketImpl*>(socket.impl()))
- Socket::operator = (socket);
- else
- throw InvalidArgumentException("Cannot assign incompatible socket");
- return *this;
-}
-
-
-int ICMPSocket::sendTo(const SocketAddress& address, int flags)
-{
- return impl()->sendTo(0, 0, address, flags);
-}
-
-
-int ICMPSocket::receiveFrom(SocketAddress& address, int flags)
-{
- return impl()->receiveFrom(0, 0, address, flags);
-}
-
-
-int ICMPSocket::dataSize() const
-{
- return static_cast<ICMPSocketImpl*>(impl())->dataSize();
-}
-
-
-int ICMPSocket::ttl() const
-{
- return static_cast<ICMPSocketImpl*>(impl())->ttl();
-}
-
-
-int ICMPSocket::timeout() const
-{
- return static_cast<ICMPSocketImpl*>(impl())->timeout();
-}
-
-
-} } // namespace Poco::Net
+//
+// ICMPSocket.cpp
+//
+// Library: Net
+// Package: ICMP
+// Module: ICMPSocket
+//
+// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/ICMPSocket.h"
+#include "Poco/Net/ICMPSocketImpl.h"
+#include "Poco/Exception.h"
+
+
+using Poco::InvalidArgumentException;
+
+
+namespace Poco {
+namespace Net {
+
+
+ICMPSocket::ICMPSocket(IPAddress::Family family, int dataSize, int ttl, int timeout):
+ Socket(new ICMPSocketImpl(family, dataSize, ttl, timeout))
+{
+}
+
+
+ICMPSocket::ICMPSocket(const Socket& socket):
+ Socket(socket)
+{
+ if (!dynamic_cast<ICMPSocketImpl*>(impl()))
+ throw InvalidArgumentException("Cannot assign incompatible socket");
+}
+
+
+ICMPSocket::ICMPSocket(SocketImpl* pImpl):
+ Socket(pImpl)
+{
+ if (!dynamic_cast<ICMPSocketImpl*>(impl()))
+ throw InvalidArgumentException("Cannot assign incompatible socket");
+}
+
+
+ICMPSocket::~ICMPSocket()
+{
+}
+
+
+ICMPSocket& ICMPSocket::operator = (const Socket& socket)
+{
+ if (dynamic_cast<ICMPSocketImpl*>(socket.impl()))
+ Socket::operator = (socket);
+ else
+ throw InvalidArgumentException("Cannot assign incompatible socket");
+ return *this;
+}
+
+
+int ICMPSocket::sendTo(const SocketAddress& address, int flags)
+{
+ return impl()->sendTo(0, 0, address, flags);
+}
+
+
+int ICMPSocket::receiveFrom(SocketAddress& address, int flags)
+{
+ return impl()->receiveFrom(0, 0, address, flags);
+}
+
+
+int ICMPSocket::dataSize() const
+{
+ return static_cast<ICMPSocketImpl*>(impl())->dataSize();
+}
+
+
+int ICMPSocket::ttl() const
+{
+ return static_cast<ICMPSocketImpl*>(impl())->ttl();
+}
+
+
+int ICMPSocket::timeout() const
+{
+ return static_cast<ICMPSocketImpl*>(impl())->timeout();
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/ICMPSocketImpl.cpp b/contrib/libs/poco/Net/src/ICMPSocketImpl.cpp
index b68748e2ab..8c68d53030 100644
--- a/contrib/libs/poco/Net/src/ICMPSocketImpl.cpp
+++ b/contrib/libs/poco/Net/src/ICMPSocketImpl.cpp
@@ -1,97 +1,97 @@
-//
-// ICMPSocketImpl.cpp
-//
-// Library: Net
-// Package: ICMP
-// Module: ICMPSocketImpl
-//
-// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/ICMPSocketImpl.h"
-#include "Poco/Net/NetException.h"
-#include "Poco/Timespan.h"
-#include "Poco/Timestamp.h"
-#include "Poco/Exception.h"
-#include "Poco/Buffer.h"
-
-
-using Poco::TimeoutException;
-using Poco::Timespan;
-using Poco::Exception;
-
-
-namespace Poco {
-namespace Net {
-
-
-ICMPSocketImpl::ICMPSocketImpl(IPAddress::Family family, int dataSize, int ttl, int timeout):
- RawSocketImpl(family, IPPROTO_ICMP),
- _icmpPacket(family, dataSize),
- _ttl(ttl),
- _timeout(timeout)
-{
- setOption(IPPROTO_IP, IP_TTL, ttl);
- setReceiveTimeout(Timespan(timeout));
-}
-
-
-ICMPSocketImpl::~ICMPSocketImpl()
-{
-}
-
-
-int ICMPSocketImpl::sendTo(const void*, int, const SocketAddress& address, int flags)
-{
- int n = SocketImpl::sendTo(_icmpPacket.packet(), _icmpPacket.packetSize(), address, flags);
- return n;
-}
-
-
-int ICMPSocketImpl::receiveFrom(void*, int, SocketAddress& address, int flags)
-{
- int maxPacketSize = _icmpPacket.maxPacketSize();
- Poco::Buffer<unsigned char> buffer(maxPacketSize);
-
- try
- {
- Poco::Timestamp ts;
- do
- {
- if (ts.isElapsed(_timeout))
- {
- // This guards against a possible DoS attack, where sending
- // fake ping responses will cause an endless loop.
- throw TimeoutException();
- }
- SocketImpl::receiveFrom(buffer.begin(), maxPacketSize, address, flags);
- }
- while (!_icmpPacket.validReplyID(buffer.begin(), maxPacketSize));
- }
- catch (TimeoutException&)
- {
- throw;
- }
- catch (Exception&)
- {
- std::string err = _icmpPacket.errorDescription(buffer.begin(), maxPacketSize);
- if (!err.empty())
- throw ICMPException(err);
- else
- throw;
- }
-
- struct timeval then = _icmpPacket.time(buffer.begin(), maxPacketSize);
- struct timeval now = _icmpPacket.time();
-
- int elapsed = (((now.tv_sec * 1000000) + now.tv_usec) - ((then.tv_sec * 1000000) + then.tv_usec))/1000;
-
- return elapsed;
-}
-
-
-} } // namespace Poco::Net
+//
+// ICMPSocketImpl.cpp
+//
+// Library: Net
+// Package: ICMP
+// Module: ICMPSocketImpl
+//
+// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/ICMPSocketImpl.h"
+#include "Poco/Net/NetException.h"
+#include "Poco/Timespan.h"
+#include "Poco/Timestamp.h"
+#include "Poco/Exception.h"
+#include "Poco/Buffer.h"
+
+
+using Poco::TimeoutException;
+using Poco::Timespan;
+using Poco::Exception;
+
+
+namespace Poco {
+namespace Net {
+
+
+ICMPSocketImpl::ICMPSocketImpl(IPAddress::Family family, int dataSize, int ttl, int timeout):
+ RawSocketImpl(family, IPPROTO_ICMP),
+ _icmpPacket(family, dataSize),
+ _ttl(ttl),
+ _timeout(timeout)
+{
+ setOption(IPPROTO_IP, IP_TTL, ttl);
+ setReceiveTimeout(Timespan(timeout));
+}
+
+
+ICMPSocketImpl::~ICMPSocketImpl()
+{
+}
+
+
+int ICMPSocketImpl::sendTo(const void*, int, const SocketAddress& address, int flags)
+{
+ int n = SocketImpl::sendTo(_icmpPacket.packet(), _icmpPacket.packetSize(), address, flags);
+ return n;
+}
+
+
+int ICMPSocketImpl::receiveFrom(void*, int, SocketAddress& address, int flags)
+{
+ int maxPacketSize = _icmpPacket.maxPacketSize();
+ Poco::Buffer<unsigned char> buffer(maxPacketSize);
+
+ try
+ {
+ Poco::Timestamp ts;
+ do
+ {
+ if (ts.isElapsed(_timeout))
+ {
+ // This guards against a possible DoS attack, where sending
+ // fake ping responses will cause an endless loop.
+ throw TimeoutException();
+ }
+ SocketImpl::receiveFrom(buffer.begin(), maxPacketSize, address, flags);
+ }
+ while (!_icmpPacket.validReplyID(buffer.begin(), maxPacketSize));
+ }
+ catch (TimeoutException&)
+ {
+ throw;
+ }
+ catch (Exception&)
+ {
+ std::string err = _icmpPacket.errorDescription(buffer.begin(), maxPacketSize);
+ if (!err.empty())
+ throw ICMPException(err);
+ else
+ throw;
+ }
+
+ struct timeval then = _icmpPacket.time(buffer.begin(), maxPacketSize);
+ struct timeval now = _icmpPacket.time();
+
+ int elapsed = (((now.tv_sec * 1000000) + now.tv_usec) - ((then.tv_sec * 1000000) + then.tv_usec))/1000;
+
+ return elapsed;
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/ICMPv4PacketImpl.cpp b/contrib/libs/poco/Net/src/ICMPv4PacketImpl.cpp
index 851e4d7ce5..7df987a6fd 100644
--- a/contrib/libs/poco/Net/src/ICMPv4PacketImpl.cpp
+++ b/contrib/libs/poco/Net/src/ICMPv4PacketImpl.cpp
@@ -1,263 +1,263 @@
-//
-// ICMPv4PacketImpl.cpp
-//
-// Library: Net
-// Package: ICMP
-// Module: ICMPv4PacketImpl
-//
-// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/ICMPv4PacketImpl.h"
-#include "Poco/Net/NetException.h"
-#include "Poco/Timestamp.h"
-#include "Poco/Timespan.h"
-#include "Poco/NumberFormatter.h"
-#if !defined(POCO_VXWORKS)
-#include "Poco/Process.h"
-#endif
-#include <sstream>
-
-
-using Poco::InvalidArgumentException;
-using Poco::Timestamp;
-using Poco::Timespan;
-using Poco::NumberFormatter;
-using Poco::UInt8;
-using Poco::UInt16;
-using Poco::Int32;
-
-
-namespace Poco {
-namespace Net {
-
-
-const UInt8 ICMPv4PacketImpl::DESTINATION_UNREACHABLE_TYPE = 3;
-const Poco::UInt8 ICMPv4PacketImpl::SOURCE_QUENCH_TYPE = 4;
-const Poco::UInt8 ICMPv4PacketImpl::REDIRECT_MESSAGE_TYPE = 5;
-const UInt8 ICMPv4PacketImpl::TIME_EXCEEDED_TYPE = 11;
-const Poco::UInt8 ICMPv4PacketImpl::PARAMETER_PROBLEM_TYPE = 12;
-
-
-const std::string ICMPv4PacketImpl::MESSAGE_TYPE[] =
-{
- "Echo Reply",
- "ICMP 1",
- "ICMP 2",
- "Dest Unreachable",
- "Source Quench",
- "Redirect",
- "ICMP 6",
- "ICMP 7",
- "Echo",
- "ICMP 9",
- "ICMP 10",
- "Time Exceeded",
- "Parameter Problem",
- "Timestamp",
- "Timestamp Reply",
- "Info Request",
- "Info Reply",
- "Unknown type"
-};
-
-
-const std::string ICMPv4PacketImpl::DESTINATION_UNREACHABLE_CODE[] =
-{
- "Net unreachable",
- "Host unreachable",
- "Protocol unreachable",
- "Port unreachable",
- "Fragmentation needed and DF set",
- "Source route failed",
- "Unknown code"
-};
-
-
-const std::string ICMPv4PacketImpl::REDIRECT_MESSAGE_CODE[] =
-{
- "Redirect datagrams for the network",
- "Redirect datagrams for the host",
- "Redirect datagrams for the type of service and network",
- "Redirect datagrams for the type of service and host",
- "Unknown code"
-};
-
-
-const std::string ICMPv4PacketImpl::TIME_EXCEEDED_CODE[] =
-{
- "Time to live exceeded in transit",
- "Fragment reassembly time exceeded",
- "Unknown code"
-};
-
-
-const std::string ICMPv4PacketImpl::PARAMETER_PROBLEM_CODE[] =
-{
- "Pointer indicates the error",
- "Unknown code"
-};
-
-
-ICMPv4PacketImpl::ICMPv4PacketImpl(int dataSize)
- : ICMPPacketImpl(dataSize),
- _seq(0)
-{
- initPacket();
-}
-
-
-ICMPv4PacketImpl::~ICMPv4PacketImpl()
-{
-}
-
-
-int ICMPv4PacketImpl::packetSize() const
-{
- return getDataSize() + sizeof(Header);
-}
-
-
-void ICMPv4PacketImpl::initPacket()
-{
- if (_seq >= MAX_SEQ_VALUE) resetSequence();
-
- Header* icp = (Header*) packet(false);
- icp->type = ECHO_REQUEST;
- icp->code = 0;
- icp->checksum = 0;
- icp->seq = ++_seq;
-#if defined(POCO_VXWORKS)
- icp->id = 0;
-#else
- icp->id = static_cast<UInt16>(Poco::Process::id());
-#endif
-
- struct timeval* ptp = (struct timeval *) (icp + 1);
- *ptp = time();
-
- icp->checksum = checksum((UInt16*) icp, getDataSize() + sizeof(Header));
-}
-
-
-struct timeval ICMPv4PacketImpl::time(Poco::UInt8* buffer, int length) const
-{
- struct timeval tv;
-
- if (0 == buffer || 0 == length)
- {
- Timespan value(Timestamp().epochMicroseconds());
- tv.tv_sec = (long) value.totalSeconds();
- tv.tv_usec = (long) value.useconds();
- }
- else
- {
- struct timeval* ptv = (struct timeval*) data(buffer, length);
- if (ptv) tv = *ptv;
- else throw InvalidArgumentException("Invalid packet.");
- }
- return tv;
-}
-
-
-ICMPv4PacketImpl::Header* ICMPv4PacketImpl::header(Poco::UInt8* buffer, int length) const
-{
- poco_check_ptr (buffer);
-
- int offset = (buffer[0] & 0x0F) * 4;
- if ((offset + sizeof(Header)) > length) return 0;
-
- buffer += offset;
- return (Header *) buffer;
-}
-
-
-Poco::UInt8* ICMPv4PacketImpl::data(Poco::UInt8* buffer, int length) const
-{
- return ((Poco::UInt8*) header(buffer, length)) + sizeof(Header);
-}
-
-
-bool ICMPv4PacketImpl::validReplyID(Poco::UInt8* buffer, int length) const
-{
- Header *icp = header(buffer, length);
-#if defined(POCO_VXWORKS)
- return icp && icp->id == 0;
-#else
- return icp && (static_cast<Poco::UInt16>(Process::id()) == icp->id);
-#endif
-}
-
-
-std::string ICMPv4PacketImpl::errorDescription(unsigned char* buffer, int length)
-{
- Header *icp = header(buffer, length);
-
- if (!icp) return "Invalid header.";
- if (ECHO_REPLY == icp->type) return std::string(); // not an error
-
- UInt8 pointer = 0;
- if (PARAMETER_PROBLEM == icp->type)
- {
- UInt8 mask = 0x00FF;
- pointer = icp->id & mask;
- }
-
- MessageType type = static_cast<MessageType>(icp->type);
- int code = icp->code;
- std::ostringstream err;
-
- switch (type)
- {
- case DESTINATION_UNREACHABLE_TYPE:
- if (code >= NET_UNREACHABLE && code < DESTINATION_UNREACHABLE_UNKNOWN)
- err << DESTINATION_UNREACHABLE_CODE[code];
- else
- err << DESTINATION_UNREACHABLE_CODE[DESTINATION_UNREACHABLE_UNKNOWN];
- break;
-
- case SOURCE_QUENCH_TYPE:
- err << "Source quench";
- break;
-
- case REDIRECT_MESSAGE_TYPE:
- if (code >= REDIRECT_NETWORK && code < REDIRECT_MESSAGE_UNKNOWN)
- err << REDIRECT_MESSAGE_CODE[code];
- else
- err << REDIRECT_MESSAGE_CODE[REDIRECT_MESSAGE_UNKNOWN];
- break;
-
- case TIME_EXCEEDED_TYPE:
- if (code >= TIME_TO_LIVE || code < TIME_EXCEEDED_UNKNOWN)
- err << TIME_EXCEEDED_CODE[code];
- else
- err << TIME_EXCEEDED_CODE[TIME_EXCEEDED_UNKNOWN];
- break;
-
- case PARAMETER_PROBLEM_TYPE:
- if (POINTER_INDICATES_THE_ERROR != code)
- code = PARAMETER_PROBLEM_UNKNOWN;
- err << PARAMETER_PROBLEM_CODE[code] << ": error in octet #" << pointer;
- break;
-
- default:
- err << "Unknown type.";
- break;
- }
-
- return err.str();
-}
-
-std::string ICMPv4PacketImpl::typeDescription(int typeId)
-{
- poco_assert (typeId >= ECHO_REPLY && typeId < MESSAGE_TYPE_LENGTH);
-
- return MESSAGE_TYPE[typeId];
-}
-
-
-} } // namespace Poco::Net
+//
+// ICMPv4PacketImpl.cpp
+//
+// Library: Net
+// Package: ICMP
+// Module: ICMPv4PacketImpl
+//
+// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/ICMPv4PacketImpl.h"
+#include "Poco/Net/NetException.h"
+#include "Poco/Timestamp.h"
+#include "Poco/Timespan.h"
+#include "Poco/NumberFormatter.h"
+#if !defined(POCO_VXWORKS)
+#include "Poco/Process.h"
+#endif
+#include <sstream>
+
+
+using Poco::InvalidArgumentException;
+using Poco::Timestamp;
+using Poco::Timespan;
+using Poco::NumberFormatter;
+using Poco::UInt8;
+using Poco::UInt16;
+using Poco::Int32;
+
+
+namespace Poco {
+namespace Net {
+
+
+const UInt8 ICMPv4PacketImpl::DESTINATION_UNREACHABLE_TYPE = 3;
+const Poco::UInt8 ICMPv4PacketImpl::SOURCE_QUENCH_TYPE = 4;
+const Poco::UInt8 ICMPv4PacketImpl::REDIRECT_MESSAGE_TYPE = 5;
+const UInt8 ICMPv4PacketImpl::TIME_EXCEEDED_TYPE = 11;
+const Poco::UInt8 ICMPv4PacketImpl::PARAMETER_PROBLEM_TYPE = 12;
+
+
+const std::string ICMPv4PacketImpl::MESSAGE_TYPE[] =
+{
+ "Echo Reply",
+ "ICMP 1",
+ "ICMP 2",
+ "Dest Unreachable",
+ "Source Quench",
+ "Redirect",
+ "ICMP 6",
+ "ICMP 7",
+ "Echo",
+ "ICMP 9",
+ "ICMP 10",
+ "Time Exceeded",
+ "Parameter Problem",
+ "Timestamp",
+ "Timestamp Reply",
+ "Info Request",
+ "Info Reply",
+ "Unknown type"
+};
+
+
+const std::string ICMPv4PacketImpl::DESTINATION_UNREACHABLE_CODE[] =
+{
+ "Net unreachable",
+ "Host unreachable",
+ "Protocol unreachable",
+ "Port unreachable",
+ "Fragmentation needed and DF set",
+ "Source route failed",
+ "Unknown code"
+};
+
+
+const std::string ICMPv4PacketImpl::REDIRECT_MESSAGE_CODE[] =
+{
+ "Redirect datagrams for the network",
+ "Redirect datagrams for the host",
+ "Redirect datagrams for the type of service and network",
+ "Redirect datagrams for the type of service and host",
+ "Unknown code"
+};
+
+
+const std::string ICMPv4PacketImpl::TIME_EXCEEDED_CODE[] =
+{
+ "Time to live exceeded in transit",
+ "Fragment reassembly time exceeded",
+ "Unknown code"
+};
+
+
+const std::string ICMPv4PacketImpl::PARAMETER_PROBLEM_CODE[] =
+{
+ "Pointer indicates the error",
+ "Unknown code"
+};
+
+
+ICMPv4PacketImpl::ICMPv4PacketImpl(int dataSize)
+ : ICMPPacketImpl(dataSize),
+ _seq(0)
+{
+ initPacket();
+}
+
+
+ICMPv4PacketImpl::~ICMPv4PacketImpl()
+{
+}
+
+
+int ICMPv4PacketImpl::packetSize() const
+{
+ return getDataSize() + sizeof(Header);
+}
+
+
+void ICMPv4PacketImpl::initPacket()
+{
+ if (_seq >= MAX_SEQ_VALUE) resetSequence();
+
+ Header* icp = (Header*) packet(false);
+ icp->type = ECHO_REQUEST;
+ icp->code = 0;
+ icp->checksum = 0;
+ icp->seq = ++_seq;
+#if defined(POCO_VXWORKS)
+ icp->id = 0;
+#else
+ icp->id = static_cast<UInt16>(Poco::Process::id());
+#endif
+
+ struct timeval* ptp = (struct timeval *) (icp + 1);
+ *ptp = time();
+
+ icp->checksum = checksum((UInt16*) icp, getDataSize() + sizeof(Header));
+}
+
+
+struct timeval ICMPv4PacketImpl::time(Poco::UInt8* buffer, int length) const
+{
+ struct timeval tv;
+
+ if (0 == buffer || 0 == length)
+ {
+ Timespan value(Timestamp().epochMicroseconds());
+ tv.tv_sec = (long) value.totalSeconds();
+ tv.tv_usec = (long) value.useconds();
+ }
+ else
+ {
+ struct timeval* ptv = (struct timeval*) data(buffer, length);
+ if (ptv) tv = *ptv;
+ else throw InvalidArgumentException("Invalid packet.");
+ }
+ return tv;
+}
+
+
+ICMPv4PacketImpl::Header* ICMPv4PacketImpl::header(Poco::UInt8* buffer, int length) const
+{
+ poco_check_ptr (buffer);
+
+ int offset = (buffer[0] & 0x0F) * 4;
+ if ((offset + sizeof(Header)) > length) return 0;
+
+ buffer += offset;
+ return (Header *) buffer;
+}
+
+
+Poco::UInt8* ICMPv4PacketImpl::data(Poco::UInt8* buffer, int length) const
+{
+ return ((Poco::UInt8*) header(buffer, length)) + sizeof(Header);
+}
+
+
+bool ICMPv4PacketImpl::validReplyID(Poco::UInt8* buffer, int length) const
+{
+ Header *icp = header(buffer, length);
+#if defined(POCO_VXWORKS)
+ return icp && icp->id == 0;
+#else
+ return icp && (static_cast<Poco::UInt16>(Process::id()) == icp->id);
+#endif
+}
+
+
+std::string ICMPv4PacketImpl::errorDescription(unsigned char* buffer, int length)
+{
+ Header *icp = header(buffer, length);
+
+ if (!icp) return "Invalid header.";
+ if (ECHO_REPLY == icp->type) return std::string(); // not an error
+
+ UInt8 pointer = 0;
+ if (PARAMETER_PROBLEM == icp->type)
+ {
+ UInt8 mask = 0x00FF;
+ pointer = icp->id & mask;
+ }
+
+ MessageType type = static_cast<MessageType>(icp->type);
+ int code = icp->code;
+ std::ostringstream err;
+
+ switch (type)
+ {
+ case DESTINATION_UNREACHABLE_TYPE:
+ if (code >= NET_UNREACHABLE && code < DESTINATION_UNREACHABLE_UNKNOWN)
+ err << DESTINATION_UNREACHABLE_CODE[code];
+ else
+ err << DESTINATION_UNREACHABLE_CODE[DESTINATION_UNREACHABLE_UNKNOWN];
+ break;
+
+ case SOURCE_QUENCH_TYPE:
+ err << "Source quench";
+ break;
+
+ case REDIRECT_MESSAGE_TYPE:
+ if (code >= REDIRECT_NETWORK && code < REDIRECT_MESSAGE_UNKNOWN)
+ err << REDIRECT_MESSAGE_CODE[code];
+ else
+ err << REDIRECT_MESSAGE_CODE[REDIRECT_MESSAGE_UNKNOWN];
+ break;
+
+ case TIME_EXCEEDED_TYPE:
+ if (code >= TIME_TO_LIVE || code < TIME_EXCEEDED_UNKNOWN)
+ err << TIME_EXCEEDED_CODE[code];
+ else
+ err << TIME_EXCEEDED_CODE[TIME_EXCEEDED_UNKNOWN];
+ break;
+
+ case PARAMETER_PROBLEM_TYPE:
+ if (POINTER_INDICATES_THE_ERROR != code)
+ code = PARAMETER_PROBLEM_UNKNOWN;
+ err << PARAMETER_PROBLEM_CODE[code] << ": error in octet #" << pointer;
+ break;
+
+ default:
+ err << "Unknown type.";
+ break;
+ }
+
+ return err.str();
+}
+
+std::string ICMPv4PacketImpl::typeDescription(int typeId)
+{
+ poco_assert (typeId >= ECHO_REPLY && typeId < MESSAGE_TYPE_LENGTH);
+
+ return MESSAGE_TYPE[typeId];
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/IPAddress.cpp b/contrib/libs/poco/Net/src/IPAddress.cpp
index 69e433e1b8..e34a02181b 100644
--- a/contrib/libs/poco/Net/src/IPAddress.cpp
+++ b/contrib/libs/poco/Net/src/IPAddress.cpp
@@ -1,601 +1,601 @@
-//
-// IPAddress.cpp
-//
-// Library: Net
-// Package: NetCore
-// Module: IPAddress
-//
-// Copyright (c) 2005-2011, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/IPAddress.h"
-#include "Poco/Net/NetException.h"
-#include "Poco/RefCountedObject.h"
-#include "Poco/NumberFormatter.h"
-#include "Poco/BinaryReader.h"
-#include "Poco/BinaryWriter.h"
-#include "Poco/String.h"
-#include "Poco/Types.h"
-
-
-using Poco::RefCountedObject;
-using Poco::NumberFormatter;
-using Poco::BinaryReader;
-using Poco::BinaryWriter;
-using Poco::toLower;
-using Poco::trim;
-using Poco::UInt8;
-using Poco::UInt16;
-using Poco::UInt32;
-using Poco::Net::Impl::IPAddressImpl;
-using Poco::Net::Impl::IPv4AddressImpl;
-#if defined(POCO_HAVE_IPv6)
-using Poco::Net::Impl::IPv6AddressImpl;
-#endif
-
-
-namespace Poco {
-namespace Net {
-
-
-#if !defined(_MSC_VER) || defined(__STDC__)
-// Go home MSVC, you're drunk...
-// See http://stackoverflow.com/questions/5899857/multiple-definition-error-for-static-const-class-members
-const IPAddress::Family IPAddress::IPv4;
-#if defined(POCO_HAVE_IPv6)
-const IPAddress::Family IPAddress::IPv6;
-#endif
-#endif
-
-
-IPAddress::IPAddress()
-{
- newIPv4();
-}
-
-
-IPAddress::IPAddress(const IPAddress& addr)
-{
- if (addr.family() == IPv4)
- newIPv4(addr.addr());
-#if defined(POCO_HAVE_IPv6)
- else
- newIPv6(addr.addr(), addr.scope());
-#endif
-}
-
-
-IPAddress::IPAddress(Family family)
-{
- if (family == IPv4)
- newIPv4();
-#if defined(POCO_HAVE_IPv6)
- else if (family == IPv6)
- newIPv6();
-#endif
- else throw Poco::InvalidArgumentException("Invalid or unsupported address family passed to IPAddress()");
-}
-
-
-IPAddress::IPAddress(const std::string& addr)
-{
- IPv4AddressImpl empty4 = IPv4AddressImpl();
- if (addr.empty() || trim(addr) == "0.0.0.0")
- {
- newIPv4(empty4.addr());
- return;
- }
-
- IPv4AddressImpl addr4(IPv4AddressImpl::parse(addr));
- if (addr4 != empty4)
- {
- newIPv4(addr4.addr());
- return;
- }
-
-#if defined(POCO_HAVE_IPv6)
- IPv6AddressImpl empty6 = IPv6AddressImpl();
- if (addr.empty() || trim(addr) == "::")
- {
- newIPv6(empty6.addr());
- return;
- }
-
- IPv6AddressImpl addr6(IPv6AddressImpl::parse(addr));
- if (addr6 != IPv6AddressImpl())
- {
- newIPv6(addr6.addr(), addr6.scope());
- return;
- }
-#endif
-
- throw InvalidAddressException(addr);
-}
-
-
-IPAddress::IPAddress(const std::string& addr, Family family)
-{
- if (family == IPv4)
- {
- IPv4AddressImpl addr4(IPv4AddressImpl::parse(addr));
- newIPv4(addr4.addr());
- return;
- }
-#if defined(POCO_HAVE_IPv6)
- else if (family == IPv6)
- {
- IPv6AddressImpl addr6(IPv6AddressImpl::parse(addr));
- newIPv6(addr6.addr(), addr6.scope());
- return;
- }
-#endif
- else throw Poco::InvalidArgumentException("Invalid or unsupported address family passed to IPAddress()");
-}
-
-
-IPAddress::IPAddress(const void* addr, poco_socklen_t length)
- : _pImpl(0)
-{
- if (length == sizeof(struct in_addr))
- newIPv4(addr);
-#if defined(POCO_HAVE_IPv6)
- else if (length == sizeof(struct in6_addr))
- newIPv6(addr);
-#endif
- else throw Poco::InvalidArgumentException("Invalid address length passed to IPAddress()");
-}
-
-
-IPAddress::IPAddress(const void* addr, poco_socklen_t length, Poco::UInt32 scope)
-{
- if (length == sizeof(struct in_addr))
- newIPv4(addr);
-#if defined(POCO_HAVE_IPv6)
- else if (length == sizeof(struct in6_addr))
- newIPv6(addr, scope);
-#endif
- else throw Poco::InvalidArgumentException("Invalid address length passed to IPAddress()");
-}
-
-
-IPAddress::IPAddress(unsigned prefix, Family family)
-{
- if (family == IPv4)
- {
- if (prefix <= 32)
- newIPv4(prefix);
+//
+// IPAddress.cpp
+//
+// Library: Net
+// Package: NetCore
+// Module: IPAddress
+//
+// Copyright (c) 2005-2011, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/IPAddress.h"
+#include "Poco/Net/NetException.h"
+#include "Poco/RefCountedObject.h"
+#include "Poco/NumberFormatter.h"
+#include "Poco/BinaryReader.h"
+#include "Poco/BinaryWriter.h"
+#include "Poco/String.h"
+#include "Poco/Types.h"
+
+
+using Poco::RefCountedObject;
+using Poco::NumberFormatter;
+using Poco::BinaryReader;
+using Poco::BinaryWriter;
+using Poco::toLower;
+using Poco::trim;
+using Poco::UInt8;
+using Poco::UInt16;
+using Poco::UInt32;
+using Poco::Net::Impl::IPAddressImpl;
+using Poco::Net::Impl::IPv4AddressImpl;
+#if defined(POCO_HAVE_IPv6)
+using Poco::Net::Impl::IPv6AddressImpl;
+#endif
+
+
+namespace Poco {
+namespace Net {
+
+
+#if !defined(_MSC_VER) || defined(__STDC__)
+// Go home MSVC, you're drunk...
+// See http://stackoverflow.com/questions/5899857/multiple-definition-error-for-static-const-class-members
+const IPAddress::Family IPAddress::IPv4;
+#if defined(POCO_HAVE_IPv6)
+const IPAddress::Family IPAddress::IPv6;
+#endif
+#endif
+
+
+IPAddress::IPAddress()
+{
+ newIPv4();
+}
+
+
+IPAddress::IPAddress(const IPAddress& addr)
+{
+ if (addr.family() == IPv4)
+ newIPv4(addr.addr());
+#if defined(POCO_HAVE_IPv6)
+ else
+ newIPv6(addr.addr(), addr.scope());
+#endif
+}
+
+
+IPAddress::IPAddress(Family family)
+{
+ if (family == IPv4)
+ newIPv4();
+#if defined(POCO_HAVE_IPv6)
+ else if (family == IPv6)
+ newIPv6();
+#endif
+ else throw Poco::InvalidArgumentException("Invalid or unsupported address family passed to IPAddress()");
+}
+
+
+IPAddress::IPAddress(const std::string& addr)
+{
+ IPv4AddressImpl empty4 = IPv4AddressImpl();
+ if (addr.empty() || trim(addr) == "0.0.0.0")
+ {
+ newIPv4(empty4.addr());
+ return;
+ }
+
+ IPv4AddressImpl addr4(IPv4AddressImpl::parse(addr));
+ if (addr4 != empty4)
+ {
+ newIPv4(addr4.addr());
+ return;
+ }
+
+#if defined(POCO_HAVE_IPv6)
+ IPv6AddressImpl empty6 = IPv6AddressImpl();
+ if (addr.empty() || trim(addr) == "::")
+ {
+ newIPv6(empty6.addr());
+ return;
+ }
+
+ IPv6AddressImpl addr6(IPv6AddressImpl::parse(addr));
+ if (addr6 != IPv6AddressImpl())
+ {
+ newIPv6(addr6.addr(), addr6.scope());
+ return;
+ }
+#endif
+
+ throw InvalidAddressException(addr);
+}
+
+
+IPAddress::IPAddress(const std::string& addr, Family family)
+{
+ if (family == IPv4)
+ {
+ IPv4AddressImpl addr4(IPv4AddressImpl::parse(addr));
+ newIPv4(addr4.addr());
+ return;
+ }
+#if defined(POCO_HAVE_IPv6)
+ else if (family == IPv6)
+ {
+ IPv6AddressImpl addr6(IPv6AddressImpl::parse(addr));
+ newIPv6(addr6.addr(), addr6.scope());
+ return;
+ }
+#endif
+ else throw Poco::InvalidArgumentException("Invalid or unsupported address family passed to IPAddress()");
+}
+
+
+IPAddress::IPAddress(const void* addr, poco_socklen_t length)
+ : _pImpl(0)
+{
+ if (length == sizeof(struct in_addr))
+ newIPv4(addr);
+#if defined(POCO_HAVE_IPv6)
+ else if (length == sizeof(struct in6_addr))
+ newIPv6(addr);
+#endif
+ else throw Poco::InvalidArgumentException("Invalid address length passed to IPAddress()");
+}
+
+
+IPAddress::IPAddress(const void* addr, poco_socklen_t length, Poco::UInt32 scope)
+{
+ if (length == sizeof(struct in_addr))
+ newIPv4(addr);
+#if defined(POCO_HAVE_IPv6)
+ else if (length == sizeof(struct in6_addr))
+ newIPv6(addr, scope);
+#endif
+ else throw Poco::InvalidArgumentException("Invalid address length passed to IPAddress()");
+}
+
+
+IPAddress::IPAddress(unsigned prefix, Family family)
+{
+ if (family == IPv4)
+ {
+ if (prefix <= 32)
+ newIPv4(prefix);
+ else
+ throw Poco::InvalidArgumentException("Invalid prefix length passed to IPAddress()");
+ }
+#if defined(POCO_HAVE_IPv6)
+ else if (family == IPv6)
+ {
+ if (prefix <= 128)
+ newIPv6(prefix);
+ else
+ throw Poco::InvalidArgumentException("Invalid prefix length passed to IPAddress()");
+ }
+#endif
+ else throw Poco::InvalidArgumentException("Invalid or unsupported address family passed to IPAddress()");
+}
+
+
+#if defined(_WIN32)
+IPAddress::IPAddress(const SOCKET_ADDRESS& socket_address)
+ : _pImpl(0)
+{
+ ADDRESS_FAMILY family = socket_address.lpSockaddr->sa_family;
+ if (family == AF_INET)
+ newIPv4(&reinterpret_cast<const struct sockaddr_in*>(socket_address.lpSockaddr)->sin_addr);
+#if defined(POCO_HAVE_IPv6)
+ else if (family == AF_INET6)
+ newIPv6(&reinterpret_cast<const struct sockaddr_in6*>(socket_address.lpSockaddr)->sin6_addr,
+ reinterpret_cast<const struct sockaddr_in6*>(socket_address.lpSockaddr)->sin6_scope_id);
+#endif
+ else throw Poco::InvalidArgumentException("Invalid or unsupported address family passed to IPAddress()");
+}
+#endif
+
+
+IPAddress::IPAddress(const struct sockaddr& sockaddr)
+{
+ unsigned short family = sockaddr.sa_family;
+ if (family == AF_INET)
+ newIPv4(&reinterpret_cast<const struct sockaddr_in*>(&sockaddr)->sin_addr);
+#if defined(POCO_HAVE_IPv6)
+ else if (family == AF_INET6)
+ newIPv6(&reinterpret_cast<const struct sockaddr_in6*>(&sockaddr)->sin6_addr,
+ reinterpret_cast<const struct sockaddr_in6*>(&sockaddr)->sin6_scope_id);
+#endif
+ else throw Poco::InvalidArgumentException("Invalid or unsupported address family passed to IPAddress()");
+}
+
+
+IPAddress::~IPAddress()
+{
+}
+
+
+IPAddress& IPAddress::operator = (const IPAddress& addr)
+{
+ if (&addr != this)
+ {
+ if (addr.family() == IPAddress::IPv4)
+ newIPv4(addr.addr());
+#if defined(POCO_HAVE_IPv6)
+ else if (addr.family() == IPAddress::IPv6)
+ newIPv6(addr.addr(), addr.scope());
+#endif
else
- throw Poco::InvalidArgumentException("Invalid prefix length passed to IPAddress()");
- }
-#if defined(POCO_HAVE_IPv6)
- else if (family == IPv6)
- {
- if (prefix <= 128)
- newIPv6(prefix);
- else
- throw Poco::InvalidArgumentException("Invalid prefix length passed to IPAddress()");
- }
-#endif
- else throw Poco::InvalidArgumentException("Invalid or unsupported address family passed to IPAddress()");
-}
-
-
-#if defined(_WIN32)
-IPAddress::IPAddress(const SOCKET_ADDRESS& socket_address)
- : _pImpl(0)
-{
- ADDRESS_FAMILY family = socket_address.lpSockaddr->sa_family;
- if (family == AF_INET)
- newIPv4(&reinterpret_cast<const struct sockaddr_in*>(socket_address.lpSockaddr)->sin_addr);
-#if defined(POCO_HAVE_IPv6)
- else if (family == AF_INET6)
- newIPv6(&reinterpret_cast<const struct sockaddr_in6*>(socket_address.lpSockaddr)->sin6_addr,
- reinterpret_cast<const struct sockaddr_in6*>(socket_address.lpSockaddr)->sin6_scope_id);
-#endif
- else throw Poco::InvalidArgumentException("Invalid or unsupported address family passed to IPAddress()");
-}
-#endif
-
-
-IPAddress::IPAddress(const struct sockaddr& sockaddr)
-{
- unsigned short family = sockaddr.sa_family;
- if (family == AF_INET)
- newIPv4(&reinterpret_cast<const struct sockaddr_in*>(&sockaddr)->sin_addr);
-#if defined(POCO_HAVE_IPv6)
- else if (family == AF_INET6)
- newIPv6(&reinterpret_cast<const struct sockaddr_in6*>(&sockaddr)->sin6_addr,
- reinterpret_cast<const struct sockaddr_in6*>(&sockaddr)->sin6_scope_id);
-#endif
- else throw Poco::InvalidArgumentException("Invalid or unsupported address family passed to IPAddress()");
-}
-
-
-IPAddress::~IPAddress()
-{
-}
-
-
-IPAddress& IPAddress::operator = (const IPAddress& addr)
-{
- if (&addr != this)
- {
- if (addr.family() == IPAddress::IPv4)
- newIPv4(addr.addr());
-#if defined(POCO_HAVE_IPv6)
- else if (addr.family() == IPAddress::IPv6)
- newIPv6(addr.addr(), addr.scope());
-#endif
- else
- throw Poco::InvalidArgumentException("Invalid or unsupported address family");
- }
- return *this;
-}
-
-
-IPAddress::Family IPAddress::family() const
-{
- return pImpl()->family();
-}
-
-
-Poco::UInt32 IPAddress::scope() const
-{
- return pImpl()->scope();
-}
-
-
-std::string IPAddress::toString() const
-{
- return pImpl()->toString();
-}
-
-
-bool IPAddress::isWildcard() const
-{
- return pImpl()->isWildcard();
-}
-
-
-bool IPAddress::isBroadcast() const
-{
- return pImpl()->isBroadcast();
-}
-
-
-bool IPAddress::isLoopback() const
-{
- return pImpl()->isLoopback();
-}
-
-
-bool IPAddress::isMulticast() const
-{
- return pImpl()->isMulticast();
-}
-
-
-bool IPAddress::isUnicast() const
-{
- return !isWildcard() && !isBroadcast() && !isMulticast();
-}
-
-
-bool IPAddress::isLinkLocal() const
-{
- return pImpl()->isLinkLocal();
-}
-
-
-bool IPAddress::isSiteLocal() const
-{
- return pImpl()->isSiteLocal();
-}
-
-
-bool IPAddress::isIPv4Compatible() const
-{
- return pImpl()->isIPv4Compatible();
-}
-
-
-bool IPAddress::isIPv4Mapped() const
-{
- return pImpl()->isIPv4Mapped();
-}
-
-
-bool IPAddress::isWellKnownMC() const
-{
- return pImpl()->isWellKnownMC();
-}
-
-
-bool IPAddress::isNodeLocalMC() const
-{
- return pImpl()->isNodeLocalMC();
-}
-
-
-bool IPAddress::isLinkLocalMC() const
-{
- return pImpl()->isLinkLocalMC();
-}
-
-
-bool IPAddress::isSiteLocalMC() const
-{
- return pImpl()->isSiteLocalMC();
-}
-
-
-bool IPAddress::isOrgLocalMC() const
-{
- return pImpl()->isOrgLocalMC();
-}
-
-
-bool IPAddress::isGlobalMC() const
-{
- return pImpl()->isGlobalMC();
-}
-
-
-bool IPAddress::operator == (const IPAddress& a) const
-{
- poco_socklen_t l1 = length();
- poco_socklen_t l2 = a.length();
- if (l1 == l2)
- {
-#if defined(POCO_HAVE_IPv6)
- if ( scope() != a.scope() )
- return false;
-#endif
- return std::memcmp(addr(), a.addr(), l1) == 0;
- }
- else return false;
-}
-
-
-bool IPAddress::operator != (const IPAddress& a) const
-{
- return !(*this == a);
-}
-
-
-bool IPAddress::operator < (const IPAddress& a) const
-{
- poco_socklen_t l1 = length();
- poco_socklen_t l2 = a.length();
- if (l1 == l2)
- {
-#if defined(POCO_HAVE_IPv6)
- if ( scope() != a.scope() )
- return scope() < a.scope();
-#endif
- return std::memcmp(addr(), a.addr(), l1) < 0;
- }
- else return l1 < l2;
-}
-
-
-bool IPAddress::operator <= (const IPAddress& a) const
-{
- return !(a < *this);
-}
-
-
-bool IPAddress::operator > (const IPAddress& a) const
-{
- return a < *this;
-}
-
-
-bool IPAddress::operator >= (const IPAddress& a) const
-{
- return !(*this < a);
-}
-
-
-IPAddress IPAddress::operator & (const IPAddress& other) const
-{
- if (family() == other.family())
- {
- if (family() == IPv4)
- {
- IPv4AddressImpl t(pImpl()->addr());
- IPv4AddressImpl o(other.pImpl()->addr());
- return IPAddress((t & o).addr(), sizeof(struct in_addr));
- }
-#if defined(POCO_HAVE_IPv6)
- else if (family() == IPv6)
- {
- const IPv6AddressImpl t(pImpl()->addr(), pImpl()->scope());
- const IPv6AddressImpl o(other.pImpl()->addr(), other.pImpl()->scope());
- const IPv6AddressImpl r = t & o;
- return IPAddress(r.addr(), sizeof(struct in6_addr), r.scope());
- }
-#endif
- else throw Poco::InvalidArgumentException("Invalid or unsupported address family passed to IPAddress()");
- }
- else throw Poco::InvalidArgumentException("Invalid or unsupported address family passed to IPAddress()");
-}
-
-
-IPAddress IPAddress::operator | (const IPAddress& other) const
-{
- if (family() == other.family())
- {
- if (family() == IPv4)
- {
- IPv4AddressImpl t(pImpl()->addr());
- IPv4AddressImpl o(other.pImpl()->addr());
- return IPAddress((t | o).addr(), sizeof(struct in_addr));
- }
-#if defined(POCO_HAVE_IPv6)
- else if (family() == IPv6)
- {
- const IPv6AddressImpl t(pImpl()->addr(), pImpl()->scope());
- const IPv6AddressImpl o(other.pImpl()->addr(), other.pImpl()->scope());
- const IPv6AddressImpl r = t | o;
- return IPAddress(r.addr(), sizeof(struct in6_addr), r.scope());
- }
-#endif
- else throw Poco::InvalidArgumentException("Invalid or unsupported address family passed to IPAddress()");
- }
- else throw Poco::InvalidArgumentException("Invalid or unsupported address family passed to IPAddress()");
-}
-
-
-IPAddress IPAddress::operator ^ (const IPAddress& other) const
-{
- if (family() == other.family())
- {
- if (family() == IPv4)
- {
- IPv4AddressImpl t(pImpl()->addr());
- IPv4AddressImpl o(other.pImpl()->addr());
- return IPAddress((t ^ o).addr(), sizeof(struct in_addr));
- }
-#if defined(POCO_HAVE_IPv6)
- else if (family() == IPv6)
- {
- const IPv6AddressImpl t(pImpl()->addr(), pImpl()->scope());
- const IPv6AddressImpl o(other.pImpl()->addr(), other.pImpl()->scope());
- const IPv6AddressImpl r = t ^ o;
- return IPAddress(r.addr(), sizeof(struct in6_addr), r.scope());
- }
-#endif
- else throw Poco::InvalidArgumentException("Invalid or unsupported address family passed to IPAddress()");
- }
- else throw Poco::InvalidArgumentException("Invalid or unsupported address family passed to IPAddress()");
-}
-
-
-IPAddress IPAddress::operator ~ () const
-{
- if (family() == IPv4)
- {
- IPv4AddressImpl self(this->pImpl()->addr());
- return IPAddress((~self).addr(), sizeof(struct in_addr));
- }
-#if defined(POCO_HAVE_IPv6)
- else if (family() == IPv6)
- {
- const IPv6AddressImpl self(pImpl()->addr(), pImpl()->scope());
- const IPv6AddressImpl r = ~self;
- return IPAddress(r.addr(), sizeof(struct in6_addr), r.scope());
- }
-#endif
- else throw Poco::InvalidArgumentException("Invalid or unsupported address family passed to IPAddress()");
-}
-
-
-poco_socklen_t IPAddress::length() const
-{
- return pImpl()->length();
-}
-
-
-const void* IPAddress::addr() const
-{
- return pImpl()->addr();
-}
-
-
-int IPAddress::af() const
-{
- return pImpl()->af();
-}
-
-
-unsigned IPAddress::prefixLength() const
-{
- return pImpl()->prefixLength();
-}
-
-
-IPAddress IPAddress::parse(const std::string& addr)
-{
- return IPAddress(addr);
-}
-
-
-bool IPAddress::tryParse(const std::string& addr, IPAddress& result)
-{
- IPv4AddressImpl impl4(IPv4AddressImpl::parse(addr));
- if (impl4 != IPv4AddressImpl() || trim(addr) == "0.0.0.0")
- {
- result.newIPv4(impl4.addr());
- return true;
- }
-#if defined(POCO_HAVE_IPv6)
- IPv6AddressImpl impl6(IPv6AddressImpl::parse(addr));
- if (impl6 != IPv6AddressImpl())
- {
- result.newIPv6(impl6.addr(), impl6.scope());
- return true;
- }
-#endif
- return false;
-}
-
-
-void IPAddress::mask(const IPAddress& mask)
-{
- IPAddress null;
- pImpl()->mask(mask.pImpl(), null.pImpl());
-}
-
-
-void IPAddress::mask(const IPAddress& mask, const IPAddress& set)
-{
- pImpl()->mask(mask.pImpl(), set.pImpl());
-}
-
-
-IPAddress IPAddress::wildcard(Family family)
-{
- return IPAddress(family);
-}
-
-
-IPAddress IPAddress::broadcast()
-{
- struct in_addr ia;
- ia.s_addr = INADDR_NONE;
- return IPAddress(&ia, sizeof(ia));
-}
-
-
-} } // namespace Poco::Net
-
-
-Poco::BinaryWriter& operator << (Poco::BinaryWriter& writer, const Poco::Net::IPAddress& value)
-{
- writer << static_cast<Poco::UInt8>(value.length());
- writer.writeRaw(reinterpret_cast<const char*>(value.addr()), value.length());
- return writer;
-}
-
-
-Poco::BinaryReader& operator >> (Poco::BinaryReader& reader, Poco::Net::IPAddress& value)
-{
- char buf[Poco::Net::IPAddress::MAX_ADDRESS_LENGTH];
- Poco::UInt8 length;
- reader >> length;
- reader.readRaw(buf, length);
- value = Poco::Net::IPAddress(buf, length);
- return reader;
-}
-
-
-std::ostream& operator << (std::ostream& ostr, const Poco::Net::IPAddress& addr)
-{
- ostr << addr.toString();
- return ostr;
-}
+ throw Poco::InvalidArgumentException("Invalid or unsupported address family");
+ }
+ return *this;
+}
+
+
+IPAddress::Family IPAddress::family() const
+{
+ return pImpl()->family();
+}
+
+
+Poco::UInt32 IPAddress::scope() const
+{
+ return pImpl()->scope();
+}
+
+
+std::string IPAddress::toString() const
+{
+ return pImpl()->toString();
+}
+
+
+bool IPAddress::isWildcard() const
+{
+ return pImpl()->isWildcard();
+}
+
+
+bool IPAddress::isBroadcast() const
+{
+ return pImpl()->isBroadcast();
+}
+
+
+bool IPAddress::isLoopback() const
+{
+ return pImpl()->isLoopback();
+}
+
+
+bool IPAddress::isMulticast() const
+{
+ return pImpl()->isMulticast();
+}
+
+
+bool IPAddress::isUnicast() const
+{
+ return !isWildcard() && !isBroadcast() && !isMulticast();
+}
+
+
+bool IPAddress::isLinkLocal() const
+{
+ return pImpl()->isLinkLocal();
+}
+
+
+bool IPAddress::isSiteLocal() const
+{
+ return pImpl()->isSiteLocal();
+}
+
+
+bool IPAddress::isIPv4Compatible() const
+{
+ return pImpl()->isIPv4Compatible();
+}
+
+
+bool IPAddress::isIPv4Mapped() const
+{
+ return pImpl()->isIPv4Mapped();
+}
+
+
+bool IPAddress::isWellKnownMC() const
+{
+ return pImpl()->isWellKnownMC();
+}
+
+
+bool IPAddress::isNodeLocalMC() const
+{
+ return pImpl()->isNodeLocalMC();
+}
+
+
+bool IPAddress::isLinkLocalMC() const
+{
+ return pImpl()->isLinkLocalMC();
+}
+
+
+bool IPAddress::isSiteLocalMC() const
+{
+ return pImpl()->isSiteLocalMC();
+}
+
+
+bool IPAddress::isOrgLocalMC() const
+{
+ return pImpl()->isOrgLocalMC();
+}
+
+
+bool IPAddress::isGlobalMC() const
+{
+ return pImpl()->isGlobalMC();
+}
+
+
+bool IPAddress::operator == (const IPAddress& a) const
+{
+ poco_socklen_t l1 = length();
+ poco_socklen_t l2 = a.length();
+ if (l1 == l2)
+ {
+#if defined(POCO_HAVE_IPv6)
+ if ( scope() != a.scope() )
+ return false;
+#endif
+ return std::memcmp(addr(), a.addr(), l1) == 0;
+ }
+ else return false;
+}
+
+
+bool IPAddress::operator != (const IPAddress& a) const
+{
+ return !(*this == a);
+}
+
+
+bool IPAddress::operator < (const IPAddress& a) const
+{
+ poco_socklen_t l1 = length();
+ poco_socklen_t l2 = a.length();
+ if (l1 == l2)
+ {
+#if defined(POCO_HAVE_IPv6)
+ if ( scope() != a.scope() )
+ return scope() < a.scope();
+#endif
+ return std::memcmp(addr(), a.addr(), l1) < 0;
+ }
+ else return l1 < l2;
+}
+
+
+bool IPAddress::operator <= (const IPAddress& a) const
+{
+ return !(a < *this);
+}
+
+
+bool IPAddress::operator > (const IPAddress& a) const
+{
+ return a < *this;
+}
+
+
+bool IPAddress::operator >= (const IPAddress& a) const
+{
+ return !(*this < a);
+}
+
+
+IPAddress IPAddress::operator & (const IPAddress& other) const
+{
+ if (family() == other.family())
+ {
+ if (family() == IPv4)
+ {
+ IPv4AddressImpl t(pImpl()->addr());
+ IPv4AddressImpl o(other.pImpl()->addr());
+ return IPAddress((t & o).addr(), sizeof(struct in_addr));
+ }
+#if defined(POCO_HAVE_IPv6)
+ else if (family() == IPv6)
+ {
+ const IPv6AddressImpl t(pImpl()->addr(), pImpl()->scope());
+ const IPv6AddressImpl o(other.pImpl()->addr(), other.pImpl()->scope());
+ const IPv6AddressImpl r = t & o;
+ return IPAddress(r.addr(), sizeof(struct in6_addr), r.scope());
+ }
+#endif
+ else throw Poco::InvalidArgumentException("Invalid or unsupported address family passed to IPAddress()");
+ }
+ else throw Poco::InvalidArgumentException("Invalid or unsupported address family passed to IPAddress()");
+}
+
+
+IPAddress IPAddress::operator | (const IPAddress& other) const
+{
+ if (family() == other.family())
+ {
+ if (family() == IPv4)
+ {
+ IPv4AddressImpl t(pImpl()->addr());
+ IPv4AddressImpl o(other.pImpl()->addr());
+ return IPAddress((t | o).addr(), sizeof(struct in_addr));
+ }
+#if defined(POCO_HAVE_IPv6)
+ else if (family() == IPv6)
+ {
+ const IPv6AddressImpl t(pImpl()->addr(), pImpl()->scope());
+ const IPv6AddressImpl o(other.pImpl()->addr(), other.pImpl()->scope());
+ const IPv6AddressImpl r = t | o;
+ return IPAddress(r.addr(), sizeof(struct in6_addr), r.scope());
+ }
+#endif
+ else throw Poco::InvalidArgumentException("Invalid or unsupported address family passed to IPAddress()");
+ }
+ else throw Poco::InvalidArgumentException("Invalid or unsupported address family passed to IPAddress()");
+}
+
+
+IPAddress IPAddress::operator ^ (const IPAddress& other) const
+{
+ if (family() == other.family())
+ {
+ if (family() == IPv4)
+ {
+ IPv4AddressImpl t(pImpl()->addr());
+ IPv4AddressImpl o(other.pImpl()->addr());
+ return IPAddress((t ^ o).addr(), sizeof(struct in_addr));
+ }
+#if defined(POCO_HAVE_IPv6)
+ else if (family() == IPv6)
+ {
+ const IPv6AddressImpl t(pImpl()->addr(), pImpl()->scope());
+ const IPv6AddressImpl o(other.pImpl()->addr(), other.pImpl()->scope());
+ const IPv6AddressImpl r = t ^ o;
+ return IPAddress(r.addr(), sizeof(struct in6_addr), r.scope());
+ }
+#endif
+ else throw Poco::InvalidArgumentException("Invalid or unsupported address family passed to IPAddress()");
+ }
+ else throw Poco::InvalidArgumentException("Invalid or unsupported address family passed to IPAddress()");
+}
+
+
+IPAddress IPAddress::operator ~ () const
+{
+ if (family() == IPv4)
+ {
+ IPv4AddressImpl self(this->pImpl()->addr());
+ return IPAddress((~self).addr(), sizeof(struct in_addr));
+ }
+#if defined(POCO_HAVE_IPv6)
+ else if (family() == IPv6)
+ {
+ const IPv6AddressImpl self(pImpl()->addr(), pImpl()->scope());
+ const IPv6AddressImpl r = ~self;
+ return IPAddress(r.addr(), sizeof(struct in6_addr), r.scope());
+ }
+#endif
+ else throw Poco::InvalidArgumentException("Invalid or unsupported address family passed to IPAddress()");
+}
+
+
+poco_socklen_t IPAddress::length() const
+{
+ return pImpl()->length();
+}
+
+
+const void* IPAddress::addr() const
+{
+ return pImpl()->addr();
+}
+
+
+int IPAddress::af() const
+{
+ return pImpl()->af();
+}
+
+
+unsigned IPAddress::prefixLength() const
+{
+ return pImpl()->prefixLength();
+}
+
+
+IPAddress IPAddress::parse(const std::string& addr)
+{
+ return IPAddress(addr);
+}
+
+
+bool IPAddress::tryParse(const std::string& addr, IPAddress& result)
+{
+ IPv4AddressImpl impl4(IPv4AddressImpl::parse(addr));
+ if (impl4 != IPv4AddressImpl() || trim(addr) == "0.0.0.0")
+ {
+ result.newIPv4(impl4.addr());
+ return true;
+ }
+#if defined(POCO_HAVE_IPv6)
+ IPv6AddressImpl impl6(IPv6AddressImpl::parse(addr));
+ if (impl6 != IPv6AddressImpl())
+ {
+ result.newIPv6(impl6.addr(), impl6.scope());
+ return true;
+ }
+#endif
+ return false;
+}
+
+
+void IPAddress::mask(const IPAddress& mask)
+{
+ IPAddress null;
+ pImpl()->mask(mask.pImpl(), null.pImpl());
+}
+
+
+void IPAddress::mask(const IPAddress& mask, const IPAddress& set)
+{
+ pImpl()->mask(mask.pImpl(), set.pImpl());
+}
+
+
+IPAddress IPAddress::wildcard(Family family)
+{
+ return IPAddress(family);
+}
+
+
+IPAddress IPAddress::broadcast()
+{
+ struct in_addr ia;
+ ia.s_addr = INADDR_NONE;
+ return IPAddress(&ia, sizeof(ia));
+}
+
+
+} } // namespace Poco::Net
+
+
+Poco::BinaryWriter& operator << (Poco::BinaryWriter& writer, const Poco::Net::IPAddress& value)
+{
+ writer << static_cast<Poco::UInt8>(value.length());
+ writer.writeRaw(reinterpret_cast<const char*>(value.addr()), value.length());
+ return writer;
+}
+
+
+Poco::BinaryReader& operator >> (Poco::BinaryReader& reader, Poco::Net::IPAddress& value)
+{
+ char buf[Poco::Net::IPAddress::MAX_ADDRESS_LENGTH];
+ Poco::UInt8 length;
+ reader >> length;
+ reader.readRaw(buf, length);
+ value = Poco::Net::IPAddress(buf, length);
+ return reader;
+}
+
+
+std::ostream& operator << (std::ostream& ostr, const Poco::Net::IPAddress& addr)
+{
+ ostr << addr.toString();
+ return ostr;
+}
diff --git a/contrib/libs/poco/Net/src/IPAddressImpl.cpp b/contrib/libs/poco/Net/src/IPAddressImpl.cpp
index ab7b7ab702..316bba33f3 100644
--- a/contrib/libs/poco/Net/src/IPAddressImpl.cpp
+++ b/contrib/libs/poco/Net/src/IPAddressImpl.cpp
@@ -1,815 +1,815 @@
-//
-// IPAddress.cpp
-//
-// Library: Net
-// Package: NetCore
-// Module: IPAddress
-//
-// Copyright (c) 2005-2011, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/IPAddressImpl.h"
-#include "Poco/Net/NetException.h"
-#include "Poco/RefCountedObject.h"
-#include "Poco/NumberFormatter.h"
-#include "Poco/ByteOrder.h"
-#include "Poco/String.h"
-#include "Poco/Types.h"
-
-
-using Poco::RefCountedObject;
-using Poco::NumberFormatter;
-using Poco::toLower;
-using Poco::UInt8;
-using Poco::UInt16;
-using Poco::UInt32;
-
-
-namespace {
-
-
-template <typename T>
-unsigned maskBits(T val, unsigned size)
- /// Returns the length of the mask (number of bits set in val).
- /// The val should be either all zeros or two contiguos areas of 1s and 0s.
- /// The algorithm ignores invalid non-contiguous series of 1s and treats val
- /// as if all bits between MSb and last non-zero bit are set to 1.
-{
- unsigned count = 0;
- if (val)
- {
- val = (val ^ (val - 1)) >> 1;
- for (count = 0; val; ++count) val >>= 1;
- }
- else count = size;
- return size - count;
-}
-
-
-} // namespace
-
-
-namespace Poco {
-namespace Net {
-namespace Impl {
-
-
-//
-// IPAddressImpl
-//
-
-
-IPAddressImpl::IPAddressImpl()
-{
-}
-
-
-IPAddressImpl::~IPAddressImpl()
-{
-}
-
-
-//
-// IPv4AddressImpl
-//
-
-
-IPv4AddressImpl::IPv4AddressImpl()
-{
- std::memset(&_addr, 0, sizeof(_addr));
-}
-
-
-IPv4AddressImpl::IPv4AddressImpl(const void* addr)
-{
- std::memcpy(&_addr, addr, sizeof(_addr));
-}
-
-
-IPv4AddressImpl::IPv4AddressImpl(unsigned prefix)
-{
- UInt32 addr = (prefix == 32) ? 0xffffffff : ~(0xffffffff >> prefix);
- _addr.s_addr = ByteOrder::toNetwork(addr);
-}
-
-
-IPv4AddressImpl::IPv4AddressImpl(const IPv4AddressImpl& addr)
-{
- std::memcpy(&_addr, &addr._addr, sizeof(_addr));
-}
-
-
-IPv4AddressImpl& IPv4AddressImpl::operator = (const IPv4AddressImpl& addr)
-{
- if (this == &addr)
- return *this;
-
- std::memcpy(&_addr, &addr._addr, sizeof(_addr));
- return *this;
-}
-
-
-std::string IPv4AddressImpl::toString() const
-{
- const UInt8* bytes = reinterpret_cast<const UInt8*>(&_addr);
- std::string result;
- result.reserve(16);
- NumberFormatter::append(result, bytes[0]);
- result.append(".");
- NumberFormatter::append(result, bytes[1]);
- result.append(".");
- NumberFormatter::append(result, bytes[2]);
- result.append(".");
- NumberFormatter::append(result, bytes[3]);
- return result;
-}
-
-
-poco_socklen_t IPv4AddressImpl::length() const
-{
- return sizeof(_addr);
-}
-
-
-const void* IPv4AddressImpl::addr() const
-{
- return &_addr;
-}
-
-
-IPAddressImpl::Family IPv4AddressImpl::family() const
-{
- return AddressFamily::IPv4;
-}
-
-
-int IPv4AddressImpl::af() const
-{
- return AF_INET;
-}
-
-
-unsigned IPv4AddressImpl::prefixLength() const
-{
- return maskBits(ntohl(_addr.s_addr), 32);
-}
-
-
-Poco::UInt32 IPv4AddressImpl::scope() const
-{
- return 0;
-}
-
-
-bool IPv4AddressImpl::isWildcard() const
-{
- return _addr.s_addr == INADDR_ANY;
-}
-
-
-bool IPv4AddressImpl::isBroadcast() const
-{
- return _addr.s_addr == INADDR_NONE;
-}
-
-
-bool IPv4AddressImpl::isLoopback() const
-{
- return (ntohl(_addr.s_addr) & 0xFF000000) == 0x7F000000; // 127.0.0.1 to 127.255.255.255
-}
-
-
-bool IPv4AddressImpl::isMulticast() const
-{
- return (ntohl(_addr.s_addr) & 0xF0000000) == 0xE0000000; // 224.0.0.0/24 to 239.0.0.0/24
-}
-
-
-bool IPv4AddressImpl::isLinkLocal() const
-{
- return (ntohl(_addr.s_addr) & 0xFFFF0000) == 0xA9FE0000; // 169.254.0.0/16
-}
-
-
-bool IPv4AddressImpl::isSiteLocal() const
-{
- UInt32 addr = ntohl(_addr.s_addr);
- return (addr & 0xFF000000) == 0x0A000000 || // 10.0.0.0/24
- (addr & 0xFFFF0000) == 0xC0A80000 || // 192.68.0.0/16
- (addr >= 0xAC100000 && addr <= 0xAC1FFFFF); // 172.16.0.0 to 172.31.255.255
-}
-
-
-bool IPv4AddressImpl::isIPv4Compatible() const
-{
- return true;
-}
-
-
-bool IPv4AddressImpl::isIPv4Mapped() const
-{
- return true;
-}
-
-
-bool IPv4AddressImpl::isWellKnownMC() const
-{
- return (ntohl(_addr.s_addr) & 0xFFFFFF00) == 0xE0000000; // 224.0.0.0/8
-}
-
-
-bool IPv4AddressImpl::isNodeLocalMC() const
-{
- return false;
-}
-
-
-bool IPv4AddressImpl::isLinkLocalMC() const
-{
- return (ntohl(_addr.s_addr) & 0xFF000000) == 0xE0000000; // 244.0.0.0/24
-}
-
-
-bool IPv4AddressImpl::isSiteLocalMC() const
-{
- return (ntohl(_addr.s_addr) & 0xFFFF0000) == 0xEFFF0000; // 239.255.0.0/16
-}
-
-
-bool IPv4AddressImpl::isOrgLocalMC() const
-{
- return (ntohl(_addr.s_addr) & 0xFFFF0000) == 0xEFC00000; // 239.192.0.0/16
-}
-
-
-bool IPv4AddressImpl::isGlobalMC() const
-{
- UInt32 addr = ntohl(_addr.s_addr);
- return addr >= 0xE0000100 && addr <= 0xEE000000; // 224.0.1.0 to 238.255.255.255
-}
-
-
-IPv4AddressImpl IPv4AddressImpl::parse(const std::string& addr)
-{
- if (addr.empty()) return IPv4AddressImpl();
-#if defined(_WIN32)
- struct in_addr ia;
- ia.s_addr = inet_addr(addr.c_str());
- if (ia.s_addr == INADDR_NONE && addr != "255.255.255.255")
- return IPv4AddressImpl();
- else
- return IPv4AddressImpl(&ia);
-#else
-#if __GNUC__ < 3 || defined(POCO_VXWORKS)
- struct in_addr ia;
- ia.s_addr = inet_addr(const_cast<char*>(addr.c_str()));
- if (ia.s_addr == INADDR_NONE && addr != "255.255.255.255")
- return IPv4AddressImpl();
- else
- return IPv4AddressImpl(&ia);
-#else
- struct in_addr ia;
- if (inet_aton(addr.c_str(), &ia))
- return IPv4AddressImpl(&ia);
- else
- return IPv4AddressImpl();
-#endif
-#endif
-}
-
-
-void IPv4AddressImpl::mask(const IPAddressImpl* pMask, const IPAddressImpl* pSet)
-{
- poco_assert (pMask->af() == AF_INET && pSet->af() == AF_INET);
-
- _addr.s_addr &= static_cast<const IPv4AddressImpl*>(pMask)->_addr.s_addr;
- _addr.s_addr |= static_cast<const IPv4AddressImpl*>(pSet)->_addr.s_addr & ~static_cast<const IPv4AddressImpl*>(pMask)->_addr.s_addr;
-}
-
-
-IPAddressImpl* IPv4AddressImpl::clone() const
-{
- return new IPv4AddressImpl(&_addr);
-}
-
-
-IPv4AddressImpl IPv4AddressImpl::operator & (const IPv4AddressImpl& addr) const
-{
- IPv4AddressImpl result(&_addr);
- result._addr.s_addr &= addr._addr.s_addr;
- return result;
-}
-
-
-IPv4AddressImpl IPv4AddressImpl::operator | (const IPv4AddressImpl& addr) const
-{
- IPv4AddressImpl result(&_addr);
- result._addr.s_addr |= addr._addr.s_addr;
- return result;
-}
-
-
-IPv4AddressImpl IPv4AddressImpl::operator ^ (const IPv4AddressImpl& addr) const
-{
- IPv4AddressImpl result(&_addr);
- result._addr.s_addr ^= addr._addr.s_addr;
- return result;
-}
-
-
-IPv4AddressImpl IPv4AddressImpl::operator ~ () const
-{
-IPv4AddressImpl result(&_addr);
- result._addr.s_addr ^= 0xffffffff;
- return result;
-}
-
-
-bool IPv4AddressImpl::operator == (const IPv4AddressImpl& addr) const
-{
- return 0 == std::memcmp(&addr._addr, &_addr, sizeof(_addr));
-}
-
-
-bool IPv4AddressImpl::operator != (const IPv4AddressImpl& addr) const
-{
- return !(*this == addr);
-}
-
-
-#if defined(POCO_HAVE_IPv6)
-
-
-//
-// IPv6AddressImpl
-//
-
-
-IPv6AddressImpl::IPv6AddressImpl(): _scope(0)
-{
- std::memset(&_addr, 0, sizeof(_addr));
-}
-
-
-IPv6AddressImpl::IPv6AddressImpl(const void* addr): _scope(0)
-{
- std::memcpy(&_addr, addr, sizeof(_addr));
-}
-
-
-IPv6AddressImpl::IPv6AddressImpl(const void* addr, Poco::UInt32 scope): _scope(scope)
-{
- std::memcpy(&_addr, addr, sizeof(_addr));
-}
-
-
-IPv6AddressImpl::IPv6AddressImpl(const IPv6AddressImpl& addr): _scope(addr._scope)
-{
- std::memcpy((void*) &_addr, (void*) &addr._addr, sizeof(_addr));
-}
-
-
-IPv6AddressImpl& IPv6AddressImpl::operator = (const IPv6AddressImpl& addr)
-{
- if (this == &addr)
- return *this;
-
- _scope = addr._scope;
- std::memcpy(&_addr, &addr._addr, sizeof(_addr));
- return *this;
-}
-
-
-IPv6AddressImpl::IPv6AddressImpl(unsigned prefix):
- _scope(0)
-{
- unsigned i = 0;
-#ifdef POCO_OS_FAMILY_WINDOWS
- for (; prefix >= 16; ++i, prefix -= 16)
- {
- _addr.s6_addr16[i] = 0xffff;
- }
- if (prefix > 0)
- {
- _addr.s6_addr16[i++] = ByteOrder::toNetwork(static_cast<Poco::UInt16>(~(0xffff >> prefix)));
- }
- while (i < 8)
- {
- _addr.s6_addr16[i++] = 0;
- }
-#else
- for (; prefix >= 32; ++i, prefix -= 32)
- {
- _addr.s6_addr32[i] = 0xffffffff;
- }
- if (prefix > 0)
- {
- _addr.s6_addr32[i++] = ByteOrder::toNetwork(~(0xffffffffU >> prefix));
- }
- while (i < 4)
- {
- _addr.s6_addr32[i++] = 0;
- }
-#endif
-}
-
-
-std::string IPv6AddressImpl::toString() const
-{
- const UInt16* words = reinterpret_cast<const UInt16*>(&_addr);
- if ((isIPv4Compatible() && !isLoopback()) || isIPv4Mapped())
- {
- std::string result;
- result.reserve(24);
- if (words[5] == 0)
- result.append("::");
- else
- result.append("::ffff:");
- const UInt8* bytes = reinterpret_cast<const UInt8*>(&_addr);
- if (bytes[12] != 0) // only 0.0.0.0 can start with zero
- {
- NumberFormatter::append(result, bytes[12]);
- result.append(".");
- NumberFormatter::append(result, bytes[13]);
- result.append(".");
- NumberFormatter::append(result, bytes[14]);
- result.append(".");
- NumberFormatter::append(result, bytes[15]);
- }
- return result;
- }
- else
- {
- std::string result;
- result.reserve(64);
- bool zeroSequence = false;
- int i = 0;
- while (i < 8)
- {
- if (!zeroSequence && words[i] == 0)
- {
- int zi = i;
- while (zi < 8 && words[zi] == 0) ++zi;
- if (zi > i + 1)
- {
- i = zi;
- result.append(":");
- zeroSequence = true;
- }
- }
- if (i > 0) result.append(":");
- if (i < 8) NumberFormatter::appendHex(result, ByteOrder::fromNetwork(words[i++]));
- }
- if (_scope > 0)
- {
- result.append("%");
+//
+// IPAddress.cpp
+//
+// Library: Net
+// Package: NetCore
+// Module: IPAddress
+//
+// Copyright (c) 2005-2011, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/IPAddressImpl.h"
+#include "Poco/Net/NetException.h"
+#include "Poco/RefCountedObject.h"
+#include "Poco/NumberFormatter.h"
+#include "Poco/ByteOrder.h"
+#include "Poco/String.h"
+#include "Poco/Types.h"
+
+
+using Poco::RefCountedObject;
+using Poco::NumberFormatter;
+using Poco::toLower;
+using Poco::UInt8;
+using Poco::UInt16;
+using Poco::UInt32;
+
+
+namespace {
+
+
+template <typename T>
+unsigned maskBits(T val, unsigned size)
+ /// Returns the length of the mask (number of bits set in val).
+ /// The val should be either all zeros or two contiguos areas of 1s and 0s.
+ /// The algorithm ignores invalid non-contiguous series of 1s and treats val
+ /// as if all bits between MSb and last non-zero bit are set to 1.
+{
+ unsigned count = 0;
+ if (val)
+ {
+ val = (val ^ (val - 1)) >> 1;
+ for (count = 0; val; ++count) val >>= 1;
+ }
+ else count = size;
+ return size - count;
+}
+
+
+} // namespace
+
+
+namespace Poco {
+namespace Net {
+namespace Impl {
+
+
+//
+// IPAddressImpl
+//
+
+
+IPAddressImpl::IPAddressImpl()
+{
+}
+
+
+IPAddressImpl::~IPAddressImpl()
+{
+}
+
+
+//
+// IPv4AddressImpl
+//
+
+
+IPv4AddressImpl::IPv4AddressImpl()
+{
+ std::memset(&_addr, 0, sizeof(_addr));
+}
+
+
+IPv4AddressImpl::IPv4AddressImpl(const void* addr)
+{
+ std::memcpy(&_addr, addr, sizeof(_addr));
+}
+
+
+IPv4AddressImpl::IPv4AddressImpl(unsigned prefix)
+{
+ UInt32 addr = (prefix == 32) ? 0xffffffff : ~(0xffffffff >> prefix);
+ _addr.s_addr = ByteOrder::toNetwork(addr);
+}
+
+
+IPv4AddressImpl::IPv4AddressImpl(const IPv4AddressImpl& addr)
+{
+ std::memcpy(&_addr, &addr._addr, sizeof(_addr));
+}
+
+
+IPv4AddressImpl& IPv4AddressImpl::operator = (const IPv4AddressImpl& addr)
+{
+ if (this == &addr)
+ return *this;
+
+ std::memcpy(&_addr, &addr._addr, sizeof(_addr));
+ return *this;
+}
+
+
+std::string IPv4AddressImpl::toString() const
+{
+ const UInt8* bytes = reinterpret_cast<const UInt8*>(&_addr);
+ std::string result;
+ result.reserve(16);
+ NumberFormatter::append(result, bytes[0]);
+ result.append(".");
+ NumberFormatter::append(result, bytes[1]);
+ result.append(".");
+ NumberFormatter::append(result, bytes[2]);
+ result.append(".");
+ NumberFormatter::append(result, bytes[3]);
+ return result;
+}
+
+
+poco_socklen_t IPv4AddressImpl::length() const
+{
+ return sizeof(_addr);
+}
+
+
+const void* IPv4AddressImpl::addr() const
+{
+ return &_addr;
+}
+
+
+IPAddressImpl::Family IPv4AddressImpl::family() const
+{
+ return AddressFamily::IPv4;
+}
+
+
+int IPv4AddressImpl::af() const
+{
+ return AF_INET;
+}
+
+
+unsigned IPv4AddressImpl::prefixLength() const
+{
+ return maskBits(ntohl(_addr.s_addr), 32);
+}
+
+
+Poco::UInt32 IPv4AddressImpl::scope() const
+{
+ return 0;
+}
+
+
+bool IPv4AddressImpl::isWildcard() const
+{
+ return _addr.s_addr == INADDR_ANY;
+}
+
+
+bool IPv4AddressImpl::isBroadcast() const
+{
+ return _addr.s_addr == INADDR_NONE;
+}
+
+
+bool IPv4AddressImpl::isLoopback() const
+{
+ return (ntohl(_addr.s_addr) & 0xFF000000) == 0x7F000000; // 127.0.0.1 to 127.255.255.255
+}
+
+
+bool IPv4AddressImpl::isMulticast() const
+{
+ return (ntohl(_addr.s_addr) & 0xF0000000) == 0xE0000000; // 224.0.0.0/24 to 239.0.0.0/24
+}
+
+
+bool IPv4AddressImpl::isLinkLocal() const
+{
+ return (ntohl(_addr.s_addr) & 0xFFFF0000) == 0xA9FE0000; // 169.254.0.0/16
+}
+
+
+bool IPv4AddressImpl::isSiteLocal() const
+{
+ UInt32 addr = ntohl(_addr.s_addr);
+ return (addr & 0xFF000000) == 0x0A000000 || // 10.0.0.0/24
+ (addr & 0xFFFF0000) == 0xC0A80000 || // 192.68.0.0/16
+ (addr >= 0xAC100000 && addr <= 0xAC1FFFFF); // 172.16.0.0 to 172.31.255.255
+}
+
+
+bool IPv4AddressImpl::isIPv4Compatible() const
+{
+ return true;
+}
+
+
+bool IPv4AddressImpl::isIPv4Mapped() const
+{
+ return true;
+}
+
+
+bool IPv4AddressImpl::isWellKnownMC() const
+{
+ return (ntohl(_addr.s_addr) & 0xFFFFFF00) == 0xE0000000; // 224.0.0.0/8
+}
+
+
+bool IPv4AddressImpl::isNodeLocalMC() const
+{
+ return false;
+}
+
+
+bool IPv4AddressImpl::isLinkLocalMC() const
+{
+ return (ntohl(_addr.s_addr) & 0xFF000000) == 0xE0000000; // 244.0.0.0/24
+}
+
+
+bool IPv4AddressImpl::isSiteLocalMC() const
+{
+ return (ntohl(_addr.s_addr) & 0xFFFF0000) == 0xEFFF0000; // 239.255.0.0/16
+}
+
+
+bool IPv4AddressImpl::isOrgLocalMC() const
+{
+ return (ntohl(_addr.s_addr) & 0xFFFF0000) == 0xEFC00000; // 239.192.0.0/16
+}
+
+
+bool IPv4AddressImpl::isGlobalMC() const
+{
+ UInt32 addr = ntohl(_addr.s_addr);
+ return addr >= 0xE0000100 && addr <= 0xEE000000; // 224.0.1.0 to 238.255.255.255
+}
+
+
+IPv4AddressImpl IPv4AddressImpl::parse(const std::string& addr)
+{
+ if (addr.empty()) return IPv4AddressImpl();
#if defined(_WIN32)
- NumberFormatter::append(result, _scope);
-#else
- char buffer[IFNAMSIZ];
- if (if_indextoname(_scope, buffer))
- {
- result.append(buffer);
- }
- else
- {
- NumberFormatter::append(result, _scope);
- }
-#endif
- }
- return toLower(result);
- }
-}
-
-
-poco_socklen_t IPv6AddressImpl::length() const
-{
- return sizeof(_addr);
-}
-
-
-const void* IPv6AddressImpl::addr() const
-{
- return &_addr;
-}
-
-
-IPAddressImpl::Family IPv6AddressImpl::family() const
-{
- return AddressFamily::IPv6;
-}
-
-
-int IPv6AddressImpl::af() const
-{
- return AF_INET6;
-}
-
-
-unsigned IPv6AddressImpl::prefixLength() const
-{
- unsigned bits = 0;
- unsigned bitPos = 128;
-#if defined(POCO_OS_FAMILY_UNIX)
- for (int i = 3; i >= 0; --i)
- {
- unsigned addr = ntohl(_addr.s6_addr32[i]);
- if ((bits = maskBits(addr, 32))) return (bitPos - (32 - bits));
- bitPos -= 32;
- }
- return 0;
-#elif defined(POCO_OS_FAMILY_WINDOWS)
- for (int i = 7; i >= 0; --i)
- {
- unsigned short addr = ByteOrder::fromNetwork(_addr.s6_addr16[i]);
- bits = maskBits(addr, 16);
- if (bits)
- return (bitPos - (16 - bits));
- bitPos -= 16;
- }
- return 0;
-#else
-#warning prefixLength() not implemented
- throw NotImplementedException("prefixLength() not implemented");
-#endif
-}
-
-
-Poco::UInt32 IPv6AddressImpl::scope() const
-{
- return _scope;
-}
-
-
-bool IPv6AddressImpl::isWildcard() const
-{
- const UInt16* words = reinterpret_cast<const UInt16*>(&_addr);
- return words[0] == 0 && words[1] == 0 && words[2] == 0 && words[3] == 0 &&
- words[4] == 0 && words[5] == 0 && words[6] == 0 && words[7] == 0;
-}
-
-
-bool IPv6AddressImpl::isBroadcast() const
-{
- return false;
-}
-
-
-bool IPv6AddressImpl::isLoopback() const
-{
- const UInt16* words = reinterpret_cast<const UInt16*>(&_addr);
- return words[0] == 0 && words[1] == 0 && words[2] == 0 && words[3] == 0 &&
- words[4] == 0 && words[5] == 0 && words[6] == 0 && ByteOrder::fromNetwork(words[7]) == 0x0001;
-}
-
-
-bool IPv6AddressImpl::isMulticast() const
-{
- const UInt16* words = reinterpret_cast<const UInt16*>(&_addr);
- return (ByteOrder::fromNetwork(words[0]) & 0xFFE0) == 0xFF00;
-}
-
-
-bool IPv6AddressImpl::isLinkLocal() const
-{
- const UInt16* words = reinterpret_cast<const UInt16*>(&_addr);
- return (ByteOrder::fromNetwork(words[0]) & 0xFFE0) == 0xFE80;
-}
-
-
-bool IPv6AddressImpl::isSiteLocal() const
-{
- const UInt16* words = reinterpret_cast<const UInt16*>(&_addr);
- return ((ByteOrder::fromNetwork(words[0]) & 0xFFE0) == 0xFEC0) || ((ByteOrder::fromNetwork(words[0]) & 0xFF00) == 0xFC00);
-}
-
-
-bool IPv6AddressImpl::isIPv4Compatible() const
-{
- const UInt16* words = reinterpret_cast<const UInt16*>(&_addr);
- return words[0] == 0 && words[1] == 0 && words[2] == 0 && words[3] == 0 && words[4] == 0 && words[5] == 0;
-}
-
-
-bool IPv6AddressImpl::isIPv4Mapped() const
-{
- const UInt16* words = reinterpret_cast<const UInt16*>(&_addr);
- return words[0] == 0 && words[1] == 0 && words[2] == 0 && words[3] == 0 && words[4] == 0 && ByteOrder::fromNetwork(words[5]) == 0xFFFF;
-}
-
-
-bool IPv6AddressImpl::isWellKnownMC() const
-{
- const UInt16* words = reinterpret_cast<const UInt16*>(&_addr);
- return (ByteOrder::fromNetwork(words[0]) & 0xFFF0) == 0xFF00;
-}
-
-
-bool IPv6AddressImpl::isNodeLocalMC() const
-{
- const UInt16* words = reinterpret_cast<const UInt16*>(&_addr);
- return (ByteOrder::fromNetwork(words[0]) & 0xFFEF) == 0xFF01;
-}
-
-
-bool IPv6AddressImpl::isLinkLocalMC() const
-{
- const UInt16* words = reinterpret_cast<const UInt16*>(&_addr);
- return (ByteOrder::fromNetwork(words[0]) & 0xFFEF) == 0xFF02;
-}
-
-
-bool IPv6AddressImpl::isSiteLocalMC() const
-{
- const UInt16* words = reinterpret_cast<const UInt16*>(&_addr);
- return (ByteOrder::fromNetwork(words[0]) & 0xFFEF) == 0xFF05;
-}
-
-
-bool IPv6AddressImpl::isOrgLocalMC() const
-{
- const UInt16* words = reinterpret_cast<const UInt16*>(&_addr);
- return (ByteOrder::fromNetwork(words[0]) & 0xFFEF) == 0xFF08;
-}
-
-
-bool IPv6AddressImpl::isGlobalMC() const
-{
- const UInt16* words = reinterpret_cast<const UInt16*>(&_addr);
- return (ByteOrder::fromNetwork(words[0]) & 0xFFEF) == 0xFF0F;
-}
-
-
-IPv6AddressImpl IPv6AddressImpl::parse(const std::string& addr)
-{
- if (addr.empty()) return IPv6AddressImpl();
-#if defined(_WIN32)
- struct addrinfo* pAI;
- struct addrinfo hints;
- std::memset(&hints, 0, sizeof(hints));
- hints.ai_flags = AI_NUMERICHOST;
- int rc = getaddrinfo(addr.c_str(), NULL, &hints, &pAI);
- if (rc == 0)
- {
- IPv6AddressImpl result = IPv6AddressImpl(&reinterpret_cast<struct sockaddr_in6*>(pAI->ai_addr)->sin6_addr, static_cast<int>(reinterpret_cast<struct sockaddr_in6*>(pAI->ai_addr)->sin6_scope_id));
- freeaddrinfo(pAI);
- return result;
- }
- else return IPv6AddressImpl();
-#else
- struct in6_addr ia;
- std::string::size_type pos = addr.find('%');
- if (std::string::npos != pos)
- {
- std::string::size_type start = ('[' == addr[0]) ? 1 : 0;
- std::string unscopedAddr(addr, start, pos - start);
- std::string scope(addr, pos + 1, addr.size() - start - pos);
- Poco::UInt32 scopeId(0);
- if (!(scopeId = if_nametoindex(scope.c_str())))
- return IPv6AddressImpl();
- if (inet_pton(AF_INET6, unscopedAddr.c_str(), &ia) == 1)
- return IPv6AddressImpl(&ia, scopeId);
- else
- return IPv6AddressImpl();
- }
- else
- {
- if (inet_pton(AF_INET6, addr.c_str(), &ia) == 1)
- return IPv6AddressImpl(&ia);
- else
- return IPv6AddressImpl();
- }
-#endif
-}
-
-
-void IPv6AddressImpl::mask(const IPAddressImpl* /*pMask*/, const IPAddressImpl* /*pSet*/)
-{
- throw Poco::NotImplementedException("mask() is only supported for IPv4 addresses");
-}
-
-
-IPAddressImpl* IPv6AddressImpl::clone() const
-{
- return new IPv6AddressImpl(*this);
-}
-
-
-IPv6AddressImpl IPv6AddressImpl::operator & (const IPv6AddressImpl& addr) const
-{
- if (_scope != addr._scope)
- throw Poco::InvalidArgumentException("Scope ID of passed IPv6 address does not match with the source one.");
-
- IPv6AddressImpl result(*this);
-#ifdef POCO_OS_FAMILY_WINDOWS
- result._addr.s6_addr16[0] &= addr._addr.s6_addr16[0];
- result._addr.s6_addr16[1] &= addr._addr.s6_addr16[1];
- result._addr.s6_addr16[2] &= addr._addr.s6_addr16[2];
- result._addr.s6_addr16[3] &= addr._addr.s6_addr16[3];
- result._addr.s6_addr16[4] &= addr._addr.s6_addr16[4];
- result._addr.s6_addr16[5] &= addr._addr.s6_addr16[5];
- result._addr.s6_addr16[6] &= addr._addr.s6_addr16[6];
- result._addr.s6_addr16[7] &= addr._addr.s6_addr16[7];
-#else
- result._addr.s6_addr32[0] &= addr._addr.s6_addr32[0];
- result._addr.s6_addr32[1] &= addr._addr.s6_addr32[1];
- result._addr.s6_addr32[2] &= addr._addr.s6_addr32[2];
- result._addr.s6_addr32[3] &= addr._addr.s6_addr32[3];
-#endif
- return result;
-}
-
-
-IPv6AddressImpl IPv6AddressImpl::operator | (const IPv6AddressImpl& addr) const
-{
- if (_scope != addr._scope)
- throw Poco::InvalidArgumentException("Scope ID of passed IPv6 address does not match with the source one.");
-
- IPv6AddressImpl result(*this);
-#ifdef POCO_OS_FAMILY_WINDOWS
- result._addr.s6_addr16[0] |= addr._addr.s6_addr16[0];
- result._addr.s6_addr16[1] |= addr._addr.s6_addr16[1];
- result._addr.s6_addr16[2] |= addr._addr.s6_addr16[2];
- result._addr.s6_addr16[3] |= addr._addr.s6_addr16[3];
- result._addr.s6_addr16[4] |= addr._addr.s6_addr16[4];
- result._addr.s6_addr16[5] |= addr._addr.s6_addr16[5];
- result._addr.s6_addr16[6] |= addr._addr.s6_addr16[6];
- result._addr.s6_addr16[7] |= addr._addr.s6_addr16[7];
-#else
- result._addr.s6_addr32[0] |= addr._addr.s6_addr32[0];
- result._addr.s6_addr32[1] |= addr._addr.s6_addr32[1];
- result._addr.s6_addr32[2] |= addr._addr.s6_addr32[2];
- result._addr.s6_addr32[3] |= addr._addr.s6_addr32[3];
-#endif
- return result;
-}
-
-
-IPv6AddressImpl IPv6AddressImpl::operator ^ (const IPv6AddressImpl& addr) const
-{
+ struct in_addr ia;
+ ia.s_addr = inet_addr(addr.c_str());
+ if (ia.s_addr == INADDR_NONE && addr != "255.255.255.255")
+ return IPv4AddressImpl();
+ else
+ return IPv4AddressImpl(&ia);
+#else
+#if __GNUC__ < 3 || defined(POCO_VXWORKS)
+ struct in_addr ia;
+ ia.s_addr = inet_addr(const_cast<char*>(addr.c_str()));
+ if (ia.s_addr == INADDR_NONE && addr != "255.255.255.255")
+ return IPv4AddressImpl();
+ else
+ return IPv4AddressImpl(&ia);
+#else
+ struct in_addr ia;
+ if (inet_aton(addr.c_str(), &ia))
+ return IPv4AddressImpl(&ia);
+ else
+ return IPv4AddressImpl();
+#endif
+#endif
+}
+
+
+void IPv4AddressImpl::mask(const IPAddressImpl* pMask, const IPAddressImpl* pSet)
+{
+ poco_assert (pMask->af() == AF_INET && pSet->af() == AF_INET);
+
+ _addr.s_addr &= static_cast<const IPv4AddressImpl*>(pMask)->_addr.s_addr;
+ _addr.s_addr |= static_cast<const IPv4AddressImpl*>(pSet)->_addr.s_addr & ~static_cast<const IPv4AddressImpl*>(pMask)->_addr.s_addr;
+}
+
+
+IPAddressImpl* IPv4AddressImpl::clone() const
+{
+ return new IPv4AddressImpl(&_addr);
+}
+
+
+IPv4AddressImpl IPv4AddressImpl::operator & (const IPv4AddressImpl& addr) const
+{
+ IPv4AddressImpl result(&_addr);
+ result._addr.s_addr &= addr._addr.s_addr;
+ return result;
+}
+
+
+IPv4AddressImpl IPv4AddressImpl::operator | (const IPv4AddressImpl& addr) const
+{
+ IPv4AddressImpl result(&_addr);
+ result._addr.s_addr |= addr._addr.s_addr;
+ return result;
+}
+
+
+IPv4AddressImpl IPv4AddressImpl::operator ^ (const IPv4AddressImpl& addr) const
+{
+ IPv4AddressImpl result(&_addr);
+ result._addr.s_addr ^= addr._addr.s_addr;
+ return result;
+}
+
+
+IPv4AddressImpl IPv4AddressImpl::operator ~ () const
+{
+IPv4AddressImpl result(&_addr);
+ result._addr.s_addr ^= 0xffffffff;
+ return result;
+}
+
+
+bool IPv4AddressImpl::operator == (const IPv4AddressImpl& addr) const
+{
+ return 0 == std::memcmp(&addr._addr, &_addr, sizeof(_addr));
+}
+
+
+bool IPv4AddressImpl::operator != (const IPv4AddressImpl& addr) const
+{
+ return !(*this == addr);
+}
+
+
+#if defined(POCO_HAVE_IPv6)
+
+
+//
+// IPv6AddressImpl
+//
+
+
+IPv6AddressImpl::IPv6AddressImpl(): _scope(0)
+{
+ std::memset(&_addr, 0, sizeof(_addr));
+}
+
+
+IPv6AddressImpl::IPv6AddressImpl(const void* addr): _scope(0)
+{
+ std::memcpy(&_addr, addr, sizeof(_addr));
+}
+
+
+IPv6AddressImpl::IPv6AddressImpl(const void* addr, Poco::UInt32 scope): _scope(scope)
+{
+ std::memcpy(&_addr, addr, sizeof(_addr));
+}
+
+
+IPv6AddressImpl::IPv6AddressImpl(const IPv6AddressImpl& addr): _scope(addr._scope)
+{
+ std::memcpy((void*) &_addr, (void*) &addr._addr, sizeof(_addr));
+}
+
+
+IPv6AddressImpl& IPv6AddressImpl::operator = (const IPv6AddressImpl& addr)
+{
+ if (this == &addr)
+ return *this;
+
+ _scope = addr._scope;
+ std::memcpy(&_addr, &addr._addr, sizeof(_addr));
+ return *this;
+}
+
+
+IPv6AddressImpl::IPv6AddressImpl(unsigned prefix):
+ _scope(0)
+{
+ unsigned i = 0;
+#ifdef POCO_OS_FAMILY_WINDOWS
+ for (; prefix >= 16; ++i, prefix -= 16)
+ {
+ _addr.s6_addr16[i] = 0xffff;
+ }
+ if (prefix > 0)
+ {
+ _addr.s6_addr16[i++] = ByteOrder::toNetwork(static_cast<Poco::UInt16>(~(0xffff >> prefix)));
+ }
+ while (i < 8)
+ {
+ _addr.s6_addr16[i++] = 0;
+ }
+#else
+ for (; prefix >= 32; ++i, prefix -= 32)
+ {
+ _addr.s6_addr32[i] = 0xffffffff;
+ }
+ if (prefix > 0)
+ {
+ _addr.s6_addr32[i++] = ByteOrder::toNetwork(~(0xffffffffU >> prefix));
+ }
+ while (i < 4)
+ {
+ _addr.s6_addr32[i++] = 0;
+ }
+#endif
+}
+
+
+std::string IPv6AddressImpl::toString() const
+{
+ const UInt16* words = reinterpret_cast<const UInt16*>(&_addr);
+ if ((isIPv4Compatible() && !isLoopback()) || isIPv4Mapped())
+ {
+ std::string result;
+ result.reserve(24);
+ if (words[5] == 0)
+ result.append("::");
+ else
+ result.append("::ffff:");
+ const UInt8* bytes = reinterpret_cast<const UInt8*>(&_addr);
+ if (bytes[12] != 0) // only 0.0.0.0 can start with zero
+ {
+ NumberFormatter::append(result, bytes[12]);
+ result.append(".");
+ NumberFormatter::append(result, bytes[13]);
+ result.append(".");
+ NumberFormatter::append(result, bytes[14]);
+ result.append(".");
+ NumberFormatter::append(result, bytes[15]);
+ }
+ return result;
+ }
+ else
+ {
+ std::string result;
+ result.reserve(64);
+ bool zeroSequence = false;
+ int i = 0;
+ while (i < 8)
+ {
+ if (!zeroSequence && words[i] == 0)
+ {
+ int zi = i;
+ while (zi < 8 && words[zi] == 0) ++zi;
+ if (zi > i + 1)
+ {
+ i = zi;
+ result.append(":");
+ zeroSequence = true;
+ }
+ }
+ if (i > 0) result.append(":");
+ if (i < 8) NumberFormatter::appendHex(result, ByteOrder::fromNetwork(words[i++]));
+ }
+ if (_scope > 0)
+ {
+ result.append("%");
+#if defined(_WIN32)
+ NumberFormatter::append(result, _scope);
+#else
+ char buffer[IFNAMSIZ];
+ if (if_indextoname(_scope, buffer))
+ {
+ result.append(buffer);
+ }
+ else
+ {
+ NumberFormatter::append(result, _scope);
+ }
+#endif
+ }
+ return toLower(result);
+ }
+}
+
+
+poco_socklen_t IPv6AddressImpl::length() const
+{
+ return sizeof(_addr);
+}
+
+
+const void* IPv6AddressImpl::addr() const
+{
+ return &_addr;
+}
+
+
+IPAddressImpl::Family IPv6AddressImpl::family() const
+{
+ return AddressFamily::IPv6;
+}
+
+
+int IPv6AddressImpl::af() const
+{
+ return AF_INET6;
+}
+
+
+unsigned IPv6AddressImpl::prefixLength() const
+{
+ unsigned bits = 0;
+ unsigned bitPos = 128;
+#if defined(POCO_OS_FAMILY_UNIX)
+ for (int i = 3; i >= 0; --i)
+ {
+ unsigned addr = ntohl(_addr.s6_addr32[i]);
+ if ((bits = maskBits(addr, 32))) return (bitPos - (32 - bits));
+ bitPos -= 32;
+ }
+ return 0;
+#elif defined(POCO_OS_FAMILY_WINDOWS)
+ for (int i = 7; i >= 0; --i)
+ {
+ unsigned short addr = ByteOrder::fromNetwork(_addr.s6_addr16[i]);
+ bits = maskBits(addr, 16);
+ if (bits)
+ return (bitPos - (16 - bits));
+ bitPos -= 16;
+ }
+ return 0;
+#else
+#warning prefixLength() not implemented
+ throw NotImplementedException("prefixLength() not implemented");
+#endif
+}
+
+
+Poco::UInt32 IPv6AddressImpl::scope() const
+{
+ return _scope;
+}
+
+
+bool IPv6AddressImpl::isWildcard() const
+{
+ const UInt16* words = reinterpret_cast<const UInt16*>(&_addr);
+ return words[0] == 0 && words[1] == 0 && words[2] == 0 && words[3] == 0 &&
+ words[4] == 0 && words[5] == 0 && words[6] == 0 && words[7] == 0;
+}
+
+
+bool IPv6AddressImpl::isBroadcast() const
+{
+ return false;
+}
+
+
+bool IPv6AddressImpl::isLoopback() const
+{
+ const UInt16* words = reinterpret_cast<const UInt16*>(&_addr);
+ return words[0] == 0 && words[1] == 0 && words[2] == 0 && words[3] == 0 &&
+ words[4] == 0 && words[5] == 0 && words[6] == 0 && ByteOrder::fromNetwork(words[7]) == 0x0001;
+}
+
+
+bool IPv6AddressImpl::isMulticast() const
+{
+ const UInt16* words = reinterpret_cast<const UInt16*>(&_addr);
+ return (ByteOrder::fromNetwork(words[0]) & 0xFFE0) == 0xFF00;
+}
+
+
+bool IPv6AddressImpl::isLinkLocal() const
+{
+ const UInt16* words = reinterpret_cast<const UInt16*>(&_addr);
+ return (ByteOrder::fromNetwork(words[0]) & 0xFFE0) == 0xFE80;
+}
+
+
+bool IPv6AddressImpl::isSiteLocal() const
+{
+ const UInt16* words = reinterpret_cast<const UInt16*>(&_addr);
+ return ((ByteOrder::fromNetwork(words[0]) & 0xFFE0) == 0xFEC0) || ((ByteOrder::fromNetwork(words[0]) & 0xFF00) == 0xFC00);
+}
+
+
+bool IPv6AddressImpl::isIPv4Compatible() const
+{
+ const UInt16* words = reinterpret_cast<const UInt16*>(&_addr);
+ return words[0] == 0 && words[1] == 0 && words[2] == 0 && words[3] == 0 && words[4] == 0 && words[5] == 0;
+}
+
+
+bool IPv6AddressImpl::isIPv4Mapped() const
+{
+ const UInt16* words = reinterpret_cast<const UInt16*>(&_addr);
+ return words[0] == 0 && words[1] == 0 && words[2] == 0 && words[3] == 0 && words[4] == 0 && ByteOrder::fromNetwork(words[5]) == 0xFFFF;
+}
+
+
+bool IPv6AddressImpl::isWellKnownMC() const
+{
+ const UInt16* words = reinterpret_cast<const UInt16*>(&_addr);
+ return (ByteOrder::fromNetwork(words[0]) & 0xFFF0) == 0xFF00;
+}
+
+
+bool IPv6AddressImpl::isNodeLocalMC() const
+{
+ const UInt16* words = reinterpret_cast<const UInt16*>(&_addr);
+ return (ByteOrder::fromNetwork(words[0]) & 0xFFEF) == 0xFF01;
+}
+
+
+bool IPv6AddressImpl::isLinkLocalMC() const
+{
+ const UInt16* words = reinterpret_cast<const UInt16*>(&_addr);
+ return (ByteOrder::fromNetwork(words[0]) & 0xFFEF) == 0xFF02;
+}
+
+
+bool IPv6AddressImpl::isSiteLocalMC() const
+{
+ const UInt16* words = reinterpret_cast<const UInt16*>(&_addr);
+ return (ByteOrder::fromNetwork(words[0]) & 0xFFEF) == 0xFF05;
+}
+
+
+bool IPv6AddressImpl::isOrgLocalMC() const
+{
+ const UInt16* words = reinterpret_cast<const UInt16*>(&_addr);
+ return (ByteOrder::fromNetwork(words[0]) & 0xFFEF) == 0xFF08;
+}
+
+
+bool IPv6AddressImpl::isGlobalMC() const
+{
+ const UInt16* words = reinterpret_cast<const UInt16*>(&_addr);
+ return (ByteOrder::fromNetwork(words[0]) & 0xFFEF) == 0xFF0F;
+}
+
+
+IPv6AddressImpl IPv6AddressImpl::parse(const std::string& addr)
+{
+ if (addr.empty()) return IPv6AddressImpl();
+#if defined(_WIN32)
+ struct addrinfo* pAI;
+ struct addrinfo hints;
+ std::memset(&hints, 0, sizeof(hints));
+ hints.ai_flags = AI_NUMERICHOST;
+ int rc = getaddrinfo(addr.c_str(), NULL, &hints, &pAI);
+ if (rc == 0)
+ {
+ IPv6AddressImpl result = IPv6AddressImpl(&reinterpret_cast<struct sockaddr_in6*>(pAI->ai_addr)->sin6_addr, static_cast<int>(reinterpret_cast<struct sockaddr_in6*>(pAI->ai_addr)->sin6_scope_id));
+ freeaddrinfo(pAI);
+ return result;
+ }
+ else return IPv6AddressImpl();
+#else
+ struct in6_addr ia;
+ std::string::size_type pos = addr.find('%');
+ if (std::string::npos != pos)
+ {
+ std::string::size_type start = ('[' == addr[0]) ? 1 : 0;
+ std::string unscopedAddr(addr, start, pos - start);
+ std::string scope(addr, pos + 1, addr.size() - start - pos);
+ Poco::UInt32 scopeId(0);
+ if (!(scopeId = if_nametoindex(scope.c_str())))
+ return IPv6AddressImpl();
+ if (inet_pton(AF_INET6, unscopedAddr.c_str(), &ia) == 1)
+ return IPv6AddressImpl(&ia, scopeId);
+ else
+ return IPv6AddressImpl();
+ }
+ else
+ {
+ if (inet_pton(AF_INET6, addr.c_str(), &ia) == 1)
+ return IPv6AddressImpl(&ia);
+ else
+ return IPv6AddressImpl();
+ }
+#endif
+}
+
+
+void IPv6AddressImpl::mask(const IPAddressImpl* /*pMask*/, const IPAddressImpl* /*pSet*/)
+{
+ throw Poco::NotImplementedException("mask() is only supported for IPv4 addresses");
+}
+
+
+IPAddressImpl* IPv6AddressImpl::clone() const
+{
+ return new IPv6AddressImpl(*this);
+}
+
+
+IPv6AddressImpl IPv6AddressImpl::operator & (const IPv6AddressImpl& addr) const
+{
+ if (_scope != addr._scope)
+ throw Poco::InvalidArgumentException("Scope ID of passed IPv6 address does not match with the source one.");
+
+ IPv6AddressImpl result(*this);
+#ifdef POCO_OS_FAMILY_WINDOWS
+ result._addr.s6_addr16[0] &= addr._addr.s6_addr16[0];
+ result._addr.s6_addr16[1] &= addr._addr.s6_addr16[1];
+ result._addr.s6_addr16[2] &= addr._addr.s6_addr16[2];
+ result._addr.s6_addr16[3] &= addr._addr.s6_addr16[3];
+ result._addr.s6_addr16[4] &= addr._addr.s6_addr16[4];
+ result._addr.s6_addr16[5] &= addr._addr.s6_addr16[5];
+ result._addr.s6_addr16[6] &= addr._addr.s6_addr16[6];
+ result._addr.s6_addr16[7] &= addr._addr.s6_addr16[7];
+#else
+ result._addr.s6_addr32[0] &= addr._addr.s6_addr32[0];
+ result._addr.s6_addr32[1] &= addr._addr.s6_addr32[1];
+ result._addr.s6_addr32[2] &= addr._addr.s6_addr32[2];
+ result._addr.s6_addr32[3] &= addr._addr.s6_addr32[3];
+#endif
+ return result;
+}
+
+
+IPv6AddressImpl IPv6AddressImpl::operator | (const IPv6AddressImpl& addr) const
+{
if (_scope != addr._scope)
- throw Poco::InvalidArgumentException("Scope ID of passed IPv6 address does not match with the source one.");
-
- IPv6AddressImpl result(*this);
-
-#ifdef POCO_OS_FAMILY_WINDOWS
- result._addr.s6_addr16[0] ^= addr._addr.s6_addr16[0];
- result._addr.s6_addr16[1] ^= addr._addr.s6_addr16[1];
- result._addr.s6_addr16[2] ^= addr._addr.s6_addr16[2];
- result._addr.s6_addr16[3] ^= addr._addr.s6_addr16[3];
- result._addr.s6_addr16[4] ^= addr._addr.s6_addr16[4];
- result._addr.s6_addr16[5] ^= addr._addr.s6_addr16[5];
- result._addr.s6_addr16[6] ^= addr._addr.s6_addr16[6];
- result._addr.s6_addr16[7] ^= addr._addr.s6_addr16[7];
-#else
- result._addr.s6_addr32[0] ^= addr._addr.s6_addr32[0];
- result._addr.s6_addr32[1] ^= addr._addr.s6_addr32[1];
- result._addr.s6_addr32[2] ^= addr._addr.s6_addr32[2];
- result._addr.s6_addr32[3] ^= addr._addr.s6_addr32[3];
-#endif
- return result;
-}
-
-
-IPv6AddressImpl IPv6AddressImpl::operator ~ () const
-{
- IPv6AddressImpl result(*this);
-#ifdef POCO_OS_FAMILY_WINDOWS
- result._addr.s6_addr16[0] ^= 0xffff;
- result._addr.s6_addr16[1] ^= 0xffff;
- result._addr.s6_addr16[2] ^= 0xffff;
- result._addr.s6_addr16[3] ^= 0xffff;
- result._addr.s6_addr16[4] ^= 0xffff;
- result._addr.s6_addr16[5] ^= 0xffff;
- result._addr.s6_addr16[6] ^= 0xffff;
- result._addr.s6_addr16[7] ^= 0xffff;
-#else
- result._addr.s6_addr32[0] ^= 0xffffffff;
- result._addr.s6_addr32[1] ^= 0xffffffff;
- result._addr.s6_addr32[2] ^= 0xffffffff;
- result._addr.s6_addr32[3] ^= 0xffffffff;
-#endif
- return result;
-}
-
-
-bool IPv6AddressImpl::operator == (const IPv6AddressImpl& addr) const
-{
- return _scope == addr._scope && 0 == std::memcmp(&addr._addr, &_addr, sizeof(_addr));
-}
-
-
-bool IPv6AddressImpl::operator != (const IPv6AddressImpl& addr) const
-{
- return !(*this == addr);
-}
-
-
-#endif // POCO_HAVE_IPv6
-
-
-} } } // namespace Poco::Net::Impl
+ throw Poco::InvalidArgumentException("Scope ID of passed IPv6 address does not match with the source one.");
+
+ IPv6AddressImpl result(*this);
+#ifdef POCO_OS_FAMILY_WINDOWS
+ result._addr.s6_addr16[0] |= addr._addr.s6_addr16[0];
+ result._addr.s6_addr16[1] |= addr._addr.s6_addr16[1];
+ result._addr.s6_addr16[2] |= addr._addr.s6_addr16[2];
+ result._addr.s6_addr16[3] |= addr._addr.s6_addr16[3];
+ result._addr.s6_addr16[4] |= addr._addr.s6_addr16[4];
+ result._addr.s6_addr16[5] |= addr._addr.s6_addr16[5];
+ result._addr.s6_addr16[6] |= addr._addr.s6_addr16[6];
+ result._addr.s6_addr16[7] |= addr._addr.s6_addr16[7];
+#else
+ result._addr.s6_addr32[0] |= addr._addr.s6_addr32[0];
+ result._addr.s6_addr32[1] |= addr._addr.s6_addr32[1];
+ result._addr.s6_addr32[2] |= addr._addr.s6_addr32[2];
+ result._addr.s6_addr32[3] |= addr._addr.s6_addr32[3];
+#endif
+ return result;
+}
+
+
+IPv6AddressImpl IPv6AddressImpl::operator ^ (const IPv6AddressImpl& addr) const
+{
+ if (_scope != addr._scope)
+ throw Poco::InvalidArgumentException("Scope ID of passed IPv6 address does not match with the source one.");
+
+ IPv6AddressImpl result(*this);
+
+#ifdef POCO_OS_FAMILY_WINDOWS
+ result._addr.s6_addr16[0] ^= addr._addr.s6_addr16[0];
+ result._addr.s6_addr16[1] ^= addr._addr.s6_addr16[1];
+ result._addr.s6_addr16[2] ^= addr._addr.s6_addr16[2];
+ result._addr.s6_addr16[3] ^= addr._addr.s6_addr16[3];
+ result._addr.s6_addr16[4] ^= addr._addr.s6_addr16[4];
+ result._addr.s6_addr16[5] ^= addr._addr.s6_addr16[5];
+ result._addr.s6_addr16[6] ^= addr._addr.s6_addr16[6];
+ result._addr.s6_addr16[7] ^= addr._addr.s6_addr16[7];
+#else
+ result._addr.s6_addr32[0] ^= addr._addr.s6_addr32[0];
+ result._addr.s6_addr32[1] ^= addr._addr.s6_addr32[1];
+ result._addr.s6_addr32[2] ^= addr._addr.s6_addr32[2];
+ result._addr.s6_addr32[3] ^= addr._addr.s6_addr32[3];
+#endif
+ return result;
+}
+
+
+IPv6AddressImpl IPv6AddressImpl::operator ~ () const
+{
+ IPv6AddressImpl result(*this);
+#ifdef POCO_OS_FAMILY_WINDOWS
+ result._addr.s6_addr16[0] ^= 0xffff;
+ result._addr.s6_addr16[1] ^= 0xffff;
+ result._addr.s6_addr16[2] ^= 0xffff;
+ result._addr.s6_addr16[3] ^= 0xffff;
+ result._addr.s6_addr16[4] ^= 0xffff;
+ result._addr.s6_addr16[5] ^= 0xffff;
+ result._addr.s6_addr16[6] ^= 0xffff;
+ result._addr.s6_addr16[7] ^= 0xffff;
+#else
+ result._addr.s6_addr32[0] ^= 0xffffffff;
+ result._addr.s6_addr32[1] ^= 0xffffffff;
+ result._addr.s6_addr32[2] ^= 0xffffffff;
+ result._addr.s6_addr32[3] ^= 0xffffffff;
+#endif
+ return result;
+}
+
+
+bool IPv6AddressImpl::operator == (const IPv6AddressImpl& addr) const
+{
+ return _scope == addr._scope && 0 == std::memcmp(&addr._addr, &_addr, sizeof(_addr));
+}
+
+
+bool IPv6AddressImpl::operator != (const IPv6AddressImpl& addr) const
+{
+ return !(*this == addr);
+}
+
+
+#endif // POCO_HAVE_IPv6
+
+
+} } } // namespace Poco::Net::Impl
diff --git a/contrib/libs/poco/Net/src/MailMessage.cpp b/contrib/libs/poco/Net/src/MailMessage.cpp
index 3bc82e0f0c..6246f9e90b 100644
--- a/contrib/libs/poco/Net/src/MailMessage.cpp
+++ b/contrib/libs/poco/Net/src/MailMessage.cpp
@@ -1,695 +1,695 @@
-//
-// MailMessage.cpp
-//
-// Library: Net
-// Package: Mail
-// Module: MailMessage
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/MailMessage.h"
-#include "Poco/Net/MediaType.h"
-#include "Poco/Net/MultipartReader.h"
-#include "Poco/Net/MultipartWriter.h"
-#include "Poco/Net/PartSource.h"
-#include "Poco/Net/PartHandler.h"
-#include "Poco/Net/StringPartSource.h"
-#include "Poco/Net/QuotedPrintableEncoder.h"
-#include "Poco/Net/QuotedPrintableDecoder.h"
-#include "Poco/Net/NameValueCollection.h"
-#include "Poco/Base64Encoder.h"
-#include "Poco/Base64Decoder.h"
-#include "Poco/StreamCopier.h"
-#include "Poco/DateTimeFormat.h"
-#include "Poco/DateTimeFormatter.h"
-#include "Poco/DateTimeParser.h"
-#include "Poco/String.h"
-#include "Poco/StringTokenizer.h"
-#include "Poco/StreamCopier.h"
-#include "Poco/NumberFormatter.h"
-#include <sstream>
-
-
-using Poco::Base64Encoder;
-using Poco::Base64Decoder;
-using Poco::StreamCopier;
-using Poco::DateTimeFormat;
-using Poco::DateTimeFormatter;
-using Poco::DateTimeParser;
-using Poco::StringTokenizer;
-using Poco::icompare;
-
-
-namespace Poco {
-namespace Net {
-
-
-namespace
-{
- class MultiPartHandler: public PartHandler
- /// This is a default part handler for multipart messages, used when there
- /// is no external handler provided to he MailMessage. This handler
- /// will handle all types of message parts, including attachments.
- {
- public:
- MultiPartHandler(MailMessage* pMsg): _pMsg(pMsg)
- /// Creates multi part handler.
- /// The pMsg pointer points to the calling MailMessage
- /// and will be used to properly populate it, so the
- /// message content could be written out unmodified
- /// in its entirety, including attachments.
- {
- }
-
- ~MultiPartHandler()
- /// Destroys string part handler.
- {
- }
-
- void handlePart(const MessageHeader& header, std::istream& stream)
- /// Handles a part. If message pointer was provided at construction time,
- /// the message pointed to will be properly populated so it could be written
- /// back out at a later point in time.
- {
- std::string tmp;
- Poco::StreamCopier::copyToString(stream, tmp);
- if (_pMsg)
- {
- MailMessage::ContentTransferEncoding cte = MailMessage::ENCODING_7BIT;
- if (header.has(MailMessage::HEADER_CONTENT_TRANSFER_ENCODING))
- {
- std::string enc = header[MailMessage::HEADER_CONTENT_TRANSFER_ENCODING];
- if (enc == MailMessage::CTE_8BIT)
- cte = MailMessage::ENCODING_8BIT;
- else if (enc == MailMessage::CTE_QUOTED_PRINTABLE)
- cte = MailMessage::ENCODING_QUOTED_PRINTABLE;
- else if (enc == MailMessage::CTE_BASE64)
- cte = MailMessage::ENCODING_BASE64;
- }
-
- std::string contentType = header.get(MailMessage::HEADER_CONTENT_TYPE, "");
- std::string contentDisp = header.get(MailMessage::HEADER_CONTENT_DISPOSITION, "");
- std::string filename;
- if (!contentDisp.empty())
- filename = getParamFromHeader(contentDisp, "filename");
- if (filename.empty())
- filename = getParamFromHeader(contentType, "name");
- PartSource* pPS = _pMsg->createPartStore(tmp, contentType, filename);
- poco_check_ptr (pPS);
- NameValueCollection::ConstIterator it = header.begin();
- NameValueCollection::ConstIterator end = header.end();
- bool added = false;
- for (; it != end; ++it)
- {
- if (!added && MailMessage::HEADER_CONTENT_DISPOSITION == it->first)
- {
- if (it->second == "inline")
- _pMsg->addContent(pPS, cte);
- else
- _pMsg->addAttachment("", pPS, cte);
- added = true;
- }
-
- pPS->headers().set(it->first, it->second);
- }
-
- if (contentDisp.empty())
- {
- _pMsg->addContent(pPS, cte);
- added = true;
- }
-
- if (!added) delete pPS;
- }
- }
-
- private:
- std::string getParamFromHeader(const std::string& header, const std::string& param)
- {
- StringTokenizer st(header, ";=", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM);
- StringTokenizer::Iterator it = st.begin();
- StringTokenizer::Iterator end = st.end();
- for (; it != end; ++it) { if (*it == param) break; }
- if (it != end)
- {
- ++it;
- if (it == end) return "";
- return *it;
- }
- return "";
- }
-
- MailMessage* _pMsg;
- };
-
-
- class StringPartHandler: public PartHandler
- /// This is a default part handler, used when there is no
- /// external handler provided to the MailMessage. This handler
- /// handles only single-part messages.
- {
- public:
- StringPartHandler(std::string& content): _str(content)
- /// Creates string part handler.
- /// The content parameter represents the part content.
- {
- }
-
- ~StringPartHandler()
- /// Destroys string part handler.
- {
- }
-
- void handlePart(const MessageHeader& /*header*/, std::istream& stream)
- /// Handles a part.
- {
- std::string tmp;
- Poco::StreamCopier::copyToString(stream, tmp);
- _str.append(tmp);
- }
-
- private:
- std::string& _str;
- };
-}
-
-
-const std::string MailMessage::HEADER_SUBJECT("Subject");
-const std::string MailMessage::HEADER_FROM("From");
-const std::string MailMessage::HEADER_TO("To");
-const std::string MailMessage::HEADER_CC("CC");
-const std::string MailMessage::HEADER_BCC("BCC");
-const std::string MailMessage::HEADER_DATE("Date");
-const std::string MailMessage::HEADER_CONTENT_TYPE("Content-Type");
-const std::string MailMessage::HEADER_CONTENT_TRANSFER_ENCODING("Content-Transfer-Encoding");
-const std::string MailMessage::HEADER_CONTENT_DISPOSITION("Content-Disposition");
-const std::string MailMessage::HEADER_CONTENT_ID("Content-ID");
-const std::string MailMessage::HEADER_MIME_VERSION("Mime-Version");
-const std::string MailMessage::EMPTY_HEADER;
-const std::string MailMessage::TEXT_PLAIN("text/plain");
-const std::string MailMessage::CTE_7BIT("7bit");
-const std::string MailMessage::CTE_8BIT("8bit");
-const std::string MailMessage::CTE_QUOTED_PRINTABLE("quoted-printable");
-const std::string MailMessage::CTE_BASE64("base64");
-
-
-MailMessage::MailMessage(PartStoreFactory* pStoreFactory):
- _encoding(),
- _pStoreFactory(pStoreFactory)
-{
- Poco::Timestamp now;
- setDate(now);
- setContentType("text/plain");
-}
-
-
-MailMessage::~MailMessage()
-{
- for (PartVec::iterator it = _parts.begin(); it != _parts.end(); ++it)
- {
- delete it->pSource;
- }
-}
-
-
-void MailMessage::addRecipient(const MailRecipient& recipient)
-{
- _recipients.push_back(recipient);
-}
-
-
-void MailMessage::setRecipients(const Recipients& recipients)
-{
- _recipients.assign(recipients.begin(), recipients.end());
-}
-
-
-void MailMessage::setSender(const std::string& sender)
-{
- set(HEADER_FROM, sender);
-}
-
-
-const std::string& MailMessage::getSender() const
-{
- if (has(HEADER_FROM))
- return get(HEADER_FROM);
- else
- return EMPTY_HEADER;
-}
-
-
-void MailMessage::setSubject(const std::string& subject)
-{
- set(HEADER_SUBJECT, subject);
-}
-
-
-const std::string& MailMessage::getSubject() const
-{
- if (has(HEADER_SUBJECT))
- return get(HEADER_SUBJECT);
- else
- return EMPTY_HEADER;
-}
-
-
-void MailMessage::setContent(const std::string& content, ContentTransferEncoding encoding)
-{
- _content = content;
- _encoding = encoding;
- set(HEADER_CONTENT_TRANSFER_ENCODING, contentTransferEncodingToString(encoding));
-}
-
-
-void MailMessage::setContentType(const std::string& mediaType)
-{
- set(HEADER_CONTENT_TYPE, mediaType);
-}
-
-
-void MailMessage::setContentType(const MediaType& mediaType)
-{
- setContentType(mediaType.toString());
-}
-
-
-const std::string& MailMessage::getContentType() const
-{
- if (has(HEADER_CONTENT_TYPE))
- return get(HEADER_CONTENT_TYPE);
- else
- return TEXT_PLAIN;
-}
-
-
-void MailMessage::setDate(const Poco::Timestamp& dateTime)
-{
- set(HEADER_DATE, DateTimeFormatter::format(dateTime, DateTimeFormat::RFC1123_FORMAT));
-}
-
-
-Poco::Timestamp MailMessage::getDate() const
-{
- const std::string& dateTime = get(HEADER_DATE);
- int tzd;
- return DateTimeParser::parse(dateTime, tzd).timestamp();
-}
-
-
-bool MailMessage::isMultipart() const
-{
- MediaType mediaType = getContentType();
- return mediaType.matches("multipart");
-}
-
-
-void MailMessage::addPart(const std::string& name, PartSource* pSource, ContentDisposition disposition, ContentTransferEncoding encoding)
-{
- poco_check_ptr (pSource);
-
- makeMultipart();
- Part part;
- part.name = name;
- part.pSource = pSource;
- part.disposition = disposition;
- part.encoding = encoding;
- _parts.push_back(part);
-}
-
-
-void MailMessage::addContent(PartSource* pSource, ContentTransferEncoding encoding)
-{
- addPart("", pSource, CONTENT_INLINE, encoding);
-}
-
-
-void MailMessage::addAttachment(const std::string& name, PartSource* pSource, ContentTransferEncoding encoding)
-{
- addPart(name, pSource, CONTENT_ATTACHMENT, encoding);
-}
-
-
-void MailMessage::read(std::istream& istr, PartHandler& handler)
-{
- readHeader(istr);
- if (isMultipart())
- {
- readMultipart(istr, handler);
- }
- else
- {
- StringPartHandler handler2(_content);
- readPart(istr, *this, handler2);
- }
-}
-
-
-void MailMessage::read(std::istream& istr)
-{
- readHeader(istr);
- if (isMultipart())
- {
- MultiPartHandler handler(this);
- readMultipart(istr, handler);
- }
- else
- {
- StringPartHandler handler(_content);
- readPart(istr, *this, handler);
- }
-}
-
-
-void MailMessage::write(std::ostream& ostr) const
-{
- MessageHeader header(*this);
- setRecipientHeaders(header);
- if (isMultipart())
- {
- writeMultipart(header, ostr);
- }
- else
- {
- writeHeader(header, ostr);
- std::istringstream istr(_content);
- writeEncoded(istr, ostr, _encoding);
- }
-}
-
-
-void MailMessage::makeMultipart()
-{
- if (!isMultipart())
- {
- MediaType mediaType("multipart", "mixed");
- setContentType(mediaType);
- }
-}
-
-
-void MailMessage::writeHeader(const MessageHeader& header, std::ostream& ostr) const
-{
- header.write(ostr);
- ostr << "\r\n";
-}
-
-
-void MailMessage::writeMultipart(MessageHeader& header, std::ostream& ostr) const
-{
- if (_boundary.empty()) _boundary = MultipartWriter::createBoundary();
- MediaType mediaType(getContentType());
- mediaType.setParameter("boundary", _boundary);
- header.set(HEADER_CONTENT_TYPE, mediaType.toString());
- header.set(HEADER_MIME_VERSION, "1.0");
- writeHeader(header, ostr);
-
- MultipartWriter writer(ostr, _boundary);
- for (PartVec::const_iterator it = _parts.begin(); it != _parts.end(); ++it)
- {
- writePart(writer, *it);
- }
- writer.close();
-}
-
-
-void MailMessage::writePart(MultipartWriter& writer, const Part& part) const
-{
- MessageHeader partHeader(part.pSource->headers());
- MediaType mediaType(part.pSource->mediaType());
- if (!part.name.empty())
- mediaType.setParameter("name", part.name);
- partHeader.set(HEADER_CONTENT_TYPE, mediaType.toString());
- partHeader.set(HEADER_CONTENT_TRANSFER_ENCODING, contentTransferEncodingToString(part.encoding));
- std::string disposition;
- if (part.disposition == CONTENT_ATTACHMENT)
- {
- disposition = "attachment";
- const std::string& filename = part.pSource->filename();
- if (!filename.empty())
- {
- disposition.append("; filename=");
- quote(filename, disposition);
- }
- }
- else disposition = "inline";
- partHeader.set(HEADER_CONTENT_DISPOSITION, disposition);
- writer.nextPart(partHeader);
- writeEncoded(part.pSource->stream(), writer.stream(), part.encoding);
-}
-
-
-void MailMessage::writeEncoded(std::istream& istr, std::ostream& ostr, ContentTransferEncoding encoding) const
-{
- switch (encoding)
- {
- case ENCODING_7BIT:
- case ENCODING_8BIT:
- StreamCopier::copyStream(istr, ostr);
- break;
- case ENCODING_QUOTED_PRINTABLE:
- {
- QuotedPrintableEncoder encoder(ostr);
- StreamCopier::copyStream(istr, encoder);
- encoder.close();
- }
- break;
- case ENCODING_BASE64:
- {
- Base64Encoder encoder(ostr);
- StreamCopier::copyStream(istr, encoder);
- encoder.close();
- }
- break;
- }
-}
-
-
-void MailMessage::readHeader(std::istream& istr)
-{
- clear();
- MessageHeader::read(istr);
- istr.get(); // \r
- if ('\n' == istr.peek()) istr.get(); // \n
-}
-
-
-void MailMessage::readMultipart(std::istream& istr, PartHandler& handler)
-{
- MediaType contentType(getContentType());
- _boundary = contentType.getParameter("boundary");
- MultipartReader reader(istr, _boundary);
- while (reader.hasNextPart())
- {
- MessageHeader partHeader;
- reader.nextPart(partHeader);
- readPart(reader.stream(), partHeader, handler);
- }
-}
-
-
-void MailMessage::readPart(std::istream& istr, const MessageHeader& header, PartHandler& handler)
-{
- std::string encoding;
- if (header.has(HEADER_CONTENT_TRANSFER_ENCODING))
- {
- encoding = header.get(HEADER_CONTENT_TRANSFER_ENCODING);
- // get rid of a parameter if one is set
- std::string::size_type pos = encoding.find(';');
- if (pos != std::string::npos)
- encoding.resize(pos);
- }
- if (icompare(encoding, CTE_QUOTED_PRINTABLE) == 0)
- {
- QuotedPrintableDecoder decoder(istr);
- handlePart(decoder, header, handler);
- _encoding = ENCODING_QUOTED_PRINTABLE;
- }
- else if (icompare(encoding, CTE_BASE64) == 0)
- {
- Base64Decoder decoder(istr);
- handlePart(decoder, header, handler);
- _encoding = ENCODING_BASE64;
- }
- else
- {
- if (icompare(encoding, CTE_7BIT) == 0)
- _encoding = ENCODING_7BIT;
- else if (icompare(encoding, CTE_8BIT) == 0)
- _encoding = ENCODING_8BIT;
-
- handlePart(istr, header, handler);
- }
-}
-
-
-void MailMessage::handlePart(std::istream& istr, const MessageHeader& header, PartHandler& handler)
-{
- handler.handlePart(header, istr);
- // Read remaining characters from stream in case
- // the handler failed to read the complete stream.
- while (istr.good()) istr.get();
-}
-
-
-void MailMessage::setRecipientHeaders(MessageHeader& headers) const
-{
- std::string to;
- std::string cc;
- std::string bcc;
-
- for (Recipients::const_iterator it = _recipients.begin(); it != _recipients.end(); ++it)
- {
- switch (it->getType())
- {
- case MailRecipient::PRIMARY_RECIPIENT:
- appendRecipient(*it, to);
- break;
- case MailRecipient::CC_RECIPIENT:
- appendRecipient(*it, cc);
- break;
- case MailRecipient::BCC_RECIPIENT:
- break;
- }
- }
- if (!to.empty()) headers.set(HEADER_TO, to);
- if (!cc.empty()) headers.set(HEADER_CC, cc);
-}
-
-
-const std::string& MailMessage::contentTransferEncodingToString(ContentTransferEncoding encoding)
-{
- switch (encoding)
- {
- case ENCODING_7BIT:
- return CTE_7BIT;
- case ENCODING_8BIT:
- return CTE_8BIT;
- case ENCODING_QUOTED_PRINTABLE:
- return CTE_QUOTED_PRINTABLE;
- case ENCODING_BASE64:
- return CTE_BASE64;
- default:
- poco_bugcheck();
- }
- return CTE_7BIT;
-}
-
-
-int MailMessage::lineLength(const std::string& str)
-{
- int n = 0;
- std::string::const_reverse_iterator it = str.rbegin();
- std::string::const_reverse_iterator end = str.rend();
- while (it != end && *it != '\n') { ++n; ++it; }
- return n;
-}
-
-
-void MailMessage::appendRecipient(const MailRecipient& recipient, std::string& str)
-{
- if (!str.empty()) str.append(", ");
- const std::string& realName = recipient.getRealName();
- const std::string& address = recipient.getAddress();
- std::string rec;
- if (!realName.empty())
- {
- quote(realName, rec, true);
- rec.append(" ");
- }
- rec.append("<");
- rec.append(address);
- rec.append(">");
- if (lineLength(str) + rec.length() > 70) str.append("\r\n\t");
- str.append(rec);
-}
-
-
-std::string MailMessage::encodeWord(const std::string& text, const std::string& charset)
-{
- bool containsNonASCII = false;
- for (std::string::const_iterator it = text.begin(); it != text.end(); ++it)
- {
- if (static_cast<unsigned char>(*it) > 127)
- {
- containsNonASCII = true;
- break;
- }
- }
- if (!containsNonASCII) return text;
-
- std::string encodedText;
- std::string::size_type lineLength = 0;
- for (std::string::const_iterator it = text.begin(); it != text.end(); ++it)
- {
- if (lineLength == 0)
- {
- encodedText += "=?";
- encodedText += charset;
- encodedText += "?q?";
- lineLength += charset.length() + 5;
- }
- switch (*it)
- {
- case ' ':
- encodedText += '_';
- lineLength++;
- break;
- case '=':
- case '?':
- case '_':
- case '(':
- case ')':
- case '[':
- case ']':
- case '<':
- case '>':
- case ',':
- case ';':
- case ':':
- case '.':
- case '@':
- encodedText += '=';
- NumberFormatter::appendHex(encodedText, static_cast<unsigned>(static_cast<unsigned char>(*it)), 2);
- lineLength += 3;
- break;
- default:
- if (*it > 32 && *it < 127)
- {
- encodedText += *it;
- lineLength++;
- }
- else
- {
- encodedText += '=';
- NumberFormatter::appendHex(encodedText, static_cast<unsigned>(static_cast<unsigned char>(*it)), 2);
- lineLength += 3;
- }
- }
- if ((lineLength >= 64 && (*it == ' ' || *it == '\t' || *it == '\r' || *it == '\n')) || lineLength >= 72)
- {
- encodedText += "?=\r\n ";
- lineLength = 0;
- }
- }
- if (lineLength > 0)
- {
- encodedText += "?=";
- }
- return encodedText;
-}
-
-
-PartSource* MailMessage::createPartStore(const std::string& content, const std::string& mediaType, const std::string& filename)
-{
- if (!_pStoreFactory) return new StringPartSource(content, mediaType, filename);
- else return _pStoreFactory->createPartStore(content, mediaType, filename);
-}
-
-
-} } // namespace Poco::Net
+//
+// MailMessage.cpp
+//
+// Library: Net
+// Package: Mail
+// Module: MailMessage
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/MailMessage.h"
+#include "Poco/Net/MediaType.h"
+#include "Poco/Net/MultipartReader.h"
+#include "Poco/Net/MultipartWriter.h"
+#include "Poco/Net/PartSource.h"
+#include "Poco/Net/PartHandler.h"
+#include "Poco/Net/StringPartSource.h"
+#include "Poco/Net/QuotedPrintableEncoder.h"
+#include "Poco/Net/QuotedPrintableDecoder.h"
+#include "Poco/Net/NameValueCollection.h"
+#include "Poco/Base64Encoder.h"
+#include "Poco/Base64Decoder.h"
+#include "Poco/StreamCopier.h"
+#include "Poco/DateTimeFormat.h"
+#include "Poco/DateTimeFormatter.h"
+#include "Poco/DateTimeParser.h"
+#include "Poco/String.h"
+#include "Poco/StringTokenizer.h"
+#include "Poco/StreamCopier.h"
+#include "Poco/NumberFormatter.h"
+#include <sstream>
+
+
+using Poco::Base64Encoder;
+using Poco::Base64Decoder;
+using Poco::StreamCopier;
+using Poco::DateTimeFormat;
+using Poco::DateTimeFormatter;
+using Poco::DateTimeParser;
+using Poco::StringTokenizer;
+using Poco::icompare;
+
+
+namespace Poco {
+namespace Net {
+
+
+namespace
+{
+ class MultiPartHandler: public PartHandler
+ /// This is a default part handler for multipart messages, used when there
+ /// is no external handler provided to he MailMessage. This handler
+ /// will handle all types of message parts, including attachments.
+ {
+ public:
+ MultiPartHandler(MailMessage* pMsg): _pMsg(pMsg)
+ /// Creates multi part handler.
+ /// The pMsg pointer points to the calling MailMessage
+ /// and will be used to properly populate it, so the
+ /// message content could be written out unmodified
+ /// in its entirety, including attachments.
+ {
+ }
+
+ ~MultiPartHandler()
+ /// Destroys string part handler.
+ {
+ }
+
+ void handlePart(const MessageHeader& header, std::istream& stream)
+ /// Handles a part. If message pointer was provided at construction time,
+ /// the message pointed to will be properly populated so it could be written
+ /// back out at a later point in time.
+ {
+ std::string tmp;
+ Poco::StreamCopier::copyToString(stream, tmp);
+ if (_pMsg)
+ {
+ MailMessage::ContentTransferEncoding cte = MailMessage::ENCODING_7BIT;
+ if (header.has(MailMessage::HEADER_CONTENT_TRANSFER_ENCODING))
+ {
+ std::string enc = header[MailMessage::HEADER_CONTENT_TRANSFER_ENCODING];
+ if (enc == MailMessage::CTE_8BIT)
+ cte = MailMessage::ENCODING_8BIT;
+ else if (enc == MailMessage::CTE_QUOTED_PRINTABLE)
+ cte = MailMessage::ENCODING_QUOTED_PRINTABLE;
+ else if (enc == MailMessage::CTE_BASE64)
+ cte = MailMessage::ENCODING_BASE64;
+ }
+
+ std::string contentType = header.get(MailMessage::HEADER_CONTENT_TYPE, "");
+ std::string contentDisp = header.get(MailMessage::HEADER_CONTENT_DISPOSITION, "");
+ std::string filename;
+ if (!contentDisp.empty())
+ filename = getParamFromHeader(contentDisp, "filename");
+ if (filename.empty())
+ filename = getParamFromHeader(contentType, "name");
+ PartSource* pPS = _pMsg->createPartStore(tmp, contentType, filename);
+ poco_check_ptr (pPS);
+ NameValueCollection::ConstIterator it = header.begin();
+ NameValueCollection::ConstIterator end = header.end();
+ bool added = false;
+ for (; it != end; ++it)
+ {
+ if (!added && MailMessage::HEADER_CONTENT_DISPOSITION == it->first)
+ {
+ if (it->second == "inline")
+ _pMsg->addContent(pPS, cte);
+ else
+ _pMsg->addAttachment("", pPS, cte);
+ added = true;
+ }
+
+ pPS->headers().set(it->first, it->second);
+ }
+
+ if (contentDisp.empty())
+ {
+ _pMsg->addContent(pPS, cte);
+ added = true;
+ }
+
+ if (!added) delete pPS;
+ }
+ }
+
+ private:
+ std::string getParamFromHeader(const std::string& header, const std::string& param)
+ {
+ StringTokenizer st(header, ";=", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM);
+ StringTokenizer::Iterator it = st.begin();
+ StringTokenizer::Iterator end = st.end();
+ for (; it != end; ++it) { if (*it == param) break; }
+ if (it != end)
+ {
+ ++it;
+ if (it == end) return "";
+ return *it;
+ }
+ return "";
+ }
+
+ MailMessage* _pMsg;
+ };
+
+
+ class StringPartHandler: public PartHandler
+ /// This is a default part handler, used when there is no
+ /// external handler provided to the MailMessage. This handler
+ /// handles only single-part messages.
+ {
+ public:
+ StringPartHandler(std::string& content): _str(content)
+ /// Creates string part handler.
+ /// The content parameter represents the part content.
+ {
+ }
+
+ ~StringPartHandler()
+ /// Destroys string part handler.
+ {
+ }
+
+ void handlePart(const MessageHeader& /*header*/, std::istream& stream)
+ /// Handles a part.
+ {
+ std::string tmp;
+ Poco::StreamCopier::copyToString(stream, tmp);
+ _str.append(tmp);
+ }
+
+ private:
+ std::string& _str;
+ };
+}
+
+
+const std::string MailMessage::HEADER_SUBJECT("Subject");
+const std::string MailMessage::HEADER_FROM("From");
+const std::string MailMessage::HEADER_TO("To");
+const std::string MailMessage::HEADER_CC("CC");
+const std::string MailMessage::HEADER_BCC("BCC");
+const std::string MailMessage::HEADER_DATE("Date");
+const std::string MailMessage::HEADER_CONTENT_TYPE("Content-Type");
+const std::string MailMessage::HEADER_CONTENT_TRANSFER_ENCODING("Content-Transfer-Encoding");
+const std::string MailMessage::HEADER_CONTENT_DISPOSITION("Content-Disposition");
+const std::string MailMessage::HEADER_CONTENT_ID("Content-ID");
+const std::string MailMessage::HEADER_MIME_VERSION("Mime-Version");
+const std::string MailMessage::EMPTY_HEADER;
+const std::string MailMessage::TEXT_PLAIN("text/plain");
+const std::string MailMessage::CTE_7BIT("7bit");
+const std::string MailMessage::CTE_8BIT("8bit");
+const std::string MailMessage::CTE_QUOTED_PRINTABLE("quoted-printable");
+const std::string MailMessage::CTE_BASE64("base64");
+
+
+MailMessage::MailMessage(PartStoreFactory* pStoreFactory):
+ _encoding(),
+ _pStoreFactory(pStoreFactory)
+{
+ Poco::Timestamp now;
+ setDate(now);
+ setContentType("text/plain");
+}
+
+
+MailMessage::~MailMessage()
+{
+ for (PartVec::iterator it = _parts.begin(); it != _parts.end(); ++it)
+ {
+ delete it->pSource;
+ }
+}
+
+
+void MailMessage::addRecipient(const MailRecipient& recipient)
+{
+ _recipients.push_back(recipient);
+}
+
+
+void MailMessage::setRecipients(const Recipients& recipients)
+{
+ _recipients.assign(recipients.begin(), recipients.end());
+}
+
+
+void MailMessage::setSender(const std::string& sender)
+{
+ set(HEADER_FROM, sender);
+}
+
+
+const std::string& MailMessage::getSender() const
+{
+ if (has(HEADER_FROM))
+ return get(HEADER_FROM);
+ else
+ return EMPTY_HEADER;
+}
+
+
+void MailMessage::setSubject(const std::string& subject)
+{
+ set(HEADER_SUBJECT, subject);
+}
+
+
+const std::string& MailMessage::getSubject() const
+{
+ if (has(HEADER_SUBJECT))
+ return get(HEADER_SUBJECT);
+ else
+ return EMPTY_HEADER;
+}
+
+
+void MailMessage::setContent(const std::string& content, ContentTransferEncoding encoding)
+{
+ _content = content;
+ _encoding = encoding;
+ set(HEADER_CONTENT_TRANSFER_ENCODING, contentTransferEncodingToString(encoding));
+}
+
+
+void MailMessage::setContentType(const std::string& mediaType)
+{
+ set(HEADER_CONTENT_TYPE, mediaType);
+}
+
+
+void MailMessage::setContentType(const MediaType& mediaType)
+{
+ setContentType(mediaType.toString());
+}
+
+
+const std::string& MailMessage::getContentType() const
+{
+ if (has(HEADER_CONTENT_TYPE))
+ return get(HEADER_CONTENT_TYPE);
+ else
+ return TEXT_PLAIN;
+}
+
+
+void MailMessage::setDate(const Poco::Timestamp& dateTime)
+{
+ set(HEADER_DATE, DateTimeFormatter::format(dateTime, DateTimeFormat::RFC1123_FORMAT));
+}
+
+
+Poco::Timestamp MailMessage::getDate() const
+{
+ const std::string& dateTime = get(HEADER_DATE);
+ int tzd;
+ return DateTimeParser::parse(dateTime, tzd).timestamp();
+}
+
+
+bool MailMessage::isMultipart() const
+{
+ MediaType mediaType = getContentType();
+ return mediaType.matches("multipart");
+}
+
+
+void MailMessage::addPart(const std::string& name, PartSource* pSource, ContentDisposition disposition, ContentTransferEncoding encoding)
+{
+ poco_check_ptr (pSource);
+
+ makeMultipart();
+ Part part;
+ part.name = name;
+ part.pSource = pSource;
+ part.disposition = disposition;
+ part.encoding = encoding;
+ _parts.push_back(part);
+}
+
+
+void MailMessage::addContent(PartSource* pSource, ContentTransferEncoding encoding)
+{
+ addPart("", pSource, CONTENT_INLINE, encoding);
+}
+
+
+void MailMessage::addAttachment(const std::string& name, PartSource* pSource, ContentTransferEncoding encoding)
+{
+ addPart(name, pSource, CONTENT_ATTACHMENT, encoding);
+}
+
+
+void MailMessage::read(std::istream& istr, PartHandler& handler)
+{
+ readHeader(istr);
+ if (isMultipart())
+ {
+ readMultipart(istr, handler);
+ }
+ else
+ {
+ StringPartHandler handler2(_content);
+ readPart(istr, *this, handler2);
+ }
+}
+
+
+void MailMessage::read(std::istream& istr)
+{
+ readHeader(istr);
+ if (isMultipart())
+ {
+ MultiPartHandler handler(this);
+ readMultipart(istr, handler);
+ }
+ else
+ {
+ StringPartHandler handler(_content);
+ readPart(istr, *this, handler);
+ }
+}
+
+
+void MailMessage::write(std::ostream& ostr) const
+{
+ MessageHeader header(*this);
+ setRecipientHeaders(header);
+ if (isMultipart())
+ {
+ writeMultipart(header, ostr);
+ }
+ else
+ {
+ writeHeader(header, ostr);
+ std::istringstream istr(_content);
+ writeEncoded(istr, ostr, _encoding);
+ }
+}
+
+
+void MailMessage::makeMultipart()
+{
+ if (!isMultipart())
+ {
+ MediaType mediaType("multipart", "mixed");
+ setContentType(mediaType);
+ }
+}
+
+
+void MailMessage::writeHeader(const MessageHeader& header, std::ostream& ostr) const
+{
+ header.write(ostr);
+ ostr << "\r\n";
+}
+
+
+void MailMessage::writeMultipart(MessageHeader& header, std::ostream& ostr) const
+{
+ if (_boundary.empty()) _boundary = MultipartWriter::createBoundary();
+ MediaType mediaType(getContentType());
+ mediaType.setParameter("boundary", _boundary);
+ header.set(HEADER_CONTENT_TYPE, mediaType.toString());
+ header.set(HEADER_MIME_VERSION, "1.0");
+ writeHeader(header, ostr);
+
+ MultipartWriter writer(ostr, _boundary);
+ for (PartVec::const_iterator it = _parts.begin(); it != _parts.end(); ++it)
+ {
+ writePart(writer, *it);
+ }
+ writer.close();
+}
+
+
+void MailMessage::writePart(MultipartWriter& writer, const Part& part) const
+{
+ MessageHeader partHeader(part.pSource->headers());
+ MediaType mediaType(part.pSource->mediaType());
+ if (!part.name.empty())
+ mediaType.setParameter("name", part.name);
+ partHeader.set(HEADER_CONTENT_TYPE, mediaType.toString());
+ partHeader.set(HEADER_CONTENT_TRANSFER_ENCODING, contentTransferEncodingToString(part.encoding));
+ std::string disposition;
+ if (part.disposition == CONTENT_ATTACHMENT)
+ {
+ disposition = "attachment";
+ const std::string& filename = part.pSource->filename();
+ if (!filename.empty())
+ {
+ disposition.append("; filename=");
+ quote(filename, disposition);
+ }
+ }
+ else disposition = "inline";
+ partHeader.set(HEADER_CONTENT_DISPOSITION, disposition);
+ writer.nextPart(partHeader);
+ writeEncoded(part.pSource->stream(), writer.stream(), part.encoding);
+}
+
+
+void MailMessage::writeEncoded(std::istream& istr, std::ostream& ostr, ContentTransferEncoding encoding) const
+{
+ switch (encoding)
+ {
+ case ENCODING_7BIT:
+ case ENCODING_8BIT:
+ StreamCopier::copyStream(istr, ostr);
+ break;
+ case ENCODING_QUOTED_PRINTABLE:
+ {
+ QuotedPrintableEncoder encoder(ostr);
+ StreamCopier::copyStream(istr, encoder);
+ encoder.close();
+ }
+ break;
+ case ENCODING_BASE64:
+ {
+ Base64Encoder encoder(ostr);
+ StreamCopier::copyStream(istr, encoder);
+ encoder.close();
+ }
+ break;
+ }
+}
+
+
+void MailMessage::readHeader(std::istream& istr)
+{
+ clear();
+ MessageHeader::read(istr);
+ istr.get(); // \r
+ if ('\n' == istr.peek()) istr.get(); // \n
+}
+
+
+void MailMessage::readMultipart(std::istream& istr, PartHandler& handler)
+{
+ MediaType contentType(getContentType());
+ _boundary = contentType.getParameter("boundary");
+ MultipartReader reader(istr, _boundary);
+ while (reader.hasNextPart())
+ {
+ MessageHeader partHeader;
+ reader.nextPart(partHeader);
+ readPart(reader.stream(), partHeader, handler);
+ }
+}
+
+
+void MailMessage::readPart(std::istream& istr, const MessageHeader& header, PartHandler& handler)
+{
+ std::string encoding;
+ if (header.has(HEADER_CONTENT_TRANSFER_ENCODING))
+ {
+ encoding = header.get(HEADER_CONTENT_TRANSFER_ENCODING);
+ // get rid of a parameter if one is set
+ std::string::size_type pos = encoding.find(';');
+ if (pos != std::string::npos)
+ encoding.resize(pos);
+ }
+ if (icompare(encoding, CTE_QUOTED_PRINTABLE) == 0)
+ {
+ QuotedPrintableDecoder decoder(istr);
+ handlePart(decoder, header, handler);
+ _encoding = ENCODING_QUOTED_PRINTABLE;
+ }
+ else if (icompare(encoding, CTE_BASE64) == 0)
+ {
+ Base64Decoder decoder(istr);
+ handlePart(decoder, header, handler);
+ _encoding = ENCODING_BASE64;
+ }
+ else
+ {
+ if (icompare(encoding, CTE_7BIT) == 0)
+ _encoding = ENCODING_7BIT;
+ else if (icompare(encoding, CTE_8BIT) == 0)
+ _encoding = ENCODING_8BIT;
+
+ handlePart(istr, header, handler);
+ }
+}
+
+
+void MailMessage::handlePart(std::istream& istr, const MessageHeader& header, PartHandler& handler)
+{
+ handler.handlePart(header, istr);
+ // Read remaining characters from stream in case
+ // the handler failed to read the complete stream.
+ while (istr.good()) istr.get();
+}
+
+
+void MailMessage::setRecipientHeaders(MessageHeader& headers) const
+{
+ std::string to;
+ std::string cc;
+ std::string bcc;
+
+ for (Recipients::const_iterator it = _recipients.begin(); it != _recipients.end(); ++it)
+ {
+ switch (it->getType())
+ {
+ case MailRecipient::PRIMARY_RECIPIENT:
+ appendRecipient(*it, to);
+ break;
+ case MailRecipient::CC_RECIPIENT:
+ appendRecipient(*it, cc);
+ break;
+ case MailRecipient::BCC_RECIPIENT:
+ break;
+ }
+ }
+ if (!to.empty()) headers.set(HEADER_TO, to);
+ if (!cc.empty()) headers.set(HEADER_CC, cc);
+}
+
+
+const std::string& MailMessage::contentTransferEncodingToString(ContentTransferEncoding encoding)
+{
+ switch (encoding)
+ {
+ case ENCODING_7BIT:
+ return CTE_7BIT;
+ case ENCODING_8BIT:
+ return CTE_8BIT;
+ case ENCODING_QUOTED_PRINTABLE:
+ return CTE_QUOTED_PRINTABLE;
+ case ENCODING_BASE64:
+ return CTE_BASE64;
+ default:
+ poco_bugcheck();
+ }
+ return CTE_7BIT;
+}
+
+
+int MailMessage::lineLength(const std::string& str)
+{
+ int n = 0;
+ std::string::const_reverse_iterator it = str.rbegin();
+ std::string::const_reverse_iterator end = str.rend();
+ while (it != end && *it != '\n') { ++n; ++it; }
+ return n;
+}
+
+
+void MailMessage::appendRecipient(const MailRecipient& recipient, std::string& str)
+{
+ if (!str.empty()) str.append(", ");
+ const std::string& realName = recipient.getRealName();
+ const std::string& address = recipient.getAddress();
+ std::string rec;
+ if (!realName.empty())
+ {
+ quote(realName, rec, true);
+ rec.append(" ");
+ }
+ rec.append("<");
+ rec.append(address);
+ rec.append(">");
+ if (lineLength(str) + rec.length() > 70) str.append("\r\n\t");
+ str.append(rec);
+}
+
+
+std::string MailMessage::encodeWord(const std::string& text, const std::string& charset)
+{
+ bool containsNonASCII = false;
+ for (std::string::const_iterator it = text.begin(); it != text.end(); ++it)
+ {
+ if (static_cast<unsigned char>(*it) > 127)
+ {
+ containsNonASCII = true;
+ break;
+ }
+ }
+ if (!containsNonASCII) return text;
+
+ std::string encodedText;
+ std::string::size_type lineLength = 0;
+ for (std::string::const_iterator it = text.begin(); it != text.end(); ++it)
+ {
+ if (lineLength == 0)
+ {
+ encodedText += "=?";
+ encodedText += charset;
+ encodedText += "?q?";
+ lineLength += charset.length() + 5;
+ }
+ switch (*it)
+ {
+ case ' ':
+ encodedText += '_';
+ lineLength++;
+ break;
+ case '=':
+ case '?':
+ case '_':
+ case '(':
+ case ')':
+ case '[':
+ case ']':
+ case '<':
+ case '>':
+ case ',':
+ case ';':
+ case ':':
+ case '.':
+ case '@':
+ encodedText += '=';
+ NumberFormatter::appendHex(encodedText, static_cast<unsigned>(static_cast<unsigned char>(*it)), 2);
+ lineLength += 3;
+ break;
+ default:
+ if (*it > 32 && *it < 127)
+ {
+ encodedText += *it;
+ lineLength++;
+ }
+ else
+ {
+ encodedText += '=';
+ NumberFormatter::appendHex(encodedText, static_cast<unsigned>(static_cast<unsigned char>(*it)), 2);
+ lineLength += 3;
+ }
+ }
+ if ((lineLength >= 64 && (*it == ' ' || *it == '\t' || *it == '\r' || *it == '\n')) || lineLength >= 72)
+ {
+ encodedText += "?=\r\n ";
+ lineLength = 0;
+ }
+ }
+ if (lineLength > 0)
+ {
+ encodedText += "?=";
+ }
+ return encodedText;
+}
+
+
+PartSource* MailMessage::createPartStore(const std::string& content, const std::string& mediaType, const std::string& filename)
+{
+ if (!_pStoreFactory) return new StringPartSource(content, mediaType, filename);
+ else return _pStoreFactory->createPartStore(content, mediaType, filename);
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/MailRecipient.cpp b/contrib/libs/poco/Net/src/MailRecipient.cpp
index 3b204a113c..1f6672810b 100644
--- a/contrib/libs/poco/Net/src/MailRecipient.cpp
+++ b/contrib/libs/poco/Net/src/MailRecipient.cpp
@@ -1,94 +1,94 @@
-//
-// MailRecipient.cpp
-//
-// Library: Net
-// Package: Mail
-// Module: MailRecipient
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/MailRecipient.h"
-#include <algorithm>
-
-
-namespace Poco {
-namespace Net {
-
-
-MailRecipient::MailRecipient():
- _type(PRIMARY_RECIPIENT)
-{
-}
-
-
-MailRecipient::MailRecipient(const MailRecipient& recipient):
- _address(recipient._address),
- _realName(recipient._realName),
- _type(recipient._type)
-{
-}
-
-
-MailRecipient::MailRecipient(RecipientType type, const std::string& address):
- _address(address),
- _type(type)
-{
-}
-
-
-MailRecipient::MailRecipient(RecipientType type, const std::string& address, const std::string& realName):
- _address(address),
- _realName(realName),
- _type(type)
-{
-}
-
-
-MailRecipient::~MailRecipient()
-{
-}
-
-
-MailRecipient& MailRecipient::operator = (const MailRecipient& recipient)
-{
- if (this != &recipient)
- {
- MailRecipient tmp(recipient);
- swap(tmp);
- }
- return *this;
-}
-
-
-void MailRecipient::swap(MailRecipient& recipient)
-{
- std::swap(_type, recipient._type);
- std::swap(_address, recipient._address);
- std::swap(_realName, recipient._realName);
-}
-
-
-void MailRecipient::setType(RecipientType type)
-{
- _type = type;
-}
-
-
-void MailRecipient::setAddress(const std::string& address)
-{
- _address = address;
-}
-
-
-void MailRecipient::setRealName(const std::string& realName)
-{
- _realName = realName;
-}
-
-
-} } // namespace Poco::Net
+//
+// MailRecipient.cpp
+//
+// Library: Net
+// Package: Mail
+// Module: MailRecipient
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/MailRecipient.h"
+#include <algorithm>
+
+
+namespace Poco {
+namespace Net {
+
+
+MailRecipient::MailRecipient():
+ _type(PRIMARY_RECIPIENT)
+{
+}
+
+
+MailRecipient::MailRecipient(const MailRecipient& recipient):
+ _address(recipient._address),
+ _realName(recipient._realName),
+ _type(recipient._type)
+{
+}
+
+
+MailRecipient::MailRecipient(RecipientType type, const std::string& address):
+ _address(address),
+ _type(type)
+{
+}
+
+
+MailRecipient::MailRecipient(RecipientType type, const std::string& address, const std::string& realName):
+ _address(address),
+ _realName(realName),
+ _type(type)
+{
+}
+
+
+MailRecipient::~MailRecipient()
+{
+}
+
+
+MailRecipient& MailRecipient::operator = (const MailRecipient& recipient)
+{
+ if (this != &recipient)
+ {
+ MailRecipient tmp(recipient);
+ swap(tmp);
+ }
+ return *this;
+}
+
+
+void MailRecipient::swap(MailRecipient& recipient)
+{
+ std::swap(_type, recipient._type);
+ std::swap(_address, recipient._address);
+ std::swap(_realName, recipient._realName);
+}
+
+
+void MailRecipient::setType(RecipientType type)
+{
+ _type = type;
+}
+
+
+void MailRecipient::setAddress(const std::string& address)
+{
+ _address = address;
+}
+
+
+void MailRecipient::setRealName(const std::string& realName)
+{
+ _realName = realName;
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/MailStream.cpp b/contrib/libs/poco/Net/src/MailStream.cpp
index b498ca2894..8cd8fa44d8 100644
--- a/contrib/libs/poco/Net/src/MailStream.cpp
+++ b/contrib/libs/poco/Net/src/MailStream.cpp
@@ -1,221 +1,221 @@
-//
-// MailStream.cpp
-//
-// Library: Net
-// Package: Mail
-// Module: MailStream
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/MailStream.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-MailStreamBuf::MailStreamBuf(std::istream& istr):
- _pIstr(&istr),
- _pOstr(0),
- _state(ST_CR_LF)
-{
-}
-
-
-MailStreamBuf::MailStreamBuf(std::ostream& ostr):
- _pIstr(0),
- _pOstr(&ostr),
- _state(ST_CR_LF)
-{
-}
-
-
-MailStreamBuf::~MailStreamBuf()
-{
-}
-
-
-void MailStreamBuf::close()
-{
- if (_pOstr && _state != ST_CR_LF_DOT_CR_LF)
- {
- if (!_buffer.empty())
- _pOstr->write(_buffer.data(), (std::streamsize) _buffer.length());
- if (_state != ST_CR_LF)
- _pOstr->write("\r\n", 2);
- _pOstr->write(".\r\n", 3);
- _state = ST_CR_LF_DOT_CR_LF;
- }
-}
-
-
-int MailStreamBuf::readFromDevice()
-{
- int c = std::char_traits<char>::eof();
- if (!_buffer.empty())
- {
- c = _buffer[0];
- _buffer.erase(0, 1);
- }
- else
- {
- c = readOne();
- while (c != std::char_traits<char>::eof() && _state != ST_DATA && _state != ST_CR_LF_DOT_CR_LF)
- c = readOne();
- if (!_buffer.empty())
- {
- c = _buffer[0];
- _buffer.erase(0, 1);
- }
- }
- return c;
-}
-
-
-int MailStreamBuf::readOne()
-{
- int c = std::char_traits<char>::eof();
- if (_state != ST_CR_LF_DOT_CR_LF)
- {
- c = _pIstr->get();
- switch (c)
- {
- case '\r':
- if (_state == ST_CR_LF_DOT)
- _state = ST_CR_LF_DOT_CR;
- else
- _state = ST_CR;
- break;
- case '\n':
- if (_state == ST_CR)
- _state = ST_CR_LF;
- else if (_state == ST_CR_LF_DOT_CR)
- _state = ST_CR_LF_DOT_CR_LF;
- else
- _state = ST_DATA;
- break;
- case '.':
- if (_state == ST_CR_LF)
- _state = ST_CR_LF_DOT;
- else if (_state == ST_CR_LF_DOT)
- _state = ST_CR_LF_DOT_DOT;
- else
- _state = ST_DATA;
- break;
- default:
- _state = ST_DATA;
- }
- if (_state == ST_CR_LF_DOT_DOT)
- _state = ST_DATA;
- else if (_state == ST_CR_LF_DOT_CR_LF)
- _buffer.resize(_buffer.size() - 2);
- else if (c != std::char_traits<char>::eof())
- _buffer += (char) c;
- }
- return c;
-}
-
-
-int MailStreamBuf::writeToDevice(char c)
-{
- switch (c)
- {
- case '\r':
- _state = ST_CR;
- break;
- case '\n':
- if (_state == ST_CR)
- _state = ST_CR_LF;
- else
- _state = ST_DATA;
- break;
- case '.':
- if (_state == ST_CR_LF)
- _state = ST_CR_LF_DOT;
- else
- _state = ST_DATA;
- break;
- default:
- _state = ST_DATA;
- }
- if (_state == ST_DATA)
- {
- if (!_buffer.empty())
- {
- _pOstr->write(_buffer.data(), (std::streamsize) _buffer.length());
- _buffer.clear();
- }
- _pOstr->put(c);
- }
- else if (_state == ST_CR_LF_DOT)
- {
- // buffer contains one or more CR-LF pairs
- _pOstr->write(_buffer.data(), (std::streamsize) _buffer.length());
- _pOstr->write("..", 2);
- _state = ST_DATA;
- _buffer.clear();
- }
- else _buffer += c;
- return charToInt(c);
-}
-
-
-MailIOS::MailIOS(std::istream& istr): _buf(istr)
-{
- poco_ios_init(&_buf);
-}
-
-
-MailIOS::MailIOS(std::ostream& ostr): _buf(ostr)
-{
- poco_ios_init(&_buf);
-}
-
-
-MailIOS::~MailIOS()
-{
-}
-
-
-void MailIOS::close()
-{
- _buf.close();
-}
-
-
-MailStreamBuf* MailIOS::rdbuf()
-{
- return &_buf;
-}
-
-
-MailInputStream::MailInputStream(std::istream& istr):
- MailIOS(istr),
- std::istream(&_buf)
-{
-}
-
-
-MailInputStream::~MailInputStream()
-{
-}
-
-
-MailOutputStream::MailOutputStream(std::ostream& ostr):
- MailIOS(ostr),
- std::ostream(&_buf)
-{
-}
-
-
-MailOutputStream::~MailOutputStream()
-{
-}
-
-
-} } // namespace Poco::Net
+//
+// MailStream.cpp
+//
+// Library: Net
+// Package: Mail
+// Module: MailStream
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/MailStream.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+MailStreamBuf::MailStreamBuf(std::istream& istr):
+ _pIstr(&istr),
+ _pOstr(0),
+ _state(ST_CR_LF)
+{
+}
+
+
+MailStreamBuf::MailStreamBuf(std::ostream& ostr):
+ _pIstr(0),
+ _pOstr(&ostr),
+ _state(ST_CR_LF)
+{
+}
+
+
+MailStreamBuf::~MailStreamBuf()
+{
+}
+
+
+void MailStreamBuf::close()
+{
+ if (_pOstr && _state != ST_CR_LF_DOT_CR_LF)
+ {
+ if (!_buffer.empty())
+ _pOstr->write(_buffer.data(), (std::streamsize) _buffer.length());
+ if (_state != ST_CR_LF)
+ _pOstr->write("\r\n", 2);
+ _pOstr->write(".\r\n", 3);
+ _state = ST_CR_LF_DOT_CR_LF;
+ }
+}
+
+
+int MailStreamBuf::readFromDevice()
+{
+ int c = std::char_traits<char>::eof();
+ if (!_buffer.empty())
+ {
+ c = _buffer[0];
+ _buffer.erase(0, 1);
+ }
+ else
+ {
+ c = readOne();
+ while (c != std::char_traits<char>::eof() && _state != ST_DATA && _state != ST_CR_LF_DOT_CR_LF)
+ c = readOne();
+ if (!_buffer.empty())
+ {
+ c = _buffer[0];
+ _buffer.erase(0, 1);
+ }
+ }
+ return c;
+}
+
+
+int MailStreamBuf::readOne()
+{
+ int c = std::char_traits<char>::eof();
+ if (_state != ST_CR_LF_DOT_CR_LF)
+ {
+ c = _pIstr->get();
+ switch (c)
+ {
+ case '\r':
+ if (_state == ST_CR_LF_DOT)
+ _state = ST_CR_LF_DOT_CR;
+ else
+ _state = ST_CR;
+ break;
+ case '\n':
+ if (_state == ST_CR)
+ _state = ST_CR_LF;
+ else if (_state == ST_CR_LF_DOT_CR)
+ _state = ST_CR_LF_DOT_CR_LF;
+ else
+ _state = ST_DATA;
+ break;
+ case '.':
+ if (_state == ST_CR_LF)
+ _state = ST_CR_LF_DOT;
+ else if (_state == ST_CR_LF_DOT)
+ _state = ST_CR_LF_DOT_DOT;
+ else
+ _state = ST_DATA;
+ break;
+ default:
+ _state = ST_DATA;
+ }
+ if (_state == ST_CR_LF_DOT_DOT)
+ _state = ST_DATA;
+ else if (_state == ST_CR_LF_DOT_CR_LF)
+ _buffer.resize(_buffer.size() - 2);
+ else if (c != std::char_traits<char>::eof())
+ _buffer += (char) c;
+ }
+ return c;
+}
+
+
+int MailStreamBuf::writeToDevice(char c)
+{
+ switch (c)
+ {
+ case '\r':
+ _state = ST_CR;
+ break;
+ case '\n':
+ if (_state == ST_CR)
+ _state = ST_CR_LF;
+ else
+ _state = ST_DATA;
+ break;
+ case '.':
+ if (_state == ST_CR_LF)
+ _state = ST_CR_LF_DOT;
+ else
+ _state = ST_DATA;
+ break;
+ default:
+ _state = ST_DATA;
+ }
+ if (_state == ST_DATA)
+ {
+ if (!_buffer.empty())
+ {
+ _pOstr->write(_buffer.data(), (std::streamsize) _buffer.length());
+ _buffer.clear();
+ }
+ _pOstr->put(c);
+ }
+ else if (_state == ST_CR_LF_DOT)
+ {
+ // buffer contains one or more CR-LF pairs
+ _pOstr->write(_buffer.data(), (std::streamsize) _buffer.length());
+ _pOstr->write("..", 2);
+ _state = ST_DATA;
+ _buffer.clear();
+ }
+ else _buffer += c;
+ return charToInt(c);
+}
+
+
+MailIOS::MailIOS(std::istream& istr): _buf(istr)
+{
+ poco_ios_init(&_buf);
+}
+
+
+MailIOS::MailIOS(std::ostream& ostr): _buf(ostr)
+{
+ poco_ios_init(&_buf);
+}
+
+
+MailIOS::~MailIOS()
+{
+}
+
+
+void MailIOS::close()
+{
+ _buf.close();
+}
+
+
+MailStreamBuf* MailIOS::rdbuf()
+{
+ return &_buf;
+}
+
+
+MailInputStream::MailInputStream(std::istream& istr):
+ MailIOS(istr),
+ std::istream(&_buf)
+{
+}
+
+
+MailInputStream::~MailInputStream()
+{
+}
+
+
+MailOutputStream::MailOutputStream(std::ostream& ostr):
+ MailIOS(ostr),
+ std::ostream(&_buf)
+{
+}
+
+
+MailOutputStream::~MailOutputStream()
+{
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/MediaType.cpp b/contrib/libs/poco/Net/src/MediaType.cpp
index b4e9f5ea32..d8a23c9ef2 100644
--- a/contrib/libs/poco/Net/src/MediaType.cpp
+++ b/contrib/libs/poco/Net/src/MediaType.cpp
@@ -1,191 +1,191 @@
-//
-// MediaType.cpp
-//
-// Library: Net
-// Package: Messages
-// Module: MediaType
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/MediaType.h"
-#include "Poco/Net/MessageHeader.h"
-#include "Poco/String.h"
-#include "Poco/Ascii.h"
-#include <algorithm>
-
-
-using Poco::icompare;
-
-
-namespace Poco {
-namespace Net {
-
-
-MediaType::MediaType(const std::string& mediaType)
-{
- parse(mediaType);
-}
-
-
-MediaType::MediaType(const std::string& type, const std::string& subType):
- _type(type),
- _subType(subType)
-{
-}
-
-
-MediaType::MediaType(const MediaType& mediaType):
- _type(mediaType._type),
- _subType(mediaType._subType),
- _parameters(mediaType._parameters)
-{
-}
-
-
-MediaType::~MediaType()
-{
-}
-
-
-MediaType& MediaType::operator = (const MediaType& mediaType)
-{
- if (&mediaType != this)
- {
- _type = mediaType._type;
- _subType = mediaType._subType;
- _parameters = mediaType._parameters;
- }
- return *this;
-}
-
-
-MediaType& MediaType::operator = (const std::string& mediaType)
-{
- parse(mediaType);
- return *this;
-}
-
-
-void MediaType::swap(MediaType& mediaType)
-{
- std::swap(_type, mediaType._type);
- std::swap(_subType, mediaType._subType);
- _parameters.swap(mediaType._parameters);
-}
-
-
-void MediaType::setType(const std::string& type)
-{
- _type = type;
-}
-
-
-void MediaType::setSubType(const std::string& subType)
-{
- _subType = subType;
-}
-
-
-void MediaType::setParameter(const std::string& name, const std::string& value)
-{
- _parameters.set(name, value);
-}
-
-
-const std::string& MediaType::getParameter(const std::string& name) const
-{
- return _parameters.get(name);
-}
-
-
-bool MediaType::hasParameter(const std::string& name) const
-{
- return _parameters.has(name);
-}
-
-
-void MediaType::removeParameter(const std::string& name)
-{
- _parameters.erase(name);
-}
-
-
-std::string MediaType::toString() const
-{
- std::string result;
- result.append(_type);
- result.append("/");
- result.append(_subType);
- for (NameValueCollection::ConstIterator it = _parameters.begin(); it != _parameters.end(); ++it)
- {
- result.append("; ");
- result.append(it->first);
- result.append("=");
- MessageHeader::quote(it->second, result);
- }
- return result;
-}
-
-
-bool MediaType::matches(const MediaType& mediaType) const
-{
- return matches(mediaType._type, mediaType._subType);
-}
-
-
-bool MediaType::matches(const std::string& type, const std::string& subType) const
-{
- return icompare(_type, type) == 0 && icompare(_subType, subType) == 0;
-}
-
-
-bool MediaType::matches(const std::string& type) const
-{
- return icompare(_type, type) == 0;
-}
-
-
-bool MediaType::matchesRange(const MediaType& mediaType) const
-{
- return matchesRange(mediaType._type, mediaType._subType);
-}
-
-
-bool MediaType::matchesRange(const std::string& type, const std::string& subType) const
-{
- if (_type == "*" || type == "*" || icompare(_type, type) == 0)
- {
- return _subType == "*" || subType == "*" || icompare(_subType, subType) == 0;
- }
- else return false;
-}
-
-
-bool MediaType::matchesRange(const std::string& type) const
-{
- return _type == "*" || type == "*" || matches(type);
-}
-
-
-void MediaType::parse(const std::string& mediaType)
-{
- _type.clear();
- _subType.clear();
- _parameters.clear();
- std::string::const_iterator it = mediaType.begin();
- std::string::const_iterator end = mediaType.end();
- while (it != end && Poco::Ascii::isSpace(*it)) ++it;
- while (it != end && *it != '/') _type += *it++;
- if (it != end) ++it;
- while (it != end && *it != ';' && !Poco::Ascii::isSpace(*it)) _subType += *it++;
- while (it != end && *it != ';') ++it;
- MessageHeader::splitParameters(it, end, _parameters);
-}
-
-
-} } // namespace Poco::Net
+//
+// MediaType.cpp
+//
+// Library: Net
+// Package: Messages
+// Module: MediaType
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/MediaType.h"
+#include "Poco/Net/MessageHeader.h"
+#include "Poco/String.h"
+#include "Poco/Ascii.h"
+#include <algorithm>
+
+
+using Poco::icompare;
+
+
+namespace Poco {
+namespace Net {
+
+
+MediaType::MediaType(const std::string& mediaType)
+{
+ parse(mediaType);
+}
+
+
+MediaType::MediaType(const std::string& type, const std::string& subType):
+ _type(type),
+ _subType(subType)
+{
+}
+
+
+MediaType::MediaType(const MediaType& mediaType):
+ _type(mediaType._type),
+ _subType(mediaType._subType),
+ _parameters(mediaType._parameters)
+{
+}
+
+
+MediaType::~MediaType()
+{
+}
+
+
+MediaType& MediaType::operator = (const MediaType& mediaType)
+{
+ if (&mediaType != this)
+ {
+ _type = mediaType._type;
+ _subType = mediaType._subType;
+ _parameters = mediaType._parameters;
+ }
+ return *this;
+}
+
+
+MediaType& MediaType::operator = (const std::string& mediaType)
+{
+ parse(mediaType);
+ return *this;
+}
+
+
+void MediaType::swap(MediaType& mediaType)
+{
+ std::swap(_type, mediaType._type);
+ std::swap(_subType, mediaType._subType);
+ _parameters.swap(mediaType._parameters);
+}
+
+
+void MediaType::setType(const std::string& type)
+{
+ _type = type;
+}
+
+
+void MediaType::setSubType(const std::string& subType)
+{
+ _subType = subType;
+}
+
+
+void MediaType::setParameter(const std::string& name, const std::string& value)
+{
+ _parameters.set(name, value);
+}
+
+
+const std::string& MediaType::getParameter(const std::string& name) const
+{
+ return _parameters.get(name);
+}
+
+
+bool MediaType::hasParameter(const std::string& name) const
+{
+ return _parameters.has(name);
+}
+
+
+void MediaType::removeParameter(const std::string& name)
+{
+ _parameters.erase(name);
+}
+
+
+std::string MediaType::toString() const
+{
+ std::string result;
+ result.append(_type);
+ result.append("/");
+ result.append(_subType);
+ for (NameValueCollection::ConstIterator it = _parameters.begin(); it != _parameters.end(); ++it)
+ {
+ result.append("; ");
+ result.append(it->first);
+ result.append("=");
+ MessageHeader::quote(it->second, result);
+ }
+ return result;
+}
+
+
+bool MediaType::matches(const MediaType& mediaType) const
+{
+ return matches(mediaType._type, mediaType._subType);
+}
+
+
+bool MediaType::matches(const std::string& type, const std::string& subType) const
+{
+ return icompare(_type, type) == 0 && icompare(_subType, subType) == 0;
+}
+
+
+bool MediaType::matches(const std::string& type) const
+{
+ return icompare(_type, type) == 0;
+}
+
+
+bool MediaType::matchesRange(const MediaType& mediaType) const
+{
+ return matchesRange(mediaType._type, mediaType._subType);
+}
+
+
+bool MediaType::matchesRange(const std::string& type, const std::string& subType) const
+{
+ if (_type == "*" || type == "*" || icompare(_type, type) == 0)
+ {
+ return _subType == "*" || subType == "*" || icompare(_subType, subType) == 0;
+ }
+ else return false;
+}
+
+
+bool MediaType::matchesRange(const std::string& type) const
+{
+ return _type == "*" || type == "*" || matches(type);
+}
+
+
+void MediaType::parse(const std::string& mediaType)
+{
+ _type.clear();
+ _subType.clear();
+ _parameters.clear();
+ std::string::const_iterator it = mediaType.begin();
+ std::string::const_iterator end = mediaType.end();
+ while (it != end && Poco::Ascii::isSpace(*it)) ++it;
+ while (it != end && *it != '/') _type += *it++;
+ if (it != end) ++it;
+ while (it != end && *it != ';' && !Poco::Ascii::isSpace(*it)) _subType += *it++;
+ while (it != end && *it != ';') ++it;
+ MessageHeader::splitParameters(it, end, _parameters);
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/MessageHeader.cpp b/contrib/libs/poco/Net/src/MessageHeader.cpp
index d98531487b..a684b3cf5d 100644
--- a/contrib/libs/poco/Net/src/MessageHeader.cpp
+++ b/contrib/libs/poco/Net/src/MessageHeader.cpp
@@ -1,394 +1,394 @@
-//
-// MessageHeader.cpp
-//
-// Library: Net
-// Package: Messages
-// Module: MessageHeader
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/MessageHeader.h"
-#include "Poco/Net/NetException.h"
-#include "Poco/String.h"
-#include "Poco/Ascii.h"
-#include "Poco/TextConverter.h"
-#include "Poco/StringTokenizer.h"
-#include "Poco/Base64Decoder.h"
-#include "Poco/UTF8Encoding.h"
-#include <sstream>
-
-
-namespace Poco {
-namespace Net {
-
-
-MessageHeader::MessageHeader():
- _fieldLimit(DFL_FIELD_LIMIT)
-{
-}
-
-
-MessageHeader::MessageHeader(const MessageHeader& messageHeader):
- NameValueCollection(messageHeader),
- _fieldLimit(DFL_FIELD_LIMIT)
-{
-}
-
-
-MessageHeader::~MessageHeader()
-{
-}
-
-
-MessageHeader& MessageHeader::operator = (const MessageHeader& messageHeader)
-{
- NameValueCollection::operator = (messageHeader);
- return *this;
-}
-
-
-void MessageHeader::write(std::ostream& ostr) const
-{
- NameValueCollection::ConstIterator it = begin();
- while (it != end())
- {
- ostr << it->first << ": " << it->second << "\r\n";
- ++it;
- }
-}
-
-
-void MessageHeader::read(std::istream& istr)
-{
- static const int eof = std::char_traits<char>::eof();
- std::streambuf& buf = *istr.rdbuf();
-
- std::string name;
- std::string value;
- name.reserve(32);
- value.reserve(64);
- int ch = buf.sbumpc();
- int fields = 0;
- while (ch != eof && ch != '\r' && ch != '\n')
- {
- if (_fieldLimit > 0 && fields == _fieldLimit)
- throw MessageException("Too many header fields");
- name.clear();
- value.clear();
- while (ch != eof && ch != ':' && ch != '\n' && name.length() < MAX_NAME_LENGTH) { name += static_cast<char>(ch); ch = buf.sbumpc(); }
- if (ch == '\n') { ch = buf.sbumpc(); continue; } // ignore invalid header lines
- if (ch != ':') throw MessageException("Field name too long/no colon found");
- if (ch != eof) ch = buf.sbumpc(); // ':'
- while (ch != eof && Poco::Ascii::isSpace(ch) && ch != '\r' && ch != '\n') ch = buf.sbumpc();
- while (ch != eof && ch != '\r' && ch != '\n' && value.length() < MAX_VALUE_LENGTH) { value += static_cast<char>(ch); ch = buf.sbumpc(); }
- if (ch == '\r') ch = buf.sbumpc();
- if (ch == '\n')
- ch = buf.sbumpc();
- else if (ch != eof)
- throw MessageException("Field value too long/no CRLF found");
- while (ch == ' ' || ch == '\t') // folding
- {
- while (ch != eof && ch != '\r' && ch != '\n' && value.length() < MAX_VALUE_LENGTH) { value += static_cast<char>(ch); ch = buf.sbumpc(); }
- if (ch == '\r') ch = buf.sbumpc();
- if (ch == '\n')
- ch = buf.sbumpc();
- else if (ch != eof)
- throw MessageException("Folded field value too long/no CRLF found");
- }
- Poco::trimRightInPlace(value);
- add(name, decodeWord(value));
- ++fields;
- }
- istr.putback(static_cast<char>(ch));
-}
-
-
-int MessageHeader::getFieldLimit() const
-{
- return _fieldLimit;
-}
-
-
-void MessageHeader::setFieldLimit(int limit)
-{
- poco_assert (limit >= 0);
-
- _fieldLimit = limit;
-}
-
-
-bool MessageHeader::hasToken(const std::string& fieldName, const std::string& token) const
-{
- std::string field = get(fieldName, "");
- std::vector<std::string> tokens;
- splitElements(field, tokens, true);
- for (std::vector<std::string>::const_iterator it = tokens.begin(); it != tokens.end(); ++it)
- {
- if (Poco::icompare(*it, token) == 0)
- return true;
- }
- return false;
-}
-
-
-void MessageHeader::splitElements(const std::string& s, std::vector<std::string>& elements, bool ignoreEmpty)
-{
- elements.clear();
- std::string::const_iterator it = s.begin();
- std::string::const_iterator end = s.end();
- std::string elem;
- elem.reserve(64);
- while (it != end)
- {
- if (*it == '"')
- {
- elem += *it++;
- while (it != end && *it != '"')
- {
- if (*it == '\\')
- {
- ++it;
- if (it != end) elem += *it++;
- }
- else elem += *it++;
- }
- if (it != end) elem += *it++;
- }
- else if (*it == '\\')
- {
- ++it;
- if (it != end) elem += *it++;
- }
- else if (*it == ',')
- {
- Poco::trimInPlace(elem);
- if (!ignoreEmpty || !elem.empty())
- elements.push_back(elem);
- elem.clear();
- ++it;
- }
- else elem += *it++;
- }
- if (!elem.empty())
- {
- Poco::trimInPlace(elem);
- if (!ignoreEmpty || !elem.empty())
- elements.push_back(elem);
- }
-}
-
-
-void MessageHeader::splitParameters(const std::string& s, std::string& value, NameValueCollection& parameters)
-{
- value.clear();
- parameters.clear();
- std::string::const_iterator it = s.begin();
- std::string::const_iterator end = s.end();
- while (it != end && Poco::Ascii::isSpace(*it)) ++it;
- while (it != end && *it != ';') value += *it++;
- Poco::trimRightInPlace(value);
- if (it != end) ++it;
- splitParameters(it, end, parameters);
-}
-
-
-void MessageHeader::splitParameters(const std::string::const_iterator& begin, const std::string::const_iterator& end, NameValueCollection& parameters)
-{
- std::string pname;
- std::string pvalue;
- pname.reserve(32);
- pvalue.reserve(64);
- std::string::const_iterator it = begin;
- while (it != end)
- {
- pname.clear();
- pvalue.clear();
- while (it != end && Poco::Ascii::isSpace(*it)) ++it;
- while (it != end && *it != '=' && *it != ';') pname += *it++;
- Poco::trimRightInPlace(pname);
- if (it != end && *it != ';') ++it;
- while (it != end && Poco::Ascii::isSpace(*it)) ++it;
- while (it != end && *it != ';')
- {
- if (*it == '"')
- {
- ++it;
- while (it != end && *it != '"')
- {
- if (*it == '\\')
- {
- ++it;
- if (it != end) pvalue += *it++;
- }
- else pvalue += *it++;
- }
- if (it != end) ++it;
- }
- else if (*it == '\\')
- {
- ++it;
- if (it != end) pvalue += *it++;
- }
- else pvalue += *it++;
- }
- Poco::trimRightInPlace(pvalue);
- if (!pname.empty()) parameters.add(pname, pvalue);
- if (it != end) ++it;
- }
-}
-
-
-void MessageHeader::quote(const std::string& value, std::string& result, bool allowSpace)
-{
- bool mustQuote = false;
- for (std::string::const_iterator it = value.begin(); !mustQuote && it != value.end(); ++it)
- {
- if (!Poco::Ascii::isAlphaNumeric(*it) && *it != '.' && *it != '_' && *it != '-' && !(Poco::Ascii::isSpace(*it) && allowSpace))
- mustQuote = true;
- }
- if (mustQuote) result += '"';
- result.append(value);
- if (mustQuote) result += '"';
-}
-
-
-void MessageHeader::decodeRFC2047(const std::string& ins, std::string& outs, const std::string& charset_to)
-{
- std::string tempout;
- StringTokenizer tokens(ins, "?");
-
- std::string charset = toUpper(tokens[0]);
- std::string encoding = toUpper(tokens[1]);
- std::string text = tokens[2];
-
- std::istringstream istr(text);
-
- if (encoding == "B")
- {
- // Base64 encoding.
- Base64Decoder decoder(istr);
- for (char c; decoder.get(c); tempout += c) {}
- }
- else if (encoding == "Q")
- {
- // Quoted encoding.
- for (char c; istr.get(c);)
- {
- if (c == '_')
- {
- //RFC 2047 _ is a space.
- tempout += " ";
- continue;
- }
-
- // FIXME: check that we have enought chars-
- if (c == '=')
- {
- // The next two chars are hex representation of the complete byte.
- std::string hex;
- for (int i = 0; i < 2; i++)
- {
- istr.get(c);
- hex += c;
- }
- hex = toUpper(hex);
- tempout += (char)(int)strtol(hex.c_str(), 0, 16);
- continue;
- }
- tempout += c;
- }
- }
- else
- {
- // Wrong encoding
- outs = ins;
- return;
- }
-
- // convert to the right charset.
- if (charset != charset_to)
- {
- try
- {
- TextEncoding& enc = TextEncoding::byName(charset);
- TextEncoding& dec = TextEncoding::byName(charset_to);
- TextConverter converter(enc, dec);
- converter.convert(tempout, outs);
- }
- catch (...)
- {
- // FIXME: Unsuported encoding...
- outs = tempout;
- }
- }
- else
- {
- // Not conversion necesary.
- outs = tempout;
- }
-}
-
-
-std::string MessageHeader::decodeWord(const std::string& text, const std::string& charset)
-{
- std::string outs, tmp = text;
- do {
- std::string tmp2;
- // find the begining of the next rfc2047 chunk
- size_t pos = tmp.find("=?");
- if (pos == std::string::npos) {
- // No more found, return
- outs += tmp;
- break;
- }
-
- // check if there are standar text before the rfc2047 chunk, and if so, copy it.
- if (pos > 0) {
- outs += tmp.substr(0, pos);
- }
-
- // remove text already copied.
- tmp = tmp.substr(pos + 2);
-
- // find the first separator
- size_t pos1 = tmp.find("?");
- if (pos1 == std::string::npos) {
- // not found.
- outs += tmp;
- break;
- }
-
- // find the second separator
- size_t pos2 = tmp.find("?", pos1 + 1);
- if (pos2 == std::string::npos) {
- // not found
- outs += tmp;
- break;
- }
-
- // find the end of the actual rfc2047 chunk
- size_t pos3 = tmp.find("?=", pos2 + 1);
- if (pos3 == std::string::npos) {
- // not found.
- outs += tmp;
- break;
-
- }
- // At this place, there are a valid rfc2047 chunk, so decode and copy the result.
- decodeRFC2047(tmp.substr(0, pos3), tmp2, charset);
- outs += tmp2;
-
- // Jump at the rest of the string and repeat the whole process.
- tmp = tmp.substr(pos3 + 2);
- } while (true);
-
- return outs;
-}
-
-
-} } // namespace Poco::Net
+//
+// MessageHeader.cpp
+//
+// Library: Net
+// Package: Messages
+// Module: MessageHeader
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/MessageHeader.h"
+#include "Poco/Net/NetException.h"
+#include "Poco/String.h"
+#include "Poco/Ascii.h"
+#include "Poco/TextConverter.h"
+#include "Poco/StringTokenizer.h"
+#include "Poco/Base64Decoder.h"
+#include "Poco/UTF8Encoding.h"
+#include <sstream>
+
+
+namespace Poco {
+namespace Net {
+
+
+MessageHeader::MessageHeader():
+ _fieldLimit(DFL_FIELD_LIMIT)
+{
+}
+
+
+MessageHeader::MessageHeader(const MessageHeader& messageHeader):
+ NameValueCollection(messageHeader),
+ _fieldLimit(DFL_FIELD_LIMIT)
+{
+}
+
+
+MessageHeader::~MessageHeader()
+{
+}
+
+
+MessageHeader& MessageHeader::operator = (const MessageHeader& messageHeader)
+{
+ NameValueCollection::operator = (messageHeader);
+ return *this;
+}
+
+
+void MessageHeader::write(std::ostream& ostr) const
+{
+ NameValueCollection::ConstIterator it = begin();
+ while (it != end())
+ {
+ ostr << it->first << ": " << it->second << "\r\n";
+ ++it;
+ }
+}
+
+
+void MessageHeader::read(std::istream& istr)
+{
+ static const int eof = std::char_traits<char>::eof();
+ std::streambuf& buf = *istr.rdbuf();
+
+ std::string name;
+ std::string value;
+ name.reserve(32);
+ value.reserve(64);
+ int ch = buf.sbumpc();
+ int fields = 0;
+ while (ch != eof && ch != '\r' && ch != '\n')
+ {
+ if (_fieldLimit > 0 && fields == _fieldLimit)
+ throw MessageException("Too many header fields");
+ name.clear();
+ value.clear();
+ while (ch != eof && ch != ':' && ch != '\n' && name.length() < MAX_NAME_LENGTH) { name += static_cast<char>(ch); ch = buf.sbumpc(); }
+ if (ch == '\n') { ch = buf.sbumpc(); continue; } // ignore invalid header lines
+ if (ch != ':') throw MessageException("Field name too long/no colon found");
+ if (ch != eof) ch = buf.sbumpc(); // ':'
+ while (ch != eof && Poco::Ascii::isSpace(ch) && ch != '\r' && ch != '\n') ch = buf.sbumpc();
+ while (ch != eof && ch != '\r' && ch != '\n' && value.length() < MAX_VALUE_LENGTH) { value += static_cast<char>(ch); ch = buf.sbumpc(); }
+ if (ch == '\r') ch = buf.sbumpc();
+ if (ch == '\n')
+ ch = buf.sbumpc();
+ else if (ch != eof)
+ throw MessageException("Field value too long/no CRLF found");
+ while (ch == ' ' || ch == '\t') // folding
+ {
+ while (ch != eof && ch != '\r' && ch != '\n' && value.length() < MAX_VALUE_LENGTH) { value += static_cast<char>(ch); ch = buf.sbumpc(); }
+ if (ch == '\r') ch = buf.sbumpc();
+ if (ch == '\n')
+ ch = buf.sbumpc();
+ else if (ch != eof)
+ throw MessageException("Folded field value too long/no CRLF found");
+ }
+ Poco::trimRightInPlace(value);
+ add(name, decodeWord(value));
+ ++fields;
+ }
+ istr.putback(static_cast<char>(ch));
+}
+
+
+int MessageHeader::getFieldLimit() const
+{
+ return _fieldLimit;
+}
+
+
+void MessageHeader::setFieldLimit(int limit)
+{
+ poco_assert (limit >= 0);
+
+ _fieldLimit = limit;
+}
+
+
+bool MessageHeader::hasToken(const std::string& fieldName, const std::string& token) const
+{
+ std::string field = get(fieldName, "");
+ std::vector<std::string> tokens;
+ splitElements(field, tokens, true);
+ for (std::vector<std::string>::const_iterator it = tokens.begin(); it != tokens.end(); ++it)
+ {
+ if (Poco::icompare(*it, token) == 0)
+ return true;
+ }
+ return false;
+}
+
+
+void MessageHeader::splitElements(const std::string& s, std::vector<std::string>& elements, bool ignoreEmpty)
+{
+ elements.clear();
+ std::string::const_iterator it = s.begin();
+ std::string::const_iterator end = s.end();
+ std::string elem;
+ elem.reserve(64);
+ while (it != end)
+ {
+ if (*it == '"')
+ {
+ elem += *it++;
+ while (it != end && *it != '"')
+ {
+ if (*it == '\\')
+ {
+ ++it;
+ if (it != end) elem += *it++;
+ }
+ else elem += *it++;
+ }
+ if (it != end) elem += *it++;
+ }
+ else if (*it == '\\')
+ {
+ ++it;
+ if (it != end) elem += *it++;
+ }
+ else if (*it == ',')
+ {
+ Poco::trimInPlace(elem);
+ if (!ignoreEmpty || !elem.empty())
+ elements.push_back(elem);
+ elem.clear();
+ ++it;
+ }
+ else elem += *it++;
+ }
+ if (!elem.empty())
+ {
+ Poco::trimInPlace(elem);
+ if (!ignoreEmpty || !elem.empty())
+ elements.push_back(elem);
+ }
+}
+
+
+void MessageHeader::splitParameters(const std::string& s, std::string& value, NameValueCollection& parameters)
+{
+ value.clear();
+ parameters.clear();
+ std::string::const_iterator it = s.begin();
+ std::string::const_iterator end = s.end();
+ while (it != end && Poco::Ascii::isSpace(*it)) ++it;
+ while (it != end && *it != ';') value += *it++;
+ Poco::trimRightInPlace(value);
+ if (it != end) ++it;
+ splitParameters(it, end, parameters);
+}
+
+
+void MessageHeader::splitParameters(const std::string::const_iterator& begin, const std::string::const_iterator& end, NameValueCollection& parameters)
+{
+ std::string pname;
+ std::string pvalue;
+ pname.reserve(32);
+ pvalue.reserve(64);
+ std::string::const_iterator it = begin;
+ while (it != end)
+ {
+ pname.clear();
+ pvalue.clear();
+ while (it != end && Poco::Ascii::isSpace(*it)) ++it;
+ while (it != end && *it != '=' && *it != ';') pname += *it++;
+ Poco::trimRightInPlace(pname);
+ if (it != end && *it != ';') ++it;
+ while (it != end && Poco::Ascii::isSpace(*it)) ++it;
+ while (it != end && *it != ';')
+ {
+ if (*it == '"')
+ {
+ ++it;
+ while (it != end && *it != '"')
+ {
+ if (*it == '\\')
+ {
+ ++it;
+ if (it != end) pvalue += *it++;
+ }
+ else pvalue += *it++;
+ }
+ if (it != end) ++it;
+ }
+ else if (*it == '\\')
+ {
+ ++it;
+ if (it != end) pvalue += *it++;
+ }
+ else pvalue += *it++;
+ }
+ Poco::trimRightInPlace(pvalue);
+ if (!pname.empty()) parameters.add(pname, pvalue);
+ if (it != end) ++it;
+ }
+}
+
+
+void MessageHeader::quote(const std::string& value, std::string& result, bool allowSpace)
+{
+ bool mustQuote = false;
+ for (std::string::const_iterator it = value.begin(); !mustQuote && it != value.end(); ++it)
+ {
+ if (!Poco::Ascii::isAlphaNumeric(*it) && *it != '.' && *it != '_' && *it != '-' && !(Poco::Ascii::isSpace(*it) && allowSpace))
+ mustQuote = true;
+ }
+ if (mustQuote) result += '"';
+ result.append(value);
+ if (mustQuote) result += '"';
+}
+
+
+void MessageHeader::decodeRFC2047(const std::string& ins, std::string& outs, const std::string& charset_to)
+{
+ std::string tempout;
+ StringTokenizer tokens(ins, "?");
+
+ std::string charset = toUpper(tokens[0]);
+ std::string encoding = toUpper(tokens[1]);
+ std::string text = tokens[2];
+
+ std::istringstream istr(text);
+
+ if (encoding == "B")
+ {
+ // Base64 encoding.
+ Base64Decoder decoder(istr);
+ for (char c; decoder.get(c); tempout += c) {}
+ }
+ else if (encoding == "Q")
+ {
+ // Quoted encoding.
+ for (char c; istr.get(c);)
+ {
+ if (c == '_')
+ {
+ //RFC 2047 _ is a space.
+ tempout += " ";
+ continue;
+ }
+
+ // FIXME: check that we have enought chars-
+ if (c == '=')
+ {
+ // The next two chars are hex representation of the complete byte.
+ std::string hex;
+ for (int i = 0; i < 2; i++)
+ {
+ istr.get(c);
+ hex += c;
+ }
+ hex = toUpper(hex);
+ tempout += (char)(int)strtol(hex.c_str(), 0, 16);
+ continue;
+ }
+ tempout += c;
+ }
+ }
+ else
+ {
+ // Wrong encoding
+ outs = ins;
+ return;
+ }
+
+ // convert to the right charset.
+ if (charset != charset_to)
+ {
+ try
+ {
+ TextEncoding& enc = TextEncoding::byName(charset);
+ TextEncoding& dec = TextEncoding::byName(charset_to);
+ TextConverter converter(enc, dec);
+ converter.convert(tempout, outs);
+ }
+ catch (...)
+ {
+ // FIXME: Unsuported encoding...
+ outs = tempout;
+ }
+ }
+ else
+ {
+ // Not conversion necesary.
+ outs = tempout;
+ }
+}
+
+
+std::string MessageHeader::decodeWord(const std::string& text, const std::string& charset)
+{
+ std::string outs, tmp = text;
+ do {
+ std::string tmp2;
+ // find the begining of the next rfc2047 chunk
+ size_t pos = tmp.find("=?");
+ if (pos == std::string::npos) {
+ // No more found, return
+ outs += tmp;
+ break;
+ }
+
+ // check if there are standar text before the rfc2047 chunk, and if so, copy it.
+ if (pos > 0) {
+ outs += tmp.substr(0, pos);
+ }
+
+ // remove text already copied.
+ tmp = tmp.substr(pos + 2);
+
+ // find the first separator
+ size_t pos1 = tmp.find("?");
+ if (pos1 == std::string::npos) {
+ // not found.
+ outs += tmp;
+ break;
+ }
+
+ // find the second separator
+ size_t pos2 = tmp.find("?", pos1 + 1);
+ if (pos2 == std::string::npos) {
+ // not found
+ outs += tmp;
+ break;
+ }
+
+ // find the end of the actual rfc2047 chunk
+ size_t pos3 = tmp.find("?=", pos2 + 1);
+ if (pos3 == std::string::npos) {
+ // not found.
+ outs += tmp;
+ break;
+
+ }
+ // At this place, there are a valid rfc2047 chunk, so decode and copy the result.
+ decodeRFC2047(tmp.substr(0, pos3), tmp2, charset);
+ outs += tmp2;
+
+ // Jump at the rest of the string and repeat the whole process.
+ tmp = tmp.substr(pos3 + 2);
+ } while (true);
+
+ return outs;
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/MulticastSocket.cpp b/contrib/libs/poco/Net/src/MulticastSocket.cpp
index 5a4eec3028..e302f6a818 100644
--- a/contrib/libs/poco/Net/src/MulticastSocket.cpp
+++ b/contrib/libs/poco/Net/src/MulticastSocket.cpp
@@ -1,289 +1,289 @@
-//
-// MulticastSocket.cpp
-//
-// Library: Net
-// Package: Sockets
-// Module: MulticastSocket
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/MulticastSocket.h"
-
-
-#ifdef POCO_NET_HAS_INTERFACE
-
-
-#include "Poco/Net/NetException.h"
-#include <cstring>
-
-
-#if defined(hpux) && defined(_XOPEN_SOURCE_EXTENDED) && defined(POCO_HPUX_IP_MREQ_HACK)
-// netinet/in.h does not define struct ip_mreq if
-// _XOPEN_SOURCE_EXTENDED is #define'd in HP-UX 11.x
-// versions prior to 11.30. Compile with -DPOCO_HPUX_IP_MREQ_HACK
-// if you experience problems.
-struct ip_mreq
-{
- struct in_addr imr_multiaddr;
- struct in_addr imr_interface;
-};
-#endif
-
-
-// some Unix variants don't have IPV6_ADD_MEMBERSHIP/IPV6_DROP_MEMBERSHIP
-#if defined(IPV6_JOIN_GROUP) && !defined(IPV6_ADD_MEMBERSHIP)
-#define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP
-#define IPV6_DROP_MEMBERSHIP IPV6_LEAVE_GROUP
-#endif
-
-
-namespace Poco {
-namespace Net {
-
-
-MulticastSocket::MulticastSocket()
-{
-}
-
-
-MulticastSocket::MulticastSocket(SocketAddress::Family family): DatagramSocket(family)
-{
-#if defined(POCO_OS_FAMILY_UNIX)
- if (family == SocketAddress::UNIX_LOCAL)
- throw Poco::InvalidArgumentException("Cannot create a MulticastSocket with UNIX_LOCAL socket");
-#endif
-}
-
-
-MulticastSocket::MulticastSocket(const SocketAddress& address, bool reuseAddress): DatagramSocket(address, reuseAddress)
-{
-}
-
-
-MulticastSocket::MulticastSocket(const Socket& socket): DatagramSocket(socket)
-{
-}
-
-
-MulticastSocket::~MulticastSocket()
-{
-}
-
-
-MulticastSocket& MulticastSocket::operator = (const Socket& socket)
-{
- DatagramSocket::operator = (socket);
- return *this;
-}
-
-
-void MulticastSocket::setInterface(const NetworkInterface& interfc)
-{
- if (address().family() == SocketAddress::IPv4)
- {
- impl()->setOption(IPPROTO_IP, IP_MULTICAST_IF, interfc.firstAddress(IPAddress::IPv4));
- }
-#if defined(POCO_HAVE_IPv6)
- else if (address().family() == SocketAddress::IPv6)
- {
- impl()->setOption(IPPROTO_IPV6, IPV6_MULTICAST_IF, interfc.index());
- }
-#endif
- else throw UnsupportedFamilyException("Unknown or unsupported socket family.");
-}
-
-
-NetworkInterface MulticastSocket::getInterface() const
-{
- try
- {
- IPAddress addr;
- impl()->getOption(IPPROTO_IP, IP_MULTICAST_IF, addr);
- return NetworkInterface::forAddress(addr);
- }
- catch (Poco::Exception&)
- {
-#if defined(POCO_HAVE_IPv6)
- int ix;
- impl()->getOption(IPPROTO_IPV6, IPV6_MULTICAST_IF, ix);
- return NetworkInterface::forIndex(ix);
-#else
- throw;
-#endif
- }
-}
-
-
-void MulticastSocket::setLoopback(bool flag)
-{
- if (address().af() == AF_INET)
- {
- unsigned char uflag = flag ? 1 : 0;
- impl()->setOption(IPPROTO_IP, IP_MULTICAST_LOOP, uflag);
- }
- else
- {
-#if defined(POCO_HAVE_IPv6)
- unsigned uflag = flag ? 1 : 0;
- impl()->setOption(IPPROTO_IPV6, IPV6_MULTICAST_LOOP, uflag);
-#endif
- }
-}
-
-
-bool MulticastSocket::getLoopback() const
-{
- bool flag = false;
- if (address().af() == AF_INET)
- {
- unsigned char uflag;
- impl()->getOption(IPPROTO_IP, IP_MULTICAST_LOOP, uflag);
- flag = uflag != 0;
- }
- else
- {
-#if defined(POCO_HAVE_IPv6)
- unsigned uflag;
- impl()->getOption(IPPROTO_IPV6, IPV6_MULTICAST_LOOP, uflag);
- flag = uflag != 0;
-#endif
- }
- return flag;
-}
-
-
-void MulticastSocket::setTimeToLive(unsigned value)
-{
- if (address().af() == AF_INET)
- {
- unsigned char ttl = (unsigned char) value;
- impl()->setOption(IPPROTO_IP, IP_MULTICAST_TTL, ttl);
- }
- else
- {
-#if defined(POCO_HAVE_IPv6)
- impl()->setOption(IPPROTO_IPV6, IPV6_MULTICAST_HOPS, value);
-#endif
- }
-}
-
-
-unsigned MulticastSocket::getTimeToLive() const
-{
- unsigned ttl(0);
- if (address().af() == AF_INET)
- {
- unsigned char cttl;
- impl()->getOption(IPPROTO_IP, IP_MULTICAST_TTL, cttl);
- ttl = cttl;
- }
- else
- {
-#if defined(POCO_HAVE_IPv6)
- impl()->getOption(IPPROTO_IPV6, IPV6_MULTICAST_HOPS, ttl);
-#endif
- }
- return ttl;
-}
-
-
-void MulticastSocket::joinGroup(const IPAddress& groupAddress)
-{
- joinGroup(groupAddress, findFirstInterface(groupAddress));
-}
-
-
-void MulticastSocket::joinGroup(const IPAddress& groupAddress, const NetworkInterface& interfc)
-{
- if (groupAddress.af() == AF_INET)
- {
- struct ip_mreq mr;
- std::memcpy(&mr.imr_multiaddr, groupAddress.addr(), groupAddress.length());
- std::memcpy(&mr.imr_interface, interfc.firstAddress(IPAddress::IPv4).addr(), interfc.firstAddress(IPAddress::IPv4).length());
- impl()->setRawOption(IPPROTO_IP, IP_ADD_MEMBERSHIP, &mr, sizeof(mr));
- }
- else
- {
-#if defined(POCO_HAVE_IPv6)
- struct ipv6_mreq mr;
- std::memcpy(&mr.ipv6mr_multiaddr, groupAddress.addr(), groupAddress.length());
- mr.ipv6mr_interface = interfc.index();
- impl()->setRawOption(IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, &mr, sizeof(mr));
-#endif
- }
-}
-
-
-NetworkInterface MulticastSocket::findFirstInterface(const IPAddress& groupAddress)
-{
- NetworkInterface::Map m = NetworkInterface::map();
- if (groupAddress.family() == IPAddress::IPv4)
- {
- for (NetworkInterface::Map::const_iterator it = m.begin(); it != m.end(); ++it)
- {
- if (it->second.supportsIPv4() &&
- it->second.firstAddress(IPAddress::IPv4).isUnicast() &&
- !it->second.isLoopback() &&
- !it->second.isPointToPoint())
- {
- return it->second;
- }
- }
- }
-#ifdef POCO_HAVE_IPv6
- else if (groupAddress.family() == IPAddress::IPv6)
- {
- for (NetworkInterface::Map::const_iterator it = m.begin(); it != m.end(); ++it)
- {
- if (it->second.supportsIPv6() &&
- it->second.firstAddress(IPAddress::IPv6).isUnicast() &&
- !it->second.isLoopback() &&
- !it->second.isPointToPoint())
- {
- return it->second;
- }
- }
- }
-#endif // POCO_HAVE_IPv6
-
- throw NotFoundException("No multicast-eligible network interface found.");
-}
-
-
-void MulticastSocket::leaveGroup(const IPAddress& groupAddress)
-{
- NetworkInterface intf;
- leaveGroup(groupAddress, intf);
-}
-
-
-void MulticastSocket::leaveGroup(const IPAddress& groupAddress, const NetworkInterface& interfc)
-{
- if (groupAddress.af() == AF_INET)
- {
- struct ip_mreq mr;
- std::memcpy(&mr.imr_multiaddr, groupAddress.addr(), groupAddress.length());
- std::memcpy(&mr.imr_interface, interfc.firstAddress(IPAddress::IPv4).addr(), interfc.firstAddress(IPAddress::IPv4).length());
- impl()->setRawOption(IPPROTO_IP, IP_DROP_MEMBERSHIP, &mr, sizeof(mr));
- }
- else
- {
-#if defined(POCO_HAVE_IPv6)
- struct ipv6_mreq mr;
- std::memcpy(&mr.ipv6mr_multiaddr, groupAddress.addr(), groupAddress.length());
- mr.ipv6mr_interface = interfc.index();
- impl()->setRawOption(IPPROTO_IPV6, IPV6_DROP_MEMBERSHIP, &mr, sizeof(mr));
-#endif
- }
-}
-
-
-} } // namespace Poco::Net
-
-
-#endif // POCO_NET_HAS_INTERFACE
+//
+// MulticastSocket.cpp
+//
+// Library: Net
+// Package: Sockets
+// Module: MulticastSocket
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/MulticastSocket.h"
+
+
+#ifdef POCO_NET_HAS_INTERFACE
+
+
+#include "Poco/Net/NetException.h"
+#include <cstring>
+
+
+#if defined(hpux) && defined(_XOPEN_SOURCE_EXTENDED) && defined(POCO_HPUX_IP_MREQ_HACK)
+// netinet/in.h does not define struct ip_mreq if
+// _XOPEN_SOURCE_EXTENDED is #define'd in HP-UX 11.x
+// versions prior to 11.30. Compile with -DPOCO_HPUX_IP_MREQ_HACK
+// if you experience problems.
+struct ip_mreq
+{
+ struct in_addr imr_multiaddr;
+ struct in_addr imr_interface;
+};
+#endif
+
+
+// some Unix variants don't have IPV6_ADD_MEMBERSHIP/IPV6_DROP_MEMBERSHIP
+#if defined(IPV6_JOIN_GROUP) && !defined(IPV6_ADD_MEMBERSHIP)
+#define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP
+#define IPV6_DROP_MEMBERSHIP IPV6_LEAVE_GROUP
+#endif
+
+
+namespace Poco {
+namespace Net {
+
+
+MulticastSocket::MulticastSocket()
+{
+}
+
+
+MulticastSocket::MulticastSocket(SocketAddress::Family family): DatagramSocket(family)
+{
+#if defined(POCO_OS_FAMILY_UNIX)
+ if (family == SocketAddress::UNIX_LOCAL)
+ throw Poco::InvalidArgumentException("Cannot create a MulticastSocket with UNIX_LOCAL socket");
+#endif
+}
+
+
+MulticastSocket::MulticastSocket(const SocketAddress& address, bool reuseAddress): DatagramSocket(address, reuseAddress)
+{
+}
+
+
+MulticastSocket::MulticastSocket(const Socket& socket): DatagramSocket(socket)
+{
+}
+
+
+MulticastSocket::~MulticastSocket()
+{
+}
+
+
+MulticastSocket& MulticastSocket::operator = (const Socket& socket)
+{
+ DatagramSocket::operator = (socket);
+ return *this;
+}
+
+
+void MulticastSocket::setInterface(const NetworkInterface& interfc)
+{
+ if (address().family() == SocketAddress::IPv4)
+ {
+ impl()->setOption(IPPROTO_IP, IP_MULTICAST_IF, interfc.firstAddress(IPAddress::IPv4));
+ }
+#if defined(POCO_HAVE_IPv6)
+ else if (address().family() == SocketAddress::IPv6)
+ {
+ impl()->setOption(IPPROTO_IPV6, IPV6_MULTICAST_IF, interfc.index());
+ }
+#endif
+ else throw UnsupportedFamilyException("Unknown or unsupported socket family.");
+}
+
+
+NetworkInterface MulticastSocket::getInterface() const
+{
+ try
+ {
+ IPAddress addr;
+ impl()->getOption(IPPROTO_IP, IP_MULTICAST_IF, addr);
+ return NetworkInterface::forAddress(addr);
+ }
+ catch (Poco::Exception&)
+ {
+#if defined(POCO_HAVE_IPv6)
+ int ix;
+ impl()->getOption(IPPROTO_IPV6, IPV6_MULTICAST_IF, ix);
+ return NetworkInterface::forIndex(ix);
+#else
+ throw;
+#endif
+ }
+}
+
+
+void MulticastSocket::setLoopback(bool flag)
+{
+ if (address().af() == AF_INET)
+ {
+ unsigned char uflag = flag ? 1 : 0;
+ impl()->setOption(IPPROTO_IP, IP_MULTICAST_LOOP, uflag);
+ }
+ else
+ {
+#if defined(POCO_HAVE_IPv6)
+ unsigned uflag = flag ? 1 : 0;
+ impl()->setOption(IPPROTO_IPV6, IPV6_MULTICAST_LOOP, uflag);
+#endif
+ }
+}
+
+
+bool MulticastSocket::getLoopback() const
+{
+ bool flag = false;
+ if (address().af() == AF_INET)
+ {
+ unsigned char uflag;
+ impl()->getOption(IPPROTO_IP, IP_MULTICAST_LOOP, uflag);
+ flag = uflag != 0;
+ }
+ else
+ {
+#if defined(POCO_HAVE_IPv6)
+ unsigned uflag;
+ impl()->getOption(IPPROTO_IPV6, IPV6_MULTICAST_LOOP, uflag);
+ flag = uflag != 0;
+#endif
+ }
+ return flag;
+}
+
+
+void MulticastSocket::setTimeToLive(unsigned value)
+{
+ if (address().af() == AF_INET)
+ {
+ unsigned char ttl = (unsigned char) value;
+ impl()->setOption(IPPROTO_IP, IP_MULTICAST_TTL, ttl);
+ }
+ else
+ {
+#if defined(POCO_HAVE_IPv6)
+ impl()->setOption(IPPROTO_IPV6, IPV6_MULTICAST_HOPS, value);
+#endif
+ }
+}
+
+
+unsigned MulticastSocket::getTimeToLive() const
+{
+ unsigned ttl(0);
+ if (address().af() == AF_INET)
+ {
+ unsigned char cttl;
+ impl()->getOption(IPPROTO_IP, IP_MULTICAST_TTL, cttl);
+ ttl = cttl;
+ }
+ else
+ {
+#if defined(POCO_HAVE_IPv6)
+ impl()->getOption(IPPROTO_IPV6, IPV6_MULTICAST_HOPS, ttl);
+#endif
+ }
+ return ttl;
+}
+
+
+void MulticastSocket::joinGroup(const IPAddress& groupAddress)
+{
+ joinGroup(groupAddress, findFirstInterface(groupAddress));
+}
+
+
+void MulticastSocket::joinGroup(const IPAddress& groupAddress, const NetworkInterface& interfc)
+{
+ if (groupAddress.af() == AF_INET)
+ {
+ struct ip_mreq mr;
+ std::memcpy(&mr.imr_multiaddr, groupAddress.addr(), groupAddress.length());
+ std::memcpy(&mr.imr_interface, interfc.firstAddress(IPAddress::IPv4).addr(), interfc.firstAddress(IPAddress::IPv4).length());
+ impl()->setRawOption(IPPROTO_IP, IP_ADD_MEMBERSHIP, &mr, sizeof(mr));
+ }
+ else
+ {
+#if defined(POCO_HAVE_IPv6)
+ struct ipv6_mreq mr;
+ std::memcpy(&mr.ipv6mr_multiaddr, groupAddress.addr(), groupAddress.length());
+ mr.ipv6mr_interface = interfc.index();
+ impl()->setRawOption(IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, &mr, sizeof(mr));
+#endif
+ }
+}
+
+
+NetworkInterface MulticastSocket::findFirstInterface(const IPAddress& groupAddress)
+{
+ NetworkInterface::Map m = NetworkInterface::map();
+ if (groupAddress.family() == IPAddress::IPv4)
+ {
+ for (NetworkInterface::Map::const_iterator it = m.begin(); it != m.end(); ++it)
+ {
+ if (it->second.supportsIPv4() &&
+ it->second.firstAddress(IPAddress::IPv4).isUnicast() &&
+ !it->second.isLoopback() &&
+ !it->second.isPointToPoint())
+ {
+ return it->second;
+ }
+ }
+ }
+#ifdef POCO_HAVE_IPv6
+ else if (groupAddress.family() == IPAddress::IPv6)
+ {
+ for (NetworkInterface::Map::const_iterator it = m.begin(); it != m.end(); ++it)
+ {
+ if (it->second.supportsIPv6() &&
+ it->second.firstAddress(IPAddress::IPv6).isUnicast() &&
+ !it->second.isLoopback() &&
+ !it->second.isPointToPoint())
+ {
+ return it->second;
+ }
+ }
+ }
+#endif // POCO_HAVE_IPv6
+
+ throw NotFoundException("No multicast-eligible network interface found.");
+}
+
+
+void MulticastSocket::leaveGroup(const IPAddress& groupAddress)
+{
+ NetworkInterface intf;
+ leaveGroup(groupAddress, intf);
+}
+
+
+void MulticastSocket::leaveGroup(const IPAddress& groupAddress, const NetworkInterface& interfc)
+{
+ if (groupAddress.af() == AF_INET)
+ {
+ struct ip_mreq mr;
+ std::memcpy(&mr.imr_multiaddr, groupAddress.addr(), groupAddress.length());
+ std::memcpy(&mr.imr_interface, interfc.firstAddress(IPAddress::IPv4).addr(), interfc.firstAddress(IPAddress::IPv4).length());
+ impl()->setRawOption(IPPROTO_IP, IP_DROP_MEMBERSHIP, &mr, sizeof(mr));
+ }
+ else
+ {
+#if defined(POCO_HAVE_IPv6)
+ struct ipv6_mreq mr;
+ std::memcpy(&mr.ipv6mr_multiaddr, groupAddress.addr(), groupAddress.length());
+ mr.ipv6mr_interface = interfc.index();
+ impl()->setRawOption(IPPROTO_IPV6, IPV6_DROP_MEMBERSHIP, &mr, sizeof(mr));
+#endif
+ }
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // POCO_NET_HAS_INTERFACE
diff --git a/contrib/libs/poco/Net/src/MultipartReader.cpp b/contrib/libs/poco/Net/src/MultipartReader.cpp
index 072de3d5ca..a41b2d61c5 100644
--- a/contrib/libs/poco/Net/src/MultipartReader.cpp
+++ b/contrib/libs/poco/Net/src/MultipartReader.cpp
@@ -1,310 +1,310 @@
-//
-// MultipartReader.cpp
-//
-// Library: Net
-// Package: Messages
-// Module: MultipartReader
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/MultipartReader.h"
-#include "Poco/Net/MessageHeader.h"
-#include "Poco/Net/NetException.h"
-#include "Poco/Ascii.h"
-
-
-using Poco::BufferedStreamBuf;
-
-
-namespace Poco {
-namespace Net {
-
-
-//
-// MultipartStreamBuf
-//
-
-
-MultipartStreamBuf::MultipartStreamBuf(std::istream& istr, const std::string& boundary):
- BufferedStreamBuf(STREAM_BUFFER_SIZE, std::ios::in),
- _istr(istr),
- _boundary(boundary),
- _lastPart(false)
-{
- poco_assert (!boundary.empty() && boundary.length() < STREAM_BUFFER_SIZE - 6);
-}
-
-
-MultipartStreamBuf::~MultipartStreamBuf()
-{
-}
-
-
-int MultipartStreamBuf::readFromDevice(char* buffer, std::streamsize length)
-{
- poco_assert_dbg (length >= _boundary.length() + 6);
-
- static const int eof = std::char_traits<char>::eof();
- std::streambuf& buf = *_istr.rdbuf();
-
- int n = 0;
- int ch = buf.sbumpc();
- if (ch == eof) return -1;
- *buffer++ = (char) ch; ++n;
- if (ch == '\n' || (ch == '\r' && buf.sgetc() == '\n'))
- {
- if (ch == '\r')
- {
- ch = buf.sbumpc(); // '\n'
- *buffer++ = (char) ch; ++n;
- }
- ch = buf.sgetc();
- if (ch == '\r' || ch == '\n') return n;
- *buffer++ = (char) buf.sbumpc(); ++n;
- if (ch == '-' && buf.sgetc() == '-')
- {
- ch = buf.sbumpc(); // '-'
- *buffer++ = (char) ch; ++n;
- std::string::const_iterator it = _boundary.begin();
- std::string::const_iterator end = _boundary.end();
- ch = buf.sbumpc();
- *buffer++ = (char) ch; ++n;
- while (it != end && ch == *it)
- {
- ++it;
- ch = buf.sbumpc();
- *buffer++ = (char) ch; ++n;
- }
- if (it == end)
- {
- if (ch == '\n' || (ch == '\r' && buf.sgetc() == '\n'))
- {
- if (ch == '\r')
- {
- buf.sbumpc(); // '\n'
- }
- return 0;
- }
- else if (ch == '-' && buf.sgetc() == '-')
- {
- buf.sbumpc(); // '-'
- _lastPart = true;
- return 0;
- }
- }
- }
- }
- ch = buf.sgetc();
- while (ch != eof && ch != '\r' && ch != '\n' && n < length)
- {
- *buffer++ = (char) buf.sbumpc(); ++n;
- ch = buf.sgetc();
- }
- return n;
-}
-
-
-bool MultipartStreamBuf::lastPart() const
-{
- return _lastPart;
-}
-
-
-//
-// MultipartIOS
-//
-
-
-MultipartIOS::MultipartIOS(std::istream& istr, const std::string& boundary):
- _buf(istr, boundary)
-{
- poco_ios_init(&_buf);
-}
-
-
-MultipartIOS::~MultipartIOS()
-{
- try
- {
- _buf.sync();
- }
- catch (...)
- {
- }
-}
-
-
-MultipartStreamBuf* MultipartIOS::rdbuf()
-{
- return &_buf;
-}
-
-
-bool MultipartIOS::lastPart() const
-{
- return _buf.lastPart();
-}
-
-
-//
-// MultipartInputStream
-//
-
-
-MultipartInputStream::MultipartInputStream(std::istream& istr, const std::string& boundary):
- MultipartIOS(istr, boundary),
- std::istream(&_buf)
-{
-}
-
-
-MultipartInputStream::~MultipartInputStream()
-{
-}
-
-
-//
-// MultipartReader
-//
-
-
-MultipartReader::MultipartReader(std::istream& istr):
- _istr(istr),
- _pMPI(0)
-{
-}
-
-
-MultipartReader::MultipartReader(std::istream& istr, const std::string& boundary):
- _istr(istr),
- _boundary(boundary),
- _pMPI(0)
-{
-}
-
-
-MultipartReader::~MultipartReader()
-{
- delete _pMPI;
-}
-
-
-void MultipartReader::nextPart(MessageHeader& messageHeader)
-{
- if (!_pMPI)
- {
- if (_boundary.empty())
- guessBoundary();
- else
- findFirstBoundary();
- }
- else if (_pMPI->lastPart())
- {
- throw MultipartException("No more parts available");
- }
- parseHeader(messageHeader);
- delete _pMPI;
- _pMPI = new MultipartInputStream(_istr, _boundary);
-}
-
-
-bool MultipartReader::hasNextPart()
-{
- return (!_pMPI || !_pMPI->lastPart()) && _istr.good();
-}
-
-
-std::istream& MultipartReader::stream() const
-{
- poco_check_ptr (_pMPI);
-
- return *_pMPI;
-}
-
-
-const std::string& MultipartReader::boundary() const
-{
- return _boundary;
-}
-
-
-void MultipartReader::findFirstBoundary()
-{
- std::string expect("--");
- expect.append(_boundary);
- std::string line;
- line.reserve(expect.length());
- bool ok = true;
- do
- {
- ok = readLine(line, expect.length());
- }
- while (ok && line != expect);
-
- if (!ok) throw MultipartException("No boundary line found");
-}
-
-
-void MultipartReader::guessBoundary()
-{
- static const int eof = std::char_traits<char>::eof();
- int ch = _istr.get();
- while (Poco::Ascii::isSpace(ch))
- ch = _istr.get();
- if (ch == '-' && _istr.peek() == '-')
- {
- _istr.get();
- ch = _istr.peek();
- while (ch != eof && ch != '\r' && ch != '\n' && _boundary.size() < 128) // Note: should be no longer than 70 chars acc. to RFC 2046
- {
- _boundary += (char) _istr.get();
- ch = _istr.peek();
- }
- if (ch != '\r' && ch != '\n')
- throw MultipartException("Invalid boundary line found");
- if (ch == '\r' || ch == '\n')
- _istr.get();
- if (_istr.peek() == '\n')
- _istr.get();
- }
- else throw MultipartException("No boundary line found");
-}
-
-
-void MultipartReader::parseHeader(MessageHeader& messageHeader)
-{
- messageHeader.clear();
- messageHeader.read(_istr);
- int ch = _istr.get();
- if (ch == '\r' && _istr.peek() == '\n') _istr.get();
-}
-
-
-bool MultipartReader::readLine(std::string& line, std::string::size_type n)
-{
- static const int eof = std::char_traits<char>::eof();
- static const int maxLength = 1024;
-
- line.clear();
- int ch = _istr.peek();
- int length = 0;
- while (ch != eof && ch != '\r' && ch != '\n' && length < maxLength)
- {
- ch = (char) _istr.get();
- if (line.length() < n)
- line += static_cast<char>(ch);
- ch = _istr.peek();
- length++;
- }
- if (ch != eof) _istr.get();
- if (ch == '\r' && _istr.peek() == '\n') _istr.get();
- return ch != eof && length < maxLength;
-}
-
-
-} } // namespace Poco::Net
+//
+// MultipartReader.cpp
+//
+// Library: Net
+// Package: Messages
+// Module: MultipartReader
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/MultipartReader.h"
+#include "Poco/Net/MessageHeader.h"
+#include "Poco/Net/NetException.h"
+#include "Poco/Ascii.h"
+
+
+using Poco::BufferedStreamBuf;
+
+
+namespace Poco {
+namespace Net {
+
+
+//
+// MultipartStreamBuf
+//
+
+
+MultipartStreamBuf::MultipartStreamBuf(std::istream& istr, const std::string& boundary):
+ BufferedStreamBuf(STREAM_BUFFER_SIZE, std::ios::in),
+ _istr(istr),
+ _boundary(boundary),
+ _lastPart(false)
+{
+ poco_assert (!boundary.empty() && boundary.length() < STREAM_BUFFER_SIZE - 6);
+}
+
+
+MultipartStreamBuf::~MultipartStreamBuf()
+{
+}
+
+
+int MultipartStreamBuf::readFromDevice(char* buffer, std::streamsize length)
+{
+ poco_assert_dbg (length >= _boundary.length() + 6);
+
+ static const int eof = std::char_traits<char>::eof();
+ std::streambuf& buf = *_istr.rdbuf();
+
+ int n = 0;
+ int ch = buf.sbumpc();
+ if (ch == eof) return -1;
+ *buffer++ = (char) ch; ++n;
+ if (ch == '\n' || (ch == '\r' && buf.sgetc() == '\n'))
+ {
+ if (ch == '\r')
+ {
+ ch = buf.sbumpc(); // '\n'
+ *buffer++ = (char) ch; ++n;
+ }
+ ch = buf.sgetc();
+ if (ch == '\r' || ch == '\n') return n;
+ *buffer++ = (char) buf.sbumpc(); ++n;
+ if (ch == '-' && buf.sgetc() == '-')
+ {
+ ch = buf.sbumpc(); // '-'
+ *buffer++ = (char) ch; ++n;
+ std::string::const_iterator it = _boundary.begin();
+ std::string::const_iterator end = _boundary.end();
+ ch = buf.sbumpc();
+ *buffer++ = (char) ch; ++n;
+ while (it != end && ch == *it)
+ {
+ ++it;
+ ch = buf.sbumpc();
+ *buffer++ = (char) ch; ++n;
+ }
+ if (it == end)
+ {
+ if (ch == '\n' || (ch == '\r' && buf.sgetc() == '\n'))
+ {
+ if (ch == '\r')
+ {
+ buf.sbumpc(); // '\n'
+ }
+ return 0;
+ }
+ else if (ch == '-' && buf.sgetc() == '-')
+ {
+ buf.sbumpc(); // '-'
+ _lastPart = true;
+ return 0;
+ }
+ }
+ }
+ }
+ ch = buf.sgetc();
+ while (ch != eof && ch != '\r' && ch != '\n' && n < length)
+ {
+ *buffer++ = (char) buf.sbumpc(); ++n;
+ ch = buf.sgetc();
+ }
+ return n;
+}
+
+
+bool MultipartStreamBuf::lastPart() const
+{
+ return _lastPart;
+}
+
+
+//
+// MultipartIOS
+//
+
+
+MultipartIOS::MultipartIOS(std::istream& istr, const std::string& boundary):
+ _buf(istr, boundary)
+{
+ poco_ios_init(&_buf);
+}
+
+
+MultipartIOS::~MultipartIOS()
+{
+ try
+ {
+ _buf.sync();
+ }
+ catch (...)
+ {
+ }
+}
+
+
+MultipartStreamBuf* MultipartIOS::rdbuf()
+{
+ return &_buf;
+}
+
+
+bool MultipartIOS::lastPart() const
+{
+ return _buf.lastPart();
+}
+
+
+//
+// MultipartInputStream
+//
+
+
+MultipartInputStream::MultipartInputStream(std::istream& istr, const std::string& boundary):
+ MultipartIOS(istr, boundary),
+ std::istream(&_buf)
+{
+}
+
+
+MultipartInputStream::~MultipartInputStream()
+{
+}
+
+
+//
+// MultipartReader
+//
+
+
+MultipartReader::MultipartReader(std::istream& istr):
+ _istr(istr),
+ _pMPI(0)
+{
+}
+
+
+MultipartReader::MultipartReader(std::istream& istr, const std::string& boundary):
+ _istr(istr),
+ _boundary(boundary),
+ _pMPI(0)
+{
+}
+
+
+MultipartReader::~MultipartReader()
+{
+ delete _pMPI;
+}
+
+
+void MultipartReader::nextPart(MessageHeader& messageHeader)
+{
+ if (!_pMPI)
+ {
+ if (_boundary.empty())
+ guessBoundary();
+ else
+ findFirstBoundary();
+ }
+ else if (_pMPI->lastPart())
+ {
+ throw MultipartException("No more parts available");
+ }
+ parseHeader(messageHeader);
+ delete _pMPI;
+ _pMPI = new MultipartInputStream(_istr, _boundary);
+}
+
+
+bool MultipartReader::hasNextPart()
+{
+ return (!_pMPI || !_pMPI->lastPart()) && _istr.good();
+}
+
+
+std::istream& MultipartReader::stream() const
+{
+ poco_check_ptr (_pMPI);
+
+ return *_pMPI;
+}
+
+
+const std::string& MultipartReader::boundary() const
+{
+ return _boundary;
+}
+
+
+void MultipartReader::findFirstBoundary()
+{
+ std::string expect("--");
+ expect.append(_boundary);
+ std::string line;
+ line.reserve(expect.length());
+ bool ok = true;
+ do
+ {
+ ok = readLine(line, expect.length());
+ }
+ while (ok && line != expect);
+
+ if (!ok) throw MultipartException("No boundary line found");
+}
+
+
+void MultipartReader::guessBoundary()
+{
+ static const int eof = std::char_traits<char>::eof();
+ int ch = _istr.get();
+ while (Poco::Ascii::isSpace(ch))
+ ch = _istr.get();
+ if (ch == '-' && _istr.peek() == '-')
+ {
+ _istr.get();
+ ch = _istr.peek();
+ while (ch != eof && ch != '\r' && ch != '\n' && _boundary.size() < 128) // Note: should be no longer than 70 chars acc. to RFC 2046
+ {
+ _boundary += (char) _istr.get();
+ ch = _istr.peek();
+ }
+ if (ch != '\r' && ch != '\n')
+ throw MultipartException("Invalid boundary line found");
+ if (ch == '\r' || ch == '\n')
+ _istr.get();
+ if (_istr.peek() == '\n')
+ _istr.get();
+ }
+ else throw MultipartException("No boundary line found");
+}
+
+
+void MultipartReader::parseHeader(MessageHeader& messageHeader)
+{
+ messageHeader.clear();
+ messageHeader.read(_istr);
+ int ch = _istr.get();
+ if (ch == '\r' && _istr.peek() == '\n') _istr.get();
+}
+
+
+bool MultipartReader::readLine(std::string& line, std::string::size_type n)
+{
+ static const int eof = std::char_traits<char>::eof();
+ static const int maxLength = 1024;
+
+ line.clear();
+ int ch = _istr.peek();
+ int length = 0;
+ while (ch != eof && ch != '\r' && ch != '\n' && length < maxLength)
+ {
+ ch = (char) _istr.get();
+ if (line.length() < n)
+ line += static_cast<char>(ch);
+ ch = _istr.peek();
+ length++;
+ }
+ if (ch != eof) _istr.get();
+ if (ch == '\r' && _istr.peek() == '\n') _istr.get();
+ return ch != eof && length < maxLength;
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/MultipartWriter.cpp b/contrib/libs/poco/Net/src/MultipartWriter.cpp
index a73e6d3d3d..831fae1071 100644
--- a/contrib/libs/poco/Net/src/MultipartWriter.cpp
+++ b/contrib/libs/poco/Net/src/MultipartWriter.cpp
@@ -1,87 +1,87 @@
-//
-// MultipartWriter.cpp
-//
-// Library: Net
-// Package: Messages
-// Module: MultipartWriter
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/MultipartWriter.h"
-#include "Poco/Net/MessageHeader.h"
-#include "Poco/Random.h"
-#include "Poco/NumberFormatter.h"
-
-
-using Poco::Random;
-using Poco::NumberFormatter;
-
-
-namespace Poco {
-namespace Net {
-
-
-MultipartWriter::MultipartWriter(std::ostream& ostr):
- _ostr(ostr),
- _boundary(createBoundary()),
- _firstPart(true)
-{
-}
-
-
-MultipartWriter::MultipartWriter(std::ostream& ostr, const std::string& boundary):
- _ostr(ostr),
- _boundary(boundary),
- _firstPart(true)
-{
- if (_boundary.empty())
- _boundary = createBoundary();
-}
-
-
-MultipartWriter::~MultipartWriter()
-{
-}
-
-
-void MultipartWriter::nextPart(const MessageHeader& header)
-{
- if (_firstPart)
- _firstPart = false;
- else
- _ostr << "\r\n";
- _ostr << "--" << _boundary << "\r\n";
- header.write(_ostr);
- _ostr << "\r\n";
-}
-
-
-void MultipartWriter::close()
-{
- _ostr << "\r\n--" << _boundary << "--\r\n";
-}
-
-
-const std::string& MultipartWriter::boundary() const
-{
- return _boundary;
-}
-
-
-std::string MultipartWriter::createBoundary()
-{
- std::string boundary("MIME_boundary_");
- Random rnd;
- rnd.seed();
- NumberFormatter::appendHex(boundary, rnd.next(), 8);
- NumberFormatter::appendHex(boundary, rnd.next(), 8);
- return boundary;
-}
-
-
-} } // namespace Poco::Net
+//
+// MultipartWriter.cpp
+//
+// Library: Net
+// Package: Messages
+// Module: MultipartWriter
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/MultipartWriter.h"
+#include "Poco/Net/MessageHeader.h"
+#include "Poco/Random.h"
+#include "Poco/NumberFormatter.h"
+
+
+using Poco::Random;
+using Poco::NumberFormatter;
+
+
+namespace Poco {
+namespace Net {
+
+
+MultipartWriter::MultipartWriter(std::ostream& ostr):
+ _ostr(ostr),
+ _boundary(createBoundary()),
+ _firstPart(true)
+{
+}
+
+
+MultipartWriter::MultipartWriter(std::ostream& ostr, const std::string& boundary):
+ _ostr(ostr),
+ _boundary(boundary),
+ _firstPart(true)
+{
+ if (_boundary.empty())
+ _boundary = createBoundary();
+}
+
+
+MultipartWriter::~MultipartWriter()
+{
+}
+
+
+void MultipartWriter::nextPart(const MessageHeader& header)
+{
+ if (_firstPart)
+ _firstPart = false;
+ else
+ _ostr << "\r\n";
+ _ostr << "--" << _boundary << "\r\n";
+ header.write(_ostr);
+ _ostr << "\r\n";
+}
+
+
+void MultipartWriter::close()
+{
+ _ostr << "\r\n--" << _boundary << "--\r\n";
+}
+
+
+const std::string& MultipartWriter::boundary() const
+{
+ return _boundary;
+}
+
+
+std::string MultipartWriter::createBoundary()
+{
+ std::string boundary("MIME_boundary_");
+ Random rnd;
+ rnd.seed();
+ NumberFormatter::appendHex(boundary, rnd.next(), 8);
+ NumberFormatter::appendHex(boundary, rnd.next(), 8);
+ return boundary;
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/NTPClient.cpp b/contrib/libs/poco/Net/src/NTPClient.cpp
index 47be7e8fbc..b370388767 100644
--- a/contrib/libs/poco/Net/src/NTPClient.cpp
+++ b/contrib/libs/poco/Net/src/NTPClient.cpp
@@ -1,87 +1,87 @@
-//
-// NTPClient.cpp
-//
-// Library: Net
-// Package: NTP
-// Module: NTPClient
-//
-// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/SocketAddress.h"
-#include "Poco/Net/NTPClient.h"
-#include "Poco/Net/NTPPacket.h"
-#include "Poco/Net/DatagramSocket.h"
-#include "Poco/Net/NetException.h"
-
-
-using Poco::TimeoutException;
-
-
-namespace Poco {
-namespace Net {
-
-
-NTPClient::NTPClient(IPAddress::Family family, int timeout):
- _family(family), _timeout(timeout)
-{
-}
-
-
-NTPClient::~NTPClient()
-{
-}
-
-
-int NTPClient::request(const std::string& address) const
-{
- SocketAddress addr(address, 123);
- return request(addr);
-}
-
-
-int NTPClient::request(SocketAddress& address) const
-{
- Poco::Net::SocketAddress sa;
- DatagramSocket ntpSocket(_family);
- ntpSocket.setReceiveTimeout(_timeout);
- ntpSocket.bind(sa);
-
- SocketAddress returnAddress;
-
- NTPEventArgs eventArgs(address);
-
- NTPPacket packet;
- Poco::UInt8 p[1024];
- packet.packet(&p[0]);
-
- ntpSocket.sendTo(p, 48, address);
-
- int received = 0;
- try
- {
- Poco::Net::SocketAddress sender;
- int n = ntpSocket.receiveFrom(p, sizeof(p)-1, sender);
-
- if (n < 48) // NTP packet must have at least 48 bytes
- throw Poco::Net::NTPException("Invalid response received");
-
- packet.setPacket(p);
- eventArgs.setPacket(packet);
- ++received;
- response.notify(this, eventArgs);
- }
- catch (Poco::TimeoutException &)
- {
- // ignore
- }
-
- return received;
-}
-
-
-} } // namespace Poco::Net
+//
+// NTPClient.cpp
+//
+// Library: Net
+// Package: NTP
+// Module: NTPClient
+//
+// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/SocketAddress.h"
+#include "Poco/Net/NTPClient.h"
+#include "Poco/Net/NTPPacket.h"
+#include "Poco/Net/DatagramSocket.h"
+#include "Poco/Net/NetException.h"
+
+
+using Poco::TimeoutException;
+
+
+namespace Poco {
+namespace Net {
+
+
+NTPClient::NTPClient(IPAddress::Family family, int timeout):
+ _family(family), _timeout(timeout)
+{
+}
+
+
+NTPClient::~NTPClient()
+{
+}
+
+
+int NTPClient::request(const std::string& address) const
+{
+ SocketAddress addr(address, 123);
+ return request(addr);
+}
+
+
+int NTPClient::request(SocketAddress& address) const
+{
+ Poco::Net::SocketAddress sa;
+ DatagramSocket ntpSocket(_family);
+ ntpSocket.setReceiveTimeout(_timeout);
+ ntpSocket.bind(sa);
+
+ SocketAddress returnAddress;
+
+ NTPEventArgs eventArgs(address);
+
+ NTPPacket packet;
+ Poco::UInt8 p[1024];
+ packet.packet(&p[0]);
+
+ ntpSocket.sendTo(p, 48, address);
+
+ int received = 0;
+ try
+ {
+ Poco::Net::SocketAddress sender;
+ int n = ntpSocket.receiveFrom(p, sizeof(p)-1, sender);
+
+ if (n < 48) // NTP packet must have at least 48 bytes
+ throw Poco::Net::NTPException("Invalid response received");
+
+ packet.setPacket(p);
+ eventArgs.setPacket(packet);
+ ++received;
+ response.notify(this, eventArgs);
+ }
+ catch (Poco::TimeoutException &)
+ {
+ // ignore
+ }
+
+ return received;
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/NTPEventArgs.cpp b/contrib/libs/poco/Net/src/NTPEventArgs.cpp
index fd86cc0233..21c57b8779 100644
--- a/contrib/libs/poco/Net/src/NTPEventArgs.cpp
+++ b/contrib/libs/poco/Net/src/NTPEventArgs.cpp
@@ -1,71 +1,71 @@
-//
-// NTPEventArgs.cpp
-//
-// Library: Net
-// Package: NTP
-// Module: NTPEventArgs
-//
-// Implementation of NTPEventArgs
-//
-// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/NTPEventArgs.h"
-#include "Poco/Net/SocketAddress.h"
-#include "Poco/Net/DNS.h"
-#include "Poco/Exception.h"
-#include "Poco/Net/NetException.h"
-
-
-using Poco::IOException;
-using Poco::InvalidArgumentException;
-
-
-namespace Poco {
-namespace Net {
-
-
-NTPEventArgs::NTPEventArgs(const SocketAddress& address):
- _address(address), _packet()
-{
-}
-
-
-NTPEventArgs::~NTPEventArgs()
-{
-}
-
-
-std::string NTPEventArgs::hostName() const
-{
- try
- {
- return DNS::resolve(_address.host().toString()).name();
- }
- catch (HostNotFoundException&)
- {
- }
- catch (NoAddressFoundException&)
- {
- }
- catch (DNSException&)
- {
- }
- catch (IOException&)
- {
- }
- return _address.host().toString();
-}
-
-
-std::string NTPEventArgs::hostAddress() const
-{
- return _address.host().toString();
-}
-
-
-} } // namespace Poco::Net
+//
+// NTPEventArgs.cpp
+//
+// Library: Net
+// Package: NTP
+// Module: NTPEventArgs
+//
+// Implementation of NTPEventArgs
+//
+// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/NTPEventArgs.h"
+#include "Poco/Net/SocketAddress.h"
+#include "Poco/Net/DNS.h"
+#include "Poco/Exception.h"
+#include "Poco/Net/NetException.h"
+
+
+using Poco::IOException;
+using Poco::InvalidArgumentException;
+
+
+namespace Poco {
+namespace Net {
+
+
+NTPEventArgs::NTPEventArgs(const SocketAddress& address):
+ _address(address), _packet()
+{
+}
+
+
+NTPEventArgs::~NTPEventArgs()
+{
+}
+
+
+std::string NTPEventArgs::hostName() const
+{
+ try
+ {
+ return DNS::resolve(_address.host().toString()).name();
+ }
+ catch (HostNotFoundException&)
+ {
+ }
+ catch (NoAddressFoundException&)
+ {
+ }
+ catch (DNSException&)
+ {
+ }
+ catch (IOException&)
+ {
+ }
+ return _address.host().toString();
+}
+
+
+std::string NTPEventArgs::hostAddress() const
+{
+ return _address.host().toString();
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/NTPPacket.cpp b/contrib/libs/poco/Net/src/NTPPacket.cpp
index f6da1856b4..2f7aec830c 100644
--- a/contrib/libs/poco/Net/src/NTPPacket.cpp
+++ b/contrib/libs/poco/Net/src/NTPPacket.cpp
@@ -1,158 +1,158 @@
-//
-// NTPPacket.cpp
-//
-// Library: Net
-// Package: NTP
-// Module: NTPPacket
-//
-// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/NTPPacket.h"
-#include "Poco/Net/NetException.h"
-#include "Poco/Timestamp.h"
-#include "Poco/ByteOrder.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-#if !defined(POCO_COMPILER_SUN)
-#pragma pack(push, 1)
-#else
-#pragma pack(1)
-#endif
-struct NTPPacketData
-{
- Poco::Int8 mode:3;
- Poco::Int8 vn:3;
- Poco::Int8 li:2;
- Poco::Int8 stratum;
- Poco::Int8 pool;
- Poco::Int8 prec;
- Poco::Int32 rootdelay;
- Poco::Int32 rootdisp;
- Poco::Int32 refid;
- Poco::Int64 rts;
- Poco::Int64 ots;
- Poco::Int64 vts;
- Poco::Int64 tts;
-};
-#if !defined(POCO_COMPILER_SUN)
-#pragma pack(pop)
-#else
-#pragma pack()
-#endif
-
-
-NTPPacket::NTPPacket() :
- // the next 3 fields must be in reverse order from spec
- _leapIndicator(3),
- _version(4),
- _mode(3),
-
- _stratum(0),
- _pool(6),
- _precision(-18),
- _rootDelay(0),
- _rootDispersion(0),
- _referenceId(0),
- _referenceTimestamp(0),
- _receiveTimestamp(0),
- _transmitTimestamp(0)
-{
- Poco::Timestamp ts;
- _originateTimestamp = ts.utcTime() - 2874597888;
-}
-
-
-NTPPacket::NTPPacket(Poco::UInt8 *packet)
-{
- setPacket(packet);
-}
-
-
-NTPPacket::~NTPPacket()
-{
-}
-
-
-void NTPPacket::packet(Poco::UInt8 *packet) const
-{
- NTPPacketData *p = (NTPPacketData*)packet;
-
- p->li = _leapIndicator;
- p->vn = _version;
- p->mode = _mode;
- p->stratum = _stratum;
- p->pool = _pool;
- p->prec = _precision;
- p->rootdelay = Poco::ByteOrder::toNetwork(_rootDelay);
- p->rootdisp = Poco::ByteOrder::toNetwork(_rootDispersion);
- p->refid = Poco::ByteOrder::toNetwork(_referenceId);
- p->rts = Poco::ByteOrder::toNetwork(_referenceTimestamp);
- p->ots = Poco::ByteOrder::toNetwork(_originateTimestamp);
- p->vts = Poco::ByteOrder::toNetwork(_receiveTimestamp);
- p->tts = Poco::ByteOrder::toNetwork(_transmitTimestamp);
-}
-
-
-void NTPPacket::setPacket(Poco::UInt8 *packet)
-{
- NTPPacketData *p = (NTPPacketData*)packet;
-
- _leapIndicator = p->li;
- _version = p->vn;
- _mode = p->mode;
- _stratum = p->stratum;
- _pool = p->pool;
- _precision = p->prec;
- _rootDelay = Poco::ByteOrder::fromNetwork(p->rootdelay);
- _rootDispersion = Poco::ByteOrder::fromNetwork(p->rootdisp);
- _referenceId = Poco::ByteOrder::fromNetwork(p->refid);
- _referenceTimestamp = Poco::ByteOrder::fromNetwork(p->rts);
- _originateTimestamp = Poco::ByteOrder::fromNetwork(p->ots);
- _receiveTimestamp = Poco::ByteOrder::fromNetwork(p->vts);
- _transmitTimestamp = Poco::ByteOrder::fromNetwork(p->tts);
-}
-
-
-Poco::Timestamp NTPPacket::referenceTime() const
-{
- return convertTime(_referenceTimestamp);
-}
-
-
-Poco::Timestamp NTPPacket::originateTime() const
-{
- return convertTime(_originateTimestamp);
-}
-
-
-Poco::Timestamp NTPPacket::receiveTime() const
-{
- return convertTime(_receiveTimestamp);
-}
-
-
-Poco::Timestamp NTPPacket::transmitTime() const
-{
- return convertTime(_transmitTimestamp);
-}
-
-
-Poco::Timestamp NTPPacket::convertTime(Poco::Int64 tm) const
-{
- const unsigned long seventyYears = 2208988800UL;
- Poco::UInt32 secsSince1900 = UInt32(Poco::ByteOrder::toLittleEndian(tm) >> 32);
- unsigned long epoch = secsSince1900 - seventyYears;
- return Poco::Timestamp::fromEpochTime(epoch);
-}
-
-
-} } // namespace Poco::Net
+//
+// NTPPacket.cpp
+//
+// Library: Net
+// Package: NTP
+// Module: NTPPacket
+//
+// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/NTPPacket.h"
+#include "Poco/Net/NetException.h"
+#include "Poco/Timestamp.h"
+#include "Poco/ByteOrder.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+#if !defined(POCO_COMPILER_SUN)
+#pragma pack(push, 1)
+#else
+#pragma pack(1)
+#endif
+struct NTPPacketData
+{
+ Poco::Int8 mode:3;
+ Poco::Int8 vn:3;
+ Poco::Int8 li:2;
+ Poco::Int8 stratum;
+ Poco::Int8 pool;
+ Poco::Int8 prec;
+ Poco::Int32 rootdelay;
+ Poco::Int32 rootdisp;
+ Poco::Int32 refid;
+ Poco::Int64 rts;
+ Poco::Int64 ots;
+ Poco::Int64 vts;
+ Poco::Int64 tts;
+};
+#if !defined(POCO_COMPILER_SUN)
+#pragma pack(pop)
+#else
+#pragma pack()
+#endif
+
+
+NTPPacket::NTPPacket() :
+ // the next 3 fields must be in reverse order from spec
+ _leapIndicator(3),
+ _version(4),
+ _mode(3),
+
+ _stratum(0),
+ _pool(6),
+ _precision(-18),
+ _rootDelay(0),
+ _rootDispersion(0),
+ _referenceId(0),
+ _referenceTimestamp(0),
+ _receiveTimestamp(0),
+ _transmitTimestamp(0)
+{
+ Poco::Timestamp ts;
+ _originateTimestamp = ts.utcTime() - 2874597888;
+}
+
+
+NTPPacket::NTPPacket(Poco::UInt8 *packet)
+{
+ setPacket(packet);
+}
+
+
+NTPPacket::~NTPPacket()
+{
+}
+
+
+void NTPPacket::packet(Poco::UInt8 *packet) const
+{
+ NTPPacketData *p = (NTPPacketData*)packet;
+
+ p->li = _leapIndicator;
+ p->vn = _version;
+ p->mode = _mode;
+ p->stratum = _stratum;
+ p->pool = _pool;
+ p->prec = _precision;
+ p->rootdelay = Poco::ByteOrder::toNetwork(_rootDelay);
+ p->rootdisp = Poco::ByteOrder::toNetwork(_rootDispersion);
+ p->refid = Poco::ByteOrder::toNetwork(_referenceId);
+ p->rts = Poco::ByteOrder::toNetwork(_referenceTimestamp);
+ p->ots = Poco::ByteOrder::toNetwork(_originateTimestamp);
+ p->vts = Poco::ByteOrder::toNetwork(_receiveTimestamp);
+ p->tts = Poco::ByteOrder::toNetwork(_transmitTimestamp);
+}
+
+
+void NTPPacket::setPacket(Poco::UInt8 *packet)
+{
+ NTPPacketData *p = (NTPPacketData*)packet;
+
+ _leapIndicator = p->li;
+ _version = p->vn;
+ _mode = p->mode;
+ _stratum = p->stratum;
+ _pool = p->pool;
+ _precision = p->prec;
+ _rootDelay = Poco::ByteOrder::fromNetwork(p->rootdelay);
+ _rootDispersion = Poco::ByteOrder::fromNetwork(p->rootdisp);
+ _referenceId = Poco::ByteOrder::fromNetwork(p->refid);
+ _referenceTimestamp = Poco::ByteOrder::fromNetwork(p->rts);
+ _originateTimestamp = Poco::ByteOrder::fromNetwork(p->ots);
+ _receiveTimestamp = Poco::ByteOrder::fromNetwork(p->vts);
+ _transmitTimestamp = Poco::ByteOrder::fromNetwork(p->tts);
+}
+
+
+Poco::Timestamp NTPPacket::referenceTime() const
+{
+ return convertTime(_referenceTimestamp);
+}
+
+
+Poco::Timestamp NTPPacket::originateTime() const
+{
+ return convertTime(_originateTimestamp);
+}
+
+
+Poco::Timestamp NTPPacket::receiveTime() const
+{
+ return convertTime(_receiveTimestamp);
+}
+
+
+Poco::Timestamp NTPPacket::transmitTime() const
+{
+ return convertTime(_transmitTimestamp);
+}
+
+
+Poco::Timestamp NTPPacket::convertTime(Poco::Int64 tm) const
+{
+ const unsigned long seventyYears = 2208988800UL;
+ Poco::UInt32 secsSince1900 = UInt32(Poco::ByteOrder::toLittleEndian(tm) >> 32);
+ unsigned long epoch = secsSince1900 - seventyYears;
+ return Poco::Timestamp::fromEpochTime(epoch);
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/NameValueCollection.cpp b/contrib/libs/poco/Net/src/NameValueCollection.cpp
index 11c882ac77..def4814a16 100644
--- a/contrib/libs/poco/Net/src/NameValueCollection.cpp
+++ b/contrib/libs/poco/Net/src/NameValueCollection.cpp
@@ -1,153 +1,153 @@
-//
-// NameValueCollection.cpp
-//
-// Library: Net
-// Package: Messages
-// Module: NameValueCollection
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/NameValueCollection.h"
-#include "Poco/Exception.h"
-#include <algorithm>
-
-
-using Poco::NotFoundException;
-
-
-namespace Poco {
-namespace Net {
-
-
-NameValueCollection::NameValueCollection()
-{
-}
-
-
-NameValueCollection::NameValueCollection(const NameValueCollection& nvc):
- _map(nvc._map)
-{
-}
-
-
-NameValueCollection::~NameValueCollection()
-{
-}
-
-
-NameValueCollection& NameValueCollection::operator = (const NameValueCollection& nvc)
-{
- if (&nvc != this)
- {
- _map = nvc._map;
- }
- return *this;
-}
-
-
-void NameValueCollection::swap(NameValueCollection& nvc)
-{
- std::swap(_map, nvc._map);
-}
-
-
-const std::string& NameValueCollection::operator [] (const std::string& name) const
-{
- ConstIterator it = _map.find(name);
- if (it != _map.end())
- return it->second;
- else
- throw NotFoundException(name);
-}
-
-
-void NameValueCollection::set(const std::string& name, const std::string& value)
-{
- Iterator it = _map.find(name);
- if (it != _map.end())
- it->second = value;
- else
- _map.insert(HeaderMap::ValueType(name, value));
-}
-
-
-void NameValueCollection::add(const std::string& name, const std::string& value)
-{
- _map.insert(HeaderMap::ValueType(name, value));
-}
-
-
-const std::string& NameValueCollection::get(const std::string& name) const
-{
- ConstIterator it = _map.find(name);
- if (it != _map.end())
- return it->second;
- else
- throw NotFoundException(name);
-}
-
-
-const std::string& NameValueCollection::get(const std::string& name, const std::string& defaultValue) const
-{
- ConstIterator it = _map.find(name);
- if (it != _map.end())
- return it->second;
- else
- return defaultValue;
-}
-
-
-bool NameValueCollection::has(const std::string& name) const
-{
- return _map.find(name) != _map.end();
-}
-
-
-NameValueCollection::ConstIterator NameValueCollection::find(const std::string& name) const
-{
- return _map.find(name);
-}
-
-
-NameValueCollection::ConstIterator NameValueCollection::begin() const
-{
- return _map.begin();
-}
-
-
-NameValueCollection::ConstIterator NameValueCollection::end() const
-{
- return _map.end();
-}
-
-
-bool NameValueCollection::empty() const
-{
- return _map.empty();
-}
-
-
-std::size_t NameValueCollection::size() const
-{
- return _map.size();
-}
-
-
-void NameValueCollection::erase(const std::string& name)
-{
- _map.erase(name);
-}
-
-
-void NameValueCollection::clear()
-{
- _map.clear();
-}
-
-
-} } // namespace Poco::Net
+//
+// NameValueCollection.cpp
+//
+// Library: Net
+// Package: Messages
+// Module: NameValueCollection
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/NameValueCollection.h"
+#include "Poco/Exception.h"
+#include <algorithm>
+
+
+using Poco::NotFoundException;
+
+
+namespace Poco {
+namespace Net {
+
+
+NameValueCollection::NameValueCollection()
+{
+}
+
+
+NameValueCollection::NameValueCollection(const NameValueCollection& nvc):
+ _map(nvc._map)
+{
+}
+
+
+NameValueCollection::~NameValueCollection()
+{
+}
+
+
+NameValueCollection& NameValueCollection::operator = (const NameValueCollection& nvc)
+{
+ if (&nvc != this)
+ {
+ _map = nvc._map;
+ }
+ return *this;
+}
+
+
+void NameValueCollection::swap(NameValueCollection& nvc)
+{
+ std::swap(_map, nvc._map);
+}
+
+
+const std::string& NameValueCollection::operator [] (const std::string& name) const
+{
+ ConstIterator it = _map.find(name);
+ if (it != _map.end())
+ return it->second;
+ else
+ throw NotFoundException(name);
+}
+
+
+void NameValueCollection::set(const std::string& name, const std::string& value)
+{
+ Iterator it = _map.find(name);
+ if (it != _map.end())
+ it->second = value;
+ else
+ _map.insert(HeaderMap::ValueType(name, value));
+}
+
+
+void NameValueCollection::add(const std::string& name, const std::string& value)
+{
+ _map.insert(HeaderMap::ValueType(name, value));
+}
+
+
+const std::string& NameValueCollection::get(const std::string& name) const
+{
+ ConstIterator it = _map.find(name);
+ if (it != _map.end())
+ return it->second;
+ else
+ throw NotFoundException(name);
+}
+
+
+const std::string& NameValueCollection::get(const std::string& name, const std::string& defaultValue) const
+{
+ ConstIterator it = _map.find(name);
+ if (it != _map.end())
+ return it->second;
+ else
+ return defaultValue;
+}
+
+
+bool NameValueCollection::has(const std::string& name) const
+{
+ return _map.find(name) != _map.end();
+}
+
+
+NameValueCollection::ConstIterator NameValueCollection::find(const std::string& name) const
+{
+ return _map.find(name);
+}
+
+
+NameValueCollection::ConstIterator NameValueCollection::begin() const
+{
+ return _map.begin();
+}
+
+
+NameValueCollection::ConstIterator NameValueCollection::end() const
+{
+ return _map.end();
+}
+
+
+bool NameValueCollection::empty() const
+{
+ return _map.empty();
+}
+
+
+std::size_t NameValueCollection::size() const
+{
+ return _map.size();
+}
+
+
+void NameValueCollection::erase(const std::string& name)
+{
+ _map.erase(name);
+}
+
+
+void NameValueCollection::clear()
+{
+ _map.clear();
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/Net.cpp b/contrib/libs/poco/Net/src/Net.cpp
index 5365f19b10..e81b4b5459 100644
--- a/contrib/libs/poco/Net/src/Net.cpp
+++ b/contrib/libs/poco/Net/src/Net.cpp
@@ -1,76 +1,76 @@
-//
-// Net.cpp
-//
-// Library: Net
-// Package: NetCore
-// Module: NetCore
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/Net.h"
-
-
-#include "Poco/Net/SocketDefs.h"
-#include "Poco/Net/NetException.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-void Net_API initializeNetwork()
-{
-#if defined(POCO_OS_FAMILY_WINDOWS)
- WORD version = MAKEWORD(2, 2);
- WSADATA data;
- if (WSAStartup(version, &data) != 0)
- throw NetException("Failed to initialize network subsystem");
-#endif
-}
-
-
-void Net_API uninitializeNetwork()
-{
-#if defined(POCO_OS_FAMILY_WINDOWS)
- WSACleanup();
-#endif
-}
-
-
-} } // namespace Poco::Net
-
-
-#if defined(POCO_OS_FAMILY_WINDOWS) && !defined(POCO_NO_AUTOMATIC_LIB_INIT)
-
- struct NetworkInitializer
- /// Network initializer for windows statically
- /// linked library.
- {
- NetworkInitializer()
- /// Calls Poco::Net::initializeNetwork();
- {
- Poco::Net::initializeNetwork();
- }
-
- ~NetworkInitializer()
- /// Calls Poco::Net::uninitializeNetwork();
- {
- try
- {
- Poco::Net::uninitializeNetwork();
- }
- catch (...)
- {
- poco_unexpected();
- }
- }
- };
-
- const NetworkInitializer pocoNetworkInitializer;
-
-#endif
+//
+// Net.cpp
+//
+// Library: Net
+// Package: NetCore
+// Module: NetCore
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/Net.h"
+
+
+#include "Poco/Net/SocketDefs.h"
+#include "Poco/Net/NetException.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+void Net_API initializeNetwork()
+{
+#if defined(POCO_OS_FAMILY_WINDOWS)
+ WORD version = MAKEWORD(2, 2);
+ WSADATA data;
+ if (WSAStartup(version, &data) != 0)
+ throw NetException("Failed to initialize network subsystem");
+#endif
+}
+
+
+void Net_API uninitializeNetwork()
+{
+#if defined(POCO_OS_FAMILY_WINDOWS)
+ WSACleanup();
+#endif
+}
+
+
+} } // namespace Poco::Net
+
+
+#if defined(POCO_OS_FAMILY_WINDOWS) && !defined(POCO_NO_AUTOMATIC_LIB_INIT)
+
+ struct NetworkInitializer
+ /// Network initializer for windows statically
+ /// linked library.
+ {
+ NetworkInitializer()
+ /// Calls Poco::Net::initializeNetwork();
+ {
+ Poco::Net::initializeNetwork();
+ }
+
+ ~NetworkInitializer()
+ /// Calls Poco::Net::uninitializeNetwork();
+ {
+ try
+ {
+ Poco::Net::uninitializeNetwork();
+ }
+ catch (...)
+ {
+ poco_unexpected();
+ }
+ }
+ };
+
+ const NetworkInitializer pocoNetworkInitializer;
+
+#endif
diff --git a/contrib/libs/poco/Net/src/NetException.cpp b/contrib/libs/poco/Net/src/NetException.cpp
index 88ee7e1e34..a167642b2a 100644
--- a/contrib/libs/poco/Net/src/NetException.cpp
+++ b/contrib/libs/poco/Net/src/NetException.cpp
@@ -1,54 +1,54 @@
-//
-// NetException.cpp
-//
-// Library: Net
-// Package: NetCore
-// Module: NetException
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/NetException.h"
-#include <typeinfo>
-
-
-using Poco::IOException;
-
-
-namespace Poco {
-namespace Net {
-
-
-POCO_IMPLEMENT_EXCEPTION(NetException, IOException, "Net Exception")
-POCO_IMPLEMENT_EXCEPTION(InvalidAddressException, NetException, "Invalid address")
-POCO_IMPLEMENT_EXCEPTION(InvalidSocketException, NetException, "Invalid socket")
-POCO_IMPLEMENT_EXCEPTION(ServiceNotFoundException, NetException, "Service not found")
-POCO_IMPLEMENT_EXCEPTION(ConnectionAbortedException, NetException, "Software caused connection abort")
-POCO_IMPLEMENT_EXCEPTION(ConnectionResetException, NetException, "Connection reset by peer")
-POCO_IMPLEMENT_EXCEPTION(ConnectionRefusedException, NetException, "Connection refused")
-POCO_IMPLEMENT_EXCEPTION(DNSException, NetException, "DNS error")
-POCO_IMPLEMENT_EXCEPTION(HostNotFoundException, DNSException, "Host not found")
-POCO_IMPLEMENT_EXCEPTION(NoAddressFoundException, DNSException, "No address found")
-POCO_IMPLEMENT_EXCEPTION(InterfaceNotFoundException, NetException, "Interface not found")
-POCO_IMPLEMENT_EXCEPTION(NoMessageException, NetException, "No message received")
-POCO_IMPLEMENT_EXCEPTION(MessageException, NetException, "Malformed message")
-POCO_IMPLEMENT_EXCEPTION(MultipartException, MessageException, "Malformed multipart message")
-POCO_IMPLEMENT_EXCEPTION(HTTPException, NetException, "HTTP Exception")
-POCO_IMPLEMENT_EXCEPTION(NotAuthenticatedException, HTTPException, "No authentication information found")
-POCO_IMPLEMENT_EXCEPTION(UnsupportedRedirectException, HTTPException, "Unsupported HTTP redirect (protocol change)")
-POCO_IMPLEMENT_EXCEPTION(FTPException, NetException, "FTP Exception")
-POCO_IMPLEMENT_EXCEPTION(SMTPException, NetException, "SMTP Exception")
-POCO_IMPLEMENT_EXCEPTION(POP3Exception, NetException, "POP3 Exception")
-POCO_IMPLEMENT_EXCEPTION(ICMPException, NetException, "ICMP Exception")
-POCO_IMPLEMENT_EXCEPTION(NTPException, NetException, "NTP Exception")
-POCO_IMPLEMENT_EXCEPTION(HTMLFormException, NetException, "HTML Form Exception")
-POCO_IMPLEMENT_EXCEPTION(WebSocketException, NetException, "WebSocket Exception")
-POCO_IMPLEMENT_EXCEPTION(UnsupportedFamilyException, NetException, "Unknown or unsupported socket family")
-POCO_IMPLEMENT_EXCEPTION(AddressFamilyMismatchException, NetException, "Address family mismatch")
-
-
-} } // namespace Poco::Net
+//
+// NetException.cpp
+//
+// Library: Net
+// Package: NetCore
+// Module: NetException
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/NetException.h"
+#include <typeinfo>
+
+
+using Poco::IOException;
+
+
+namespace Poco {
+namespace Net {
+
+
+POCO_IMPLEMENT_EXCEPTION(NetException, IOException, "Net Exception")
+POCO_IMPLEMENT_EXCEPTION(InvalidAddressException, NetException, "Invalid address")
+POCO_IMPLEMENT_EXCEPTION(InvalidSocketException, NetException, "Invalid socket")
+POCO_IMPLEMENT_EXCEPTION(ServiceNotFoundException, NetException, "Service not found")
+POCO_IMPLEMENT_EXCEPTION(ConnectionAbortedException, NetException, "Software caused connection abort")
+POCO_IMPLEMENT_EXCEPTION(ConnectionResetException, NetException, "Connection reset by peer")
+POCO_IMPLEMENT_EXCEPTION(ConnectionRefusedException, NetException, "Connection refused")
+POCO_IMPLEMENT_EXCEPTION(DNSException, NetException, "DNS error")
+POCO_IMPLEMENT_EXCEPTION(HostNotFoundException, DNSException, "Host not found")
+POCO_IMPLEMENT_EXCEPTION(NoAddressFoundException, DNSException, "No address found")
+POCO_IMPLEMENT_EXCEPTION(InterfaceNotFoundException, NetException, "Interface not found")
+POCO_IMPLEMENT_EXCEPTION(NoMessageException, NetException, "No message received")
+POCO_IMPLEMENT_EXCEPTION(MessageException, NetException, "Malformed message")
+POCO_IMPLEMENT_EXCEPTION(MultipartException, MessageException, "Malformed multipart message")
+POCO_IMPLEMENT_EXCEPTION(HTTPException, NetException, "HTTP Exception")
+POCO_IMPLEMENT_EXCEPTION(NotAuthenticatedException, HTTPException, "No authentication information found")
+POCO_IMPLEMENT_EXCEPTION(UnsupportedRedirectException, HTTPException, "Unsupported HTTP redirect (protocol change)")
+POCO_IMPLEMENT_EXCEPTION(FTPException, NetException, "FTP Exception")
+POCO_IMPLEMENT_EXCEPTION(SMTPException, NetException, "SMTP Exception")
+POCO_IMPLEMENT_EXCEPTION(POP3Exception, NetException, "POP3 Exception")
+POCO_IMPLEMENT_EXCEPTION(ICMPException, NetException, "ICMP Exception")
+POCO_IMPLEMENT_EXCEPTION(NTPException, NetException, "NTP Exception")
+POCO_IMPLEMENT_EXCEPTION(HTMLFormException, NetException, "HTML Form Exception")
+POCO_IMPLEMENT_EXCEPTION(WebSocketException, NetException, "WebSocket Exception")
+POCO_IMPLEMENT_EXCEPTION(UnsupportedFamilyException, NetException, "Unknown or unsupported socket family")
+POCO_IMPLEMENT_EXCEPTION(AddressFamilyMismatchException, NetException, "Address family mismatch")
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/NetworkInterface.cpp b/contrib/libs/poco/Net/src/NetworkInterface.cpp
index bf56b38a10..e3b1c24f7b 100644
--- a/contrib/libs/poco/Net/src/NetworkInterface.cpp
+++ b/contrib/libs/poco/Net/src/NetworkInterface.cpp
@@ -1,1827 +1,1827 @@
-//
-// NetworkInterface.cpp
-//
-// Library: Net
-// Package: NetCore
-// Module: NetworkInterface
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/NetworkInterface.h"
-
-
-#ifdef POCO_NET_HAS_INTERFACE
-
-
-#include "Poco/Net/DatagramSocket.h"
-#include "Poco/Net/NetException.h"
-#include "Poco/NumberFormatter.h"
-#include "Poco/NumberParser.h"
-#include "Poco/StringTokenizer.h"
-#include "Poco/RefCountedObject.h"
-#include "Poco/Format.h"
-#if defined(POCO_OS_FAMILY_WINDOWS)
- #if defined(POCO_WIN32_UTF8)
- #include "Poco/UnicodeConverter.h"
- #endif
- #include "Poco/Error.h"
- #include <wincrypt.h>
- #include <iphlpapi.h>
- #include <ipifcons.h>
-#endif
-#include <cstring>
-#include <fstream>
-#include <iostream>
-#include <iomanip>
-
-
-using Poco::NumberFormatter;
-using Poco::FastMutex;
-using Poco::format;
-
-
-std::ostream& operator << (std::ostream& os, const Poco::Net::NetworkInterface::MACAddress& mac)
-{
- std::ios state(0);
- state.copyfmt(os);
- for (unsigned i = 0; i < mac.size(); ++i)
- {
- if (i > 0) os << Poco::Net::NetworkInterface::MAC_SEPARATOR;
- os << std::hex << std::setw(2) << std::setfill('0') << (unsigned) mac[i];
- }
- os.copyfmt(state);
- return os;
-}
-
-
-namespace Poco {
-namespace Net {
-
-
-//
-// NetworkInterfaceImpl
-//
-
-class NetworkInterfaceImpl: public Poco::RefCountedObject
-{
-public:
- typedef NetworkInterface::AddressTuple AddressTuple;
- typedef NetworkInterface::AddressList AddressList;
- typedef NetworkInterface::Type Type;
-
- NetworkInterfaceImpl(unsigned index);
- NetworkInterfaceImpl(const std::string& name, const std::string& displayName, const std::string& adapterName, const IPAddress& address, unsigned index, NetworkInterface::MACAddress* pMACAddress = 0);
- NetworkInterfaceImpl(const std::string& name, const std::string& displayName, const std::string& adapterName, unsigned index = 0, NetworkInterface::MACAddress* pMACAddress = 0);
- NetworkInterfaceImpl(const std::string& name,
- const std::string& displayName,
- const std::string& adapterName,
- const IPAddress& address,
- const IPAddress& subnetMask,
- const IPAddress& broadcastAddress,
- unsigned index,
- NetworkInterface::MACAddress* pMACAddress = 0);
-
- unsigned index() const;
- const std::string& name() const;
- const std::string& displayName() const;
- const std::string& adapterName() const;
- const IPAddress& firstAddress(IPAddress::Family family) const;
- void addAddress(const AddressTuple& address);
- const IPAddress& address(unsigned index) const;
- const NetworkInterface::AddressList& addressList() const;
- bool hasAddress(const IPAddress& address) const;
- const IPAddress& subnetMask(unsigned index) const;
- const IPAddress& broadcastAddress(unsigned index) const;
- const IPAddress& destAddress(unsigned index) const;
- const NetworkInterface::MACAddress& macAddress() const;
- bool supportsIPv4() const;
- bool supportsIPv6() const;
-
- void setName(const std::string& name);
- void setDisplayName(const std::string& name);
- void setAdapterName(const std::string& name);
- void addAddress(const IPAddress& addr);
- void setMACAddress(const NetworkInterface::MACAddress& addr);
- void setMACAddress(const void *addr, std::size_t len);
-
- unsigned mtu() const;
- unsigned ifindex() const;
- Type type() const;
-
- bool broadcast() const;
- bool loopback() const;
- bool multicast() const;
- bool pointToPoint() const;
- bool running() const;
- bool up() const;
-
-#if defined(POCO_OS_FAMILY_WINDOWS)
- void setFlags(DWORD flags, DWORD iftype);
- void setRunning(bool running);
-#else
- void setFlags(short flags);
-#endif
-
- void setUp(bool up);
- void setMTU(unsigned mtu);
- void setType(Type type);
- void setIndex(unsigned index);
- void setPhyParams();
-
-protected:
- ~NetworkInterfaceImpl();
-
-private:
- std::string _name;
- std::string _displayName;
- std::string _adapterName;
- AddressList _addressList;
- unsigned _index;
- bool _broadcast;
- bool _loopback;
- bool _multicast;
- bool _pointToPoint;
- bool _up;
- bool _running;
- unsigned _mtu;
- Type _type;
-
- NetworkInterface::MACAddress _macAddress;
-
- friend class NetworkInterface;
-};
-
-
-NetworkInterfaceImpl::NetworkInterfaceImpl(unsigned index):
- _index(index),
- _broadcast(false),
- _loopback(false),
- _multicast(false),
- _pointToPoint(false),
- _up(false),
- _running(false),
- _mtu(0),
- _type(NetworkInterface::NI_TYPE_OTHER)
-{
-}
-
-
-NetworkInterfaceImpl::NetworkInterfaceImpl(const std::string& name, const std::string& displayName, const std::string& adapterName, const IPAddress& address, unsigned index, NetworkInterface::MACAddress* pMACAddress):
- _name(name),
- _displayName(displayName),
- _adapterName(adapterName),
- _index(index),
- _broadcast(false),
- _loopback(false),
- _multicast(false),
- _pointToPoint(false),
- _up(false),
- _running(false),
- _mtu(0),
- _type(NetworkInterface::NI_TYPE_OTHER)
-{
- _addressList.push_back(AddressTuple(address, IPAddress(), IPAddress()));
- setPhyParams();
- if (pMACAddress) setMACAddress(*pMACAddress);
-}
-
-
-NetworkInterfaceImpl::NetworkInterfaceImpl(const std::string& name, const std::string& displayName, const std::string& adapterName, unsigned index, NetworkInterface::MACAddress* pMACAddress):
- _name(name),
- _displayName(displayName),
- _adapterName(adapterName),
- _index(index),
- _broadcast(false),
- _loopback(false),
- _multicast(false),
- _pointToPoint(false),
- _up(false),
- _running(false),
- _mtu(0),
- _type(NetworkInterface::NI_TYPE_OTHER)
-{
- setPhyParams();
- if (pMACAddress) setMACAddress(*pMACAddress);
-}
-
-
-NetworkInterfaceImpl::NetworkInterfaceImpl(const std::string& name,
- const std::string& displayName,
- const std::string& adapterName,
- const IPAddress& address,
- const IPAddress& subnetMask,
- const IPAddress& broadcastAddress,
- unsigned index,
- NetworkInterface::MACAddress* pMACAddress):
- _name(name),
- _displayName(displayName),
- _adapterName(adapterName),
- _index(index),
- _broadcast(false),
- _loopback(false),
- _multicast(false),
- _pointToPoint(false),
- _up(false),
- _running(false),
- _mtu(0),
- _type(NetworkInterface::NI_TYPE_OTHER)
-{
- _addressList.push_back(AddressTuple(address, subnetMask, broadcastAddress));
- setPhyParams();
- if (pMACAddress) setMACAddress(*pMACAddress);
-}
-
-
-void NetworkInterfaceImpl::setPhyParams()
-{
-#if !defined(POCO_OS_FAMILY_WINDOWS) && !defined(POCO_VXWORKS)
- struct ifreq ifr;
- std::strncpy(ifr.ifr_name, _name.c_str(), IFNAMSIZ);
- DatagramSocket ds(SocketAddress::IPv4);
-
- ds.impl()->ioctl(SIOCGIFFLAGS, &ifr);
- setFlags(ifr.ifr_flags);
-
- ds.impl()->ioctl(SIOCGIFMTU, &ifr);
- setMTU(ifr.ifr_mtu);
-#endif
-}
-
-
-NetworkInterfaceImpl::~NetworkInterfaceImpl()
-{
-}
-
-
-bool NetworkInterfaceImpl::supportsIPv4() const
-{
- AddressList::const_iterator it = _addressList.begin();
- AddressList::const_iterator end = _addressList.end();
- for (; it != end; ++it)
- {
- if (IPAddress::IPv4 == it->get<NetworkInterface::IP_ADDRESS>().family())
- return true;
- }
-
- return false;
-}
-
-
-bool NetworkInterfaceImpl::supportsIPv6() const
-{
-#ifdef POCO_HAVE_IPv6
- AddressList::const_iterator it = _addressList.begin();
- AddressList::const_iterator end = _addressList.end();
- for (; it != end; ++it)
- {
- if (IPAddress::IPv6 == it->get<NetworkInterface::IP_ADDRESS>().family())
- return true;
- }
-#endif
- return false;
-}
-
-
-inline unsigned NetworkInterfaceImpl::index() const
-{
- return _index;
-}
-
-
-inline const std::string& NetworkInterfaceImpl::name() const
-{
- return _name;
-}
-
-
-inline const std::string& NetworkInterfaceImpl::displayName() const
-{
- return _displayName;
-}
-
-
-inline const std::string& NetworkInterfaceImpl::adapterName() const
-{
- return _adapterName;
-}
-
-
-const IPAddress& NetworkInterfaceImpl::firstAddress(IPAddress::Family family) const
-{
- AddressList::const_iterator it = _addressList.begin();
- AddressList::const_iterator end = _addressList.end();
- for (;it != end; ++it)
- {
- const IPAddress& addr = it->get<NetworkInterface::IP_ADDRESS>();
- if (addr.family() == family) return addr;
- }
-
- throw NotFoundException(format("%s family address not found.", (family == IPAddress::IPv4) ? std::string("IPv4") : std::string("IPv6")));
-}
-
-
-inline void NetworkInterfaceImpl::addAddress(const AddressTuple& address)
-{
- _addressList.push_back(address);
-}
-
-
-bool NetworkInterfaceImpl::hasAddress(const IPAddress& address) const
-{
- NetworkInterface::ConstAddressIterator it = _addressList.begin();
- NetworkInterface::ConstAddressIterator end = _addressList.end();
- for (; it != end; ++it)
- {
- if (it->get<NetworkInterface::IP_ADDRESS>() == address)
- return true;
- }
- return false;
-}
-
-
-inline const IPAddress& NetworkInterfaceImpl::address(unsigned index) const
-{
- if (index < _addressList.size()) return _addressList[index].get<NetworkInterface::IP_ADDRESS>();
- else throw NotFoundException(Poco::format("No address with index %u.", index));
-}
-
-
-inline const NetworkInterface::AddressList& NetworkInterfaceImpl::addressList() const
-{
- return _addressList;
-}
-
-
-const IPAddress& NetworkInterfaceImpl::subnetMask(unsigned index) const
-{
- if (index < _addressList.size())
- return _addressList[index].get<NetworkInterface::SUBNET_MASK>();
-
- throw NotFoundException(Poco::format("No subnet mask with index %u.", index));
-}
-
-
-const IPAddress& NetworkInterfaceImpl::broadcastAddress(unsigned index) const
-{
- if (index < _addressList.size())
- return _addressList[index].get<NetworkInterface::BROADCAST_ADDRESS>();
-
- throw NotFoundException(Poco::format("No subnet mask with index %u.", index));
-}
-
-
-const IPAddress& NetworkInterfaceImpl::destAddress(unsigned index) const
-{
- if (!pointToPoint())
- throw InvalidAccessException("Only PPP addresses have destination address.");
- else if (index < _addressList.size())
- return _addressList[index].get<NetworkInterface::BROADCAST_ADDRESS>();
-
- throw NotFoundException(Poco::format("No address with index %u.", index));
-}
-
-
-const NetworkInterface::MACAddress& NetworkInterfaceImpl::macAddress() const
-{
- return _macAddress;
-}
-
-
-inline unsigned NetworkInterfaceImpl::mtu() const
-{
- return _mtu;
-}
-
-
-inline NetworkInterface::Type NetworkInterfaceImpl::type() const
-{
- return _type;
-}
-
-
-inline bool NetworkInterfaceImpl::broadcast() const
-{
- return _broadcast;
-}
-
-
-inline bool NetworkInterfaceImpl::loopback() const
-{
- return _loopback;
-}
-
-
-inline bool NetworkInterfaceImpl::multicast() const
-{
- return _multicast;
-}
-
-
-inline bool NetworkInterfaceImpl::pointToPoint() const
-{
- return _pointToPoint;
-}
-
-
-inline bool NetworkInterfaceImpl::running() const
-{
- return _running;
-}
-
-
-inline bool NetworkInterfaceImpl::up() const
-{
- return _up;
-}
-
-
-#if defined(POCO_OS_FAMILY_WINDOWS)
-
-
-void NetworkInterfaceImpl::setFlags(DWORD flags, DWORD iftype)
-{
- _running = _up = false;
- switch (iftype) {
- case IF_TYPE_ETHERNET_CSMACD:
- case IF_TYPE_ISO88025_TOKENRING:
- case IF_TYPE_IEEE80211:
- _multicast = _broadcast = true;
- break;
- case IF_TYPE_SOFTWARE_LOOPBACK:
- _loopback = true;
- break;
- case IF_TYPE_PPP:
- case IF_TYPE_ATM:
- case IF_TYPE_TUNNEL:
- case IF_TYPE_IEEE1394:
- _pointToPoint = true;
- break;
- }
- if (!(flags & IP_ADAPTER_NO_MULTICAST))
- _multicast = true;
-}
-
-
-void NetworkInterfaceImpl::setRunning(bool running)
-{
- _running = running;
-}
-
-
-#else
-
-
-void NetworkInterfaceImpl::setFlags(short flags)
-{
-#ifdef POCO_OS_FAMILY_UNIX
- _broadcast = ((flags & IFF_BROADCAST) != 0);
- _loopback = ((flags & IFF_LOOPBACK) != 0);
- _multicast = ((flags & IFF_MULTICAST) != 0);
- _pointToPoint = ((flags & IFF_POINTOPOINT) != 0);
- _running = ((flags & IFF_RUNNING) != 0);
- _up = ((flags & IFF_UP) != 0);
-#endif
-}
-
-
-#endif
-
-
-inline void NetworkInterfaceImpl::setUp(bool up)
-{
- _up = up;
-}
-
-
-inline void NetworkInterfaceImpl::setMTU(unsigned mtu)
-{
- _mtu = mtu;
-}
-
-
-inline void NetworkInterfaceImpl::setType(Type type)
-{
- _type = type;
-}
-
-
-inline void NetworkInterfaceImpl::setIndex(unsigned index)
-{
- _index = index;
-}
-
-
-inline void NetworkInterfaceImpl::setName(const std::string& name)
-{
- _name = name;
-}
-
-
-inline void NetworkInterfaceImpl::setDisplayName(const std::string& name)
-{
- _displayName = name;
-}
-
-
-inline void NetworkInterfaceImpl::setAdapterName(const std::string& name)
-{
- _adapterName = name;
-}
-
-
-inline void NetworkInterfaceImpl::addAddress(const IPAddress& addr)
-{
- _addressList.push_back(addr);
-}
-
-
-inline void NetworkInterfaceImpl::setMACAddress(const NetworkInterface::MACAddress& addr)
-{
- _macAddress = addr;
-}
-
-
-inline void NetworkInterfaceImpl::setMACAddress(const void *addr, std::size_t len)
-{
- _macAddress.clear();
- _macAddress.insert(_macAddress.end(), static_cast<const unsigned char*>(addr), static_cast<const unsigned char*>(addr) + len);
-}
-
-
-//
-// NetworkInterface
-//
-
-
-FastMutex NetworkInterface::_mutex;
-
-
-NetworkInterface::NetworkInterface(unsigned index):
- _pImpl(new NetworkInterfaceImpl(index))
-{
-}
-
-
-NetworkInterface::NetworkInterface(const NetworkInterface& interfc):
- _pImpl(interfc._pImpl)
-{
- _pImpl->duplicate();
-}
-
-
-NetworkInterface::NetworkInterface(const std::string& name, const std::string& displayName, const std::string& adapterName, const IPAddress& address, unsigned index, MACAddress* pMACAddress):
- _pImpl(new NetworkInterfaceImpl(name, displayName, adapterName, address, index, pMACAddress))
-{
-}
-
-
-NetworkInterface::NetworkInterface(const std::string& name, const std::string& displayName, const std::string& adapterName, unsigned index, MACAddress* pMACAddress):
- _pImpl(new NetworkInterfaceImpl(name, displayName, adapterName, index, pMACAddress))
-{
-}
-
-
-NetworkInterface::NetworkInterface(const std::string& name, const IPAddress& address, unsigned index, MACAddress* pMACAddress):
- _pImpl(new NetworkInterfaceImpl(name, name, name, address, index, pMACAddress))
-{
-}
-
-
-NetworkInterface::NetworkInterface(const std::string& name,
- const std::string& displayName,
- const std::string& adapterName,
- const IPAddress& address,
- const IPAddress& subnetMask,
- const IPAddress& broadcastAddress,
- unsigned index,
- MACAddress* pMACAddress):
- _pImpl(new NetworkInterfaceImpl(name, displayName, adapterName, address, subnetMask, broadcastAddress, index, pMACAddress))
-{
-}
-
-
-NetworkInterface::NetworkInterface(const std::string& name,
- const IPAddress& address,
- const IPAddress& subnetMask,
- const IPAddress& broadcastAddress,
- unsigned index,
- MACAddress* pMACAddress):
- _pImpl(new NetworkInterfaceImpl(name, name, name, address, subnetMask, broadcastAddress, index, pMACAddress))
-{
-}
-
-
-NetworkInterface::~NetworkInterface()
-{
- _pImpl->release();
-}
-
-
-NetworkInterface& NetworkInterface::operator = (const NetworkInterface& interfc)
-{
- NetworkInterface tmp(interfc);
- swap(tmp);
- return *this;
-}
-
-
-void NetworkInterface::swap(NetworkInterface& other)
-{
- using std::swap;
- swap(_pImpl, other._pImpl);
-}
-
-
-unsigned NetworkInterface::index() const
-{
- return _pImpl->index();
-}
-
-
-const std::string& NetworkInterface::name() const
-{
- return _pImpl->name();
-}
-
-
-const std::string& NetworkInterface::displayName() const
-{
- return _pImpl->displayName();
-}
-
-
-const std::string& NetworkInterface::adapterName() const
-{
- return _pImpl->adapterName();
-}
-
-
-const IPAddress& NetworkInterface::firstAddress(IPAddress::Family family) const
-{
- return _pImpl->firstAddress(family);
-}
-
-
-void NetworkInterface::firstAddress(IPAddress& addr, IPAddress::Family family) const
-{
- try
- {
- addr = firstAddress(family);
- }
- catch (NotFoundException&)
- {
- addr = IPAddress(family);
- }
-}
-
-
-void NetworkInterface::addAddress(const IPAddress& address)
-{
- _pImpl->addAddress(AddressTuple(address, IPAddress(), IPAddress()));
-}
-
-
-void NetworkInterface::addAddress(const IPAddress& address, const IPAddress& subnetMask, const IPAddress& broadcastAddress)
-{
- _pImpl->addAddress(AddressTuple(address, subnetMask, broadcastAddress));
-}
-
-
-const IPAddress& NetworkInterface::address(unsigned index) const
-{
- return _pImpl->address(index);
-}
-
-
-const NetworkInterface::AddressList& NetworkInterface::addressList() const
-{
- return _pImpl->addressList();
-}
-
-
-const IPAddress& NetworkInterface::subnetMask(unsigned index) const
-{
- return _pImpl->subnetMask(index);
-}
-
-
-const IPAddress& NetworkInterface::broadcastAddress(unsigned index) const
-{
- return _pImpl->broadcastAddress(index);
-}
-
-
-const NetworkInterface::MACAddress& NetworkInterface::macAddress() const
-{
- return _pImpl->macAddress();
-}
-
-
-const IPAddress& NetworkInterface::destAddress(unsigned index) const
-{
- return _pImpl->destAddress(index);
-}
-
-
-unsigned NetworkInterface::mtu() const
-{
- return _pImpl->mtu();
-}
-
-
-NetworkInterface::Type NetworkInterface::type() const
-{
- return _pImpl->type();
-}
-
-
-bool NetworkInterface::supportsIP() const
-{
- return _pImpl->supportsIPv4() || _pImpl->supportsIPv6();
-}
-
-
-bool NetworkInterface::supportsIPv4() const
-{
- return _pImpl->supportsIPv4();
-}
-
-
-bool NetworkInterface::supportsIPv6() const
-{
- return _pImpl->supportsIPv6();
-}
-
-
-bool NetworkInterface::supportsBroadcast() const
-{
- return _pImpl->broadcast();
-}
-
-
-bool NetworkInterface::supportsMulticast() const
-{
- return _pImpl->multicast();
-}
-
-
-bool NetworkInterface::isLoopback() const
-{
- return _pImpl->loopback();
-}
-
-
-bool NetworkInterface::isPointToPoint() const
-{
- return _pImpl->pointToPoint();
-}
-
-
-bool NetworkInterface::isRunning() const
-{
- return _pImpl->running();
-}
-
-
-bool NetworkInterface::isUp() const
-{
- return _pImpl->up();
-}
-
-
-NetworkInterface NetworkInterface::forName(const std::string& name, bool requireIPv6)
-{
- if (requireIPv6)
- return forName(name, IPv6_ONLY);
- else
- return forName(name, IPv4_OR_IPv6);
-}
-
-
-NetworkInterface NetworkInterface::forName(const std::string& name, IPVersion ipVersion)
-{
- Map map = NetworkInterface::map(false, false);
- Map::const_iterator it = map.begin();
- Map::const_iterator end = map.end();
-
- for (; it != end; ++it)
- {
- if (it->second.name() == name)
- {
- if (ipVersion == IPv4_ONLY && it->second.supportsIPv4())
- return it->second;
- else if (ipVersion == IPv6_ONLY && it->second.supportsIPv6())
- return it->second;
- else if (ipVersion == IPv4_OR_IPv6)
- return it->second;
- }
- }
- throw InterfaceNotFoundException(name);
-}
-
-
-NetworkInterface NetworkInterface::forAddress(const IPAddress& addr)
-{
- Map map = NetworkInterface::map(true, false);
- Map::const_iterator it = map.begin();
- Map::const_iterator end = map.end();
-
- for (; it != end; ++it)
- {
- const std::size_t count = it->second.addressList().size();
- for (int i = 0; i < count; ++i)
- {
- if (it->second.address(i) == addr)
- return it->second;
- }
- }
- throw InterfaceNotFoundException(addr.toString());
-}
-
-
-NetworkInterface NetworkInterface::forIndex(unsigned i)
-{
- if (i != NetworkInterface::NO_INDEX)
- {
- Map map = NetworkInterface::map(false, false);
- Map::const_iterator it = map.find(i);
- if (it != map.end())
- return it->second;
- else
- throw InterfaceNotFoundException("#" + NumberFormatter::format(i));
- }
- throw InterfaceNotFoundException("#" + NumberFormatter::format(i));
-}
-
-
-NetworkInterface::List NetworkInterface::list(bool ipOnly, bool upOnly)
-{
- List list;
- Map m = map(ipOnly, upOnly);
- NetworkInterface::Map::const_iterator it = m.begin();
- NetworkInterface::Map::const_iterator end = m.end();
- for (; it != end; ++it)
- {
- int index = it->second.index();
- std::string name = it->second.name();
- std::string displayName = it->second.displayName();
- std::string adapterName = it->second.adapterName();
- NetworkInterface::MACAddress mac = it->second.macAddress();
-
- typedef NetworkInterface::AddressList AddrList;
- const AddrList& ipList = it->second.addressList();
- if (ipList.size() > 0)
- {
- AddrList::const_iterator ipIt = ipList.begin();
- AddrList::const_iterator ipEnd = ipList.end();
- for(; ipIt != ipEnd; ++ipIt)
- {
- IPAddress addr = ipIt->get<NetworkInterface::IP_ADDRESS>();
- IPAddress mask = ipIt->get<NetworkInterface::SUBNET_MASK>();
- NetworkInterface ni;
- if(mask.isWildcard())
- {
- ni = NetworkInterface(name, displayName, adapterName, addr, index, &mac);
- }
- else
- {
- IPAddress broadcast = ipIt->get<NetworkInterface::BROADCAST_ADDRESS>();
- ni = NetworkInterface(name, displayName, adapterName, addr, mask, broadcast, index, &mac);
- }
-
- ni._pImpl->_broadcast = it->second._pImpl->_broadcast;
- ni._pImpl->_loopback = it->second._pImpl->_loopback;
- ni._pImpl->_multicast = it->second._pImpl->_multicast;
- ni._pImpl->_pointToPoint = it->second._pImpl->_pointToPoint;
- ni._pImpl->_up = it->second._pImpl->_up;
- ni._pImpl->_running = it->second._pImpl->_running;
- ni._pImpl->_mtu = it->second._pImpl->_mtu;
- ni._pImpl->_type = it->second._pImpl->_type;
-
- list.push_back(ni);
- }
- }
- else
- {
- list.push_back(NetworkInterface(name, displayName, adapterName, index, &mac));
- }
- }
-
- return list;
-}
-
-
-} } // namespace Poco::Net
-
-
-//
-// platform-specific code below
-//
-
-
-#if defined(POCO_OS_FAMILY_WINDOWS)
-//
-// Windows
-//
-
-
-#include "Poco/Buffer.h"
-#include <iterator>
-
-
-namespace Poco {
-namespace Net {
-
-
-namespace {
-
-
-IPAddress getBroadcastAddress(PIP_ADAPTER_PREFIX pPrefix, const IPAddress& addr, ULONG* pprefix = 0)
- /// This function relies on (1) subnet prefix being at the position
- /// immediately preceding and (2) broadcast address being at the position
- /// immediately succeeding the IPv4 unicast address.
- ///
- /// Since there is no explicit guarantee on order, to ensure correctness,
- /// the above constraints are checked prior to returning the result.
- /// Additionally, on pre-Vista versions on Windows, the main structure does
- /// not contain prefix length; for those platforms, this function
- /// returns prefix through pprefix argument.
-{
- PIP_ADAPTER_PREFIX pPrev = 0;
- for (int i = 0; pPrefix; pPrefix = pPrefix->Next, ++i)
- {
- ADDRESS_FAMILY family = pPrefix->Address.lpSockaddr->sa_family;
- if ((family == AF_INET) && (addr == IPAddress(pPrefix->Address)))
- break;
- pPrev = pPrefix;
- }
-
- if (pPrefix && pPrefix->Next && pPrev)
- {
- IPAddress ipPrefix(pPrev->PrefixLength, IPAddress::IPv4);
- IPAddress mask(pPrefix->Next->Address);
- if ((ipPrefix & mask) == (ipPrefix & addr))
- {
- if (pprefix) *pprefix = pPrefix->PrefixLength;
- return IPAddress(pPrefix->Next->Address);
- }
- }
-
- return IPAddress(IPAddress::IPv4);
-}
-
-
-NetworkInterface::Type fromNative(DWORD type)
-{
- switch (type)
- {
- case IF_TYPE_ETHERNET_CSMACD: return NetworkInterface::NI_TYPE_ETHERNET_CSMACD;
- case IF_TYPE_ISO88025_TOKENRING: return NetworkInterface::NI_TYPE_ISO88025_TOKENRING;
- case IF_TYPE_FRAMERELAY: return NetworkInterface::NI_TYPE_FRAMERELAY;
- case IF_TYPE_PPP: return NetworkInterface::NI_TYPE_PPP;
- case IF_TYPE_SOFTWARE_LOOPBACK: return NetworkInterface::NI_TYPE_SOFTWARE_LOOPBACK;
- case IF_TYPE_ATM: return NetworkInterface::NI_TYPE_ATM;
- case IF_TYPE_IEEE80211: return NetworkInterface::NI_TYPE_IEEE80211;
- case IF_TYPE_TUNNEL: return NetworkInterface::NI_TYPE_TUNNEL;
- case IF_TYPE_IEEE1394: return NetworkInterface::NI_TYPE_IEEE1394;
- default: return NetworkInterface::NI_TYPE_OTHER;
- }
-}
-
-
-IPAddress subnetMaskForInterface(const std::string& name, bool isLoopback)
-{
- if (isLoopback)
- {
- return IPAddress::parse("255.0.0.0");
- }
+//
+// NetworkInterface.cpp
+//
+// Library: Net
+// Package: NetCore
+// Module: NetworkInterface
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/NetworkInterface.h"
+
+
+#ifdef POCO_NET_HAS_INTERFACE
+
+
+#include "Poco/Net/DatagramSocket.h"
+#include "Poco/Net/NetException.h"
+#include "Poco/NumberFormatter.h"
+#include "Poco/NumberParser.h"
+#include "Poco/StringTokenizer.h"
+#include "Poco/RefCountedObject.h"
+#include "Poco/Format.h"
+#if defined(POCO_OS_FAMILY_WINDOWS)
+ #if defined(POCO_WIN32_UTF8)
+ #include "Poco/UnicodeConverter.h"
+ #endif
+ #include "Poco/Error.h"
+ #include <wincrypt.h>
+ #include <iphlpapi.h>
+ #include <ipifcons.h>
+#endif
+#include <cstring>
+#include <fstream>
+#include <iostream>
+#include <iomanip>
+
+
+using Poco::NumberFormatter;
+using Poco::FastMutex;
+using Poco::format;
+
+
+std::ostream& operator << (std::ostream& os, const Poco::Net::NetworkInterface::MACAddress& mac)
+{
+ std::ios state(0);
+ state.copyfmt(os);
+ for (unsigned i = 0; i < mac.size(); ++i)
+ {
+ if (i > 0) os << Poco::Net::NetworkInterface::MAC_SEPARATOR;
+ os << std::hex << std::setw(2) << std::setfill('0') << (unsigned) mac[i];
+ }
+ os.copyfmt(state);
+ return os;
+}
+
+
+namespace Poco {
+namespace Net {
+
+
+//
+// NetworkInterfaceImpl
+//
+
+class NetworkInterfaceImpl: public Poco::RefCountedObject
+{
+public:
+ typedef NetworkInterface::AddressTuple AddressTuple;
+ typedef NetworkInterface::AddressList AddressList;
+ typedef NetworkInterface::Type Type;
+
+ NetworkInterfaceImpl(unsigned index);
+ NetworkInterfaceImpl(const std::string& name, const std::string& displayName, const std::string& adapterName, const IPAddress& address, unsigned index, NetworkInterface::MACAddress* pMACAddress = 0);
+ NetworkInterfaceImpl(const std::string& name, const std::string& displayName, const std::string& adapterName, unsigned index = 0, NetworkInterface::MACAddress* pMACAddress = 0);
+ NetworkInterfaceImpl(const std::string& name,
+ const std::string& displayName,
+ const std::string& adapterName,
+ const IPAddress& address,
+ const IPAddress& subnetMask,
+ const IPAddress& broadcastAddress,
+ unsigned index,
+ NetworkInterface::MACAddress* pMACAddress = 0);
+
+ unsigned index() const;
+ const std::string& name() const;
+ const std::string& displayName() const;
+ const std::string& adapterName() const;
+ const IPAddress& firstAddress(IPAddress::Family family) const;
+ void addAddress(const AddressTuple& address);
+ const IPAddress& address(unsigned index) const;
+ const NetworkInterface::AddressList& addressList() const;
+ bool hasAddress(const IPAddress& address) const;
+ const IPAddress& subnetMask(unsigned index) const;
+ const IPAddress& broadcastAddress(unsigned index) const;
+ const IPAddress& destAddress(unsigned index) const;
+ const NetworkInterface::MACAddress& macAddress() const;
+ bool supportsIPv4() const;
+ bool supportsIPv6() const;
+
+ void setName(const std::string& name);
+ void setDisplayName(const std::string& name);
+ void setAdapterName(const std::string& name);
+ void addAddress(const IPAddress& addr);
+ void setMACAddress(const NetworkInterface::MACAddress& addr);
+ void setMACAddress(const void *addr, std::size_t len);
+
+ unsigned mtu() const;
+ unsigned ifindex() const;
+ Type type() const;
+
+ bool broadcast() const;
+ bool loopback() const;
+ bool multicast() const;
+ bool pointToPoint() const;
+ bool running() const;
+ bool up() const;
+
+#if defined(POCO_OS_FAMILY_WINDOWS)
+ void setFlags(DWORD flags, DWORD iftype);
+ void setRunning(bool running);
+#else
+ void setFlags(short flags);
+#endif
+
+ void setUp(bool up);
+ void setMTU(unsigned mtu);
+ void setType(Type type);
+ void setIndex(unsigned index);
+ void setPhyParams();
+
+protected:
+ ~NetworkInterfaceImpl();
+
+private:
+ std::string _name;
+ std::string _displayName;
+ std::string _adapterName;
+ AddressList _addressList;
+ unsigned _index;
+ bool _broadcast;
+ bool _loopback;
+ bool _multicast;
+ bool _pointToPoint;
+ bool _up;
+ bool _running;
+ unsigned _mtu;
+ Type _type;
+
+ NetworkInterface::MACAddress _macAddress;
+
+ friend class NetworkInterface;
+};
+
+
+NetworkInterfaceImpl::NetworkInterfaceImpl(unsigned index):
+ _index(index),
+ _broadcast(false),
+ _loopback(false),
+ _multicast(false),
+ _pointToPoint(false),
+ _up(false),
+ _running(false),
+ _mtu(0),
+ _type(NetworkInterface::NI_TYPE_OTHER)
+{
+}
+
+
+NetworkInterfaceImpl::NetworkInterfaceImpl(const std::string& name, const std::string& displayName, const std::string& adapterName, const IPAddress& address, unsigned index, NetworkInterface::MACAddress* pMACAddress):
+ _name(name),
+ _displayName(displayName),
+ _adapterName(adapterName),
+ _index(index),
+ _broadcast(false),
+ _loopback(false),
+ _multicast(false),
+ _pointToPoint(false),
+ _up(false),
+ _running(false),
+ _mtu(0),
+ _type(NetworkInterface::NI_TYPE_OTHER)
+{
+ _addressList.push_back(AddressTuple(address, IPAddress(), IPAddress()));
+ setPhyParams();
+ if (pMACAddress) setMACAddress(*pMACAddress);
+}
+
+
+NetworkInterfaceImpl::NetworkInterfaceImpl(const std::string& name, const std::string& displayName, const std::string& adapterName, unsigned index, NetworkInterface::MACAddress* pMACAddress):
+ _name(name),
+ _displayName(displayName),
+ _adapterName(adapterName),
+ _index(index),
+ _broadcast(false),
+ _loopback(false),
+ _multicast(false),
+ _pointToPoint(false),
+ _up(false),
+ _running(false),
+ _mtu(0),
+ _type(NetworkInterface::NI_TYPE_OTHER)
+{
+ setPhyParams();
+ if (pMACAddress) setMACAddress(*pMACAddress);
+}
+
+
+NetworkInterfaceImpl::NetworkInterfaceImpl(const std::string& name,
+ const std::string& displayName,
+ const std::string& adapterName,
+ const IPAddress& address,
+ const IPAddress& subnetMask,
+ const IPAddress& broadcastAddress,
+ unsigned index,
+ NetworkInterface::MACAddress* pMACAddress):
+ _name(name),
+ _displayName(displayName),
+ _adapterName(adapterName),
+ _index(index),
+ _broadcast(false),
+ _loopback(false),
+ _multicast(false),
+ _pointToPoint(false),
+ _up(false),
+ _running(false),
+ _mtu(0),
+ _type(NetworkInterface::NI_TYPE_OTHER)
+{
+ _addressList.push_back(AddressTuple(address, subnetMask, broadcastAddress));
+ setPhyParams();
+ if (pMACAddress) setMACAddress(*pMACAddress);
+}
+
+
+void NetworkInterfaceImpl::setPhyParams()
+{
+#if !defined(POCO_OS_FAMILY_WINDOWS) && !defined(POCO_VXWORKS)
+ struct ifreq ifr;
+ std::strncpy(ifr.ifr_name, _name.c_str(), IFNAMSIZ);
+ DatagramSocket ds(SocketAddress::IPv4);
+
+ ds.impl()->ioctl(SIOCGIFFLAGS, &ifr);
+ setFlags(ifr.ifr_flags);
+
+ ds.impl()->ioctl(SIOCGIFMTU, &ifr);
+ setMTU(ifr.ifr_mtu);
+#endif
+}
+
+
+NetworkInterfaceImpl::~NetworkInterfaceImpl()
+{
+}
+
+
+bool NetworkInterfaceImpl::supportsIPv4() const
+{
+ AddressList::const_iterator it = _addressList.begin();
+ AddressList::const_iterator end = _addressList.end();
+ for (; it != end; ++it)
+ {
+ if (IPAddress::IPv4 == it->get<NetworkInterface::IP_ADDRESS>().family())
+ return true;
+ }
+
+ return false;
+}
+
+
+bool NetworkInterfaceImpl::supportsIPv6() const
+{
+#ifdef POCO_HAVE_IPv6
+ AddressList::const_iterator it = _addressList.begin();
+ AddressList::const_iterator end = _addressList.end();
+ for (; it != end; ++it)
+ {
+ if (IPAddress::IPv6 == it->get<NetworkInterface::IP_ADDRESS>().family())
+ return true;
+ }
+#endif
+ return false;
+}
+
+
+inline unsigned NetworkInterfaceImpl::index() const
+{
+ return _index;
+}
+
+
+inline const std::string& NetworkInterfaceImpl::name() const
+{
+ return _name;
+}
+
+
+inline const std::string& NetworkInterfaceImpl::displayName() const
+{
+ return _displayName;
+}
+
+
+inline const std::string& NetworkInterfaceImpl::adapterName() const
+{
+ return _adapterName;
+}
+
+
+const IPAddress& NetworkInterfaceImpl::firstAddress(IPAddress::Family family) const
+{
+ AddressList::const_iterator it = _addressList.begin();
+ AddressList::const_iterator end = _addressList.end();
+ for (;it != end; ++it)
+ {
+ const IPAddress& addr = it->get<NetworkInterface::IP_ADDRESS>();
+ if (addr.family() == family) return addr;
+ }
+
+ throw NotFoundException(format("%s family address not found.", (family == IPAddress::IPv4) ? std::string("IPv4") : std::string("IPv6")));
+}
+
+
+inline void NetworkInterfaceImpl::addAddress(const AddressTuple& address)
+{
+ _addressList.push_back(address);
+}
+
+
+bool NetworkInterfaceImpl::hasAddress(const IPAddress& address) const
+{
+ NetworkInterface::ConstAddressIterator it = _addressList.begin();
+ NetworkInterface::ConstAddressIterator end = _addressList.end();
+ for (; it != end; ++it)
+ {
+ if (it->get<NetworkInterface::IP_ADDRESS>() == address)
+ return true;
+ }
+ return false;
+}
+
+
+inline const IPAddress& NetworkInterfaceImpl::address(unsigned index) const
+{
+ if (index < _addressList.size()) return _addressList[index].get<NetworkInterface::IP_ADDRESS>();
+ else throw NotFoundException(Poco::format("No address with index %u.", index));
+}
+
+
+inline const NetworkInterface::AddressList& NetworkInterfaceImpl::addressList() const
+{
+ return _addressList;
+}
+
+
+const IPAddress& NetworkInterfaceImpl::subnetMask(unsigned index) const
+{
+ if (index < _addressList.size())
+ return _addressList[index].get<NetworkInterface::SUBNET_MASK>();
+
+ throw NotFoundException(Poco::format("No subnet mask with index %u.", index));
+}
+
+
+const IPAddress& NetworkInterfaceImpl::broadcastAddress(unsigned index) const
+{
+ if (index < _addressList.size())
+ return _addressList[index].get<NetworkInterface::BROADCAST_ADDRESS>();
+
+ throw NotFoundException(Poco::format("No subnet mask with index %u.", index));
+}
+
+
+const IPAddress& NetworkInterfaceImpl::destAddress(unsigned index) const
+{
+ if (!pointToPoint())
+ throw InvalidAccessException("Only PPP addresses have destination address.");
+ else if (index < _addressList.size())
+ return _addressList[index].get<NetworkInterface::BROADCAST_ADDRESS>();
+
+ throw NotFoundException(Poco::format("No address with index %u.", index));
+}
+
+
+const NetworkInterface::MACAddress& NetworkInterfaceImpl::macAddress() const
+{
+ return _macAddress;
+}
+
+
+inline unsigned NetworkInterfaceImpl::mtu() const
+{
+ return _mtu;
+}
+
+
+inline NetworkInterface::Type NetworkInterfaceImpl::type() const
+{
+ return _type;
+}
+
+
+inline bool NetworkInterfaceImpl::broadcast() const
+{
+ return _broadcast;
+}
+
+
+inline bool NetworkInterfaceImpl::loopback() const
+{
+ return _loopback;
+}
+
+
+inline bool NetworkInterfaceImpl::multicast() const
+{
+ return _multicast;
+}
+
+
+inline bool NetworkInterfaceImpl::pointToPoint() const
+{
+ return _pointToPoint;
+}
+
+
+inline bool NetworkInterfaceImpl::running() const
+{
+ return _running;
+}
+
+
+inline bool NetworkInterfaceImpl::up() const
+{
+ return _up;
+}
+
+
+#if defined(POCO_OS_FAMILY_WINDOWS)
+
+
+void NetworkInterfaceImpl::setFlags(DWORD flags, DWORD iftype)
+{
+ _running = _up = false;
+ switch (iftype) {
+ case IF_TYPE_ETHERNET_CSMACD:
+ case IF_TYPE_ISO88025_TOKENRING:
+ case IF_TYPE_IEEE80211:
+ _multicast = _broadcast = true;
+ break;
+ case IF_TYPE_SOFTWARE_LOOPBACK:
+ _loopback = true;
+ break;
+ case IF_TYPE_PPP:
+ case IF_TYPE_ATM:
+ case IF_TYPE_TUNNEL:
+ case IF_TYPE_IEEE1394:
+ _pointToPoint = true;
+ break;
+ }
+ if (!(flags & IP_ADAPTER_NO_MULTICAST))
+ _multicast = true;
+}
+
+
+void NetworkInterfaceImpl::setRunning(bool running)
+{
+ _running = running;
+}
+
+
+#else
+
+
+void NetworkInterfaceImpl::setFlags(short flags)
+{
+#ifdef POCO_OS_FAMILY_UNIX
+ _broadcast = ((flags & IFF_BROADCAST) != 0);
+ _loopback = ((flags & IFF_LOOPBACK) != 0);
+ _multicast = ((flags & IFF_MULTICAST) != 0);
+ _pointToPoint = ((flags & IFF_POINTOPOINT) != 0);
+ _running = ((flags & IFF_RUNNING) != 0);
+ _up = ((flags & IFF_UP) != 0);
+#endif
+}
+
+
+#endif
+
+
+inline void NetworkInterfaceImpl::setUp(bool up)
+{
+ _up = up;
+}
+
+
+inline void NetworkInterfaceImpl::setMTU(unsigned mtu)
+{
+ _mtu = mtu;
+}
+
+
+inline void NetworkInterfaceImpl::setType(Type type)
+{
+ _type = type;
+}
+
+
+inline void NetworkInterfaceImpl::setIndex(unsigned index)
+{
+ _index = index;
+}
+
+
+inline void NetworkInterfaceImpl::setName(const std::string& name)
+{
+ _name = name;
+}
+
+
+inline void NetworkInterfaceImpl::setDisplayName(const std::string& name)
+{
+ _displayName = name;
+}
+
+
+inline void NetworkInterfaceImpl::setAdapterName(const std::string& name)
+{
+ _adapterName = name;
+}
+
+
+inline void NetworkInterfaceImpl::addAddress(const IPAddress& addr)
+{
+ _addressList.push_back(addr);
+}
+
+
+inline void NetworkInterfaceImpl::setMACAddress(const NetworkInterface::MACAddress& addr)
+{
+ _macAddress = addr;
+}
+
+
+inline void NetworkInterfaceImpl::setMACAddress(const void *addr, std::size_t len)
+{
+ _macAddress.clear();
+ _macAddress.insert(_macAddress.end(), static_cast<const unsigned char*>(addr), static_cast<const unsigned char*>(addr) + len);
+}
+
+
+//
+// NetworkInterface
+//
+
+
+FastMutex NetworkInterface::_mutex;
+
+
+NetworkInterface::NetworkInterface(unsigned index):
+ _pImpl(new NetworkInterfaceImpl(index))
+{
+}
+
+
+NetworkInterface::NetworkInterface(const NetworkInterface& interfc):
+ _pImpl(interfc._pImpl)
+{
+ _pImpl->duplicate();
+}
+
+
+NetworkInterface::NetworkInterface(const std::string& name, const std::string& displayName, const std::string& adapterName, const IPAddress& address, unsigned index, MACAddress* pMACAddress):
+ _pImpl(new NetworkInterfaceImpl(name, displayName, adapterName, address, index, pMACAddress))
+{
+}
+
+
+NetworkInterface::NetworkInterface(const std::string& name, const std::string& displayName, const std::string& adapterName, unsigned index, MACAddress* pMACAddress):
+ _pImpl(new NetworkInterfaceImpl(name, displayName, adapterName, index, pMACAddress))
+{
+}
+
+
+NetworkInterface::NetworkInterface(const std::string& name, const IPAddress& address, unsigned index, MACAddress* pMACAddress):
+ _pImpl(new NetworkInterfaceImpl(name, name, name, address, index, pMACAddress))
+{
+}
+
+
+NetworkInterface::NetworkInterface(const std::string& name,
+ const std::string& displayName,
+ const std::string& adapterName,
+ const IPAddress& address,
+ const IPAddress& subnetMask,
+ const IPAddress& broadcastAddress,
+ unsigned index,
+ MACAddress* pMACAddress):
+ _pImpl(new NetworkInterfaceImpl(name, displayName, adapterName, address, subnetMask, broadcastAddress, index, pMACAddress))
+{
+}
+
+
+NetworkInterface::NetworkInterface(const std::string& name,
+ const IPAddress& address,
+ const IPAddress& subnetMask,
+ const IPAddress& broadcastAddress,
+ unsigned index,
+ MACAddress* pMACAddress):
+ _pImpl(new NetworkInterfaceImpl(name, name, name, address, subnetMask, broadcastAddress, index, pMACAddress))
+{
+}
+
+
+NetworkInterface::~NetworkInterface()
+{
+ _pImpl->release();
+}
+
+
+NetworkInterface& NetworkInterface::operator = (const NetworkInterface& interfc)
+{
+ NetworkInterface tmp(interfc);
+ swap(tmp);
+ return *this;
+}
+
+
+void NetworkInterface::swap(NetworkInterface& other)
+{
+ using std::swap;
+ swap(_pImpl, other._pImpl);
+}
+
+
+unsigned NetworkInterface::index() const
+{
+ return _pImpl->index();
+}
+
+
+const std::string& NetworkInterface::name() const
+{
+ return _pImpl->name();
+}
+
+
+const std::string& NetworkInterface::displayName() const
+{
+ return _pImpl->displayName();
+}
+
+
+const std::string& NetworkInterface::adapterName() const
+{
+ return _pImpl->adapterName();
+}
+
+
+const IPAddress& NetworkInterface::firstAddress(IPAddress::Family family) const
+{
+ return _pImpl->firstAddress(family);
+}
+
+
+void NetworkInterface::firstAddress(IPAddress& addr, IPAddress::Family family) const
+{
+ try
+ {
+ addr = firstAddress(family);
+ }
+ catch (NotFoundException&)
+ {
+ addr = IPAddress(family);
+ }
+}
+
+
+void NetworkInterface::addAddress(const IPAddress& address)
+{
+ _pImpl->addAddress(AddressTuple(address, IPAddress(), IPAddress()));
+}
+
+
+void NetworkInterface::addAddress(const IPAddress& address, const IPAddress& subnetMask, const IPAddress& broadcastAddress)
+{
+ _pImpl->addAddress(AddressTuple(address, subnetMask, broadcastAddress));
+}
+
+
+const IPAddress& NetworkInterface::address(unsigned index) const
+{
+ return _pImpl->address(index);
+}
+
+
+const NetworkInterface::AddressList& NetworkInterface::addressList() const
+{
+ return _pImpl->addressList();
+}
+
+
+const IPAddress& NetworkInterface::subnetMask(unsigned index) const
+{
+ return _pImpl->subnetMask(index);
+}
+
+
+const IPAddress& NetworkInterface::broadcastAddress(unsigned index) const
+{
+ return _pImpl->broadcastAddress(index);
+}
+
+
+const NetworkInterface::MACAddress& NetworkInterface::macAddress() const
+{
+ return _pImpl->macAddress();
+}
+
+
+const IPAddress& NetworkInterface::destAddress(unsigned index) const
+{
+ return _pImpl->destAddress(index);
+}
+
+
+unsigned NetworkInterface::mtu() const
+{
+ return _pImpl->mtu();
+}
+
+
+NetworkInterface::Type NetworkInterface::type() const
+{
+ return _pImpl->type();
+}
+
+
+bool NetworkInterface::supportsIP() const
+{
+ return _pImpl->supportsIPv4() || _pImpl->supportsIPv6();
+}
+
+
+bool NetworkInterface::supportsIPv4() const
+{
+ return _pImpl->supportsIPv4();
+}
+
+
+bool NetworkInterface::supportsIPv6() const
+{
+ return _pImpl->supportsIPv6();
+}
+
+
+bool NetworkInterface::supportsBroadcast() const
+{
+ return _pImpl->broadcast();
+}
+
+
+bool NetworkInterface::supportsMulticast() const
+{
+ return _pImpl->multicast();
+}
+
+
+bool NetworkInterface::isLoopback() const
+{
+ return _pImpl->loopback();
+}
+
+
+bool NetworkInterface::isPointToPoint() const
+{
+ return _pImpl->pointToPoint();
+}
+
+
+bool NetworkInterface::isRunning() const
+{
+ return _pImpl->running();
+}
+
+
+bool NetworkInterface::isUp() const
+{
+ return _pImpl->up();
+}
+
+
+NetworkInterface NetworkInterface::forName(const std::string& name, bool requireIPv6)
+{
+ if (requireIPv6)
+ return forName(name, IPv6_ONLY);
else
- {
-#if !defined(_WIN32_WCE)
- std::string subKey("SYSTEM\\CurrentControlSet\\services\\Tcpip\\Parameters\\Interfaces\\");
- subKey += name;
- std::string netmask;
- HKEY hKey;
-#if defined(POCO_WIN32_UTF8) && !defined(POCO_NO_WSTRING)
- std::wstring usubKey;
- Poco::UnicodeConverter::toUTF16(subKey, usubKey);
- if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, usubKey.c_str(), 0, KEY_READ, &hKey) != ERROR_SUCCESS)
- return IPAddress();
- wchar_t unetmask[16];
- DWORD size = sizeof(unetmask);
- if (RegQueryValueExW(hKey, L"DhcpSubnetMask", NULL, NULL, (LPBYTE)&unetmask, &size) != ERROR_SUCCESS)
- {
- if (RegQueryValueExW(hKey, L"SubnetMask", NULL, NULL, (LPBYTE)&unetmask, &size) != ERROR_SUCCESS)
- {
- RegCloseKey(hKey);
- return IPAddress();
- }
- }
- Poco::UnicodeConverter::toUTF8(unetmask, netmask);
-#else
- if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, subKey.c_str(), 0, KEY_READ, &hKey) != ERROR_SUCCESS)
- return IPAddress();
- char unetmask[16];
- DWORD size = sizeof(unetmask);
- if (RegQueryValueExA(hKey, "DhcpSubnetMask", NULL, NULL, (LPBYTE)&unetmask, &size) != ERROR_SUCCESS)
- {
- if (RegQueryValueExA(hKey, "SubnetMask", NULL, NULL, (LPBYTE)&unetmask, &size) != ERROR_SUCCESS)
- {
- RegCloseKey(hKey);
- return IPAddress();
- }
- }
- netmask = unetmask;
-#endif
- RegCloseKey(hKey);
- return IPAddress::parse(netmask);
-#else
- return IPAddress();
-#endif // !defined(_WIN32_WCE)
- }
-}
-
-
-} /// namespace
-
-
-NetworkInterface::Map NetworkInterface::map(bool ipOnly, bool upOnly)
-{
- OSVERSIONINFO osvi;
- ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
- osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
- GetVersionEx(&osvi);
-
- FastMutex::ScopedLock lock(_mutex);
- Map result;
- ULONG outBufLen = 16384;
- Poco::Buffer<UCHAR> memory(outBufLen);
- ULONG flags = (GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST | GAA_FLAG_SKIP_DNS_SERVER | GAA_FLAG_INCLUDE_PREFIX);
-#ifdef GAA_FLAG_INCLUDE_ALL_INTERFACES
- flags |= GAA_FLAG_INCLUDE_ALL_INTERFACES;
-#endif
-#if defined(POCO_HAVE_IPv6)
- const unsigned family = AF_UNSPEC; //IPv4 and IPv6
-#else
- const unsigned family = AF_INET; //IPv4 only
-#endif
- DWORD dwRetVal = 0;
- ULONG iterations = 0;
- PIP_ADAPTER_ADDRESSES pAddress = 0;
- do
- {
- pAddress = reinterpret_cast<IP_ADAPTER_ADDRESSES*>(memory.begin()); // leave in the loop, begin may change after resize
- poco_assert (memory.capacity() >= outBufLen);
- if (ERROR_BUFFER_OVERFLOW == (dwRetVal = GetAdaptersAddresses(family, flags, 0, pAddress, &outBufLen)))
- memory.resize(outBufLen, false); // adjust size and try again
- else if (ERROR_NO_DATA == dwRetVal) // no network interfaces found
- return result;
- else if (NO_ERROR != dwRetVal) // error occurred
- throw SystemException(format("An error occurred while trying to obtain list of network interfaces: [%s]", Error::getMessage(dwRetVal)));
- else
- break;
- }
- while ((ERROR_BUFFER_OVERFLOW == dwRetVal) && (++iterations <= 2));
-
- poco_assert (NO_ERROR == dwRetVal);
- for (; pAddress; pAddress = pAddress->Next)
- {
- IPAddress address;
- IPAddress subnetMask;
- IPAddress broadcastAddress;
- unsigned ifIndex = 0;
-
-#if defined(POCO_HAVE_IPv6)
- #if defined(_WIN32_WCE)
- ifIndex = pAddress->Ipv6IfIndex;
- #elif (_WIN32_WINNT >= 0x0501) && (NTDDI_VERSION >= 0x05010100) // Win XP SP1
- #if defined (IP_ADAPTER_IPV6_ENABLED) // Vista
- if(osvi.dwMajorVersion>=6)//vista
- {
- if ((pAddress->Flags & IP_ADAPTER_IPV6_ENABLED) &&
- (osvi.dwMajorVersion >= 5) &&
- (osvi.dwMinorVersion >= 1) &&
- (osvi.dwBuildNumber >=1))
- {
- ifIndex = pAddress->Ipv6IfIndex;
- }
- }
- else
- {
- if ((osvi.dwMajorVersion >= 5) &&
- (osvi.dwMinorVersion >= 1) &&
- (osvi.dwBuildNumber >= 1))
- {
- ifIndex = pAddress->Ipv6IfIndex;
- }
- }
- #else // !defined(IP_ADAPTER_IPV6_ENABLED)
- if ((osvi.dwMajorVersion >= 5) &&
- (osvi.dwMinorVersion >= 1) &&
- (osvi.dwBuildNumber >= 1))
- {
- ifIndex = pAddress->Ipv6IfIndex;
- }
- #endif // defined(IP_ADAPTER_IPV6_ENABLED)
- #endif // (_WIN32_WINNT >= 0x0501) && (NTDDI_VERSION >= 0x05010100)
-#endif // POCO_HAVE_IPv6
-
-#if defined (IP_ADAPTER_IPV4_ENABLED)
- if(osvi.dwMajorVersion>=6)
- {//vista
- if (pAddress->Flags & IP_ADAPTER_IPV4_ENABLED)
- {
- ifIndex = pAddress->IfIndex;
- }
- }
- else
- {
- ifIndex = pAddress->IfIndex;
- }
-#else // !IP_ADAPTER_IPV4_ENABLED
- ifIndex = pAddress->IfIndex;
-#endif
- if (ifIndex == 0) continue;
-
- std::string name;
- std::string displayName;
- std::string adapterName(pAddress->AdapterName);
-#ifdef POCO_WIN32_UTF8
- Poco::UnicodeConverter::toUTF8(pAddress->FriendlyName, name);
- Poco::UnicodeConverter::toUTF8(pAddress->Description, displayName);
-#else
- char nameBuffer[1024];
- int rc = WideCharToMultiByte(CP_ACP, 0, pAddress->FriendlyName, -1, nameBuffer, sizeof(nameBuffer), NULL, NULL);
- if (rc) name = nameBuffer;
- char displayNameBuffer[1024];
- rc = WideCharToMultiByte(CP_ACP, 0, pAddress->Description, -1, displayNameBuffer, sizeof(displayNameBuffer), NULL, NULL);
- if (rc) displayName = displayNameBuffer;
-#endif
-
- bool isUp = (pAddress->OperStatus == IfOperStatusUp);
- bool isIP = (0 != pAddress->FirstUnicastAddress);
- if (((ipOnly && isIP) || !ipOnly) && ((upOnly && isUp) || !upOnly))
- {
- NetworkInterface ni(name, displayName, adapterName, ifIndex);
- // Create interface even if it has an empty list of addresses; also, set
- // physical attributes which are protocol independent (name, media type,
- // MAC address, MTU, operational status, etc).
- Map::iterator ifIt = result.find(ifIndex);
- if (ifIt == result.end())
- ifIt = result.insert(Map::value_type(ifIndex, ni)).first;
-
- ifIt->second.impl().setFlags(pAddress->Flags, pAddress->IfType);
- ifIt->second.impl().setMTU(pAddress->Mtu);
- ifIt->second.impl().setUp(pAddress->OperStatus == IfOperStatusUp);
-#if (_WIN32_WINNT >= 0x0600) // Vista and newer only
- if ((osvi.dwMajorVersion >= 6) &&
- (osvi.dwMinorVersion >= 0) &&
- (osvi.dwBuildNumber >= 0))
- {
- ifIt->second.impl().setRunning(pAddress->ReceiveLinkSpeed > 0 || pAddress->TransmitLinkSpeed > 0);
- }
-#endif
- ifIt->second.impl().setType(fromNative(pAddress->IfType));
- if (pAddress->PhysicalAddressLength)
- ifIt->second.impl().setMACAddress(pAddress->PhysicalAddress, pAddress->PhysicalAddressLength);
-
- for (PIP_ADAPTER_UNICAST_ADDRESS pUniAddr = pAddress->FirstUnicastAddress;
- pUniAddr;
- pUniAddr = pUniAddr->Next)
- {
- address = IPAddress(pUniAddr->Address);
- ADDRESS_FAMILY family2 = pUniAddr->Address.lpSockaddr->sa_family;
- switch (family2)
- {
- case AF_INET:
- {
- // Windows lists broadcast address on localhost
- bool hasBroadcast = (pAddress->IfType == IF_TYPE_ETHERNET_CSMACD) || (pAddress->IfType == IF_TYPE_SOFTWARE_LOOPBACK) || (pAddress->IfType == IF_TYPE_IEEE80211);
- if (hasBroadcast)
- {
- // On Windows, a valid broadcast address will be all 1's (== address | ~subnetMask); additionaly, on pre-Vista versions of
- // OS, master address structure does not contain member for prefix length; we go an extra mile here in order to make sure
- // we reflect the actual values held by system and protect against misconfiguration (e.g. bad DHCP config entry)
- ULONG prefixLength = 0;
-#if defined(_WIN32_WCE)
- #if _WIN32_WCE >= 0x0800
- prefixLength = pUniAddr->OnLinkPrefixLength;
- broadcastAddress = getBroadcastAddress(pAddress->FirstPrefix, address);
- #else
- broadcastAddress = getBroadcastAddress(pAddress->FirstPrefix, address, &prefixLength);
- #endif
- // if previous call did not do it, make last-ditch attempt for prefix and broadcast
- if (prefixLength == 0 && pAddress->FirstPrefix)
- prefixLength = pAddress->FirstPrefix->PrefixLength;
- poco_assert (prefixLength <= 32);
- if (broadcastAddress.isWildcard())
- {
- IPAddress mask(static_cast<unsigned>(prefixLength), IPAddress::IPv4);
- IPAddress host(mask & address);
- broadcastAddress = host | ~mask;
- }
-#elif (_WIN32_WINNT >= 0x0501) && (NTDDI_VERSION >= 0x05010100) // Win XP SP1
- #if (_WIN32_WINNT >= 0x0600) // Vista and newer
- if (osvi.dwMajorVersion >= 6)
- {
- prefixLength = pUniAddr->OnLinkPrefixLength;
- broadcastAddress = getBroadcastAddress(pAddress->FirstPrefix, address);
- }
- else
- {
- broadcastAddress = getBroadcastAddress(pAddress->FirstPrefix, address, &prefixLength);
- }
- #else
- broadcastAddress = getBroadcastAddress(pAddress->FirstPrefix, address, &prefixLength);
- #endif
- poco_assert (prefixLength <= 32);
- if (broadcastAddress.isWildcard())
- {
- IPAddress mask(static_cast<unsigned>(prefixLength), IPAddress::IPv4);
- IPAddress host(mask & address);
- broadcastAddress = host | ~mask;
- }
-#endif // (_WIN32_WINNT >= 0x0501) && (NTDDI_VERSION >= 0x05010100)
- if (prefixLength)
- {
- subnetMask = IPAddress(static_cast<unsigned>(prefixLength), IPAddress::IPv4);
- }
- else // if all of the above fails, look up the subnet mask in the registry
- {
- address = IPAddress(&reinterpret_cast<struct sockaddr_in*>(pUniAddr->Address.lpSockaddr)->sin_addr, sizeof(in_addr));
- subnetMask = subnetMaskForInterface(name, address.isLoopback());
- if (!address.isLoopback())
- {
- broadcastAddress = address;
- broadcastAddress.mask(subnetMask, IPAddress::broadcast());
- }
- }
- ifIt->second.addAddress(address, subnetMask, broadcastAddress);
- }
- else
- {
- ifIt->second.addAddress(address);
- }
- }
- break;
-#if defined(POCO_HAVE_IPv6)
- case AF_INET6:
- ifIt->second.addAddress(address);
- break;
-#endif
- } // switch family
- } // for addresses
- } // if ipOnly/upOnly
- } // for adapters
- return result;
-}
-
-
-} } // namespace Poco::Net
-
-
-#elif defined(POCO_VXWORKS)
-//
-// VxWorks
-//
-
-#error TODO
-
-/*
-namespace Poco {
-namespace Net {
-
-
-NetworkInterface::NetworkInterfaceList NetworkInterface::list()
-{
- FastMutex::ScopedLock lock(_mutex);
- NetworkInterfaceList result;
-
- int ifIndex = 1;
- char ifName[32];
- char ifAddr[INET_ADDR_LEN];
-
- for (;;)
- {
- if (ifIndexToIfName(ifIndex, ifName) == OK)
- {
- std::string name(ifName);
- IPAddress addr;
- IPAddress mask;
- IPAddress bcst;
- if (ifAddrGet(ifName, ifAddr) == OK)
- {
- addr = IPAddress(std::string(ifAddr));
- }
- int ifMask;
- if (ifMaskGet(ifName, &ifMask) == OK)
- {
- mask = IPAddress(&ifMask, sizeof(ifMask));
- }
- if (ifBroadcastGet(ifName, ifAddr) == OK)
- {
- bcst = IPAddress(std::string(ifAddr));
- }
- result.push_back(NetworkInterface(name, name, name, addr, mask, bcst));
- ifIndex++;
- }
- else break;
- }
-
- return result;
-}
-
-
-} } // namespace Poco::Net
-*/
-
-#elif defined(POCO_OS_FAMILY_BSD) || (POCO_OS == POCO_OS_QNX) || (POCO_OS == POCO_OS_SOLARIS)
-//
-// BSD variants, QNX(?) and Solaris
-//
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <ifaddrs.h>
-#include <net/if.h>
-#include <net/if_dl.h>
-#ifndef POCO_NO_NET_IFTYPES
-#include <net/if_types.h>
-#endif
-
-
-namespace Poco {
-namespace Net {
-
-
-namespace {
-
-
-NetworkInterface::Type fromNative(u_char nativeType)
-{
- switch (nativeType)
- {
-#ifndef POCO_NO_NET_IFTYPES
- case IFT_ETHER: return NetworkInterface::NI_TYPE_ETHERNET_CSMACD;
- case IFT_ISO88025: return NetworkInterface::NI_TYPE_ISO88025_TOKENRING;
- case IFT_FRELAY: return NetworkInterface::NI_TYPE_FRAMERELAY;
- case IFT_PPP: return NetworkInterface::NI_TYPE_PPP;
- case IFT_LOOP: return NetworkInterface::NI_TYPE_SOFTWARE_LOOPBACK;
- case IFT_ATM: return NetworkInterface::NI_TYPE_ATM;
-#if (POCO_OS != POCO_OS_SOLARIS)
- case IFT_IEEE1394: return NetworkInterface::NI_TYPE_IEEE1394;
-#endif
-#endif
- default: return NetworkInterface::NI_TYPE_OTHER;
-
+ return forName(name, IPv4_OR_IPv6);
+}
+
+
+NetworkInterface NetworkInterface::forName(const std::string& name, IPVersion ipVersion)
+{
+ Map map = NetworkInterface::map(false, false);
+ Map::const_iterator it = map.begin();
+ Map::const_iterator end = map.end();
+
+ for (; it != end; ++it)
+ {
+ if (it->second.name() == name)
+ {
+ if (ipVersion == IPv4_ONLY && it->second.supportsIPv4())
+ return it->second;
+ else if (ipVersion == IPv6_ONLY && it->second.supportsIPv6())
+ return it->second;
+ else if (ipVersion == IPv4_OR_IPv6)
+ return it->second;
+ }
+ }
+ throw InterfaceNotFoundException(name);
+}
+
+
+NetworkInterface NetworkInterface::forAddress(const IPAddress& addr)
+{
+ Map map = NetworkInterface::map(true, false);
+ Map::const_iterator it = map.begin();
+ Map::const_iterator end = map.end();
+
+ for (; it != end; ++it)
+ {
+ const std::size_t count = it->second.addressList().size();
+ for (int i = 0; i < count; ++i)
+ {
+ if (it->second.address(i) == addr)
+ return it->second;
+ }
+ }
+ throw InterfaceNotFoundException(addr.toString());
+}
+
+
+NetworkInterface NetworkInterface::forIndex(unsigned i)
+{
+ if (i != NetworkInterface::NO_INDEX)
+ {
+ Map map = NetworkInterface::map(false, false);
+ Map::const_iterator it = map.find(i);
+ if (it != map.end())
+ return it->second;
+ else
+ throw InterfaceNotFoundException("#" + NumberFormatter::format(i));
+ }
+ throw InterfaceNotFoundException("#" + NumberFormatter::format(i));
+}
+
+
+NetworkInterface::List NetworkInterface::list(bool ipOnly, bool upOnly)
+{
+ List list;
+ Map m = map(ipOnly, upOnly);
+ NetworkInterface::Map::const_iterator it = m.begin();
+ NetworkInterface::Map::const_iterator end = m.end();
+ for (; it != end; ++it)
+ {
+ int index = it->second.index();
+ std::string name = it->second.name();
+ std::string displayName = it->second.displayName();
+ std::string adapterName = it->second.adapterName();
+ NetworkInterface::MACAddress mac = it->second.macAddress();
+
+ typedef NetworkInterface::AddressList AddrList;
+ const AddrList& ipList = it->second.addressList();
+ if (ipList.size() > 0)
+ {
+ AddrList::const_iterator ipIt = ipList.begin();
+ AddrList::const_iterator ipEnd = ipList.end();
+ for(; ipIt != ipEnd; ++ipIt)
+ {
+ IPAddress addr = ipIt->get<NetworkInterface::IP_ADDRESS>();
+ IPAddress mask = ipIt->get<NetworkInterface::SUBNET_MASK>();
+ NetworkInterface ni;
+ if(mask.isWildcard())
+ {
+ ni = NetworkInterface(name, displayName, adapterName, addr, index, &mac);
+ }
+ else
+ {
+ IPAddress broadcast = ipIt->get<NetworkInterface::BROADCAST_ADDRESS>();
+ ni = NetworkInterface(name, displayName, adapterName, addr, mask, broadcast, index, &mac);
+ }
+
+ ni._pImpl->_broadcast = it->second._pImpl->_broadcast;
+ ni._pImpl->_loopback = it->second._pImpl->_loopback;
+ ni._pImpl->_multicast = it->second._pImpl->_multicast;
+ ni._pImpl->_pointToPoint = it->second._pImpl->_pointToPoint;
+ ni._pImpl->_up = it->second._pImpl->_up;
+ ni._pImpl->_running = it->second._pImpl->_running;
+ ni._pImpl->_mtu = it->second._pImpl->_mtu;
+ ni._pImpl->_type = it->second._pImpl->_type;
+
+ list.push_back(ni);
+ }
+ }
+ else
+ {
+ list.push_back(NetworkInterface(name, displayName, adapterName, index, &mac));
+ }
+ }
+
+ return list;
+}
+
+
+} } // namespace Poco::Net
+
+
+//
+// platform-specific code below
+//
+
+
+#if defined(POCO_OS_FAMILY_WINDOWS)
+//
+// Windows
+//
+
+
+#include "Poco/Buffer.h"
+#include <iterator>
+
+
+namespace Poco {
+namespace Net {
+
+
+namespace {
+
+
+IPAddress getBroadcastAddress(PIP_ADAPTER_PREFIX pPrefix, const IPAddress& addr, ULONG* pprefix = 0)
+ /// This function relies on (1) subnet prefix being at the position
+ /// immediately preceding and (2) broadcast address being at the position
+ /// immediately succeeding the IPv4 unicast address.
+ ///
+ /// Since there is no explicit guarantee on order, to ensure correctness,
+ /// the above constraints are checked prior to returning the result.
+ /// Additionally, on pre-Vista versions on Windows, the main structure does
+ /// not contain prefix length; for those platforms, this function
+ /// returns prefix through pprefix argument.
+{
+ PIP_ADAPTER_PREFIX pPrev = 0;
+ for (int i = 0; pPrefix; pPrefix = pPrefix->Next, ++i)
+ {
+ ADDRESS_FAMILY family = pPrefix->Address.lpSockaddr->sa_family;
+ if ((family == AF_INET) && (addr == IPAddress(pPrefix->Address)))
+ break;
+ pPrev = pPrefix;
+ }
+
+ if (pPrefix && pPrefix->Next && pPrev)
+ {
+ IPAddress ipPrefix(pPrev->PrefixLength, IPAddress::IPv4);
+ IPAddress mask(pPrefix->Next->Address);
+ if ((ipPrefix & mask) == (ipPrefix & addr))
+ {
+ if (pprefix) *pprefix = pPrefix->PrefixLength;
+ return IPAddress(pPrefix->Next->Address);
+ }
+ }
+
+ return IPAddress(IPAddress::IPv4);
+}
+
+
+NetworkInterface::Type fromNative(DWORD type)
+{
+ switch (type)
+ {
+ case IF_TYPE_ETHERNET_CSMACD: return NetworkInterface::NI_TYPE_ETHERNET_CSMACD;
+ case IF_TYPE_ISO88025_TOKENRING: return NetworkInterface::NI_TYPE_ISO88025_TOKENRING;
+ case IF_TYPE_FRAMERELAY: return NetworkInterface::NI_TYPE_FRAMERELAY;
+ case IF_TYPE_PPP: return NetworkInterface::NI_TYPE_PPP;
+ case IF_TYPE_SOFTWARE_LOOPBACK: return NetworkInterface::NI_TYPE_SOFTWARE_LOOPBACK;
+ case IF_TYPE_ATM: return NetworkInterface::NI_TYPE_ATM;
+ case IF_TYPE_IEEE80211: return NetworkInterface::NI_TYPE_IEEE80211;
+ case IF_TYPE_TUNNEL: return NetworkInterface::NI_TYPE_TUNNEL;
+ case IF_TYPE_IEEE1394: return NetworkInterface::NI_TYPE_IEEE1394;
+ default: return NetworkInterface::NI_TYPE_OTHER;
+ }
+}
+
+
+IPAddress subnetMaskForInterface(const std::string& name, bool isLoopback)
+{
+ if (isLoopback)
+ {
+ return IPAddress::parse("255.0.0.0");
+ }
+ else
+ {
+#if !defined(_WIN32_WCE)
+ std::string subKey("SYSTEM\\CurrentControlSet\\services\\Tcpip\\Parameters\\Interfaces\\");
+ subKey += name;
+ std::string netmask;
+ HKEY hKey;
+#if defined(POCO_WIN32_UTF8) && !defined(POCO_NO_WSTRING)
+ std::wstring usubKey;
+ Poco::UnicodeConverter::toUTF16(subKey, usubKey);
+ if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, usubKey.c_str(), 0, KEY_READ, &hKey) != ERROR_SUCCESS)
+ return IPAddress();
+ wchar_t unetmask[16];
+ DWORD size = sizeof(unetmask);
+ if (RegQueryValueExW(hKey, L"DhcpSubnetMask", NULL, NULL, (LPBYTE)&unetmask, &size) != ERROR_SUCCESS)
+ {
+ if (RegQueryValueExW(hKey, L"SubnetMask", NULL, NULL, (LPBYTE)&unetmask, &size) != ERROR_SUCCESS)
+ {
+ RegCloseKey(hKey);
+ return IPAddress();
+ }
+ }
+ Poco::UnicodeConverter::toUTF8(unetmask, netmask);
+#else
+ if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, subKey.c_str(), 0, KEY_READ, &hKey) != ERROR_SUCCESS)
+ return IPAddress();
+ char unetmask[16];
+ DWORD size = sizeof(unetmask);
+ if (RegQueryValueExA(hKey, "DhcpSubnetMask", NULL, NULL, (LPBYTE)&unetmask, &size) != ERROR_SUCCESS)
+ {
+ if (RegQueryValueExA(hKey, "SubnetMask", NULL, NULL, (LPBYTE)&unetmask, &size) != ERROR_SUCCESS)
+ {
+ RegCloseKey(hKey);
+ return IPAddress();
+ }
+ }
+ netmask = unetmask;
+#endif
+ RegCloseKey(hKey);
+ return IPAddress::parse(netmask);
+#else
+ return IPAddress();
+#endif // !defined(_WIN32_WCE)
+ }
+}
+
+
+} /// namespace
+
+
+NetworkInterface::Map NetworkInterface::map(bool ipOnly, bool upOnly)
+{
+ OSVERSIONINFO osvi;
+ ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
+ osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+ GetVersionEx(&osvi);
+
+ FastMutex::ScopedLock lock(_mutex);
+ Map result;
+ ULONG outBufLen = 16384;
+ Poco::Buffer<UCHAR> memory(outBufLen);
+ ULONG flags = (GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST | GAA_FLAG_SKIP_DNS_SERVER | GAA_FLAG_INCLUDE_PREFIX);
+#ifdef GAA_FLAG_INCLUDE_ALL_INTERFACES
+ flags |= GAA_FLAG_INCLUDE_ALL_INTERFACES;
+#endif
+#if defined(POCO_HAVE_IPv6)
+ const unsigned family = AF_UNSPEC; //IPv4 and IPv6
+#else
+ const unsigned family = AF_INET; //IPv4 only
+#endif
+ DWORD dwRetVal = 0;
+ ULONG iterations = 0;
+ PIP_ADAPTER_ADDRESSES pAddress = 0;
+ do
+ {
+ pAddress = reinterpret_cast<IP_ADAPTER_ADDRESSES*>(memory.begin()); // leave in the loop, begin may change after resize
+ poco_assert (memory.capacity() >= outBufLen);
+ if (ERROR_BUFFER_OVERFLOW == (dwRetVal = GetAdaptersAddresses(family, flags, 0, pAddress, &outBufLen)))
+ memory.resize(outBufLen, false); // adjust size and try again
+ else if (ERROR_NO_DATA == dwRetVal) // no network interfaces found
+ return result;
+ else if (NO_ERROR != dwRetVal) // error occurred
+ throw SystemException(format("An error occurred while trying to obtain list of network interfaces: [%s]", Error::getMessage(dwRetVal)));
+ else
+ break;
}
-}
-
-
-void setInterfaceParams(struct ifaddrs* iface, NetworkInterfaceImpl& impl)
-{
- struct sockaddr_dl* sdl = (struct sockaddr_dl*) iface->ifa_addr;
- impl.setName(iface->ifa_name);
- impl.setDisplayName(iface->ifa_name);
- impl.setAdapterName(iface->ifa_name);
- impl.setPhyParams();
-
- impl.setMACAddress(LLADDR(sdl), sdl->sdl_alen);
- impl.setType(fromNative(sdl->sdl_type));
-}
-
-
-} // namespace
-
-
-NetworkInterface::Map NetworkInterface::map(bool ipOnly, bool upOnly)
-{
- FastMutex::ScopedLock lock(_mutex);
- Map result;
- unsigned ifIndex = 0;
- NetworkInterface intf;
- Map::iterator ifIt;
-
- struct ifaddrs* ifaces = 0;
- struct ifaddrs* currIface = 0;
-
- if (getifaddrs(&ifaces) < 0)
- throw NetException("cannot get network adapter list");
-
- try
- {
- for (currIface = ifaces; currIface != 0; currIface = currIface->ifa_next)
- {
- if (!currIface->ifa_addr) continue;
-
- IPAddress address, subnetMask, broadcastAddress;
- unsigned family = currIface->ifa_addr->sa_family;
- switch (family)
- {
-#if defined(POCO_OS_FAMILY_BSD)
- case AF_LINK:
- {
- struct sockaddr_dl* sdl = (struct sockaddr_dl*) currIface->ifa_addr;
- ifIndex = sdl->sdl_index;
- intf = NetworkInterface(ifIndex);
- setInterfaceParams(currIface, intf.impl());
- if ((result.find(ifIndex) == result.end()) && ((upOnly && intf.isUp()) || !upOnly))
- ifIt = result.insert(Map::value_type(ifIndex, intf)).first;
- break;
- }
-#endif
- case AF_INET:
- ifIndex = if_nametoindex(currIface->ifa_name);
- ifIt = result.find(ifIndex);
- intf = NetworkInterface(ifIndex);
- setInterfaceParams(currIface, intf.impl());
- if ((ifIt == result.end()) && ((upOnly && intf.isUp()) || !upOnly))
- ifIt = result.insert(Map::value_type(ifIndex, intf)).first;
-
- address = IPAddress(*(currIface->ifa_addr));
-
- if (( currIface->ifa_flags & IFF_LOOPBACK ) == 0 && currIface->ifa_netmask)
- subnetMask = IPAddress(*(currIface->ifa_netmask));
-
- if (currIface->ifa_flags & IFF_BROADCAST && currIface->ifa_broadaddr)
- broadcastAddress = IPAddress(*(currIface->ifa_broadaddr));
- else if (currIface->ifa_flags & IFF_POINTOPOINT && currIface->ifa_dstaddr)
- broadcastAddress = IPAddress(*(currIface->ifa_dstaddr));
- else
- broadcastAddress = IPAddress();
- break;
-#if defined(POCO_HAVE_IPv6)
- case AF_INET6:
- ifIndex = if_nametoindex(currIface->ifa_name);
- ifIt = result.find(ifIndex);
- intf = NetworkInterface(ifIndex);
- setInterfaceParams(currIface, intf.impl());
- if ((ifIt == result.end()) && ((upOnly && intf.isUp()) || !upOnly))
- ifIt = result.insert(Map::value_type(ifIndex, intf)).first;
-
- address = IPAddress(&reinterpret_cast<const struct sockaddr_in6*>(currIface->ifa_addr)->sin6_addr,
- sizeof(struct in6_addr), ifIndex);
- subnetMask = IPAddress(*(currIface->ifa_netmask));
- broadcastAddress = IPAddress();
- break;
-#endif
- default:
- continue;
- }
-
- if (family == AF_INET
-#ifdef POCO_HAVE_IPv6
- || family == AF_INET6
-#endif
- )
- {
- if ((upOnly && intf.isUp()) || !upOnly)
- {
- if ((ifIt = result.find(ifIndex)) != result.end())
- ifIt->second.addAddress(address, subnetMask, broadcastAddress);
+ while ((ERROR_BUFFER_OVERFLOW == dwRetVal) && (++iterations <= 2));
+
+ poco_assert (NO_ERROR == dwRetVal);
+ for (; pAddress; pAddress = pAddress->Next)
+ {
+ IPAddress address;
+ IPAddress subnetMask;
+ IPAddress broadcastAddress;
+ unsigned ifIndex = 0;
+
+#if defined(POCO_HAVE_IPv6)
+ #if defined(_WIN32_WCE)
+ ifIndex = pAddress->Ipv6IfIndex;
+ #elif (_WIN32_WINNT >= 0x0501) && (NTDDI_VERSION >= 0x05010100) // Win XP SP1
+ #if defined (IP_ADAPTER_IPV6_ENABLED) // Vista
+ if(osvi.dwMajorVersion>=6)//vista
+ {
+ if ((pAddress->Flags & IP_ADAPTER_IPV6_ENABLED) &&
+ (osvi.dwMajorVersion >= 5) &&
+ (osvi.dwMinorVersion >= 1) &&
+ (osvi.dwBuildNumber >=1))
+ {
+ ifIndex = pAddress->Ipv6IfIndex;
+ }
+ }
+ else
+ {
+ if ((osvi.dwMajorVersion >= 5) &&
+ (osvi.dwMinorVersion >= 1) &&
+ (osvi.dwBuildNumber >= 1))
+ {
+ ifIndex = pAddress->Ipv6IfIndex;
+ }
+ }
+ #else // !defined(IP_ADAPTER_IPV6_ENABLED)
+ if ((osvi.dwMajorVersion >= 5) &&
+ (osvi.dwMinorVersion >= 1) &&
+ (osvi.dwBuildNumber >= 1))
+ {
+ ifIndex = pAddress->Ipv6IfIndex;
+ }
+ #endif // defined(IP_ADAPTER_IPV6_ENABLED)
+ #endif // (_WIN32_WINNT >= 0x0501) && (NTDDI_VERSION >= 0x05010100)
+#endif // POCO_HAVE_IPv6
+
+#if defined (IP_ADAPTER_IPV4_ENABLED)
+ if(osvi.dwMajorVersion>=6)
+ {//vista
+ if (pAddress->Flags & IP_ADAPTER_IPV4_ENABLED)
+ {
+ ifIndex = pAddress->IfIndex;
+ }
+ }
+ else
+ {
+ ifIndex = pAddress->IfIndex;
+ }
+#else // !IP_ADAPTER_IPV4_ENABLED
+ ifIndex = pAddress->IfIndex;
+#endif
+ if (ifIndex == 0) continue;
+
+ std::string name;
+ std::string displayName;
+ std::string adapterName(pAddress->AdapterName);
+#ifdef POCO_WIN32_UTF8
+ Poco::UnicodeConverter::toUTF8(pAddress->FriendlyName, name);
+ Poco::UnicodeConverter::toUTF8(pAddress->Description, displayName);
+#else
+ char nameBuffer[1024];
+ int rc = WideCharToMultiByte(CP_ACP, 0, pAddress->FriendlyName, -1, nameBuffer, sizeof(nameBuffer), NULL, NULL);
+ if (rc) name = nameBuffer;
+ char displayNameBuffer[1024];
+ rc = WideCharToMultiByte(CP_ACP, 0, pAddress->Description, -1, displayNameBuffer, sizeof(displayNameBuffer), NULL, NULL);
+ if (rc) displayName = displayNameBuffer;
+#endif
+
+ bool isUp = (pAddress->OperStatus == IfOperStatusUp);
+ bool isIP = (0 != pAddress->FirstUnicastAddress);
+ if (((ipOnly && isIP) || !ipOnly) && ((upOnly && isUp) || !upOnly))
+ {
+ NetworkInterface ni(name, displayName, adapterName, ifIndex);
+ // Create interface even if it has an empty list of addresses; also, set
+ // physical attributes which are protocol independent (name, media type,
+ // MAC address, MTU, operational status, etc).
+ Map::iterator ifIt = result.find(ifIndex);
+ if (ifIt == result.end())
+ ifIt = result.insert(Map::value_type(ifIndex, ni)).first;
+
+ ifIt->second.impl().setFlags(pAddress->Flags, pAddress->IfType);
+ ifIt->second.impl().setMTU(pAddress->Mtu);
+ ifIt->second.impl().setUp(pAddress->OperStatus == IfOperStatusUp);
+#if (_WIN32_WINNT >= 0x0600) // Vista and newer only
+ if ((osvi.dwMajorVersion >= 6) &&
+ (osvi.dwMinorVersion >= 0) &&
+ (osvi.dwBuildNumber >= 0))
+ {
+ ifIt->second.impl().setRunning(pAddress->ReceiveLinkSpeed > 0 || pAddress->TransmitLinkSpeed > 0);
+ }
+#endif
+ ifIt->second.impl().setType(fromNative(pAddress->IfType));
+ if (pAddress->PhysicalAddressLength)
+ ifIt->second.impl().setMACAddress(pAddress->PhysicalAddress, pAddress->PhysicalAddressLength);
+
+ for (PIP_ADAPTER_UNICAST_ADDRESS pUniAddr = pAddress->FirstUnicastAddress;
+ pUniAddr;
+ pUniAddr = pUniAddr->Next)
+ {
+ address = IPAddress(pUniAddr->Address);
+ ADDRESS_FAMILY family2 = pUniAddr->Address.lpSockaddr->sa_family;
+ switch (family2)
+ {
+ case AF_INET:
+ {
+ // Windows lists broadcast address on localhost
+ bool hasBroadcast = (pAddress->IfType == IF_TYPE_ETHERNET_CSMACD) || (pAddress->IfType == IF_TYPE_SOFTWARE_LOOPBACK) || (pAddress->IfType == IF_TYPE_IEEE80211);
+ if (hasBroadcast)
+ {
+ // On Windows, a valid broadcast address will be all 1's (== address | ~subnetMask); additionaly, on pre-Vista versions of
+ // OS, master address structure does not contain member for prefix length; we go an extra mile here in order to make sure
+ // we reflect the actual values held by system and protect against misconfiguration (e.g. bad DHCP config entry)
+ ULONG prefixLength = 0;
+#if defined(_WIN32_WCE)
+ #if _WIN32_WCE >= 0x0800
+ prefixLength = pUniAddr->OnLinkPrefixLength;
+ broadcastAddress = getBroadcastAddress(pAddress->FirstPrefix, address);
+ #else
+ broadcastAddress = getBroadcastAddress(pAddress->FirstPrefix, address, &prefixLength);
+ #endif
+ // if previous call did not do it, make last-ditch attempt for prefix and broadcast
+ if (prefixLength == 0 && pAddress->FirstPrefix)
+ prefixLength = pAddress->FirstPrefix->PrefixLength;
+ poco_assert (prefixLength <= 32);
+ if (broadcastAddress.isWildcard())
+ {
+ IPAddress mask(static_cast<unsigned>(prefixLength), IPAddress::IPv4);
+ IPAddress host(mask & address);
+ broadcastAddress = host | ~mask;
+ }
+#elif (_WIN32_WINNT >= 0x0501) && (NTDDI_VERSION >= 0x05010100) // Win XP SP1
+ #if (_WIN32_WINNT >= 0x0600) // Vista and newer
+ if (osvi.dwMajorVersion >= 6)
+ {
+ prefixLength = pUniAddr->OnLinkPrefixLength;
+ broadcastAddress = getBroadcastAddress(pAddress->FirstPrefix, address);
+ }
+ else
+ {
+ broadcastAddress = getBroadcastAddress(pAddress->FirstPrefix, address, &prefixLength);
+ }
+ #else
+ broadcastAddress = getBroadcastAddress(pAddress->FirstPrefix, address, &prefixLength);
+ #endif
+ poco_assert (prefixLength <= 32);
+ if (broadcastAddress.isWildcard())
+ {
+ IPAddress mask(static_cast<unsigned>(prefixLength), IPAddress::IPv4);
+ IPAddress host(mask & address);
+ broadcastAddress = host | ~mask;
+ }
+#endif // (_WIN32_WINNT >= 0x0501) && (NTDDI_VERSION >= 0x05010100)
+ if (prefixLength)
+ {
+ subnetMask = IPAddress(static_cast<unsigned>(prefixLength), IPAddress::IPv4);
+ }
+ else // if all of the above fails, look up the subnet mask in the registry
+ {
+ address = IPAddress(&reinterpret_cast<struct sockaddr_in*>(pUniAddr->Address.lpSockaddr)->sin_addr, sizeof(in_addr));
+ subnetMask = subnetMaskForInterface(name, address.isLoopback());
+ if (!address.isLoopback())
+ {
+ broadcastAddress = address;
+ broadcastAddress.mask(subnetMask, IPAddress::broadcast());
+ }
+ }
+ ifIt->second.addAddress(address, subnetMask, broadcastAddress);
+ }
+ else
+ {
+ ifIt->second.addAddress(address);
+ }
}
- }
- }
- }
- catch (...)
- {
- }
- if (ifaces) freeifaddrs(ifaces);
-
- if (ipOnly)
- {
- Map::iterator it = result.begin();
- Map::iterator end = result.end();
- for (; it != end;)
- {
- if (!it->second.supportsIPv4() && !it->second.supportsIPv6())
- result.erase(it++);
- else ++it;
- }
- }
-
- return result;
-}
-
-
-} } // namespace Poco::Net
-
-
-#elif POCO_OS == POCO_OS_LINUX || POCO_OS == POCO_OS_ANDROID
-//
-// Linux
-//
-
-
-#include <sys/types.h>
-#if POCO_OS != POCO_OS_ANDROID // Android doesn't have <ifaddrs.h>
-#include <ifaddrs.h>
-#endif
-#include <net/if.h>
-#ifndef POCO_NO_LINUX_IF_PACKET_H
-#include <linux/if_packet.h>
-#endif
-#include <net/if_arp.h>
-#include <iostream>
-
-namespace Poco {
-namespace Net {
-
-
-namespace {
-
-
-static NetworkInterface::Type fromNative(unsigned arphrd)
-{
- switch (arphrd)
- {
- case ARPHRD_ETHER: return NetworkInterface::NI_TYPE_ETHERNET_CSMACD;
- case ARPHRD_IEEE802: return NetworkInterface::NI_TYPE_ISO88025_TOKENRING;
- case ARPHRD_DLCI: return NetworkInterface::NI_TYPE_FRAMERELAY;
- case ARPHRD_PPP: return NetworkInterface::NI_TYPE_PPP;
- case ARPHRD_LOOPBACK: return NetworkInterface::NI_TYPE_SOFTWARE_LOOPBACK;
- case ARPHRD_ATM: return NetworkInterface::NI_TYPE_ATM;
- case ARPHRD_IEEE80211: return NetworkInterface::NI_TYPE_IEEE80211;
- case ARPHRD_TUNNEL:
- case ARPHRD_TUNNEL6: return NetworkInterface::NI_TYPE_TUNNEL;
- case ARPHRD_IEEE1394: return NetworkInterface::NI_TYPE_IEEE1394;
- default: return NetworkInterface::NI_TYPE_OTHER;
- }
-}
-
-#if POCO_OS != POCO_OS_ANDROID
-
-void setInterfaceParams(struct ifaddrs* iface, NetworkInterfaceImpl& impl)
-{
- impl.setName(iface->ifa_name);
- impl.setDisplayName(iface->ifa_name);
- impl.setAdapterName(iface->ifa_name);
- impl.setPhyParams();
-
-#ifndef POCO_NO_LINUX_IF_PACKET_H
- struct sockaddr_ll* sdl = (struct sockaddr_ll*) iface->ifa_addr;
- impl.setMACAddress(sdl->sll_addr, sdl->sll_halen);
- impl.setType(fromNative(sdl->sll_hatype));
-#else
- std::string ifPath("/sys/class/net/");
- ifPath += iface->ifa_name;
-
- std::string addrPath(ifPath);
- addrPath += "/address";
-
- std::ifstream addrStream(addrPath.c_str());
- if (addrStream.good())
- {
- std::string addr;
- std::getline(addrStream, addr);
- Poco::StringTokenizer tok(addr, ":");
- std::vector<unsigned char> mac;
- for (Poco::StringTokenizer::Iterator it = tok.begin(); it != tok.end(); ++it)
- {
- mac.push_back(static_cast<unsigned char>(Poco::NumberParser::parseHex(*it)));
- }
- impl.setMACAddress(&mac[0], mac.size());
- addrStream.close();
- }
-
- std::string typePath(ifPath);
- typePath += "/type";
- std::ifstream typeStream(typePath.c_str());
- if (typeStream.good())
- {
- int type;
- typeStream >> type;
- impl.setType(fromNative(type));
- typeStream.close();
- }
-#endif // POCO_NO_LINUX_IF_PACKET_H
-}
-
-#endif
-
-
-}
-
-
-NetworkInterface::Map NetworkInterface::map(bool ipOnly, bool upOnly)
-{
-#if POCO_OS != POCO_OS_ANDROID
- FastMutex::ScopedLock lock(_mutex);
- Map result;
- unsigned ifIndex = 0;
- NetworkInterface intf;
- Map::iterator ifIt;
-
- struct ifaddrs* ifaces = 0;
- struct ifaddrs* iface = 0;
-
- if (getifaddrs(&ifaces) < 0)
- throw NetException("cannot get network adapter list");
-
- try
- {
- for (iface = ifaces; iface; iface = iface->ifa_next)
- {
- if (!iface->ifa_addr) continue;
-
- IPAddress address, subnetMask, broadcastAddress;
- unsigned family = iface->ifa_addr->sa_family;
- switch (family)
- {
-#ifndef POCO_NO_LINUX_IF_PACKET_H
- case AF_PACKET:
- {
- struct sockaddr_ll* sll = (struct sockaddr_ll*)iface->ifa_addr;
- ifIndex = sll->sll_ifindex;
- intf = NetworkInterface(ifIndex);
- setInterfaceParams(iface, intf.impl());
-
- if ((result.find(ifIndex) == result.end()) && ((upOnly && intf.isUp()) || !upOnly))
- ifIt = result.insert(Map::value_type(ifIndex, intf)).first;
-
- break;
- }
-#endif // POCO_NO_LINUX_IF_PACKET_H
- case AF_INET:
- ifIndex = if_nametoindex(iface->ifa_name);
- ifIt = result.find(ifIndex);
- intf = NetworkInterface(ifIndex);
- setInterfaceParams(iface, intf.impl());
-
- if ((ifIt == result.end()) && ((upOnly && intf.isUp()) || !upOnly))
- ifIt = result.insert(Map::value_type(ifIndex, intf)).first;
-
- address = IPAddress(*(iface->ifa_addr));
- subnetMask = IPAddress(*(iface->ifa_netmask));
-
- if (iface->ifa_flags & IFF_BROADCAST && iface->ifa_broadaddr)
- broadcastAddress = IPAddress(*(iface->ifa_broadaddr));
- else if (iface->ifa_flags & IFF_POINTOPOINT && iface->ifa_dstaddr)
- broadcastAddress = IPAddress(*(iface->ifa_dstaddr));
- else
- broadcastAddress = IPAddress();
-
- break;
-#if defined(POCO_HAVE_IPv6)
- case AF_INET6:
- ifIndex = if_nametoindex(iface->ifa_name);
- ifIt = result.find(ifIndex);
- intf = NetworkInterface(ifIndex);
- setInterfaceParams(iface, intf.impl());
-
- if ((ifIt == result.end()) && ((upOnly && intf.isUp()) || !upOnly))
- result.insert(Map::value_type(ifIndex, intf));
-
- address = IPAddress(&reinterpret_cast<const struct sockaddr_in6*>(iface->ifa_addr)->sin6_addr, sizeof(struct in6_addr), ifIndex);
- subnetMask = IPAddress(*(iface->ifa_netmask));
- broadcastAddress = IPAddress();
-
- break;
-#endif
- default:
- continue;
- }
-
- if (family == AF_INET
-#ifdef POCO_HAVE_IPv6
- || family == AF_INET6
-#endif
- )
- {
- intf = NetworkInterface(std::string(iface->ifa_name), address, subnetMask, broadcastAddress, ifIndex);
- if ((upOnly && intf.isUp()) || !upOnly)
- {
- if ((ifIt = result.find(ifIndex)) != result.end())
- ifIt->second.addAddress(address, subnetMask, broadcastAddress);
- }
- }
- } // for interface
- }
- catch (...)
- {
- if (ifaces) freeifaddrs(ifaces);
- throw;
- }
-
- if (ifaces) freeifaddrs(ifaces);
-
- if (ipOnly)
- {
- Map::iterator it = result.begin();
- Map::iterator end = result.end();
- for (; it != end;)
- {
- if (!it->second.supportsIPv4() && !it->second.supportsIPv6())
- result.erase(it++);
- else ++it;
- }
- }
-
- return result;
-#else
- throw Poco::NotImplementedException("Not implemented in Android");
-#endif
-}
-
-
-} } // namespace Poco::Net
-
-
-#else
-//
-// Non-BSD Unix variants
-//
-#error TODO
-/*
-NetworkInterface::NetworkInterfaceList NetworkInterface::list()
-{
- FastMutex::ScopedLock lock(_mutex);
- NetworkInterfaceList result;
- DatagramSocket socket;
- // the following code is loosely based
- // on W. Richard Stevens, UNIX Network Programming, pp 434ff.
- int lastlen = 0;
- int len = 100*sizeof(struct ifreq);
- char* buf = 0;
- try
- {
- struct ifconf ifc;
- for (;;)
- {
- buf = new char[len];
- ifc.ifc_len = len;
- ifc.ifc_buf = buf;
- if (::ioctl(socket.impl()->sockfd(), SIOCGIFCONF, &ifc) < 0)
- {
- if (errno != EINVAL || lastlen != 0)
- throw NetException("cannot get network adapter list");
- }
- else
- {
- if (ifc.ifc_len == lastlen)
- break;
- lastlen = ifc.ifc_len;
- }
- len += 10*sizeof(struct ifreq);
- delete [] buf;
- }
- for (const char* ptr = buf; ptr < buf + ifc.ifc_len;)
- {
- const struct ifreq* ifr = reinterpret_cast<const struct ifreq*>(ptr);
-#if defined(POCO_HAVE_SALEN)
- len = ifr->ifr_addr.sa_len;
- if (sizeof(struct sockaddr) > len) len = sizeof(struct sockaddr);
-#else
- len = sizeof(struct sockaddr);
-#endif
- IPAddress addr;
- bool haveAddr = false;
- int ifIndex(-1);
- switch (ifr->ifr_addr.sa_family)
- {
-#if defined(POCO_HAVE_IPv6)
- case AF_INET6:
- ifIndex = if_nametoindex(ifr->ifr_name);
- if (len < sizeof(struct sockaddr_in6)) len = sizeof(struct sockaddr_in6);
- addr = IPAddress(&reinterpret_cast<const struct sockaddr_in6*>(&ifr->ifr_addr)->sin6_addr, sizeof(struct in6_addr), ifIndex);
- haveAddr = true;
- break;
-#endif
- case AF_INET:
- if (len < sizeof(struct sockaddr_in)) len = sizeof(struct sockaddr_in);
- addr = IPAddress(ifr->ifr_addr);
- haveAddr = true;
- break;
- default:
- break;
- }
- if (haveAddr)
- {
- std::string name(ifr->ifr_name);
- result.push_back(NetworkInterface(name, name, name, addr, ifIndex));
- }
- len += sizeof(ifr->ifr_name);
- ptr += len;
- }
- }
- catch (...)
- {
- delete [] buf;
- throw;
- }
- delete [] buf;
- return result;
-}
-*/
-
-} } // namespace Poco::Net
-
-
-#endif
-
-
-#endif // POCO_NET_HAS_INTERFACE
+ break;
+#if defined(POCO_HAVE_IPv6)
+ case AF_INET6:
+ ifIt->second.addAddress(address);
+ break;
+#endif
+ } // switch family
+ } // for addresses
+ } // if ipOnly/upOnly
+ } // for adapters
+ return result;
+}
+
+
+} } // namespace Poco::Net
+
+
+#elif defined(POCO_VXWORKS)
+//
+// VxWorks
+//
+
+#error TODO
+
+/*
+namespace Poco {
+namespace Net {
+
+
+NetworkInterface::NetworkInterfaceList NetworkInterface::list()
+{
+ FastMutex::ScopedLock lock(_mutex);
+ NetworkInterfaceList result;
+
+ int ifIndex = 1;
+ char ifName[32];
+ char ifAddr[INET_ADDR_LEN];
+
+ for (;;)
+ {
+ if (ifIndexToIfName(ifIndex, ifName) == OK)
+ {
+ std::string name(ifName);
+ IPAddress addr;
+ IPAddress mask;
+ IPAddress bcst;
+ if (ifAddrGet(ifName, ifAddr) == OK)
+ {
+ addr = IPAddress(std::string(ifAddr));
+ }
+ int ifMask;
+ if (ifMaskGet(ifName, &ifMask) == OK)
+ {
+ mask = IPAddress(&ifMask, sizeof(ifMask));
+ }
+ if (ifBroadcastGet(ifName, ifAddr) == OK)
+ {
+ bcst = IPAddress(std::string(ifAddr));
+ }
+ result.push_back(NetworkInterface(name, name, name, addr, mask, bcst));
+ ifIndex++;
+ }
+ else break;
+ }
+
+ return result;
+}
+
+
+} } // namespace Poco::Net
+*/
+
+#elif defined(POCO_OS_FAMILY_BSD) || (POCO_OS == POCO_OS_QNX) || (POCO_OS == POCO_OS_SOLARIS)
+//
+// BSD variants, QNX(?) and Solaris
+//
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <ifaddrs.h>
+#include <net/if.h>
+#include <net/if_dl.h>
+#ifndef POCO_NO_NET_IFTYPES
+#include <net/if_types.h>
+#endif
+
+
+namespace Poco {
+namespace Net {
+
+
+namespace {
+
+
+NetworkInterface::Type fromNative(u_char nativeType)
+{
+ switch (nativeType)
+ {
+#ifndef POCO_NO_NET_IFTYPES
+ case IFT_ETHER: return NetworkInterface::NI_TYPE_ETHERNET_CSMACD;
+ case IFT_ISO88025: return NetworkInterface::NI_TYPE_ISO88025_TOKENRING;
+ case IFT_FRELAY: return NetworkInterface::NI_TYPE_FRAMERELAY;
+ case IFT_PPP: return NetworkInterface::NI_TYPE_PPP;
+ case IFT_LOOP: return NetworkInterface::NI_TYPE_SOFTWARE_LOOPBACK;
+ case IFT_ATM: return NetworkInterface::NI_TYPE_ATM;
+#if (POCO_OS != POCO_OS_SOLARIS)
+ case IFT_IEEE1394: return NetworkInterface::NI_TYPE_IEEE1394;
+#endif
+#endif
+ default: return NetworkInterface::NI_TYPE_OTHER;
+
+ }
+}
+
+
+void setInterfaceParams(struct ifaddrs* iface, NetworkInterfaceImpl& impl)
+{
+ struct sockaddr_dl* sdl = (struct sockaddr_dl*) iface->ifa_addr;
+ impl.setName(iface->ifa_name);
+ impl.setDisplayName(iface->ifa_name);
+ impl.setAdapterName(iface->ifa_name);
+ impl.setPhyParams();
+
+ impl.setMACAddress(LLADDR(sdl), sdl->sdl_alen);
+ impl.setType(fromNative(sdl->sdl_type));
+}
+
+
+} // namespace
+
+
+NetworkInterface::Map NetworkInterface::map(bool ipOnly, bool upOnly)
+{
+ FastMutex::ScopedLock lock(_mutex);
+ Map result;
+ unsigned ifIndex = 0;
+ NetworkInterface intf;
+ Map::iterator ifIt;
+
+ struct ifaddrs* ifaces = 0;
+ struct ifaddrs* currIface = 0;
+
+ if (getifaddrs(&ifaces) < 0)
+ throw NetException("cannot get network adapter list");
+
+ try
+ {
+ for (currIface = ifaces; currIface != 0; currIface = currIface->ifa_next)
+ {
+ if (!currIface->ifa_addr) continue;
+
+ IPAddress address, subnetMask, broadcastAddress;
+ unsigned family = currIface->ifa_addr->sa_family;
+ switch (family)
+ {
+#if defined(POCO_OS_FAMILY_BSD)
+ case AF_LINK:
+ {
+ struct sockaddr_dl* sdl = (struct sockaddr_dl*) currIface->ifa_addr;
+ ifIndex = sdl->sdl_index;
+ intf = NetworkInterface(ifIndex);
+ setInterfaceParams(currIface, intf.impl());
+ if ((result.find(ifIndex) == result.end()) && ((upOnly && intf.isUp()) || !upOnly))
+ ifIt = result.insert(Map::value_type(ifIndex, intf)).first;
+ break;
+ }
+#endif
+ case AF_INET:
+ ifIndex = if_nametoindex(currIface->ifa_name);
+ ifIt = result.find(ifIndex);
+ intf = NetworkInterface(ifIndex);
+ setInterfaceParams(currIface, intf.impl());
+ if ((ifIt == result.end()) && ((upOnly && intf.isUp()) || !upOnly))
+ ifIt = result.insert(Map::value_type(ifIndex, intf)).first;
+
+ address = IPAddress(*(currIface->ifa_addr));
+
+ if (( currIface->ifa_flags & IFF_LOOPBACK ) == 0 && currIface->ifa_netmask)
+ subnetMask = IPAddress(*(currIface->ifa_netmask));
+
+ if (currIface->ifa_flags & IFF_BROADCAST && currIface->ifa_broadaddr)
+ broadcastAddress = IPAddress(*(currIface->ifa_broadaddr));
+ else if (currIface->ifa_flags & IFF_POINTOPOINT && currIface->ifa_dstaddr)
+ broadcastAddress = IPAddress(*(currIface->ifa_dstaddr));
+ else
+ broadcastAddress = IPAddress();
+ break;
+#if defined(POCO_HAVE_IPv6)
+ case AF_INET6:
+ ifIndex = if_nametoindex(currIface->ifa_name);
+ ifIt = result.find(ifIndex);
+ intf = NetworkInterface(ifIndex);
+ setInterfaceParams(currIface, intf.impl());
+ if ((ifIt == result.end()) && ((upOnly && intf.isUp()) || !upOnly))
+ ifIt = result.insert(Map::value_type(ifIndex, intf)).first;
+
+ address = IPAddress(&reinterpret_cast<const struct sockaddr_in6*>(currIface->ifa_addr)->sin6_addr,
+ sizeof(struct in6_addr), ifIndex);
+ subnetMask = IPAddress(*(currIface->ifa_netmask));
+ broadcastAddress = IPAddress();
+ break;
+#endif
+ default:
+ continue;
+ }
+
+ if (family == AF_INET
+#ifdef POCO_HAVE_IPv6
+ || family == AF_INET6
+#endif
+ )
+ {
+ if ((upOnly && intf.isUp()) || !upOnly)
+ {
+ if ((ifIt = result.find(ifIndex)) != result.end())
+ ifIt->second.addAddress(address, subnetMask, broadcastAddress);
+ }
+ }
+ }
+ }
+ catch (...)
+ {
+ }
+ if (ifaces) freeifaddrs(ifaces);
+
+ if (ipOnly)
+ {
+ Map::iterator it = result.begin();
+ Map::iterator end = result.end();
+ for (; it != end;)
+ {
+ if (!it->second.supportsIPv4() && !it->second.supportsIPv6())
+ result.erase(it++);
+ else ++it;
+ }
+ }
+
+ return result;
+}
+
+
+} } // namespace Poco::Net
+
+
+#elif POCO_OS == POCO_OS_LINUX || POCO_OS == POCO_OS_ANDROID
+//
+// Linux
+//
+
+
+#include <sys/types.h>
+#if POCO_OS != POCO_OS_ANDROID // Android doesn't have <ifaddrs.h>
+#include <ifaddrs.h>
+#endif
+#include <net/if.h>
+#ifndef POCO_NO_LINUX_IF_PACKET_H
+#include <linux/if_packet.h>
+#endif
+#include <net/if_arp.h>
+#include <iostream>
+
+namespace Poco {
+namespace Net {
+
+
+namespace {
+
+
+static NetworkInterface::Type fromNative(unsigned arphrd)
+{
+ switch (arphrd)
+ {
+ case ARPHRD_ETHER: return NetworkInterface::NI_TYPE_ETHERNET_CSMACD;
+ case ARPHRD_IEEE802: return NetworkInterface::NI_TYPE_ISO88025_TOKENRING;
+ case ARPHRD_DLCI: return NetworkInterface::NI_TYPE_FRAMERELAY;
+ case ARPHRD_PPP: return NetworkInterface::NI_TYPE_PPP;
+ case ARPHRD_LOOPBACK: return NetworkInterface::NI_TYPE_SOFTWARE_LOOPBACK;
+ case ARPHRD_ATM: return NetworkInterface::NI_TYPE_ATM;
+ case ARPHRD_IEEE80211: return NetworkInterface::NI_TYPE_IEEE80211;
+ case ARPHRD_TUNNEL:
+ case ARPHRD_TUNNEL6: return NetworkInterface::NI_TYPE_TUNNEL;
+ case ARPHRD_IEEE1394: return NetworkInterface::NI_TYPE_IEEE1394;
+ default: return NetworkInterface::NI_TYPE_OTHER;
+ }
+}
+
+#if POCO_OS != POCO_OS_ANDROID
+
+void setInterfaceParams(struct ifaddrs* iface, NetworkInterfaceImpl& impl)
+{
+ impl.setName(iface->ifa_name);
+ impl.setDisplayName(iface->ifa_name);
+ impl.setAdapterName(iface->ifa_name);
+ impl.setPhyParams();
+
+#ifndef POCO_NO_LINUX_IF_PACKET_H
+ struct sockaddr_ll* sdl = (struct sockaddr_ll*) iface->ifa_addr;
+ impl.setMACAddress(sdl->sll_addr, sdl->sll_halen);
+ impl.setType(fromNative(sdl->sll_hatype));
+#else
+ std::string ifPath("/sys/class/net/");
+ ifPath += iface->ifa_name;
+
+ std::string addrPath(ifPath);
+ addrPath += "/address";
+
+ std::ifstream addrStream(addrPath.c_str());
+ if (addrStream.good())
+ {
+ std::string addr;
+ std::getline(addrStream, addr);
+ Poco::StringTokenizer tok(addr, ":");
+ std::vector<unsigned char> mac;
+ for (Poco::StringTokenizer::Iterator it = tok.begin(); it != tok.end(); ++it)
+ {
+ mac.push_back(static_cast<unsigned char>(Poco::NumberParser::parseHex(*it)));
+ }
+ impl.setMACAddress(&mac[0], mac.size());
+ addrStream.close();
+ }
+
+ std::string typePath(ifPath);
+ typePath += "/type";
+ std::ifstream typeStream(typePath.c_str());
+ if (typeStream.good())
+ {
+ int type;
+ typeStream >> type;
+ impl.setType(fromNative(type));
+ typeStream.close();
+ }
+#endif // POCO_NO_LINUX_IF_PACKET_H
+}
+
+#endif
+
+
+}
+
+
+NetworkInterface::Map NetworkInterface::map(bool ipOnly, bool upOnly)
+{
+#if POCO_OS != POCO_OS_ANDROID
+ FastMutex::ScopedLock lock(_mutex);
+ Map result;
+ unsigned ifIndex = 0;
+ NetworkInterface intf;
+ Map::iterator ifIt;
+
+ struct ifaddrs* ifaces = 0;
+ struct ifaddrs* iface = 0;
+
+ if (getifaddrs(&ifaces) < 0)
+ throw NetException("cannot get network adapter list");
+
+ try
+ {
+ for (iface = ifaces; iface; iface = iface->ifa_next)
+ {
+ if (!iface->ifa_addr) continue;
+
+ IPAddress address, subnetMask, broadcastAddress;
+ unsigned family = iface->ifa_addr->sa_family;
+ switch (family)
+ {
+#ifndef POCO_NO_LINUX_IF_PACKET_H
+ case AF_PACKET:
+ {
+ struct sockaddr_ll* sll = (struct sockaddr_ll*)iface->ifa_addr;
+ ifIndex = sll->sll_ifindex;
+ intf = NetworkInterface(ifIndex);
+ setInterfaceParams(iface, intf.impl());
+
+ if ((result.find(ifIndex) == result.end()) && ((upOnly && intf.isUp()) || !upOnly))
+ ifIt = result.insert(Map::value_type(ifIndex, intf)).first;
+
+ break;
+ }
+#endif // POCO_NO_LINUX_IF_PACKET_H
+ case AF_INET:
+ ifIndex = if_nametoindex(iface->ifa_name);
+ ifIt = result.find(ifIndex);
+ intf = NetworkInterface(ifIndex);
+ setInterfaceParams(iface, intf.impl());
+
+ if ((ifIt == result.end()) && ((upOnly && intf.isUp()) || !upOnly))
+ ifIt = result.insert(Map::value_type(ifIndex, intf)).first;
+
+ address = IPAddress(*(iface->ifa_addr));
+ subnetMask = IPAddress(*(iface->ifa_netmask));
+
+ if (iface->ifa_flags & IFF_BROADCAST && iface->ifa_broadaddr)
+ broadcastAddress = IPAddress(*(iface->ifa_broadaddr));
+ else if (iface->ifa_flags & IFF_POINTOPOINT && iface->ifa_dstaddr)
+ broadcastAddress = IPAddress(*(iface->ifa_dstaddr));
+ else
+ broadcastAddress = IPAddress();
+
+ break;
+#if defined(POCO_HAVE_IPv6)
+ case AF_INET6:
+ ifIndex = if_nametoindex(iface->ifa_name);
+ ifIt = result.find(ifIndex);
+ intf = NetworkInterface(ifIndex);
+ setInterfaceParams(iface, intf.impl());
+
+ if ((ifIt == result.end()) && ((upOnly && intf.isUp()) || !upOnly))
+ result.insert(Map::value_type(ifIndex, intf));
+
+ address = IPAddress(&reinterpret_cast<const struct sockaddr_in6*>(iface->ifa_addr)->sin6_addr, sizeof(struct in6_addr), ifIndex);
+ subnetMask = IPAddress(*(iface->ifa_netmask));
+ broadcastAddress = IPAddress();
+
+ break;
+#endif
+ default:
+ continue;
+ }
+
+ if (family == AF_INET
+#ifdef POCO_HAVE_IPv6
+ || family == AF_INET6
+#endif
+ )
+ {
+ intf = NetworkInterface(std::string(iface->ifa_name), address, subnetMask, broadcastAddress, ifIndex);
+ if ((upOnly && intf.isUp()) || !upOnly)
+ {
+ if ((ifIt = result.find(ifIndex)) != result.end())
+ ifIt->second.addAddress(address, subnetMask, broadcastAddress);
+ }
+ }
+ } // for interface
+ }
+ catch (...)
+ {
+ if (ifaces) freeifaddrs(ifaces);
+ throw;
+ }
+
+ if (ifaces) freeifaddrs(ifaces);
+
+ if (ipOnly)
+ {
+ Map::iterator it = result.begin();
+ Map::iterator end = result.end();
+ for (; it != end;)
+ {
+ if (!it->second.supportsIPv4() && !it->second.supportsIPv6())
+ result.erase(it++);
+ else ++it;
+ }
+ }
+
+ return result;
+#else
+ throw Poco::NotImplementedException("Not implemented in Android");
+#endif
+}
+
+
+} } // namespace Poco::Net
+
+
+#else
+//
+// Non-BSD Unix variants
+//
+#error TODO
+/*
+NetworkInterface::NetworkInterfaceList NetworkInterface::list()
+{
+ FastMutex::ScopedLock lock(_mutex);
+ NetworkInterfaceList result;
+ DatagramSocket socket;
+ // the following code is loosely based
+ // on W. Richard Stevens, UNIX Network Programming, pp 434ff.
+ int lastlen = 0;
+ int len = 100*sizeof(struct ifreq);
+ char* buf = 0;
+ try
+ {
+ struct ifconf ifc;
+ for (;;)
+ {
+ buf = new char[len];
+ ifc.ifc_len = len;
+ ifc.ifc_buf = buf;
+ if (::ioctl(socket.impl()->sockfd(), SIOCGIFCONF, &ifc) < 0)
+ {
+ if (errno != EINVAL || lastlen != 0)
+ throw NetException("cannot get network adapter list");
+ }
+ else
+ {
+ if (ifc.ifc_len == lastlen)
+ break;
+ lastlen = ifc.ifc_len;
+ }
+ len += 10*sizeof(struct ifreq);
+ delete [] buf;
+ }
+ for (const char* ptr = buf; ptr < buf + ifc.ifc_len;)
+ {
+ const struct ifreq* ifr = reinterpret_cast<const struct ifreq*>(ptr);
+#if defined(POCO_HAVE_SALEN)
+ len = ifr->ifr_addr.sa_len;
+ if (sizeof(struct sockaddr) > len) len = sizeof(struct sockaddr);
+#else
+ len = sizeof(struct sockaddr);
+#endif
+ IPAddress addr;
+ bool haveAddr = false;
+ int ifIndex(-1);
+ switch (ifr->ifr_addr.sa_family)
+ {
+#if defined(POCO_HAVE_IPv6)
+ case AF_INET6:
+ ifIndex = if_nametoindex(ifr->ifr_name);
+ if (len < sizeof(struct sockaddr_in6)) len = sizeof(struct sockaddr_in6);
+ addr = IPAddress(&reinterpret_cast<const struct sockaddr_in6*>(&ifr->ifr_addr)->sin6_addr, sizeof(struct in6_addr), ifIndex);
+ haveAddr = true;
+ break;
+#endif
+ case AF_INET:
+ if (len < sizeof(struct sockaddr_in)) len = sizeof(struct sockaddr_in);
+ addr = IPAddress(ifr->ifr_addr);
+ haveAddr = true;
+ break;
+ default:
+ break;
+ }
+ if (haveAddr)
+ {
+ std::string name(ifr->ifr_name);
+ result.push_back(NetworkInterface(name, name, name, addr, ifIndex));
+ }
+ len += sizeof(ifr->ifr_name);
+ ptr += len;
+ }
+ }
+ catch (...)
+ {
+ delete [] buf;
+ throw;
+ }
+ delete [] buf;
+ return result;
+}
+*/
+
+} } // namespace Poco::Net
+
+
+#endif
+
+
+#endif // POCO_NET_HAS_INTERFACE
diff --git a/contrib/libs/poco/Net/src/NullPartHandler.cpp b/contrib/libs/poco/Net/src/NullPartHandler.cpp
index e7453a1c06..0a8cbf9794 100644
--- a/contrib/libs/poco/Net/src/NullPartHandler.cpp
+++ b/contrib/libs/poco/Net/src/NullPartHandler.cpp
@@ -1,46 +1,46 @@
-//
-// NullPartHandler.cpp
-//
-// Library: Net
-// Package: Messages
-// Module: NullPartHandler
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/NullPartHandler.h"
-#include "Poco/Net/MessageHeader.h"
-#include "Poco/NullStream.h"
-#include "Poco/StreamCopier.h"
-
-
-using Poco::NullOutputStream;
-using Poco::StreamCopier;
-
-
-namespace Poco {
-namespace Net {
-
-
-NullPartHandler::NullPartHandler()
-{
-}
-
-
-NullPartHandler::~NullPartHandler()
-{
-}
-
-
-void NullPartHandler::handlePart(const MessageHeader& /*header*/, std::istream& stream)
-{
- NullOutputStream ostr;
- StreamCopier::copyStream(stream, ostr);
-}
-
-
-} } // namespace Poco::Net
+//
+// NullPartHandler.cpp
+//
+// Library: Net
+// Package: Messages
+// Module: NullPartHandler
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/NullPartHandler.h"
+#include "Poco/Net/MessageHeader.h"
+#include "Poco/NullStream.h"
+#include "Poco/StreamCopier.h"
+
+
+using Poco::NullOutputStream;
+using Poco::StreamCopier;
+
+
+namespace Poco {
+namespace Net {
+
+
+NullPartHandler::NullPartHandler()
+{
+}
+
+
+NullPartHandler::~NullPartHandler()
+{
+}
+
+
+void NullPartHandler::handlePart(const MessageHeader& /*header*/, std::istream& stream)
+{
+ NullOutputStream ostr;
+ StreamCopier::copyStream(stream, ostr);
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/OAuth10Credentials.cpp b/contrib/libs/poco/Net/src/OAuth10Credentials.cpp
index 6588599782..71ec0f736b 100644
--- a/contrib/libs/poco/Net/src/OAuth10Credentials.cpp
+++ b/contrib/libs/poco/Net/src/OAuth10Credentials.cpp
@@ -1,365 +1,365 @@
-//
-// OAuth10Credentials.cpp
-//
-// Library: Net
-// Package: OAuth
-// Module: OAuth10Credentials
-//
-// Copyright (c) 2014, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/OAuth10Credentials.h"
-#include "Poco/Net/HTTPRequest.h"
-#include "Poco/Net/HTMLForm.h"
-#include "Poco/Net/NetException.h"
-#include "Poco/Net/HTTPAuthenticationParams.h"
-#include "Poco/SHA1Engine.h"
-#include "Poco/HMACEngine.h"
-#include "Poco/Base64Encoder.h"
-#include "Poco/RandomStream.h"
-#include "Poco/Timestamp.h"
-#include "Poco/NumberParser.h"
-#include "Poco/NumberFormatter.h"
-#include "Poco/Format.h"
-#include "Poco/String.h"
-#include <map>
-#include <sstream>
-
-
-namespace Poco {
-namespace Net {
-
-
-const std::string OAuth10Credentials::SCHEME = "OAuth";
-
-
-OAuth10Credentials::OAuth10Credentials()
-{
-}
-
-
-OAuth10Credentials::OAuth10Credentials(const std::string& consumerKey, const std::string& consumerSecret):
- _consumerKey(consumerKey),
- _consumerSecret(consumerSecret)
-{
-}
-
-
-OAuth10Credentials::OAuth10Credentials(const std::string& consumerKey, const std::string& consumerSecret, const std::string& token, const std::string& tokenSecret):
- _consumerKey(consumerKey),
- _consumerSecret(consumerSecret),
- _token(token),
- _tokenSecret(tokenSecret)
-{
-}
-
-
-OAuth10Credentials::OAuth10Credentials(const Poco::Net::HTTPRequest& request)
-{
- if (request.hasCredentials())
- {
- std::string authScheme;
- std::string authParams;
- request.getCredentials(authScheme, authParams);
- if (icompare(authScheme, SCHEME) == 0)
- {
- HTTPAuthenticationParams params(authParams);
- std::string consumerKey = params.get("oauth_consumer_key", "");
- URI::decode(consumerKey, _consumerKey);
- std::string token = params.get("oauth_token", "");
- URI::decode(token, _token);
- std::string callback = params.get("oauth_callback", "");
- URI::decode(callback, _callback);
- }
- else throw NotAuthenticatedException("No OAuth credentials in Authorization header", authScheme);
- }
- else throw NotAuthenticatedException("No Authorization header found");
-}
-
-
-OAuth10Credentials::~OAuth10Credentials()
-{
-}
-
-
-void OAuth10Credentials::setConsumerKey(const std::string& consumerKey)
-{
- _consumerKey = consumerKey;
-}
-
-
-void OAuth10Credentials::setConsumerSecret(const std::string& consumerSecret)
-{
- _consumerSecret = consumerSecret;
-}
-
-
-void OAuth10Credentials::setToken(const std::string& token)
-{
- _token = token;
-}
-
-
-void OAuth10Credentials::setTokenSecret(const std::string& tokenSecret)
-{
- _tokenSecret = tokenSecret;
-}
-
-
-void OAuth10Credentials::setRealm(const std::string& realm)
-{
- _realm = realm;
-}
-
-
-void OAuth10Credentials::setCallback(const std::string& callback)
-{
- _callback = callback;
-}
-
-
-void OAuth10Credentials::authenticate(HTTPRequest& request, const Poco::URI& uri, SignatureMethod method)
-{
- HTMLForm emptyParams;
- authenticate(request, uri, emptyParams, method);
-}
-
-
-void OAuth10Credentials::authenticate(HTTPRequest& request, const Poco::URI& uri, const Poco::Net::HTMLForm& params, SignatureMethod method)
-{
- if (method == SIGN_PLAINTEXT)
- {
- signPlaintext(request);
- }
- else
- {
- URI uriWithoutQuery(uri);
- uriWithoutQuery.setQuery("");
- uriWithoutQuery.setFragment("");
- signHMACSHA1(request, uriWithoutQuery.toString(), params);
- }
-}
-
-
-bool OAuth10Credentials::verify(const HTTPRequest& request, const Poco::URI& uri)
-{
- HTMLForm params;
- return verify(request, uri, params);
-}
-
-
-bool OAuth10Credentials::verify(const HTTPRequest& request, const Poco::URI& uri, const Poco::Net::HTMLForm& params)
-{
- if (request.hasCredentials())
- {
- std::string authScheme;
- std::string authParams;
- request.getCredentials(authScheme, authParams);
- if (icompare(authScheme, SCHEME) == 0)
- {
- HTTPAuthenticationParams oauthParams(authParams);
-
- std::string version = oauthParams.get("oauth_version", "1.0");
- if (version != "1.0") throw NotAuthenticatedException("Unsupported OAuth version", version);
-
- _consumerKey.clear();
- std::string consumerKey = oauthParams.get("oauth_consumer_key", "");
- URI::decode(consumerKey, _consumerKey);
-
- _token.clear();
- std::string token = oauthParams.get("oauth_token", "");
- URI::decode(token, _token);
-
- _callback.clear();
- std::string callback = oauthParams.get("oauth_callback", "");
- URI::decode(callback, _callback);
-
- std::string nonceEnc = oauthParams.get("oauth_nonce", "");
- std::string nonce;
- URI::decode(nonceEnc, nonce);
-
- std::string timestamp = oauthParams.get("oauth_timestamp", "");
-
- std::string method = oauthParams.get("oauth_signature_method", "");
-
- std::string signatureEnc = oauthParams.get("oauth_signature", "");
- std::string signature;
- URI::decode(signatureEnc, signature);
-
- std::string refSignature;
- if (icompare(method, "PLAINTEXT") == 0)
- {
- refSignature = percentEncode(_consumerSecret);
- refSignature += '&';
- refSignature += percentEncode(_tokenSecret);
- }
- else if (icompare(method, "HMAC-SHA1") == 0)
- {
- URI uriWithoutQuery(uri);
- uriWithoutQuery.setQuery("");
- uriWithoutQuery.setFragment("");
- refSignature = createSignature(request, uriWithoutQuery.toString(), params, nonce, timestamp);
- }
- else throw NotAuthenticatedException("Unsupported OAuth signature method", method);
-
- return refSignature == signature;
- }
- else throw NotAuthenticatedException("No OAuth credentials found in Authorization header");
- }
- else throw NotAuthenticatedException("No Authorization header found");
-}
-
-
-void OAuth10Credentials::nonceAndTimestampForTesting(const std::string& nonce, const std::string& timestamp)
-{
- _nonce = nonce;
- _timestamp = timestamp;
-}
-
-
-void OAuth10Credentials::signPlaintext(Poco::Net::HTTPRequest& request) const
-{
- std::string signature(percentEncode(_consumerSecret));
- signature += '&';
- signature += percentEncode(_tokenSecret);
-
- std::string authorization(SCHEME);
- if (!_realm.empty())
- {
- Poco::format(authorization, " realm=\"%s\",", _realm);
- }
- Poco::format(authorization, " oauth_consumer_key=\"%s\"", percentEncode(_consumerKey));
- Poco::format(authorization, ", oauth_signature=\"%s\"", percentEncode(signature));
- authorization += ", oauth_signature_method=\"PLAINTEXT\"";
- if (!_token.empty())
- {
- Poco::format(authorization, ", oauth_token=\"%s\"", percentEncode(_token));
- }
- if (!_callback.empty())
- {
- Poco::format(authorization, ", oauth_callback=\"%s\"", percentEncode(_callback));
- }
- authorization += ", oauth_version=\"1.0\"";
-
- request.set(HTTPRequest::AUTHORIZATION, authorization);
-}
-
-
-void OAuth10Credentials::signHMACSHA1(Poco::Net::HTTPRequest& request, const std::string& uri, const Poco::Net::HTMLForm& params) const
-{
- std::string nonce(_nonce);
- if (nonce.empty())
- {
- nonce = createNonce();
- }
- std::string timestamp(_timestamp);
- if (timestamp.empty())
- {
- timestamp = Poco::NumberFormatter::format(Poco::Timestamp().epochTime());
- }
- std::string signature(createSignature(request, uri, params, nonce, timestamp));
-
- std::string authorization(SCHEME);
- if (!_realm.empty())
- {
- Poco::format(authorization, " realm=\"%s\",", _realm);
- }
- Poco::format(authorization, " oauth_consumer_key=\"%s\"", percentEncode(_consumerKey));
- Poco::format(authorization, ", oauth_nonce=\"%s\"", percentEncode(nonce));
- Poco::format(authorization, ", oauth_signature=\"%s\"", percentEncode(signature));
- authorization += ", oauth_signature_method=\"HMAC-SHA1\"";
- Poco::format(authorization, ", oauth_timestamp=\"%s\"", timestamp);
- if (!_token.empty())
- {
- Poco::format(authorization, ", oauth_token=\"%s\"", percentEncode(_token));
- }
- if (!_callback.empty())
- {
- Poco::format(authorization, ", oauth_callback=\"%s\"", percentEncode(_callback));
- }
- authorization += ", oauth_version=\"1.0\"";
-
- request.set(HTTPRequest::AUTHORIZATION, authorization);
-}
-
-
-std::string OAuth10Credentials::createNonce() const
-{
- std::ostringstream base64Nonce;
- Poco::Base64Encoder base64Encoder(base64Nonce);
- Poco::RandomInputStream randomStream;
- for (int i = 0; i < 32; i++)
- {
- base64Encoder.put(static_cast<char>(randomStream.get()));
- }
- base64Encoder.close();
- std::string nonce = base64Nonce.str();
- return Poco::translate(nonce, "+/=", "");
-}
-
-
-std::string OAuth10Credentials::createSignature(const Poco::Net::HTTPRequest& request, const std::string& uri, const Poco::Net::HTMLForm& params, const std::string& nonce, const std::string& timestamp) const
-{
- std::map<std::string, std::string> paramsMap;
- paramsMap["oauth_version"] = "1.0";
- paramsMap["oauth_consumer_key"] = percentEncode(_consumerKey);
- paramsMap["oauth_nonce"] = percentEncode(nonce);
- paramsMap["oauth_signature_method"] = "HMAC-SHA1";
- paramsMap["oauth_timestamp"] = timestamp;
- if (!_token.empty())
- {
- paramsMap["oauth_token"] = percentEncode(_token);
- }
- if (!_callback.empty())
- {
- paramsMap["oauth_callback"] = percentEncode(_callback);
- }
- for (Poco::Net::HTMLForm::ConstIterator it = params.begin(); it != params.end(); ++it)
- {
- paramsMap[percentEncode(it->first)] = percentEncode(it->second);
- }
-
- std::string paramsString;
- for (std::map<std::string, std::string>::const_iterator it = paramsMap.begin(); it != paramsMap.end(); ++it)
- {
- if (it != paramsMap.begin()) paramsString += '&';
- paramsString += it->first;
- paramsString += "=";
- paramsString += it->second;
- }
-
- std::string signatureBase = request.getMethod();
- signatureBase += '&';
- signatureBase += percentEncode(uri);
- signatureBase += '&';
- signatureBase += percentEncode(paramsString);
-
- std::string signingKey;
- signingKey += percentEncode(_consumerSecret);
- signingKey += '&';
- signingKey += percentEncode(_tokenSecret);
-
- Poco::HMACEngine<Poco::SHA1Engine> hmacEngine(signingKey);
- hmacEngine.update(signatureBase);
- Poco::DigestEngine::Digest digest = hmacEngine.digest();
- std::ostringstream digestBase64;
- Poco::Base64Encoder base64Encoder(digestBase64);
- base64Encoder.write(reinterpret_cast<char*>(&digest[0]), digest.size());
- base64Encoder.close();
- return digestBase64.str();
-}
-
-
-std::string OAuth10Credentials::percentEncode(const std::string& str)
-{
- std::string encoded;
- Poco::URI::encode(str, "!?#/'\",;:$&()[]*+=@", encoded);
- return encoded;
-}
-
-
-} } // namespace Poco::Net
+//
+// OAuth10Credentials.cpp
+//
+// Library: Net
+// Package: OAuth
+// Module: OAuth10Credentials
+//
+// Copyright (c) 2014, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/OAuth10Credentials.h"
+#include "Poco/Net/HTTPRequest.h"
+#include "Poco/Net/HTMLForm.h"
+#include "Poco/Net/NetException.h"
+#include "Poco/Net/HTTPAuthenticationParams.h"
+#include "Poco/SHA1Engine.h"
+#include "Poco/HMACEngine.h"
+#include "Poco/Base64Encoder.h"
+#include "Poco/RandomStream.h"
+#include "Poco/Timestamp.h"
+#include "Poco/NumberParser.h"
+#include "Poco/NumberFormatter.h"
+#include "Poco/Format.h"
+#include "Poco/String.h"
+#include <map>
+#include <sstream>
+
+
+namespace Poco {
+namespace Net {
+
+
+const std::string OAuth10Credentials::SCHEME = "OAuth";
+
+
+OAuth10Credentials::OAuth10Credentials()
+{
+}
+
+
+OAuth10Credentials::OAuth10Credentials(const std::string& consumerKey, const std::string& consumerSecret):
+ _consumerKey(consumerKey),
+ _consumerSecret(consumerSecret)
+{
+}
+
+
+OAuth10Credentials::OAuth10Credentials(const std::string& consumerKey, const std::string& consumerSecret, const std::string& token, const std::string& tokenSecret):
+ _consumerKey(consumerKey),
+ _consumerSecret(consumerSecret),
+ _token(token),
+ _tokenSecret(tokenSecret)
+{
+}
+
+
+OAuth10Credentials::OAuth10Credentials(const Poco::Net::HTTPRequest& request)
+{
+ if (request.hasCredentials())
+ {
+ std::string authScheme;
+ std::string authParams;
+ request.getCredentials(authScheme, authParams);
+ if (icompare(authScheme, SCHEME) == 0)
+ {
+ HTTPAuthenticationParams params(authParams);
+ std::string consumerKey = params.get("oauth_consumer_key", "");
+ URI::decode(consumerKey, _consumerKey);
+ std::string token = params.get("oauth_token", "");
+ URI::decode(token, _token);
+ std::string callback = params.get("oauth_callback", "");
+ URI::decode(callback, _callback);
+ }
+ else throw NotAuthenticatedException("No OAuth credentials in Authorization header", authScheme);
+ }
+ else throw NotAuthenticatedException("No Authorization header found");
+}
+
+
+OAuth10Credentials::~OAuth10Credentials()
+{
+}
+
+
+void OAuth10Credentials::setConsumerKey(const std::string& consumerKey)
+{
+ _consumerKey = consumerKey;
+}
+
+
+void OAuth10Credentials::setConsumerSecret(const std::string& consumerSecret)
+{
+ _consumerSecret = consumerSecret;
+}
+
+
+void OAuth10Credentials::setToken(const std::string& token)
+{
+ _token = token;
+}
+
+
+void OAuth10Credentials::setTokenSecret(const std::string& tokenSecret)
+{
+ _tokenSecret = tokenSecret;
+}
+
+
+void OAuth10Credentials::setRealm(const std::string& realm)
+{
+ _realm = realm;
+}
+
+
+void OAuth10Credentials::setCallback(const std::string& callback)
+{
+ _callback = callback;
+}
+
+
+void OAuth10Credentials::authenticate(HTTPRequest& request, const Poco::URI& uri, SignatureMethod method)
+{
+ HTMLForm emptyParams;
+ authenticate(request, uri, emptyParams, method);
+}
+
+
+void OAuth10Credentials::authenticate(HTTPRequest& request, const Poco::URI& uri, const Poco::Net::HTMLForm& params, SignatureMethod method)
+{
+ if (method == SIGN_PLAINTEXT)
+ {
+ signPlaintext(request);
+ }
+ else
+ {
+ URI uriWithoutQuery(uri);
+ uriWithoutQuery.setQuery("");
+ uriWithoutQuery.setFragment("");
+ signHMACSHA1(request, uriWithoutQuery.toString(), params);
+ }
+}
+
+
+bool OAuth10Credentials::verify(const HTTPRequest& request, const Poco::URI& uri)
+{
+ HTMLForm params;
+ return verify(request, uri, params);
+}
+
+
+bool OAuth10Credentials::verify(const HTTPRequest& request, const Poco::URI& uri, const Poco::Net::HTMLForm& params)
+{
+ if (request.hasCredentials())
+ {
+ std::string authScheme;
+ std::string authParams;
+ request.getCredentials(authScheme, authParams);
+ if (icompare(authScheme, SCHEME) == 0)
+ {
+ HTTPAuthenticationParams oauthParams(authParams);
+
+ std::string version = oauthParams.get("oauth_version", "1.0");
+ if (version != "1.0") throw NotAuthenticatedException("Unsupported OAuth version", version);
+
+ _consumerKey.clear();
+ std::string consumerKey = oauthParams.get("oauth_consumer_key", "");
+ URI::decode(consumerKey, _consumerKey);
+
+ _token.clear();
+ std::string token = oauthParams.get("oauth_token", "");
+ URI::decode(token, _token);
+
+ _callback.clear();
+ std::string callback = oauthParams.get("oauth_callback", "");
+ URI::decode(callback, _callback);
+
+ std::string nonceEnc = oauthParams.get("oauth_nonce", "");
+ std::string nonce;
+ URI::decode(nonceEnc, nonce);
+
+ std::string timestamp = oauthParams.get("oauth_timestamp", "");
+
+ std::string method = oauthParams.get("oauth_signature_method", "");
+
+ std::string signatureEnc = oauthParams.get("oauth_signature", "");
+ std::string signature;
+ URI::decode(signatureEnc, signature);
+
+ std::string refSignature;
+ if (icompare(method, "PLAINTEXT") == 0)
+ {
+ refSignature = percentEncode(_consumerSecret);
+ refSignature += '&';
+ refSignature += percentEncode(_tokenSecret);
+ }
+ else if (icompare(method, "HMAC-SHA1") == 0)
+ {
+ URI uriWithoutQuery(uri);
+ uriWithoutQuery.setQuery("");
+ uriWithoutQuery.setFragment("");
+ refSignature = createSignature(request, uriWithoutQuery.toString(), params, nonce, timestamp);
+ }
+ else throw NotAuthenticatedException("Unsupported OAuth signature method", method);
+
+ return refSignature == signature;
+ }
+ else throw NotAuthenticatedException("No OAuth credentials found in Authorization header");
+ }
+ else throw NotAuthenticatedException("No Authorization header found");
+}
+
+
+void OAuth10Credentials::nonceAndTimestampForTesting(const std::string& nonce, const std::string& timestamp)
+{
+ _nonce = nonce;
+ _timestamp = timestamp;
+}
+
+
+void OAuth10Credentials::signPlaintext(Poco::Net::HTTPRequest& request) const
+{
+ std::string signature(percentEncode(_consumerSecret));
+ signature += '&';
+ signature += percentEncode(_tokenSecret);
+
+ std::string authorization(SCHEME);
+ if (!_realm.empty())
+ {
+ Poco::format(authorization, " realm=\"%s\",", _realm);
+ }
+ Poco::format(authorization, " oauth_consumer_key=\"%s\"", percentEncode(_consumerKey));
+ Poco::format(authorization, ", oauth_signature=\"%s\"", percentEncode(signature));
+ authorization += ", oauth_signature_method=\"PLAINTEXT\"";
+ if (!_token.empty())
+ {
+ Poco::format(authorization, ", oauth_token=\"%s\"", percentEncode(_token));
+ }
+ if (!_callback.empty())
+ {
+ Poco::format(authorization, ", oauth_callback=\"%s\"", percentEncode(_callback));
+ }
+ authorization += ", oauth_version=\"1.0\"";
+
+ request.set(HTTPRequest::AUTHORIZATION, authorization);
+}
+
+
+void OAuth10Credentials::signHMACSHA1(Poco::Net::HTTPRequest& request, const std::string& uri, const Poco::Net::HTMLForm& params) const
+{
+ std::string nonce(_nonce);
+ if (nonce.empty())
+ {
+ nonce = createNonce();
+ }
+ std::string timestamp(_timestamp);
+ if (timestamp.empty())
+ {
+ timestamp = Poco::NumberFormatter::format(Poco::Timestamp().epochTime());
+ }
+ std::string signature(createSignature(request, uri, params, nonce, timestamp));
+
+ std::string authorization(SCHEME);
+ if (!_realm.empty())
+ {
+ Poco::format(authorization, " realm=\"%s\",", _realm);
+ }
+ Poco::format(authorization, " oauth_consumer_key=\"%s\"", percentEncode(_consumerKey));
+ Poco::format(authorization, ", oauth_nonce=\"%s\"", percentEncode(nonce));
+ Poco::format(authorization, ", oauth_signature=\"%s\"", percentEncode(signature));
+ authorization += ", oauth_signature_method=\"HMAC-SHA1\"";
+ Poco::format(authorization, ", oauth_timestamp=\"%s\"", timestamp);
+ if (!_token.empty())
+ {
+ Poco::format(authorization, ", oauth_token=\"%s\"", percentEncode(_token));
+ }
+ if (!_callback.empty())
+ {
+ Poco::format(authorization, ", oauth_callback=\"%s\"", percentEncode(_callback));
+ }
+ authorization += ", oauth_version=\"1.0\"";
+
+ request.set(HTTPRequest::AUTHORIZATION, authorization);
+}
+
+
+std::string OAuth10Credentials::createNonce() const
+{
+ std::ostringstream base64Nonce;
+ Poco::Base64Encoder base64Encoder(base64Nonce);
+ Poco::RandomInputStream randomStream;
+ for (int i = 0; i < 32; i++)
+ {
+ base64Encoder.put(static_cast<char>(randomStream.get()));
+ }
+ base64Encoder.close();
+ std::string nonce = base64Nonce.str();
+ return Poco::translate(nonce, "+/=", "");
+}
+
+
+std::string OAuth10Credentials::createSignature(const Poco::Net::HTTPRequest& request, const std::string& uri, const Poco::Net::HTMLForm& params, const std::string& nonce, const std::string& timestamp) const
+{
+ std::map<std::string, std::string> paramsMap;
+ paramsMap["oauth_version"] = "1.0";
+ paramsMap["oauth_consumer_key"] = percentEncode(_consumerKey);
+ paramsMap["oauth_nonce"] = percentEncode(nonce);
+ paramsMap["oauth_signature_method"] = "HMAC-SHA1";
+ paramsMap["oauth_timestamp"] = timestamp;
+ if (!_token.empty())
+ {
+ paramsMap["oauth_token"] = percentEncode(_token);
+ }
+ if (!_callback.empty())
+ {
+ paramsMap["oauth_callback"] = percentEncode(_callback);
+ }
+ for (Poco::Net::HTMLForm::ConstIterator it = params.begin(); it != params.end(); ++it)
+ {
+ paramsMap[percentEncode(it->first)] = percentEncode(it->second);
+ }
+
+ std::string paramsString;
+ for (std::map<std::string, std::string>::const_iterator it = paramsMap.begin(); it != paramsMap.end(); ++it)
+ {
+ if (it != paramsMap.begin()) paramsString += '&';
+ paramsString += it->first;
+ paramsString += "=";
+ paramsString += it->second;
+ }
+
+ std::string signatureBase = request.getMethod();
+ signatureBase += '&';
+ signatureBase += percentEncode(uri);
+ signatureBase += '&';
+ signatureBase += percentEncode(paramsString);
+
+ std::string signingKey;
+ signingKey += percentEncode(_consumerSecret);
+ signingKey += '&';
+ signingKey += percentEncode(_tokenSecret);
+
+ Poco::HMACEngine<Poco::SHA1Engine> hmacEngine(signingKey);
+ hmacEngine.update(signatureBase);
+ Poco::DigestEngine::Digest digest = hmacEngine.digest();
+ std::ostringstream digestBase64;
+ Poco::Base64Encoder base64Encoder(digestBase64);
+ base64Encoder.write(reinterpret_cast<char*>(&digest[0]), digest.size());
+ base64Encoder.close();
+ return digestBase64.str();
+}
+
+
+std::string OAuth10Credentials::percentEncode(const std::string& str)
+{
+ std::string encoded;
+ Poco::URI::encode(str, "!?#/'\",;:$&()[]*+=@", encoded);
+ return encoded;
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/OAuth20Credentials.cpp b/contrib/libs/poco/Net/src/OAuth20Credentials.cpp
index 4c95e2b71f..392115ad5f 100644
--- a/contrib/libs/poco/Net/src/OAuth20Credentials.cpp
+++ b/contrib/libs/poco/Net/src/OAuth20Credentials.cpp
@@ -1,105 +1,105 @@
-//
-// OAuth20Credentials.cpp
-//
-// Library: Net
-// Package: OAuth
-// Module: OAuth20Credentials
-//
-// Copyright (c) 2014, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/OAuth20Credentials.h"
-#include "Poco/Net/HTTPRequest.h"
-#include "Poco/Net/NetException.h"
-#include "Poco/String.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-const std::string OAuth20Credentials::SCHEME = "Bearer";
-
-
-OAuth20Credentials::OAuth20Credentials():
- _scheme(SCHEME)
-{
-}
-
-
-OAuth20Credentials::OAuth20Credentials(const std::string& bearerToken):
- _bearerToken(bearerToken),
- _scheme(SCHEME)
-{
-}
-
-
-OAuth20Credentials::OAuth20Credentials(const std::string& bearerToken, const std::string& scheme):
- _bearerToken(bearerToken),
- _scheme(scheme)
-{
-}
-
-
-OAuth20Credentials::OAuth20Credentials(const HTTPRequest& request):
- _scheme(SCHEME)
-{
- extractBearerToken(request);
-}
-
-
-OAuth20Credentials::OAuth20Credentials(const HTTPRequest& request, const std::string& scheme):
- _scheme(scheme)
-{
- extractBearerToken(request);
-}
-
-
-OAuth20Credentials::~OAuth20Credentials()
-{
-}
-
-
-void OAuth20Credentials::setBearerToken(const std::string& bearerToken)
-{
- _bearerToken = bearerToken;
-}
-
-
-void OAuth20Credentials::setScheme(const std::string& scheme)
-{
- _scheme = scheme;
-}
-
-
-void OAuth20Credentials::authenticate(HTTPRequest& request)
-{
- std::string auth(_scheme);
- auth += ' ';
- auth += _bearerToken;
- request.set(HTTPRequest::AUTHORIZATION, auth);
-}
-
-
-void OAuth20Credentials::extractBearerToken(const HTTPRequest& request)
-{
- if (request.hasCredentials())
- {
- std::string authScheme;
- std::string authInfo;
- request.getCredentials(authScheme, authInfo);
- if (icompare(authScheme, _scheme) == 0)
- {
- _bearerToken = authInfo;
- }
- else throw NotAuthenticatedException("No bearer token in Authorization header", authScheme);
- }
- else throw NotAuthenticatedException("No Authorization header found");
-}
-
-
-} } // namespace Poco::Net
+//
+// OAuth20Credentials.cpp
+//
+// Library: Net
+// Package: OAuth
+// Module: OAuth20Credentials
+//
+// Copyright (c) 2014, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/OAuth20Credentials.h"
+#include "Poco/Net/HTTPRequest.h"
+#include "Poco/Net/NetException.h"
+#include "Poco/String.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+const std::string OAuth20Credentials::SCHEME = "Bearer";
+
+
+OAuth20Credentials::OAuth20Credentials():
+ _scheme(SCHEME)
+{
+}
+
+
+OAuth20Credentials::OAuth20Credentials(const std::string& bearerToken):
+ _bearerToken(bearerToken),
+ _scheme(SCHEME)
+{
+}
+
+
+OAuth20Credentials::OAuth20Credentials(const std::string& bearerToken, const std::string& scheme):
+ _bearerToken(bearerToken),
+ _scheme(scheme)
+{
+}
+
+
+OAuth20Credentials::OAuth20Credentials(const HTTPRequest& request):
+ _scheme(SCHEME)
+{
+ extractBearerToken(request);
+}
+
+
+OAuth20Credentials::OAuth20Credentials(const HTTPRequest& request, const std::string& scheme):
+ _scheme(scheme)
+{
+ extractBearerToken(request);
+}
+
+
+OAuth20Credentials::~OAuth20Credentials()
+{
+}
+
+
+void OAuth20Credentials::setBearerToken(const std::string& bearerToken)
+{
+ _bearerToken = bearerToken;
+}
+
+
+void OAuth20Credentials::setScheme(const std::string& scheme)
+{
+ _scheme = scheme;
+}
+
+
+void OAuth20Credentials::authenticate(HTTPRequest& request)
+{
+ std::string auth(_scheme);
+ auth += ' ';
+ auth += _bearerToken;
+ request.set(HTTPRequest::AUTHORIZATION, auth);
+}
+
+
+void OAuth20Credentials::extractBearerToken(const HTTPRequest& request)
+{
+ if (request.hasCredentials())
+ {
+ std::string authScheme;
+ std::string authInfo;
+ request.getCredentials(authScheme, authInfo);
+ if (icompare(authScheme, _scheme) == 0)
+ {
+ _bearerToken = authInfo;
+ }
+ else throw NotAuthenticatedException("No bearer token in Authorization header", authScheme);
+ }
+ else throw NotAuthenticatedException("No Authorization header found");
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/POP3ClientSession.cpp b/contrib/libs/poco/Net/src/POP3ClientSession.cpp
index d6936c9991..159f2108c5 100644
--- a/contrib/libs/poco/Net/src/POP3ClientSession.cpp
+++ b/contrib/libs/poco/Net/src/POP3ClientSession.cpp
@@ -1,280 +1,280 @@
-//
-// POP3ClientSession.cpp
-//
-// Library: Net
-// Package: Mail
-// Module: POP3ClientSession
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/POP3ClientSession.h"
-#include "Poco/Net/MailMessage.h"
-#include "Poco/Net/MailStream.h"
-#include "Poco/Net/SocketAddress.h"
-#include "Poco/Net/NetException.h"
-#include "Poco/StreamCopier.h"
-#include "Poco/NumberFormatter.h"
-#include "Poco/UnbufferedStreamBuf.h"
-#include "Poco/Ascii.h"
-#include <istream>
-
-
-using Poco::NumberFormatter;
-using Poco::StreamCopier;
-
-
-namespace Poco {
-namespace Net {
-
-
-class DialogStreamBuf: public Poco::UnbufferedStreamBuf
-{
-public:
- DialogStreamBuf(DialogSocket& socket):
- _socket(socket)
- {
- }
-
- ~DialogStreamBuf()
- {
- }
-
-private:
- int readFromDevice()
- {
- return _socket.get();
- }
-
- DialogSocket& _socket;
-};
-
-
-class DialogIOS: public virtual std::ios
-{
-public:
- DialogIOS(DialogSocket& socket):
- _buf(socket)
- {
- poco_ios_init(&_buf);
- }
-
- ~DialogIOS()
- {
- }
-
- DialogStreamBuf* rdbuf()
- {
- return &_buf;
- }
-
-protected:
- DialogStreamBuf _buf;
-};
-
-
-class DialogInputStream: public DialogIOS, public std::istream
-{
-public:
- DialogInputStream(DialogSocket& socket):
- DialogIOS(socket),
- std::istream(&_buf)
- {
- }
-
- ~DialogInputStream()
- {
- }
-};
-
-
-POP3ClientSession::POP3ClientSession(const StreamSocket& socket):
- _socket(socket),
- _isOpen(true)
-{
-}
-
-
-POP3ClientSession::POP3ClientSession(const std::string& host, Poco::UInt16 port):
- _socket(SocketAddress(host, port)),
- _isOpen(true)
-{
-}
-
-
-POP3ClientSession::~POP3ClientSession()
-{
- try
- {
- close();
- }
- catch (...)
- {
- }
-}
-
-
-void POP3ClientSession::setTimeout(const Poco::Timespan& timeout)
-{
- _socket.setReceiveTimeout(timeout);
-}
-
-
-Poco::Timespan POP3ClientSession::getTimeout() const
-{
- return _socket.getReceiveTimeout();
-}
-
-
-void POP3ClientSession::login(const std::string& username, const std::string& password)
-{
- std::string response;
- _socket.receiveMessage(response);
- if (!isPositive(response)) throw POP3Exception("The POP3 service is unavailable", response);
- sendCommand("USER", username, response);
- if (!isPositive(response)) throw POP3Exception("Login rejected for user", response);
- sendCommand("PASS", password, response);
- if (!isPositive(response)) throw POP3Exception("Password rejected for user", response);
-}
-
-
-void POP3ClientSession::close()
-{
- if (_isOpen)
- {
- std::string response;
- sendCommand("QUIT", response);
- _socket.close();
- _isOpen = false;
- }
-}
-
-
-int POP3ClientSession::messageCount()
-{
- std::string response;
- sendCommand("STAT", response);
- if (!isPositive(response)) throw POP3Exception("Cannot determine message count", response);
- std::string::const_iterator it = response.begin();
- std::string::const_iterator end = response.end();
- int count = 0;
- while (it != end && !Poco::Ascii::isSpace(*it)) ++it;
- while (it != end && Poco::Ascii::isSpace(*it)) ++it;
- while (it != end && Poco::Ascii::isDigit(*it)) count = count*10 + *it++ - '0';
- return count;
-}
-
-
-void POP3ClientSession::listMessages(MessageInfoVec& messages)
-{
- messages.clear();
- std::string response;
- sendCommand("LIST", response);
- if (!isPositive(response)) throw POP3Exception("Cannot get message list", response);
- _socket.receiveMessage(response);
- while (response != ".")
- {
- MessageInfo info = {0, 0};
- std::string::const_iterator it = response.begin();
- std::string::const_iterator end = response.end();
- while (it != end && Poco::Ascii::isDigit(*it)) info.id = info.id*10 + *it++ - '0';
- while (it != end && Poco::Ascii::isSpace(*it)) ++it;
- while (it != end && Poco::Ascii::isDigit(*it)) info.size = info.size*10 + *it++ - '0';
- messages.push_back(info);
- _socket.receiveMessage(response);
- }
-}
-
-
-void POP3ClientSession::retrieveMessage(int id, MailMessage& message)
-{
- std::string response;
- sendCommand("RETR", NumberFormatter::format(id), response);
- if (!isPositive(response)) throw POP3Exception("Cannot retrieve message", response);
- DialogInputStream sis(_socket);
- MailInputStream mis(sis);
- message.read(mis);
- while (mis.good()) mis.get(); // read any remaining junk
-}
-
-
-void POP3ClientSession::retrieveMessage(int id, MailMessage& message, PartHandler& handler)
-{
- std::string response;
- sendCommand("RETR", NumberFormatter::format(id), response);
- if (!isPositive(response)) throw POP3Exception("Cannot retrieve message", response);
- DialogInputStream sis(_socket);
- MailInputStream mis(sis);
- message.read(mis, handler);
- while (mis.good()) mis.get(); // read any remaining junk
-}
-
-
-void POP3ClientSession::retrieveMessage(int id, std::ostream& ostr)
-{
- std::string response;
- sendCommand("RETR", NumberFormatter::format(id), response);
- if (!isPositive(response)) throw POP3Exception("Cannot retrieve message", response);
- DialogInputStream sis(_socket);
- MailInputStream mis(sis);
- StreamCopier::copyStream(mis, ostr);
-}
-
-
-void POP3ClientSession::retrieveHeader(int id, MessageHeader& header)
-{
- std::string response;
- sendCommand("TOP", NumberFormatter::format(id), "0", response);
- if (!isPositive(response)) throw POP3Exception("Cannot retrieve header", response);
- DialogInputStream sis(_socket);
- MailInputStream mis(sis);
- header.read(mis);
- // skip stuff following header
- mis.get(); // \r
- mis.get(); // \n
-}
-
-
-void POP3ClientSession::deleteMessage(int id)
-{
- std::string response;
- sendCommand("DELE", NumberFormatter::format(id), response);
- if (!isPositive(response)) throw POP3Exception("Cannot mark message for deletion", response);
-}
-
-
-bool POP3ClientSession::sendCommand(const std::string& command, std::string& response)
-{
- _socket.sendMessage(command);
- _socket.receiveMessage(response);
- return isPositive(response);
-}
-
-
-bool POP3ClientSession::sendCommand(const std::string& command, const std::string& arg, std::string& response)
-{
- _socket.sendMessage(command, arg);
- _socket.receiveMessage(response);
- return isPositive(response);
-}
-
-
-bool POP3ClientSession::sendCommand(const std::string& command, const std::string& arg1, const std::string& arg2, std::string& response)
-{
- _socket.sendMessage(command, arg1, arg2);
- _socket.receiveMessage(response);
- return isPositive(response);
-}
-
-
-bool POP3ClientSession::isPositive(const std::string& response)
-{
- return response.length() > 0 && response[0] == '+';
-}
-
-
-} } // namespace Poco::Net
+//
+// POP3ClientSession.cpp
+//
+// Library: Net
+// Package: Mail
+// Module: POP3ClientSession
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/POP3ClientSession.h"
+#include "Poco/Net/MailMessage.h"
+#include "Poco/Net/MailStream.h"
+#include "Poco/Net/SocketAddress.h"
+#include "Poco/Net/NetException.h"
+#include "Poco/StreamCopier.h"
+#include "Poco/NumberFormatter.h"
+#include "Poco/UnbufferedStreamBuf.h"
+#include "Poco/Ascii.h"
+#include <istream>
+
+
+using Poco::NumberFormatter;
+using Poco::StreamCopier;
+
+
+namespace Poco {
+namespace Net {
+
+
+class DialogStreamBuf: public Poco::UnbufferedStreamBuf
+{
+public:
+ DialogStreamBuf(DialogSocket& socket):
+ _socket(socket)
+ {
+ }
+
+ ~DialogStreamBuf()
+ {
+ }
+
+private:
+ int readFromDevice()
+ {
+ return _socket.get();
+ }
+
+ DialogSocket& _socket;
+};
+
+
+class DialogIOS: public virtual std::ios
+{
+public:
+ DialogIOS(DialogSocket& socket):
+ _buf(socket)
+ {
+ poco_ios_init(&_buf);
+ }
+
+ ~DialogIOS()
+ {
+ }
+
+ DialogStreamBuf* rdbuf()
+ {
+ return &_buf;
+ }
+
+protected:
+ DialogStreamBuf _buf;
+};
+
+
+class DialogInputStream: public DialogIOS, public std::istream
+{
+public:
+ DialogInputStream(DialogSocket& socket):
+ DialogIOS(socket),
+ std::istream(&_buf)
+ {
+ }
+
+ ~DialogInputStream()
+ {
+ }
+};
+
+
+POP3ClientSession::POP3ClientSession(const StreamSocket& socket):
+ _socket(socket),
+ _isOpen(true)
+{
+}
+
+
+POP3ClientSession::POP3ClientSession(const std::string& host, Poco::UInt16 port):
+ _socket(SocketAddress(host, port)),
+ _isOpen(true)
+{
+}
+
+
+POP3ClientSession::~POP3ClientSession()
+{
+ try
+ {
+ close();
+ }
+ catch (...)
+ {
+ }
+}
+
+
+void POP3ClientSession::setTimeout(const Poco::Timespan& timeout)
+{
+ _socket.setReceiveTimeout(timeout);
+}
+
+
+Poco::Timespan POP3ClientSession::getTimeout() const
+{
+ return _socket.getReceiveTimeout();
+}
+
+
+void POP3ClientSession::login(const std::string& username, const std::string& password)
+{
+ std::string response;
+ _socket.receiveMessage(response);
+ if (!isPositive(response)) throw POP3Exception("The POP3 service is unavailable", response);
+ sendCommand("USER", username, response);
+ if (!isPositive(response)) throw POP3Exception("Login rejected for user", response);
+ sendCommand("PASS", password, response);
+ if (!isPositive(response)) throw POP3Exception("Password rejected for user", response);
+}
+
+
+void POP3ClientSession::close()
+{
+ if (_isOpen)
+ {
+ std::string response;
+ sendCommand("QUIT", response);
+ _socket.close();
+ _isOpen = false;
+ }
+}
+
+
+int POP3ClientSession::messageCount()
+{
+ std::string response;
+ sendCommand("STAT", response);
+ if (!isPositive(response)) throw POP3Exception("Cannot determine message count", response);
+ std::string::const_iterator it = response.begin();
+ std::string::const_iterator end = response.end();
+ int count = 0;
+ while (it != end && !Poco::Ascii::isSpace(*it)) ++it;
+ while (it != end && Poco::Ascii::isSpace(*it)) ++it;
+ while (it != end && Poco::Ascii::isDigit(*it)) count = count*10 + *it++ - '0';
+ return count;
+}
+
+
+void POP3ClientSession::listMessages(MessageInfoVec& messages)
+{
+ messages.clear();
+ std::string response;
+ sendCommand("LIST", response);
+ if (!isPositive(response)) throw POP3Exception("Cannot get message list", response);
+ _socket.receiveMessage(response);
+ while (response != ".")
+ {
+ MessageInfo info = {0, 0};
+ std::string::const_iterator it = response.begin();
+ std::string::const_iterator end = response.end();
+ while (it != end && Poco::Ascii::isDigit(*it)) info.id = info.id*10 + *it++ - '0';
+ while (it != end && Poco::Ascii::isSpace(*it)) ++it;
+ while (it != end && Poco::Ascii::isDigit(*it)) info.size = info.size*10 + *it++ - '0';
+ messages.push_back(info);
+ _socket.receiveMessage(response);
+ }
+}
+
+
+void POP3ClientSession::retrieveMessage(int id, MailMessage& message)
+{
+ std::string response;
+ sendCommand("RETR", NumberFormatter::format(id), response);
+ if (!isPositive(response)) throw POP3Exception("Cannot retrieve message", response);
+ DialogInputStream sis(_socket);
+ MailInputStream mis(sis);
+ message.read(mis);
+ while (mis.good()) mis.get(); // read any remaining junk
+}
+
+
+void POP3ClientSession::retrieveMessage(int id, MailMessage& message, PartHandler& handler)
+{
+ std::string response;
+ sendCommand("RETR", NumberFormatter::format(id), response);
+ if (!isPositive(response)) throw POP3Exception("Cannot retrieve message", response);
+ DialogInputStream sis(_socket);
+ MailInputStream mis(sis);
+ message.read(mis, handler);
+ while (mis.good()) mis.get(); // read any remaining junk
+}
+
+
+void POP3ClientSession::retrieveMessage(int id, std::ostream& ostr)
+{
+ std::string response;
+ sendCommand("RETR", NumberFormatter::format(id), response);
+ if (!isPositive(response)) throw POP3Exception("Cannot retrieve message", response);
+ DialogInputStream sis(_socket);
+ MailInputStream mis(sis);
+ StreamCopier::copyStream(mis, ostr);
+}
+
+
+void POP3ClientSession::retrieveHeader(int id, MessageHeader& header)
+{
+ std::string response;
+ sendCommand("TOP", NumberFormatter::format(id), "0", response);
+ if (!isPositive(response)) throw POP3Exception("Cannot retrieve header", response);
+ DialogInputStream sis(_socket);
+ MailInputStream mis(sis);
+ header.read(mis);
+ // skip stuff following header
+ mis.get(); // \r
+ mis.get(); // \n
+}
+
+
+void POP3ClientSession::deleteMessage(int id)
+{
+ std::string response;
+ sendCommand("DELE", NumberFormatter::format(id), response);
+ if (!isPositive(response)) throw POP3Exception("Cannot mark message for deletion", response);
+}
+
+
+bool POP3ClientSession::sendCommand(const std::string& command, std::string& response)
+{
+ _socket.sendMessage(command);
+ _socket.receiveMessage(response);
+ return isPositive(response);
+}
+
+
+bool POP3ClientSession::sendCommand(const std::string& command, const std::string& arg, std::string& response)
+{
+ _socket.sendMessage(command, arg);
+ _socket.receiveMessage(response);
+ return isPositive(response);
+}
+
+
+bool POP3ClientSession::sendCommand(const std::string& command, const std::string& arg1, const std::string& arg2, std::string& response)
+{
+ _socket.sendMessage(command, arg1, arg2);
+ _socket.receiveMessage(response);
+ return isPositive(response);
+}
+
+
+bool POP3ClientSession::isPositive(const std::string& response)
+{
+ return response.length() > 0 && response[0] == '+';
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/PartHandler.cpp b/contrib/libs/poco/Net/src/PartHandler.cpp
index 5eab4770bb..945cf318b5 100644
--- a/contrib/libs/poco/Net/src/PartHandler.cpp
+++ b/contrib/libs/poco/Net/src/PartHandler.cpp
@@ -1,32 +1,32 @@
-//
-// PartHandler.cpp
-//
-// Library: Net
-// Package: Messages
-// Module: PartHandler
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/PartHandler.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-PartHandler::PartHandler()
-{
-}
-
-
-PartHandler::~PartHandler()
-{
-}
-
-
-} } // namespace Poco::Net
+//
+// PartHandler.cpp
+//
+// Library: Net
+// Package: Messages
+// Module: PartHandler
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/PartHandler.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+PartHandler::PartHandler()
+{
+}
+
+
+PartHandler::~PartHandler()
+{
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/PartSource.cpp b/contrib/libs/poco/Net/src/PartSource.cpp
index 240b9fbaa0..22f6c66828 100644
--- a/contrib/libs/poco/Net/src/PartSource.cpp
+++ b/contrib/libs/poco/Net/src/PartSource.cpp
@@ -1,58 +1,58 @@
-//
-// PartSource.cpp
-//
-// Library: Net
-// Package: Messages
-// Module: PartSource
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/PartSource.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-const int PartSource::UNKNOWN_CONTENT_LENGTH = -1;
-
-
-PartSource::PartSource():
- _mediaType("application/octet-stream")
-{
-}
-
-
-PartSource::PartSource(const std::string& mediaType):
- _mediaType(mediaType)
-{
-}
-
-
-PartSource::~PartSource()
-{
-}
-
-
-namespace
-{
- static const std::string EMPTY;
-}
-
-
-const std::string& PartSource::filename() const
-{
- return EMPTY;
-}
-
-std::streamsize PartSource::getContentLength() const
-{
- return UNKNOWN_CONTENT_LENGTH;
-}
-
-} } // namespace Poco::Net
+//
+// PartSource.cpp
+//
+// Library: Net
+// Package: Messages
+// Module: PartSource
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/PartSource.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+const int PartSource::UNKNOWN_CONTENT_LENGTH = -1;
+
+
+PartSource::PartSource():
+ _mediaType("application/octet-stream")
+{
+}
+
+
+PartSource::PartSource(const std::string& mediaType):
+ _mediaType(mediaType)
+{
+}
+
+
+PartSource::~PartSource()
+{
+}
+
+
+namespace
+{
+ static const std::string EMPTY;
+}
+
+
+const std::string& PartSource::filename() const
+{
+ return EMPTY;
+}
+
+std::streamsize PartSource::getContentLength() const
+{
+ return UNKNOWN_CONTENT_LENGTH;
+}
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/PartStore.cpp b/contrib/libs/poco/Net/src/PartStore.cpp
index 14179f429a..3b0b0251d0 100644
--- a/contrib/libs/poco/Net/src/PartStore.cpp
+++ b/contrib/libs/poco/Net/src/PartStore.cpp
@@ -1,87 +1,87 @@
-//
-// PartStore.cpp
-//
-// Library: Net
-// Package: Messages
-// Module: PartStore
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/PartStore.h"
-#include "Poco/TemporaryFile.h"
-#include "Poco/File.h"
-#include "Poco/Exception.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-//
-// PartStore
-//
-
-
-PartStore::PartStore(const std::string& mediaType): PartSource(mediaType)
-{
-}
-
-
-PartStore::~PartStore()
-{
-}
-
-
-//
-// FilePartStore
-//
-
-
-FilePartStore::FilePartStore(const std::string& content, const std::string& mediaType, const std::string& filename):
- PartStore(mediaType),
- _filename(filename),
- _path(TemporaryFile::tempName()),
- _fstr(_path)
-{
- _fstr << content << std::flush;
- _fstr.seekg(0, std::ios::beg);
-}
-
-
-FilePartStore::~FilePartStore()
-{
- try
- {
- _fstr.close();
- File(_path).remove();
- }
- catch (...)
- {
- }
-}
-
-
-std::istream& FilePartStore::stream()
-{
- return _fstr;
-}
-
-
-const std::string& FilePartStore::filename() const
-{
- return _filename;
-}
-
-
-const std::string& FilePartStore::path() const
-{
- return _path;
-}
-
-
-} } // namespace Poco::Net
+//
+// PartStore.cpp
+//
+// Library: Net
+// Package: Messages
+// Module: PartStore
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/PartStore.h"
+#include "Poco/TemporaryFile.h"
+#include "Poco/File.h"
+#include "Poco/Exception.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+//
+// PartStore
+//
+
+
+PartStore::PartStore(const std::string& mediaType): PartSource(mediaType)
+{
+}
+
+
+PartStore::~PartStore()
+{
+}
+
+
+//
+// FilePartStore
+//
+
+
+FilePartStore::FilePartStore(const std::string& content, const std::string& mediaType, const std::string& filename):
+ PartStore(mediaType),
+ _filename(filename),
+ _path(TemporaryFile::tempName()),
+ _fstr(_path)
+{
+ _fstr << content << std::flush;
+ _fstr.seekg(0, std::ios::beg);
+}
+
+
+FilePartStore::~FilePartStore()
+{
+ try
+ {
+ _fstr.close();
+ File(_path).remove();
+ }
+ catch (...)
+ {
+ }
+}
+
+
+std::istream& FilePartStore::stream()
+{
+ return _fstr;
+}
+
+
+const std::string& FilePartStore::filename() const
+{
+ return _filename;
+}
+
+
+const std::string& FilePartStore::path() const
+{
+ return _path;
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/PollSet.cpp b/contrib/libs/poco/Net/src/PollSet.cpp
index 25e911bf9e..57d481d23e 100644
--- a/contrib/libs/poco/Net/src/PollSet.cpp
+++ b/contrib/libs/poco/Net/src/PollSet.cpp
@@ -1,529 +1,529 @@
-//
-// PollSet.cpp
-//
-// Library: Net
-// Package: Sockets
-// Module: PollSet
-//
-// Copyright (c) 2016, Applied Informatics Software Engineering GmbH.
-// All rights reserved.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/PollSet.h"
-#include "Poco/Net/SocketImpl.h"
-#include "Poco/Mutex.h"
-#include <set>
-
-
-#if defined(_WIN32) && _WIN32_WINNT >= 0x0600
-#ifndef POCO_HAVE_FD_POLL
-#define POCO_HAVE_FD_POLL 1
-#endif
-#elif defined(POCO_OS_FAMILY_BSD)
-#ifndef POCO_HAVE_FD_POLL
-#define POCO_HAVE_FD_POLL 1
-#endif
-#endif
-
-
-#if defined(POCO_HAVE_FD_EPOLL)
-#include <sys/epoll.h>
-#elif defined(POCO_HAVE_FD_POLL)
-#ifndef _WIN32
-#include <poll.h>
-#endif
-#endif
-
-
-namespace Poco {
-namespace Net {
-
-
-#if defined(POCO_HAVE_FD_EPOLL)
-
-
-//
-// Linux implementation using epoll
-//
-class PollSetImpl
-{
-public:
- PollSetImpl():
- _epollfd(-1),
- _events(1024)
- {
- _epollfd = epoll_create(1);
- if (_epollfd < 0)
- {
- SocketImpl::error();
- }
- }
-
- ~PollSetImpl()
- {
- if (_epollfd >= 0)
- ::close(_epollfd);
- }
-
- void add(const Socket& socket, int mode)
- {
- Poco::FastMutex::ScopedLock lock(_mutex);
-
- SocketImpl* sockImpl = socket.impl();
- poco_socket_t fd = sockImpl->sockfd();
- struct epoll_event ev;
- ev.events = 0;
- if (mode & PollSet::POLL_READ)
- ev.events |= EPOLLIN;
- if (mode & PollSet::POLL_WRITE)
- ev.events |= EPOLLOUT;
- if (mode & PollSet::POLL_ERROR)
- ev.events |= EPOLLERR;
- ev.data.ptr = socket.impl();
- int err = epoll_ctl(_epollfd, EPOLL_CTL_ADD, fd, &ev);
-
- if (err)
- {
- if (errno == EEXIST) update(socket, mode);
- else SocketImpl::error();
- }
-
- if (_socketMap.find(sockImpl) == _socketMap.end())
- _socketMap[sockImpl] = socket;
- }
-
- void remove(const Socket& socket)
- {
- Poco::FastMutex::ScopedLock lock(_mutex);
-
- poco_socket_t fd = socket.impl()->sockfd();
- struct epoll_event ev;
- ev.events = 0;
- ev.data.ptr = 0;
- int err = epoll_ctl(_epollfd, EPOLL_CTL_DEL, fd, &ev);
- if (err) SocketImpl::error();
-
- _socketMap.erase(socket.impl());
- }
-
- void update(const Socket& socket, int mode)
- {
- poco_socket_t fd = socket.impl()->sockfd();
- struct epoll_event ev;
- ev.events = 0;
- if (mode & PollSet::POLL_READ)
- ev.events |= EPOLLIN;
- if (mode & PollSet::POLL_WRITE)
- ev.events |= EPOLLOUT;
- if (mode & PollSet::POLL_ERROR)
- ev.events |= EPOLLERR;
- ev.data.ptr = socket.impl();
- int err = epoll_ctl(_epollfd, EPOLL_CTL_MOD, fd, &ev);
- if (err)
- {
- SocketImpl::error();
- }
- }
-
- void clear()
- {
- Poco::FastMutex::ScopedLock lock(_mutex);
-
- ::close(_epollfd);
- _socketMap.clear();
- _epollfd = epoll_create(1);
- if (_epollfd < 0)
- {
- SocketImpl::error();
- }
- }
-
- PollSet::SocketModeMap poll(const Poco::Timespan& timeout)
- {
- PollSet::SocketModeMap result;
-
- if (_socketMap.empty()) return result;
-
- Poco::Timespan remainingTime(timeout);
- int rc;
- do
- {
- Poco::Timestamp start;
- rc = epoll_wait(_epollfd, &_events[0], _events.size(), remainingTime.totalMilliseconds());
- if (rc < 0 && SocketImpl::lastError() == POCO_EINTR)
- {
- Poco::Timestamp end;
- Poco::Timespan waited = end - start;
- if (waited < remainingTime)
- remainingTime -= waited;
- else
- remainingTime = 0;
- }
- }
- while (rc < 0 && SocketImpl::lastError() == POCO_EINTR);
- if (rc < 0) SocketImpl::error();
-
- Poco::FastMutex::ScopedLock lock(_mutex);
-
- for (int i = 0; i < rc; i++)
- {
- std::map<void*, Socket>::iterator it = _socketMap.find(_events[i].data.ptr);
- if (it != _socketMap.end())
- {
- if (_events[i].events & EPOLLIN)
- result[it->second] |= PollSet::POLL_READ;
- if (_events[i].events & EPOLLOUT)
- result[it->second] |= PollSet::POLL_WRITE;
- if (_events[i].events & EPOLLERR)
- result[it->second] |= PollSet::POLL_ERROR;
- }
- }
-
- return result;
- }
-
-private:
- Poco::FastMutex _mutex;
- int _epollfd;
- std::map<void*, Socket> _socketMap;
- std::vector<struct epoll_event> _events;
-};
-
-
-#elif defined(POCO_HAVE_FD_POLL)
-
-
-//
-// BSD implementation using poll
-//
-class PollSetImpl
-{
-public:
- void add(const Socket& socket, int mode)
- {
- Poco::FastMutex::ScopedLock lock(_mutex);
-
- poco_socket_t fd = socket.impl()->sockfd();
- _addMap[fd] = mode;
- _removeSet.erase(fd);
- _socketMap[fd] = socket;
- }
-
- void remove(const Socket& socket)
- {
- Poco::FastMutex::ScopedLock lock(_mutex);
-
- poco_socket_t fd = socket.impl()->sockfd();
- _removeSet.insert(fd);
- _addMap.erase(fd);
- _socketMap.erase(fd);
- }
-
- void update(const Socket& socket, int mode)
- {
- Poco::FastMutex::ScopedLock lock(_mutex);
-
- poco_socket_t fd = socket.impl()->sockfd();
- for (std::vector<pollfd>::iterator it = _pollfds.begin(); it != _pollfds.end(); ++it)
- {
- if (it->fd == fd)
- {
- it->events = 0;
- if (mode & PollSet::POLL_READ)
- it->events |= POLLIN;
- if (mode & PollSet::POLL_WRITE)
- it->events |= POLLOUT;
- }
- }
- }
-
- void clear()
- {
- Poco::FastMutex::ScopedLock lock(_mutex);
-
- _socketMap.clear();
- _addMap.clear();
- _removeSet.clear();
- _pollfds.clear();
- }
-
- PollSet::SocketModeMap poll(const Poco::Timespan& timeout)
- {
- PollSet::SocketModeMap result;
- {
- Poco::FastMutex::ScopedLock lock(_mutex);
-
- if (!_removeSet.empty())
- {
- for (std::vector<pollfd>::iterator it = _pollfds.begin(); it != _pollfds.end();)
- {
- if (_removeSet.find(it->fd) != _removeSet.end())
- {
- it = _pollfds.erase(it);
- }
- else ++it;
- }
- _removeSet.clear();
- }
-
- _pollfds.reserve(_pollfds.size() + _addMap.size());
- for (std::map<poco_socket_t, int>::iterator it = _addMap.begin(); it != _addMap.end(); ++it)
- {
- pollfd pfd;
- pfd.fd = it->first;
- pfd.events = 0;
- pfd.revents = 0;
- if (it->second & PollSet::POLL_READ)
- pfd.events |= POLLIN;
- if (it->second & PollSet::POLL_WRITE)
- pfd.events |= POLLOUT;
-
- _pollfds.push_back(pfd);
- }
- _addMap.clear();
- }
-
- if (_pollfds.empty()) return result;
-
- Poco::Timespan remainingTime(timeout);
- int rc;
- do
- {
- Poco::Timestamp start;
-#ifdef _WIN32
- rc = WSAPoll(&_pollfds[0], _pollfds.size(), static_cast<INT>(timeout.totalMilliseconds()));
-#else
- rc = ::poll(&_pollfds[0], _pollfds.size(), timeout.totalMilliseconds());
-#endif
- if (rc < 0 && SocketImpl::lastError() == POCO_EINTR)
- {
- Poco::Timestamp end;
- Poco::Timespan waited = end - start;
- if (waited < remainingTime)
- remainingTime -= waited;
- else
- remainingTime = 0;
- }
- }
- while (rc < 0 && SocketImpl::lastError() == POCO_EINTR);
- if (rc < 0) SocketImpl::error();
-
- {
- Poco::FastMutex::ScopedLock lock(_mutex);
-
- if (!_socketMap.empty())
- {
- for (std::vector<pollfd>::iterator it = _pollfds.begin(); it != _pollfds.end(); ++it)
- {
- std::map<poco_socket_t, Socket>::const_iterator its = _socketMap.find(it->fd);
- if (its != _socketMap.end())
- {
- if (it->revents & POLLIN)
- result[its->second] |= PollSet::POLL_READ;
- if (it->revents & POLLOUT)
- result[its->second] |= PollSet::POLL_WRITE;
- if (it->revents & POLLERR)
- result[its->second] |= PollSet::POLL_ERROR;
-#ifdef _WIN32
- if (it->revents & POLLHUP)
- result[its->second] |= PollSet::POLL_READ;
-#endif
- }
- it->revents = 0;
- }
- }
- }
-
- return result;
- }
-
-private:
- Poco::FastMutex _mutex;
- std::map<poco_socket_t, Socket> _socketMap;
- std::map<poco_socket_t, int> _addMap;
- std::set<poco_socket_t> _removeSet;
- std::vector<pollfd> _pollfds;
-};
-
-
-#else
-
-
-//
-// Fallback implementation using select()
-//
-class PollSetImpl
-{
-public:
- void add(const Socket& socket, int mode)
- {
- Poco::FastMutex::ScopedLock lock(_mutex);
-
- _map[socket] = mode;
- }
-
- void remove(const Socket& socket)
- {
- Poco::FastMutex::ScopedLock lock(_mutex);
-
- _map.erase(socket);
- }
-
- void update(const Socket& socket, int mode)
- {
- Poco::FastMutex::ScopedLock lock(_mutex);
-
- _map[socket] = mode;
- }
-
- void clear()
- {
- Poco::FastMutex::ScopedLock lock(_mutex);
-
- _map.clear();
- }
-
- PollSet::SocketModeMap poll(const Poco::Timespan& timeout)
- {
- fd_set fdRead;
- fd_set fdWrite;
- fd_set fdExcept;
- int nfd = 0;
-
- FD_ZERO(&fdRead);
- FD_ZERO(&fdWrite);
- FD_ZERO(&fdExcept);
-
- {
- Poco::FastMutex::ScopedLock lock(_mutex);
-
- for (PollSet::SocketModeMap::const_iterator it = _map.begin(); it != _map.end(); ++it)
- {
- poco_socket_t fd = it->first.impl()->sockfd();
- if (fd != POCO_INVALID_SOCKET && it->second)
- {
- if (int(fd) > nfd) nfd = int(fd);
-
- if (it->second & PollSet::POLL_READ)
- {
- FD_SET(fd, &fdRead);
- }
- if (it->second & PollSet::POLL_WRITE)
- {
- FD_SET(fd, &fdWrite);
- }
- if (it->second & PollSet::POLL_ERROR)
- {
- FD_SET(fd, &fdExcept);
- }
- }
- }
- }
-
- PollSet::SocketModeMap result;
- if (nfd == 0) return result;
-
- Poco::Timespan remainingTime(timeout);
- int rc;
- do
- {
- struct timeval tv;
- tv.tv_sec = (long) remainingTime.totalSeconds();
- tv.tv_usec = (long) remainingTime.useconds();
- Poco::Timestamp start;
- rc = ::select(nfd + 1, &fdRead, &fdWrite, &fdExcept, &tv);
- if (rc < 0 && SocketImpl::lastError() == POCO_EINTR)
- {
- Poco::Timestamp end;
- Poco::Timespan waited = end - start;
- if (waited < remainingTime)
- remainingTime -= waited;
- else
- remainingTime = 0;
- }
- }
- while (rc < 0 && SocketImpl::lastError() == POCO_EINTR);
- if (rc < 0) SocketImpl::error();
-
- {
- Poco::FastMutex::ScopedLock lock(_mutex);
-
- for (PollSet::SocketModeMap::const_iterator it = _map.begin(); it != _map.end(); ++it)
- {
- poco_socket_t fd = it->first.impl()->sockfd();
- if (fd != POCO_INVALID_SOCKET)
- {
- if (FD_ISSET(fd, &fdRead))
- {
- result[it->first] |= PollSet::POLL_READ;
- }
- if (FD_ISSET(fd, &fdWrite))
- {
- result[it->first] |= PollSet::POLL_WRITE;
- }
- if (FD_ISSET(fd, &fdExcept))
- {
- result[it->first] |= PollSet::POLL_ERROR;
- }
- }
- }
- }
-
- return result;
- }
-
-private:
- Poco::FastMutex _mutex;
- PollSet::SocketModeMap _map;
-};
-
-
-#endif
-
-
-PollSet::PollSet():
- _pImpl(new PollSetImpl)
-{
-}
-
-
-PollSet::~PollSet()
-{
- delete _pImpl;
-}
-
-
-void PollSet::add(const Socket& socket, int mode)
-{
- _pImpl->add(socket, mode);
-}
-
-
-void PollSet::remove(const Socket& socket)
-{
- _pImpl->remove(socket);
-}
-
-
-void PollSet::update(const Socket& socket, int mode)
-{
- _pImpl->update(socket, mode);
-}
-
-
-void PollSet::clear()
-{
- _pImpl->clear();
-}
-
-
-PollSet::SocketModeMap PollSet::poll(const Poco::Timespan& timeout)
-{
- return _pImpl->poll(timeout);
-}
-
-
-} } // namespace Poco::Net
+//
+// PollSet.cpp
+//
+// Library: Net
+// Package: Sockets
+// Module: PollSet
+//
+// Copyright (c) 2016, Applied Informatics Software Engineering GmbH.
+// All rights reserved.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/PollSet.h"
+#include "Poco/Net/SocketImpl.h"
+#include "Poco/Mutex.h"
+#include <set>
+
+
+#if defined(_WIN32) && _WIN32_WINNT >= 0x0600
+#ifndef POCO_HAVE_FD_POLL
+#define POCO_HAVE_FD_POLL 1
+#endif
+#elif defined(POCO_OS_FAMILY_BSD)
+#ifndef POCO_HAVE_FD_POLL
+#define POCO_HAVE_FD_POLL 1
+#endif
+#endif
+
+
+#if defined(POCO_HAVE_FD_EPOLL)
+#include <sys/epoll.h>
+#elif defined(POCO_HAVE_FD_POLL)
+#ifndef _WIN32
+#include <poll.h>
+#endif
+#endif
+
+
+namespace Poco {
+namespace Net {
+
+
+#if defined(POCO_HAVE_FD_EPOLL)
+
+
+//
+// Linux implementation using epoll
+//
+class PollSetImpl
+{
+public:
+ PollSetImpl():
+ _epollfd(-1),
+ _events(1024)
+ {
+ _epollfd = epoll_create(1);
+ if (_epollfd < 0)
+ {
+ SocketImpl::error();
+ }
+ }
+
+ ~PollSetImpl()
+ {
+ if (_epollfd >= 0)
+ ::close(_epollfd);
+ }
+
+ void add(const Socket& socket, int mode)
+ {
+ Poco::FastMutex::ScopedLock lock(_mutex);
+
+ SocketImpl* sockImpl = socket.impl();
+ poco_socket_t fd = sockImpl->sockfd();
+ struct epoll_event ev;
+ ev.events = 0;
+ if (mode & PollSet::POLL_READ)
+ ev.events |= EPOLLIN;
+ if (mode & PollSet::POLL_WRITE)
+ ev.events |= EPOLLOUT;
+ if (mode & PollSet::POLL_ERROR)
+ ev.events |= EPOLLERR;
+ ev.data.ptr = socket.impl();
+ int err = epoll_ctl(_epollfd, EPOLL_CTL_ADD, fd, &ev);
+
+ if (err)
+ {
+ if (errno == EEXIST) update(socket, mode);
+ else SocketImpl::error();
+ }
+
+ if (_socketMap.find(sockImpl) == _socketMap.end())
+ _socketMap[sockImpl] = socket;
+ }
+
+ void remove(const Socket& socket)
+ {
+ Poco::FastMutex::ScopedLock lock(_mutex);
+
+ poco_socket_t fd = socket.impl()->sockfd();
+ struct epoll_event ev;
+ ev.events = 0;
+ ev.data.ptr = 0;
+ int err = epoll_ctl(_epollfd, EPOLL_CTL_DEL, fd, &ev);
+ if (err) SocketImpl::error();
+
+ _socketMap.erase(socket.impl());
+ }
+
+ void update(const Socket& socket, int mode)
+ {
+ poco_socket_t fd = socket.impl()->sockfd();
+ struct epoll_event ev;
+ ev.events = 0;
+ if (mode & PollSet::POLL_READ)
+ ev.events |= EPOLLIN;
+ if (mode & PollSet::POLL_WRITE)
+ ev.events |= EPOLLOUT;
+ if (mode & PollSet::POLL_ERROR)
+ ev.events |= EPOLLERR;
+ ev.data.ptr = socket.impl();
+ int err = epoll_ctl(_epollfd, EPOLL_CTL_MOD, fd, &ev);
+ if (err)
+ {
+ SocketImpl::error();
+ }
+ }
+
+ void clear()
+ {
+ Poco::FastMutex::ScopedLock lock(_mutex);
+
+ ::close(_epollfd);
+ _socketMap.clear();
+ _epollfd = epoll_create(1);
+ if (_epollfd < 0)
+ {
+ SocketImpl::error();
+ }
+ }
+
+ PollSet::SocketModeMap poll(const Poco::Timespan& timeout)
+ {
+ PollSet::SocketModeMap result;
+
+ if (_socketMap.empty()) return result;
+
+ Poco::Timespan remainingTime(timeout);
+ int rc;
+ do
+ {
+ Poco::Timestamp start;
+ rc = epoll_wait(_epollfd, &_events[0], _events.size(), remainingTime.totalMilliseconds());
+ if (rc < 0 && SocketImpl::lastError() == POCO_EINTR)
+ {
+ Poco::Timestamp end;
+ Poco::Timespan waited = end - start;
+ if (waited < remainingTime)
+ remainingTime -= waited;
+ else
+ remainingTime = 0;
+ }
+ }
+ while (rc < 0 && SocketImpl::lastError() == POCO_EINTR);
+ if (rc < 0) SocketImpl::error();
+
+ Poco::FastMutex::ScopedLock lock(_mutex);
+
+ for (int i = 0; i < rc; i++)
+ {
+ std::map<void*, Socket>::iterator it = _socketMap.find(_events[i].data.ptr);
+ if (it != _socketMap.end())
+ {
+ if (_events[i].events & EPOLLIN)
+ result[it->second] |= PollSet::POLL_READ;
+ if (_events[i].events & EPOLLOUT)
+ result[it->second] |= PollSet::POLL_WRITE;
+ if (_events[i].events & EPOLLERR)
+ result[it->second] |= PollSet::POLL_ERROR;
+ }
+ }
+
+ return result;
+ }
+
+private:
+ Poco::FastMutex _mutex;
+ int _epollfd;
+ std::map<void*, Socket> _socketMap;
+ std::vector<struct epoll_event> _events;
+};
+
+
+#elif defined(POCO_HAVE_FD_POLL)
+
+
+//
+// BSD implementation using poll
+//
+class PollSetImpl
+{
+public:
+ void add(const Socket& socket, int mode)
+ {
+ Poco::FastMutex::ScopedLock lock(_mutex);
+
+ poco_socket_t fd = socket.impl()->sockfd();
+ _addMap[fd] = mode;
+ _removeSet.erase(fd);
+ _socketMap[fd] = socket;
+ }
+
+ void remove(const Socket& socket)
+ {
+ Poco::FastMutex::ScopedLock lock(_mutex);
+
+ poco_socket_t fd = socket.impl()->sockfd();
+ _removeSet.insert(fd);
+ _addMap.erase(fd);
+ _socketMap.erase(fd);
+ }
+
+ void update(const Socket& socket, int mode)
+ {
+ Poco::FastMutex::ScopedLock lock(_mutex);
+
+ poco_socket_t fd = socket.impl()->sockfd();
+ for (std::vector<pollfd>::iterator it = _pollfds.begin(); it != _pollfds.end(); ++it)
+ {
+ if (it->fd == fd)
+ {
+ it->events = 0;
+ if (mode & PollSet::POLL_READ)
+ it->events |= POLLIN;
+ if (mode & PollSet::POLL_WRITE)
+ it->events |= POLLOUT;
+ }
+ }
+ }
+
+ void clear()
+ {
+ Poco::FastMutex::ScopedLock lock(_mutex);
+
+ _socketMap.clear();
+ _addMap.clear();
+ _removeSet.clear();
+ _pollfds.clear();
+ }
+
+ PollSet::SocketModeMap poll(const Poco::Timespan& timeout)
+ {
+ PollSet::SocketModeMap result;
+ {
+ Poco::FastMutex::ScopedLock lock(_mutex);
+
+ if (!_removeSet.empty())
+ {
+ for (std::vector<pollfd>::iterator it = _pollfds.begin(); it != _pollfds.end();)
+ {
+ if (_removeSet.find(it->fd) != _removeSet.end())
+ {
+ it = _pollfds.erase(it);
+ }
+ else ++it;
+ }
+ _removeSet.clear();
+ }
+
+ _pollfds.reserve(_pollfds.size() + _addMap.size());
+ for (std::map<poco_socket_t, int>::iterator it = _addMap.begin(); it != _addMap.end(); ++it)
+ {
+ pollfd pfd;
+ pfd.fd = it->first;
+ pfd.events = 0;
+ pfd.revents = 0;
+ if (it->second & PollSet::POLL_READ)
+ pfd.events |= POLLIN;
+ if (it->second & PollSet::POLL_WRITE)
+ pfd.events |= POLLOUT;
+
+ _pollfds.push_back(pfd);
+ }
+ _addMap.clear();
+ }
+
+ if (_pollfds.empty()) return result;
+
+ Poco::Timespan remainingTime(timeout);
+ int rc;
+ do
+ {
+ Poco::Timestamp start;
+#ifdef _WIN32
+ rc = WSAPoll(&_pollfds[0], _pollfds.size(), static_cast<INT>(timeout.totalMilliseconds()));
+#else
+ rc = ::poll(&_pollfds[0], _pollfds.size(), timeout.totalMilliseconds());
+#endif
+ if (rc < 0 && SocketImpl::lastError() == POCO_EINTR)
+ {
+ Poco::Timestamp end;
+ Poco::Timespan waited = end - start;
+ if (waited < remainingTime)
+ remainingTime -= waited;
+ else
+ remainingTime = 0;
+ }
+ }
+ while (rc < 0 && SocketImpl::lastError() == POCO_EINTR);
+ if (rc < 0) SocketImpl::error();
+
+ {
+ Poco::FastMutex::ScopedLock lock(_mutex);
+
+ if (!_socketMap.empty())
+ {
+ for (std::vector<pollfd>::iterator it = _pollfds.begin(); it != _pollfds.end(); ++it)
+ {
+ std::map<poco_socket_t, Socket>::const_iterator its = _socketMap.find(it->fd);
+ if (its != _socketMap.end())
+ {
+ if (it->revents & POLLIN)
+ result[its->second] |= PollSet::POLL_READ;
+ if (it->revents & POLLOUT)
+ result[its->second] |= PollSet::POLL_WRITE;
+ if (it->revents & POLLERR)
+ result[its->second] |= PollSet::POLL_ERROR;
+#ifdef _WIN32
+ if (it->revents & POLLHUP)
+ result[its->second] |= PollSet::POLL_READ;
+#endif
+ }
+ it->revents = 0;
+ }
+ }
+ }
+
+ return result;
+ }
+
+private:
+ Poco::FastMutex _mutex;
+ std::map<poco_socket_t, Socket> _socketMap;
+ std::map<poco_socket_t, int> _addMap;
+ std::set<poco_socket_t> _removeSet;
+ std::vector<pollfd> _pollfds;
+};
+
+
+#else
+
+
+//
+// Fallback implementation using select()
+//
+class PollSetImpl
+{
+public:
+ void add(const Socket& socket, int mode)
+ {
+ Poco::FastMutex::ScopedLock lock(_mutex);
+
+ _map[socket] = mode;
+ }
+
+ void remove(const Socket& socket)
+ {
+ Poco::FastMutex::ScopedLock lock(_mutex);
+
+ _map.erase(socket);
+ }
+
+ void update(const Socket& socket, int mode)
+ {
+ Poco::FastMutex::ScopedLock lock(_mutex);
+
+ _map[socket] = mode;
+ }
+
+ void clear()
+ {
+ Poco::FastMutex::ScopedLock lock(_mutex);
+
+ _map.clear();
+ }
+
+ PollSet::SocketModeMap poll(const Poco::Timespan& timeout)
+ {
+ fd_set fdRead;
+ fd_set fdWrite;
+ fd_set fdExcept;
+ int nfd = 0;
+
+ FD_ZERO(&fdRead);
+ FD_ZERO(&fdWrite);
+ FD_ZERO(&fdExcept);
+
+ {
+ Poco::FastMutex::ScopedLock lock(_mutex);
+
+ for (PollSet::SocketModeMap::const_iterator it = _map.begin(); it != _map.end(); ++it)
+ {
+ poco_socket_t fd = it->first.impl()->sockfd();
+ if (fd != POCO_INVALID_SOCKET && it->second)
+ {
+ if (int(fd) > nfd) nfd = int(fd);
+
+ if (it->second & PollSet::POLL_READ)
+ {
+ FD_SET(fd, &fdRead);
+ }
+ if (it->second & PollSet::POLL_WRITE)
+ {
+ FD_SET(fd, &fdWrite);
+ }
+ if (it->second & PollSet::POLL_ERROR)
+ {
+ FD_SET(fd, &fdExcept);
+ }
+ }
+ }
+ }
+
+ PollSet::SocketModeMap result;
+ if (nfd == 0) return result;
+
+ Poco::Timespan remainingTime(timeout);
+ int rc;
+ do
+ {
+ struct timeval tv;
+ tv.tv_sec = (long) remainingTime.totalSeconds();
+ tv.tv_usec = (long) remainingTime.useconds();
+ Poco::Timestamp start;
+ rc = ::select(nfd + 1, &fdRead, &fdWrite, &fdExcept, &tv);
+ if (rc < 0 && SocketImpl::lastError() == POCO_EINTR)
+ {
+ Poco::Timestamp end;
+ Poco::Timespan waited = end - start;
+ if (waited < remainingTime)
+ remainingTime -= waited;
+ else
+ remainingTime = 0;
+ }
+ }
+ while (rc < 0 && SocketImpl::lastError() == POCO_EINTR);
+ if (rc < 0) SocketImpl::error();
+
+ {
+ Poco::FastMutex::ScopedLock lock(_mutex);
+
+ for (PollSet::SocketModeMap::const_iterator it = _map.begin(); it != _map.end(); ++it)
+ {
+ poco_socket_t fd = it->first.impl()->sockfd();
+ if (fd != POCO_INVALID_SOCKET)
+ {
+ if (FD_ISSET(fd, &fdRead))
+ {
+ result[it->first] |= PollSet::POLL_READ;
+ }
+ if (FD_ISSET(fd, &fdWrite))
+ {
+ result[it->first] |= PollSet::POLL_WRITE;
+ }
+ if (FD_ISSET(fd, &fdExcept))
+ {
+ result[it->first] |= PollSet::POLL_ERROR;
+ }
+ }
+ }
+ }
+
+ return result;
+ }
+
+private:
+ Poco::FastMutex _mutex;
+ PollSet::SocketModeMap _map;
+};
+
+
+#endif
+
+
+PollSet::PollSet():
+ _pImpl(new PollSetImpl)
+{
+}
+
+
+PollSet::~PollSet()
+{
+ delete _pImpl;
+}
+
+
+void PollSet::add(const Socket& socket, int mode)
+{
+ _pImpl->add(socket, mode);
+}
+
+
+void PollSet::remove(const Socket& socket)
+{
+ _pImpl->remove(socket);
+}
+
+
+void PollSet::update(const Socket& socket, int mode)
+{
+ _pImpl->update(socket, mode);
+}
+
+
+void PollSet::clear()
+{
+ _pImpl->clear();
+}
+
+
+PollSet::SocketModeMap PollSet::poll(const Poco::Timespan& timeout)
+{
+ return _pImpl->poll(timeout);
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/QuotedPrintableDecoder.cpp b/contrib/libs/poco/Net/src/QuotedPrintableDecoder.cpp
index c3c0ed5880..4f8b3c6726 100644
--- a/contrib/libs/poco/Net/src/QuotedPrintableDecoder.cpp
+++ b/contrib/libs/poco/Net/src/QuotedPrintableDecoder.cpp
@@ -1,102 +1,102 @@
-//
-// QuotedPrintableDecoder.cpp
-//
-// Library: Net
-// Package: Messages
-// Module: QuotedPrintableDecoder
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/QuotedPrintableDecoder.h"
-#include "Poco/NumberParser.h"
-#include "Poco/Exception.h"
-#include "Poco/Ascii.h"
-
-
-using Poco::UnbufferedStreamBuf;
-using Poco::NumberParser;
-using Poco::DataFormatException;
-
-
-namespace Poco {
-namespace Net {
-
-
-QuotedPrintableDecoderBuf::QuotedPrintableDecoderBuf(std::istream& istr):
- _buf(*istr.rdbuf())
-{
-}
-
-
-QuotedPrintableDecoderBuf::~QuotedPrintableDecoderBuf()
-{
-}
-
-
-int QuotedPrintableDecoderBuf::readFromDevice()
-{
- int ch = _buf.sbumpc();
- while (ch == '=')
- {
- ch = _buf.sbumpc();
- if (ch == '\r')
- {
- _buf.sbumpc(); // read \n
- }
- else if (Poco::Ascii::isHexDigit(ch))
- {
- std::string hex = "0x";
- hex += (char) ch;
- ch = _buf.sbumpc();
- if (Poco::Ascii::isHexDigit(ch))
- {
- hex += (char) ch;
- return NumberParser::parseHex(hex);
- }
- throw DataFormatException("Incomplete hex number in quoted-printable encoded stream");
- }
- else if (ch != '\n')
- {
- throw DataFormatException("Invalid occurrence of '=' in quoted-printable encoded stream");
- }
- ch = _buf.sbumpc();
- }
- return ch;
-}
-
-
-QuotedPrintableDecoderIOS::QuotedPrintableDecoderIOS(std::istream& istr): _buf(istr)
-{
- poco_ios_init(&_buf);
-}
-
-
-QuotedPrintableDecoderIOS::~QuotedPrintableDecoderIOS()
-{
-}
-
-
-QuotedPrintableDecoderBuf* QuotedPrintableDecoderIOS::rdbuf()
-{
- return &_buf;
-}
-
-
-QuotedPrintableDecoder::QuotedPrintableDecoder(std::istream& istr):
- QuotedPrintableDecoderIOS(istr),
- std::istream(&_buf)
-{
-}
-
-
-QuotedPrintableDecoder::~QuotedPrintableDecoder()
-{
-}
-
-
-} } // namespace Poco::Net
+//
+// QuotedPrintableDecoder.cpp
+//
+// Library: Net
+// Package: Messages
+// Module: QuotedPrintableDecoder
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/QuotedPrintableDecoder.h"
+#include "Poco/NumberParser.h"
+#include "Poco/Exception.h"
+#include "Poco/Ascii.h"
+
+
+using Poco::UnbufferedStreamBuf;
+using Poco::NumberParser;
+using Poco::DataFormatException;
+
+
+namespace Poco {
+namespace Net {
+
+
+QuotedPrintableDecoderBuf::QuotedPrintableDecoderBuf(std::istream& istr):
+ _buf(*istr.rdbuf())
+{
+}
+
+
+QuotedPrintableDecoderBuf::~QuotedPrintableDecoderBuf()
+{
+}
+
+
+int QuotedPrintableDecoderBuf::readFromDevice()
+{
+ int ch = _buf.sbumpc();
+ while (ch == '=')
+ {
+ ch = _buf.sbumpc();
+ if (ch == '\r')
+ {
+ _buf.sbumpc(); // read \n
+ }
+ else if (Poco::Ascii::isHexDigit(ch))
+ {
+ std::string hex = "0x";
+ hex += (char) ch;
+ ch = _buf.sbumpc();
+ if (Poco::Ascii::isHexDigit(ch))
+ {
+ hex += (char) ch;
+ return NumberParser::parseHex(hex);
+ }
+ throw DataFormatException("Incomplete hex number in quoted-printable encoded stream");
+ }
+ else if (ch != '\n')
+ {
+ throw DataFormatException("Invalid occurrence of '=' in quoted-printable encoded stream");
+ }
+ ch = _buf.sbumpc();
+ }
+ return ch;
+}
+
+
+QuotedPrintableDecoderIOS::QuotedPrintableDecoderIOS(std::istream& istr): _buf(istr)
+{
+ poco_ios_init(&_buf);
+}
+
+
+QuotedPrintableDecoderIOS::~QuotedPrintableDecoderIOS()
+{
+}
+
+
+QuotedPrintableDecoderBuf* QuotedPrintableDecoderIOS::rdbuf()
+{
+ return &_buf;
+}
+
+
+QuotedPrintableDecoder::QuotedPrintableDecoder(std::istream& istr):
+ QuotedPrintableDecoderIOS(istr),
+ std::istream(&_buf)
+{
+}
+
+
+QuotedPrintableDecoder::~QuotedPrintableDecoder()
+{
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/QuotedPrintableEncoder.cpp b/contrib/libs/poco/Net/src/QuotedPrintableEncoder.cpp
index d34f1bd58f..a71eb154f5 100644
--- a/contrib/libs/poco/Net/src/QuotedPrintableEncoder.cpp
+++ b/contrib/libs/poco/Net/src/QuotedPrintableEncoder.cpp
@@ -1,150 +1,150 @@
-//
-// QuotedPrintableEncoder.cpp
-//
-// Library: Net
-// Package: Messages
-// Module: QuotedPrintableEncoder
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/QuotedPrintableEncoder.h"
-#include "Poco/NumberFormatter.h"
-
-
-using Poco::UnbufferedStreamBuf;
-using Poco::NumberFormatter;
-
-
-namespace Poco {
-namespace Net {
-
-
-QuotedPrintableEncoderBuf::QuotedPrintableEncoderBuf(std::ostream& ostr):
- _pending(-1),
- _lineLength(0),
- _ostr(ostr)
-{
-}
-
-
-QuotedPrintableEncoderBuf::~QuotedPrintableEncoderBuf()
-{
- try
- {
- close();
- }
- catch (...)
- {
- }
-}
-
-
-int QuotedPrintableEncoderBuf::writeToDevice(char c)
-{
- if (_pending != -1)
- {
- if (_pending == '\r' && c == '\n')
- writeRaw((char) _pending);
- else if (c == '\r' || c == '\n')
- writeEncoded((char) _pending);
- else
- writeRaw((char) _pending);
- _pending = -1;
- }
- if (c == '\t' || c == ' ')
- {
- _pending = charToInt(c);
- return _pending;
- }
- else if (c == '\r' || c == '\n' || (c > 32 && c < 127 && c != '='))
- {
- writeRaw(c);
- }
- else
- {
- writeEncoded(c);
- }
- return charToInt(c);
-}
-
-
-void QuotedPrintableEncoderBuf::writeEncoded(char c)
-{
- if (_lineLength >= 73)
- {
- _ostr << "=\r\n";
- _lineLength = 3;
- }
- else _lineLength += 3;
- _ostr << '=' << NumberFormatter::formatHex((unsigned) charToInt(c), 2);
-}
-
-
-void QuotedPrintableEncoderBuf::writeRaw(char c)
-{
- if (c == '\r' || c == '\n')
- {
- _ostr.put(c);
- _lineLength = 0;
- }
- else if (_lineLength < 75)
- {
- _ostr.put(c);
- ++_lineLength;
- }
- else
- {
- _ostr << "=\r\n" << c;
- _lineLength = 1;
- }
-}
-
-
-int QuotedPrintableEncoderBuf::close()
-{
- sync();
- return _ostr ? 0 : -1;
-}
-
-
-QuotedPrintableEncoderIOS::QuotedPrintableEncoderIOS(std::ostream& ostr): _buf(ostr)
-{
- poco_ios_init(&_buf);
-}
-
-
-QuotedPrintableEncoderIOS::~QuotedPrintableEncoderIOS()
-{
-}
-
-
-int QuotedPrintableEncoderIOS::close()
-{
- return _buf.close();
-}
-
-
-QuotedPrintableEncoderBuf* QuotedPrintableEncoderIOS::rdbuf()
-{
- return &_buf;
-}
-
-
-QuotedPrintableEncoder::QuotedPrintableEncoder(std::ostream& ostr):
- QuotedPrintableEncoderIOS(ostr),
- std::ostream(&_buf)
-{
-}
-
-
-QuotedPrintableEncoder::~QuotedPrintableEncoder()
-{
-}
-
-
-} } // namespace Poco::Net
+//
+// QuotedPrintableEncoder.cpp
+//
+// Library: Net
+// Package: Messages
+// Module: QuotedPrintableEncoder
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/QuotedPrintableEncoder.h"
+#include "Poco/NumberFormatter.h"
+
+
+using Poco::UnbufferedStreamBuf;
+using Poco::NumberFormatter;
+
+
+namespace Poco {
+namespace Net {
+
+
+QuotedPrintableEncoderBuf::QuotedPrintableEncoderBuf(std::ostream& ostr):
+ _pending(-1),
+ _lineLength(0),
+ _ostr(ostr)
+{
+}
+
+
+QuotedPrintableEncoderBuf::~QuotedPrintableEncoderBuf()
+{
+ try
+ {
+ close();
+ }
+ catch (...)
+ {
+ }
+}
+
+
+int QuotedPrintableEncoderBuf::writeToDevice(char c)
+{
+ if (_pending != -1)
+ {
+ if (_pending == '\r' && c == '\n')
+ writeRaw((char) _pending);
+ else if (c == '\r' || c == '\n')
+ writeEncoded((char) _pending);
+ else
+ writeRaw((char) _pending);
+ _pending = -1;
+ }
+ if (c == '\t' || c == ' ')
+ {
+ _pending = charToInt(c);
+ return _pending;
+ }
+ else if (c == '\r' || c == '\n' || (c > 32 && c < 127 && c != '='))
+ {
+ writeRaw(c);
+ }
+ else
+ {
+ writeEncoded(c);
+ }
+ return charToInt(c);
+}
+
+
+void QuotedPrintableEncoderBuf::writeEncoded(char c)
+{
+ if (_lineLength >= 73)
+ {
+ _ostr << "=\r\n";
+ _lineLength = 3;
+ }
+ else _lineLength += 3;
+ _ostr << '=' << NumberFormatter::formatHex((unsigned) charToInt(c), 2);
+}
+
+
+void QuotedPrintableEncoderBuf::writeRaw(char c)
+{
+ if (c == '\r' || c == '\n')
+ {
+ _ostr.put(c);
+ _lineLength = 0;
+ }
+ else if (_lineLength < 75)
+ {
+ _ostr.put(c);
+ ++_lineLength;
+ }
+ else
+ {
+ _ostr << "=\r\n" << c;
+ _lineLength = 1;
+ }
+}
+
+
+int QuotedPrintableEncoderBuf::close()
+{
+ sync();
+ return _ostr ? 0 : -1;
+}
+
+
+QuotedPrintableEncoderIOS::QuotedPrintableEncoderIOS(std::ostream& ostr): _buf(ostr)
+{
+ poco_ios_init(&_buf);
+}
+
+
+QuotedPrintableEncoderIOS::~QuotedPrintableEncoderIOS()
+{
+}
+
+
+int QuotedPrintableEncoderIOS::close()
+{
+ return _buf.close();
+}
+
+
+QuotedPrintableEncoderBuf* QuotedPrintableEncoderIOS::rdbuf()
+{
+ return &_buf;
+}
+
+
+QuotedPrintableEncoder::QuotedPrintableEncoder(std::ostream& ostr):
+ QuotedPrintableEncoderIOS(ostr),
+ std::ostream(&_buf)
+{
+}
+
+
+QuotedPrintableEncoder::~QuotedPrintableEncoder()
+{
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/RawSocket.cpp b/contrib/libs/poco/Net/src/RawSocket.cpp
index 4cd1602ce2..7605dcac39 100644
--- a/contrib/libs/poco/Net/src/RawSocket.cpp
+++ b/contrib/libs/poco/Net/src/RawSocket.cpp
@@ -1,117 +1,117 @@
-//
-// RawSocket.cpp
-//
-// Library: Net
-// Package: Sockets
-// Module: RawSocket
-//
-// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/RawSocket.h"
-#include "Poco/Net/RawSocketImpl.h"
-#include "Poco/Exception.h"
-
-
-using Poco::InvalidArgumentException;
-
-
-namespace Poco {
-namespace Net {
-
-
-RawSocket::RawSocket():
- Socket(new RawSocketImpl)
-{
-}
-
-
-RawSocket::RawSocket(SocketAddress::Family family, int proto):
- Socket(new RawSocketImpl(family, proto))
-{
-}
-
-
-RawSocket::RawSocket(const SocketAddress& address, bool reuseAddress):
- Socket(new RawSocketImpl(address.family()))
-{
- bind(address, reuseAddress);
-}
-
-
-RawSocket::RawSocket(const Socket& socket): Socket(socket)
-{
- if (!dynamic_cast<RawSocketImpl*>(impl()))
- throw InvalidArgumentException("Cannot assign incompatible socket");
-}
-
-
-RawSocket::RawSocket(SocketImpl* pImpl): Socket(pImpl)
-{
- if (!dynamic_cast<RawSocketImpl*>(impl()))
- throw InvalidArgumentException("Cannot assign incompatible socket");
-}
-
-
-RawSocket::~RawSocket()
-{
-}
-
-
-RawSocket& RawSocket::operator = (const Socket& socket)
-{
- if (dynamic_cast<RawSocketImpl*>(socket.impl()))
- Socket::operator = (socket);
- else
- throw InvalidArgumentException("Cannot assign incompatible socket");
- return *this;
-}
-
-
-void RawSocket::connect(const SocketAddress& address)
-{
- impl()->connect(address);
-}
-
-
-void RawSocket::bind(const SocketAddress& address, bool reuseAddress)
-{
- impl()->bind(address, reuseAddress);
-}
-
-
-void RawSocket::bind(const SocketAddress& address, bool reuseAddress, bool reusePort)
-{
- impl()->bind(address, reuseAddress, reusePort);
-}
-
-
-int RawSocket::sendBytes(const void* buffer, int length, int flags)
-{
- return impl()->sendBytes(buffer, length, flags);
-}
-
-
-int RawSocket::receiveBytes(void* buffer, int length, int flags)
-{
- return impl()->receiveBytes(buffer, length, flags);
-}
-
-
-int RawSocket::sendTo(const void* buffer, int length, const SocketAddress& address, int flags)
-{
- return impl()->sendTo(buffer, length, address, flags);
-}
-
-
-int RawSocket::receiveFrom(void* buffer, int length, SocketAddress& address, int flags)
-{
- return impl()->receiveFrom(buffer, length, address, flags);
-}
-
-
-} } // namespace Poco::Net
+//
+// RawSocket.cpp
+//
+// Library: Net
+// Package: Sockets
+// Module: RawSocket
+//
+// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/RawSocket.h"
+#include "Poco/Net/RawSocketImpl.h"
+#include "Poco/Exception.h"
+
+
+using Poco::InvalidArgumentException;
+
+
+namespace Poco {
+namespace Net {
+
+
+RawSocket::RawSocket():
+ Socket(new RawSocketImpl)
+{
+}
+
+
+RawSocket::RawSocket(SocketAddress::Family family, int proto):
+ Socket(new RawSocketImpl(family, proto))
+{
+}
+
+
+RawSocket::RawSocket(const SocketAddress& address, bool reuseAddress):
+ Socket(new RawSocketImpl(address.family()))
+{
+ bind(address, reuseAddress);
+}
+
+
+RawSocket::RawSocket(const Socket& socket): Socket(socket)
+{
+ if (!dynamic_cast<RawSocketImpl*>(impl()))
+ throw InvalidArgumentException("Cannot assign incompatible socket");
+}
+
+
+RawSocket::RawSocket(SocketImpl* pImpl): Socket(pImpl)
+{
+ if (!dynamic_cast<RawSocketImpl*>(impl()))
+ throw InvalidArgumentException("Cannot assign incompatible socket");
+}
+
+
+RawSocket::~RawSocket()
+{
+}
+
+
+RawSocket& RawSocket::operator = (const Socket& socket)
+{
+ if (dynamic_cast<RawSocketImpl*>(socket.impl()))
+ Socket::operator = (socket);
+ else
+ throw InvalidArgumentException("Cannot assign incompatible socket");
+ return *this;
+}
+
+
+void RawSocket::connect(const SocketAddress& address)
+{
+ impl()->connect(address);
+}
+
+
+void RawSocket::bind(const SocketAddress& address, bool reuseAddress)
+{
+ impl()->bind(address, reuseAddress);
+}
+
+
+void RawSocket::bind(const SocketAddress& address, bool reuseAddress, bool reusePort)
+{
+ impl()->bind(address, reuseAddress, reusePort);
+}
+
+
+int RawSocket::sendBytes(const void* buffer, int length, int flags)
+{
+ return impl()->sendBytes(buffer, length, flags);
+}
+
+
+int RawSocket::receiveBytes(void* buffer, int length, int flags)
+{
+ return impl()->receiveBytes(buffer, length, flags);
+}
+
+
+int RawSocket::sendTo(const void* buffer, int length, const SocketAddress& address, int flags)
+{
+ return impl()->sendTo(buffer, length, address, flags);
+}
+
+
+int RawSocket::receiveFrom(void* buffer, int length, SocketAddress& address, int flags)
+{
+ return impl()->receiveFrom(buffer, length, address, flags);
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/RawSocketImpl.cpp b/contrib/libs/poco/Net/src/RawSocketImpl.cpp
index 73dc78818f..c7fb248ef7 100644
--- a/contrib/libs/poco/Net/src/RawSocketImpl.cpp
+++ b/contrib/libs/poco/Net/src/RawSocketImpl.cpp
@@ -1,69 +1,69 @@
-//
-// RawSocketImpl.cpp
-//
-// Library: Net
-// Package: Sockets
-// Module: RawSocketImpl
-//
-// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/RawSocketImpl.h"
-#include "Poco/Net/NetException.h"
-
-
-using Poco::InvalidArgumentException;
-
-
-namespace Poco {
-namespace Net {
-
-
-RawSocketImpl::RawSocketImpl()
-{
- init(AF_INET);
-}
-
-
-RawSocketImpl::RawSocketImpl(SocketAddress::Family family, int proto)
-{
- if (family == SocketAddress::IPv4)
- init2(AF_INET, proto);
-#if defined(POCO_HAVE_IPv6)
- else if (family == SocketAddress::IPv6)
- init2(AF_INET6, proto);
-#endif
- else throw InvalidArgumentException("Invalid or unsupported address family passed to RawSocketImpl");
-
-}
-
-
-RawSocketImpl::RawSocketImpl(poco_socket_t sockfd):
- SocketImpl(sockfd)
-{
-}
-
-
-RawSocketImpl::~RawSocketImpl()
-{
-}
-
-
-void RawSocketImpl::init(int af)
-{
- init2(af, IPPROTO_RAW);
-}
-
-
-void RawSocketImpl::init2(int af, int proto)
-{
- initSocket(af, SOCK_RAW, proto);
- setOption(IPPROTO_IP, IP_HDRINCL, 0);
-}
-
-
-} } // namespace Poco::Net
+//
+// RawSocketImpl.cpp
+//
+// Library: Net
+// Package: Sockets
+// Module: RawSocketImpl
+//
+// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/RawSocketImpl.h"
+#include "Poco/Net/NetException.h"
+
+
+using Poco::InvalidArgumentException;
+
+
+namespace Poco {
+namespace Net {
+
+
+RawSocketImpl::RawSocketImpl()
+{
+ init(AF_INET);
+}
+
+
+RawSocketImpl::RawSocketImpl(SocketAddress::Family family, int proto)
+{
+ if (family == SocketAddress::IPv4)
+ init2(AF_INET, proto);
+#if defined(POCO_HAVE_IPv6)
+ else if (family == SocketAddress::IPv6)
+ init2(AF_INET6, proto);
+#endif
+ else throw InvalidArgumentException("Invalid or unsupported address family passed to RawSocketImpl");
+
+}
+
+
+RawSocketImpl::RawSocketImpl(poco_socket_t sockfd):
+ SocketImpl(sockfd)
+{
+}
+
+
+RawSocketImpl::~RawSocketImpl()
+{
+}
+
+
+void RawSocketImpl::init(int af)
+{
+ init2(af, IPPROTO_RAW);
+}
+
+
+void RawSocketImpl::init2(int af, int proto)
+{
+ initSocket(af, SOCK_RAW, proto);
+ setOption(IPPROTO_IP, IP_HDRINCL, 0);
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/RemoteSyslogChannel.cpp b/contrib/libs/poco/Net/src/RemoteSyslogChannel.cpp
index 3337e786df..8ad6d5b2d0 100644
--- a/contrib/libs/poco/Net/src/RemoteSyslogChannel.cpp
+++ b/contrib/libs/poco/Net/src/RemoteSyslogChannel.cpp
@@ -1,356 +1,356 @@
-//
-// RemoteSyslogChannel.cpp
-//
-// Library: Net
-// Package: Logging
-// Module: RemoteSyslogChannel
-//
-// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/RemoteSyslogChannel.h"
-#include "Poco/Message.h"
-#include "Poco/DateTimeFormatter.h"
-#include "Poco/NumberFormatter.h"
-#include "Poco/Net/SocketAddress.h"
-#include "Poco/Net/DNS.h"
-#include "Poco/LoggingFactory.h"
-#include "Poco/Instantiator.h"
-#include "Poco/String.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-const std::string RemoteSyslogChannel::BSD_TIMEFORMAT("%b %f %H:%M:%S");
-const std::string RemoteSyslogChannel::SYSLOG_TIMEFORMAT("%Y-%m-%dT%H:%M:%S.%i%z");
-const std::string RemoteSyslogChannel::PROP_NAME("name");
-const std::string RemoteSyslogChannel::PROP_FACILITY("facility");
-const std::string RemoteSyslogChannel::PROP_FORMAT("format");
-const std::string RemoteSyslogChannel::PROP_LOGHOST("loghost");
-const std::string RemoteSyslogChannel::PROP_HOST("host");
-const std::string RemoteSyslogChannel::STRUCTURED_DATA("structured-data");
-
-
-RemoteSyslogChannel::RemoteSyslogChannel():
- _logHost("localhost"),
- _name("-"),
- _facility(SYSLOG_USER),
- _bsdFormat(false),
- _open(false)
-{
-}
-
-
-RemoteSyslogChannel::RemoteSyslogChannel(const std::string& address, const std::string& name, int facility, bool bsdFormat):
- _logHost(address),
- _name(name),
- _facility(facility),
- _bsdFormat(bsdFormat),
- _open(false)
-{
- if (_name.empty()) _name = "-";
-}
-
-
-RemoteSyslogChannel::~RemoteSyslogChannel()
-{
- try
- {
- close();
- }
- catch (...)
- {
- poco_unexpected();
- }
-}
-
-
-void RemoteSyslogChannel::open()
-{
- if (_open) return;
-
- if (_logHost.find(':') != std::string::npos)
- _socketAddress = SocketAddress(_logHost);
- else
- _socketAddress = SocketAddress(_logHost, SYSLOG_PORT);
-
- // reset socket for the case that it has been previously closed
- _socket = DatagramSocket(_socketAddress.family());
-
- if (_host.empty())
- {
- try
- {
- _host = DNS::thisHost().name();
- }
- catch (Poco::Exception&)
- {
- _host = _socket.address().host().toString();
- }
- }
-
- _open = true;
-}
-
-
-void RemoteSyslogChannel::close()
-{
- if (_open)
- {
- _socket.close();
- _open = false;
- }
-}
-
-
-void RemoteSyslogChannel::log(const Message& msg)
-{
- Poco::FastMutex::ScopedLock lock(_mutex);
-
- if (!_open) open();
-
- std::string m;
- m.reserve(1024);
- m += '<';
- Poco::NumberFormatter::append(m, getPrio(msg) + _facility);
- m += '>';
- if (_bsdFormat)
- {
- Poco::DateTimeFormatter::append(m, msg.getTime(), BSD_TIMEFORMAT);
- m += ' ';
- m += _host;
- }
- else
- {
- m += "1 "; // version
- Poco::DateTimeFormatter::append(m, msg.getTime(), SYSLOG_TIMEFORMAT);
- m += ' ';
- m += _host;
- m += ' ';
- m += _name;
- m += ' ';
- Poco::NumberFormatter::append(m, msg.getPid());
- m += ' ';
- m += msg.getSource();
- m += ' ';
- if (msg.has(STRUCTURED_DATA))
- {
- m += msg.get(STRUCTURED_DATA);
- }
- else
- {
- m += "-";
- }
- }
- m += ' ';
- m += msg.getText();
-
- _socket.sendTo(m.data(), static_cast<int>(m.size()), _socketAddress);
-}
-
-
-void RemoteSyslogChannel::setProperty(const std::string& name, const std::string& value)
-{
- if (name == PROP_NAME)
- {
- _name = value;
- if (_name.empty()) _name = "-";
- }
- else if (name == PROP_FACILITY)
- {
- std::string facility;
- if (Poco::icompare(value, 4, "LOG_") == 0)
- facility = Poco::toUpper(value.substr(4));
- else if (Poco::icompare(value, 4, "SYSLOG_") == 0)
- facility = Poco::toUpper(value.substr(7));
- else
- facility = Poco::toUpper(value);
-
- if (facility == "KERN")
- _facility = SYSLOG_KERN;
- else if (facility == "USER")
- _facility = SYSLOG_USER;
- else if (facility == "MAIL")
- _facility = SYSLOG_MAIL;
- else if (facility == "DAEMON")
- _facility = SYSLOG_DAEMON;
- else if (facility == "AUTH")
- _facility = SYSLOG_AUTH;
- else if (facility == "AUTHPRIV")
- _facility = SYSLOG_AUTHPRIV;
- else if (facility == "SYSLOG")
- _facility = SYSLOG_SYSLOG;
- else if (facility == "LPR")
- _facility = SYSLOG_LPR;
- else if (facility == "NEWS")
- _facility = SYSLOG_NEWS;
- else if (facility == "UUCP")
- _facility = SYSLOG_UUCP;
- else if (facility == "CRON")
- _facility = SYSLOG_CRON;
- else if (facility == "FTP")
- _facility = SYSLOG_FTP;
- else if (facility == "NTP")
- _facility = SYSLOG_NTP;
- else if (facility == "LOGAUDIT")
- _facility = SYSLOG_LOGAUDIT;
- else if (facility == "LOGALERT")
- _facility = SYSLOG_LOGALERT;
- else if (facility == "CLOCK")
- _facility = SYSLOG_CLOCK;
- else if (facility == "LOCAL0")
- _facility = SYSLOG_LOCAL0;
- else if (facility == "LOCAL1")
- _facility = SYSLOG_LOCAL1;
- else if (facility == "LOCAL2")
- _facility = SYSLOG_LOCAL2;
- else if (facility == "LOCAL3")
- _facility = SYSLOG_LOCAL3;
- else if (facility == "LOCAL4")
- _facility = SYSLOG_LOCAL4;
- else if (facility == "LOCAL5")
- _facility = SYSLOG_LOCAL5;
- else if (facility == "LOCAL6")
- _facility = SYSLOG_LOCAL6;
- else if (facility == "LOCAL7")
- _facility = SYSLOG_LOCAL7;
- }
- else if (name == PROP_LOGHOST)
- {
- _logHost = value;
- }
- else if (name == PROP_HOST)
- {
- _host = value;
- }
- else if (name == PROP_FORMAT)
- {
- _bsdFormat = (value == "bsd" || value == "rfc3164");
- }
- else
- {
- Channel::setProperty(name, value);
- }
-}
-
-
-std::string RemoteSyslogChannel::getProperty(const std::string& name) const
-{
- if (name == PROP_NAME)
- {
- if (_name != "-")
- return _name;
- else
- return "";
- }
- else if (name == PROP_FACILITY)
- {
- if (_facility == SYSLOG_KERN)
- return "KERN";
- else if (_facility == SYSLOG_USER)
- return "USER";
- else if (_facility == SYSLOG_MAIL)
- return "MAIL";
- else if (_facility == SYSLOG_DAEMON)
- return "DAEMON";
- else if (_facility == SYSLOG_AUTH)
- return "AUTH";
- else if (_facility == SYSLOG_AUTHPRIV)
- return "AUTHPRIV";
- else if (_facility == SYSLOG_SYSLOG)
- return "SYSLOG";
- else if (_facility == SYSLOG_LPR)
- return "LPR";
- else if (_facility == SYSLOG_NEWS)
- return "NEWS";
- else if (_facility == SYSLOG_UUCP)
- return "UUCP";
- else if (_facility == SYSLOG_CRON)
- return "CRON";
- else if (_facility == SYSLOG_FTP)
- return "FTP";
- else if (_facility == SYSLOG_NTP)
- return "NTP";
- else if (_facility == SYSLOG_LOGAUDIT)
- return "LOGAUDIT";
- else if (_facility == SYSLOG_LOGALERT)
- return "LOGALERT";
- else if (_facility == SYSLOG_CLOCK)
- return "CLOCK";
- else if (_facility == SYSLOG_LOCAL0)
- return "LOCAL0";
- else if (_facility == SYSLOG_LOCAL1)
- return "LOCAL1";
- else if (_facility == SYSLOG_LOCAL2)
- return "LOCAL2";
- else if (_facility == SYSLOG_LOCAL3)
- return "LOCAL3";
- else if (_facility == SYSLOG_LOCAL4)
- return "LOCAL4";
- else if (_facility == SYSLOG_LOCAL5)
- return "LOCAL5";
- else if (_facility == SYSLOG_LOCAL6)
- return "LOCAL6";
- else if (_facility == SYSLOG_LOCAL7)
- return "LOCAL7";
- else
- return "";
- }
- else if (name == PROP_LOGHOST)
- {
- return _logHost;
- }
- else if (name == PROP_HOST)
- {
- return _host;
- }
- else if (name == PROP_FORMAT)
- {
- return _bsdFormat ? "rfc3164" : "rfc5424";
- }
- else
- {
- return Channel::getProperty(name);
- }
-}
-
-
-int RemoteSyslogChannel::getPrio(const Message& msg)
-{
- switch (msg.getPriority())
- {
+//
+// RemoteSyslogChannel.cpp
+//
+// Library: Net
+// Package: Logging
+// Module: RemoteSyslogChannel
+//
+// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/RemoteSyslogChannel.h"
+#include "Poco/Message.h"
+#include "Poco/DateTimeFormatter.h"
+#include "Poco/NumberFormatter.h"
+#include "Poco/Net/SocketAddress.h"
+#include "Poco/Net/DNS.h"
+#include "Poco/LoggingFactory.h"
+#include "Poco/Instantiator.h"
+#include "Poco/String.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+const std::string RemoteSyslogChannel::BSD_TIMEFORMAT("%b %f %H:%M:%S");
+const std::string RemoteSyslogChannel::SYSLOG_TIMEFORMAT("%Y-%m-%dT%H:%M:%S.%i%z");
+const std::string RemoteSyslogChannel::PROP_NAME("name");
+const std::string RemoteSyslogChannel::PROP_FACILITY("facility");
+const std::string RemoteSyslogChannel::PROP_FORMAT("format");
+const std::string RemoteSyslogChannel::PROP_LOGHOST("loghost");
+const std::string RemoteSyslogChannel::PROP_HOST("host");
+const std::string RemoteSyslogChannel::STRUCTURED_DATA("structured-data");
+
+
+RemoteSyslogChannel::RemoteSyslogChannel():
+ _logHost("localhost"),
+ _name("-"),
+ _facility(SYSLOG_USER),
+ _bsdFormat(false),
+ _open(false)
+{
+}
+
+
+RemoteSyslogChannel::RemoteSyslogChannel(const std::string& address, const std::string& name, int facility, bool bsdFormat):
+ _logHost(address),
+ _name(name),
+ _facility(facility),
+ _bsdFormat(bsdFormat),
+ _open(false)
+{
+ if (_name.empty()) _name = "-";
+}
+
+
+RemoteSyslogChannel::~RemoteSyslogChannel()
+{
+ try
+ {
+ close();
+ }
+ catch (...)
+ {
+ poco_unexpected();
+ }
+}
+
+
+void RemoteSyslogChannel::open()
+{
+ if (_open) return;
+
+ if (_logHost.find(':') != std::string::npos)
+ _socketAddress = SocketAddress(_logHost);
+ else
+ _socketAddress = SocketAddress(_logHost, SYSLOG_PORT);
+
+ // reset socket for the case that it has been previously closed
+ _socket = DatagramSocket(_socketAddress.family());
+
+ if (_host.empty())
+ {
+ try
+ {
+ _host = DNS::thisHost().name();
+ }
+ catch (Poco::Exception&)
+ {
+ _host = _socket.address().host().toString();
+ }
+ }
+
+ _open = true;
+}
+
+
+void RemoteSyslogChannel::close()
+{
+ if (_open)
+ {
+ _socket.close();
+ _open = false;
+ }
+}
+
+
+void RemoteSyslogChannel::log(const Message& msg)
+{
+ Poco::FastMutex::ScopedLock lock(_mutex);
+
+ if (!_open) open();
+
+ std::string m;
+ m.reserve(1024);
+ m += '<';
+ Poco::NumberFormatter::append(m, getPrio(msg) + _facility);
+ m += '>';
+ if (_bsdFormat)
+ {
+ Poco::DateTimeFormatter::append(m, msg.getTime(), BSD_TIMEFORMAT);
+ m += ' ';
+ m += _host;
+ }
+ else
+ {
+ m += "1 "; // version
+ Poco::DateTimeFormatter::append(m, msg.getTime(), SYSLOG_TIMEFORMAT);
+ m += ' ';
+ m += _host;
+ m += ' ';
+ m += _name;
+ m += ' ';
+ Poco::NumberFormatter::append(m, msg.getPid());
+ m += ' ';
+ m += msg.getSource();
+ m += ' ';
+ if (msg.has(STRUCTURED_DATA))
+ {
+ m += msg.get(STRUCTURED_DATA);
+ }
+ else
+ {
+ m += "-";
+ }
+ }
+ m += ' ';
+ m += msg.getText();
+
+ _socket.sendTo(m.data(), static_cast<int>(m.size()), _socketAddress);
+}
+
+
+void RemoteSyslogChannel::setProperty(const std::string& name, const std::string& value)
+{
+ if (name == PROP_NAME)
+ {
+ _name = value;
+ if (_name.empty()) _name = "-";
+ }
+ else if (name == PROP_FACILITY)
+ {
+ std::string facility;
+ if (Poco::icompare(value, 4, "LOG_") == 0)
+ facility = Poco::toUpper(value.substr(4));
+ else if (Poco::icompare(value, 4, "SYSLOG_") == 0)
+ facility = Poco::toUpper(value.substr(7));
+ else
+ facility = Poco::toUpper(value);
+
+ if (facility == "KERN")
+ _facility = SYSLOG_KERN;
+ else if (facility == "USER")
+ _facility = SYSLOG_USER;
+ else if (facility == "MAIL")
+ _facility = SYSLOG_MAIL;
+ else if (facility == "DAEMON")
+ _facility = SYSLOG_DAEMON;
+ else if (facility == "AUTH")
+ _facility = SYSLOG_AUTH;
+ else if (facility == "AUTHPRIV")
+ _facility = SYSLOG_AUTHPRIV;
+ else if (facility == "SYSLOG")
+ _facility = SYSLOG_SYSLOG;
+ else if (facility == "LPR")
+ _facility = SYSLOG_LPR;
+ else if (facility == "NEWS")
+ _facility = SYSLOG_NEWS;
+ else if (facility == "UUCP")
+ _facility = SYSLOG_UUCP;
+ else if (facility == "CRON")
+ _facility = SYSLOG_CRON;
+ else if (facility == "FTP")
+ _facility = SYSLOG_FTP;
+ else if (facility == "NTP")
+ _facility = SYSLOG_NTP;
+ else if (facility == "LOGAUDIT")
+ _facility = SYSLOG_LOGAUDIT;
+ else if (facility == "LOGALERT")
+ _facility = SYSLOG_LOGALERT;
+ else if (facility == "CLOCK")
+ _facility = SYSLOG_CLOCK;
+ else if (facility == "LOCAL0")
+ _facility = SYSLOG_LOCAL0;
+ else if (facility == "LOCAL1")
+ _facility = SYSLOG_LOCAL1;
+ else if (facility == "LOCAL2")
+ _facility = SYSLOG_LOCAL2;
+ else if (facility == "LOCAL3")
+ _facility = SYSLOG_LOCAL3;
+ else if (facility == "LOCAL4")
+ _facility = SYSLOG_LOCAL4;
+ else if (facility == "LOCAL5")
+ _facility = SYSLOG_LOCAL5;
+ else if (facility == "LOCAL6")
+ _facility = SYSLOG_LOCAL6;
+ else if (facility == "LOCAL7")
+ _facility = SYSLOG_LOCAL7;
+ }
+ else if (name == PROP_LOGHOST)
+ {
+ _logHost = value;
+ }
+ else if (name == PROP_HOST)
+ {
+ _host = value;
+ }
+ else if (name == PROP_FORMAT)
+ {
+ _bsdFormat = (value == "bsd" || value == "rfc3164");
+ }
+ else
+ {
+ Channel::setProperty(name, value);
+ }
+}
+
+
+std::string RemoteSyslogChannel::getProperty(const std::string& name) const
+{
+ if (name == PROP_NAME)
+ {
+ if (_name != "-")
+ return _name;
+ else
+ return "";
+ }
+ else if (name == PROP_FACILITY)
+ {
+ if (_facility == SYSLOG_KERN)
+ return "KERN";
+ else if (_facility == SYSLOG_USER)
+ return "USER";
+ else if (_facility == SYSLOG_MAIL)
+ return "MAIL";
+ else if (_facility == SYSLOG_DAEMON)
+ return "DAEMON";
+ else if (_facility == SYSLOG_AUTH)
+ return "AUTH";
+ else if (_facility == SYSLOG_AUTHPRIV)
+ return "AUTHPRIV";
+ else if (_facility == SYSLOG_SYSLOG)
+ return "SYSLOG";
+ else if (_facility == SYSLOG_LPR)
+ return "LPR";
+ else if (_facility == SYSLOG_NEWS)
+ return "NEWS";
+ else if (_facility == SYSLOG_UUCP)
+ return "UUCP";
+ else if (_facility == SYSLOG_CRON)
+ return "CRON";
+ else if (_facility == SYSLOG_FTP)
+ return "FTP";
+ else if (_facility == SYSLOG_NTP)
+ return "NTP";
+ else if (_facility == SYSLOG_LOGAUDIT)
+ return "LOGAUDIT";
+ else if (_facility == SYSLOG_LOGALERT)
+ return "LOGALERT";
+ else if (_facility == SYSLOG_CLOCK)
+ return "CLOCK";
+ else if (_facility == SYSLOG_LOCAL0)
+ return "LOCAL0";
+ else if (_facility == SYSLOG_LOCAL1)
+ return "LOCAL1";
+ else if (_facility == SYSLOG_LOCAL2)
+ return "LOCAL2";
+ else if (_facility == SYSLOG_LOCAL3)
+ return "LOCAL3";
+ else if (_facility == SYSLOG_LOCAL4)
+ return "LOCAL4";
+ else if (_facility == SYSLOG_LOCAL5)
+ return "LOCAL5";
+ else if (_facility == SYSLOG_LOCAL6)
+ return "LOCAL6";
+ else if (_facility == SYSLOG_LOCAL7)
+ return "LOCAL7";
+ else
+ return "";
+ }
+ else if (name == PROP_LOGHOST)
+ {
+ return _logHost;
+ }
+ else if (name == PROP_HOST)
+ {
+ return _host;
+ }
+ else if (name == PROP_FORMAT)
+ {
+ return _bsdFormat ? "rfc3164" : "rfc5424";
+ }
+ else
+ {
+ return Channel::getProperty(name);
+ }
+}
+
+
+int RemoteSyslogChannel::getPrio(const Message& msg)
+{
+ switch (msg.getPriority())
+ {
case Message::PRIO_TEST:
- case Message::PRIO_TRACE:
- case Message::PRIO_DEBUG:
- return SYSLOG_DEBUG;
- case Message::PRIO_INFORMATION:
- return SYSLOG_INFORMATIONAL;
- case Message::PRIO_NOTICE:
- return SYSLOG_NOTICE;
- case Message::PRIO_WARNING:
- return SYSLOG_WARNING;
- case Message::PRIO_ERROR:
- return SYSLOG_ERROR;
- case Message::PRIO_CRITICAL:
- return SYSLOG_CRITICAL;
- case Message::PRIO_FATAL:
- return SYSLOG_ALERT;
- default:
- return 0;
- }
-}
-
-
-void RemoteSyslogChannel::registerChannel()
-{
- Poco::LoggingFactory::defaultFactory().registerChannelClass("RemoteSyslogChannel", new Poco::Instantiator<RemoteSyslogChannel, Poco::Channel>);
-}
-
-
-} } // namespace Poco::Net
+ case Message::PRIO_TRACE:
+ case Message::PRIO_DEBUG:
+ return SYSLOG_DEBUG;
+ case Message::PRIO_INFORMATION:
+ return SYSLOG_INFORMATIONAL;
+ case Message::PRIO_NOTICE:
+ return SYSLOG_NOTICE;
+ case Message::PRIO_WARNING:
+ return SYSLOG_WARNING;
+ case Message::PRIO_ERROR:
+ return SYSLOG_ERROR;
+ case Message::PRIO_CRITICAL:
+ return SYSLOG_CRITICAL;
+ case Message::PRIO_FATAL:
+ return SYSLOG_ALERT;
+ default:
+ return 0;
+ }
+}
+
+
+void RemoteSyslogChannel::registerChannel()
+{
+ Poco::LoggingFactory::defaultFactory().registerChannelClass("RemoteSyslogChannel", new Poco::Instantiator<RemoteSyslogChannel, Poco::Channel>);
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/RemoteSyslogListener.cpp b/contrib/libs/poco/Net/src/RemoteSyslogListener.cpp
index ac17391324..c33a4e49da 100644
--- a/contrib/libs/poco/Net/src/RemoteSyslogListener.cpp
+++ b/contrib/libs/poco/Net/src/RemoteSyslogListener.cpp
@@ -1,630 +1,630 @@
-//
-// RemoteSyslogListener.cpp
-//
-// Library: Net
-// Package: Logging
-// Module: RemoteSyslogListener
-//
-// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/RemoteSyslogListener.h"
-#include "Poco/Net/RemoteSyslogChannel.h"
-#include "Poco/Net/DatagramSocket.h"
-#include "Poco/Net/SocketAddress.h"
-#include "Poco/Runnable.h"
-#include "Poco/Notification.h"
-#include "Poco/AutoPtr.h"
-#include "Poco/NumberParser.h"
-#include "Poco/NumberFormatter.h"
-#include "Poco/DateTimeParser.h"
-#include "Poco/Message.h"
-#include "Poco/LoggingFactory.h"
-#include "Poco/Buffer.h"
-#include "Poco/Ascii.h"
-#include <cstddef>
-
-
-namespace Poco {
-namespace Net {
-
-
-//
-// MessageNotification
-//
-
-
-class MessageNotification: public Poco::Notification
-{
-public:
- MessageNotification(const char* buffer, std::size_t length, const Poco::Net::SocketAddress& sourceAddress):
- _message(buffer, length),
- _sourceAddress(sourceAddress)
- {
- }
-
- MessageNotification(const std::string& message, const Poco::Net::SocketAddress& sourceAddress):
- _message(message),
- _sourceAddress(sourceAddress)
- {
- }
-
- ~MessageNotification()
- {
- }
-
- const std::string& message() const
- {
- return _message;
- }
-
- const Poco::Net::SocketAddress& sourceAddress() const
- {
- return _sourceAddress;
- }
-
-private:
- std::string _message;
- Poco::Net::SocketAddress _sourceAddress;
-};
-
-
-//
-// RemoteUDPListener
-//
-
-
-class RemoteUDPListener: public Poco::Runnable
-{
-public:
- enum
- {
- WAITTIME_MILLISEC = 1000,
- BUFFER_SIZE = 65536
- };
-
- RemoteUDPListener(Poco::NotificationQueue& queue, Poco::UInt16 port);
- ~RemoteUDPListener();
-
- void run();
- void safeStop();
-
-private:
- Poco::NotificationQueue& _queue;
- DatagramSocket _socket;
- bool _stopped;
-};
-
-
-RemoteUDPListener::RemoteUDPListener(Poco::NotificationQueue& queue, Poco::UInt16 port):
- _queue(queue),
- _socket(Poco::Net::SocketAddress(Poco::Net::IPAddress(), port)),
- _stopped(false)
-{
-}
-
-
-RemoteUDPListener::~RemoteUDPListener()
-{
-}
-
-
-void RemoteUDPListener::run()
-{
- Poco::Buffer<char> buffer(BUFFER_SIZE);
- Poco::Timespan waitTime(WAITTIME_MILLISEC* 1000);
- while (!_stopped)
- {
- try
- {
- if (_socket.poll(waitTime, Socket::SELECT_READ))
- {
- Poco::Net::SocketAddress sourceAddress;
- int n = _socket.receiveFrom(buffer.begin(), BUFFER_SIZE, sourceAddress);
- if (n > 0)
- {
- _queue.enqueueNotification(new MessageNotification(buffer.begin(), n, sourceAddress));
- }
- }
- }
- catch (...)
- {
- // lazy exception catching
- }
- }
-}
-
-
-void RemoteUDPListener::safeStop()
-{
- _stopped = true;
-}
-
-
-//
-// SyslogParser
-//
-
-
-class SyslogParser: public Poco::Runnable
-{
-public:
- static const std::string NILVALUE;
-
- enum
- {
- WAITTIME_MILLISEC = 1000
- };
-
- SyslogParser(Poco::NotificationQueue& queue, RemoteSyslogListener* pListener);
- ~SyslogParser();
-
- void parse(const std::string& line, Poco::Message& message);
- void run();
- void safeStop();
-
- static Poco::Message::Priority convert(RemoteSyslogChannel::Severity severity);
-
-private:
- void parsePrio(const std::string& line, std::size_t& pos, RemoteSyslogChannel::Severity& severity, RemoteSyslogChannel::Facility& fac);
- void parseNew(const std::string& line, RemoteSyslogChannel::Severity severity, RemoteSyslogChannel::Facility fac, std::size_t& pos, Poco::Message& message);
- void parseBSD(const std::string& line, RemoteSyslogChannel::Severity severity, RemoteSyslogChannel::Facility fac, std::size_t& pos, Poco::Message& message);
-
- static std::string parseUntilSpace(const std::string& line, std::size_t& pos);
- /// Parses until it encounters the next space char, returns the string from pos, excluding space
- /// pos will point past the space char
-
- static std::string parseStructuredData(const std::string& line, std::size_t& pos);
- /// Parses the structured data field.
-
- static std::string parseStructuredDataToken(const std::string& line, std::size_t& pos);
- /// Parses a token from the structured data field.
-
-private:
- Poco::NotificationQueue& _queue;
- bool _stopped;
- RemoteSyslogListener* _pListener;
-};
-
-
-const std::string SyslogParser::NILVALUE("-");
-
-
-SyslogParser::SyslogParser(Poco::NotificationQueue& queue, RemoteSyslogListener* pListener):
- _queue(queue),
- _stopped(false),
- _pListener(pListener)
-{
- poco_check_ptr (_pListener);
-}
-
-
-SyslogParser::~SyslogParser()
-{
-}
-
-
-void SyslogParser::run()
-{
- while (!_stopped)
- {
- try
- {
- Poco::AutoPtr<Poco::Notification> pNf(_queue.waitDequeueNotification(WAITTIME_MILLISEC));
- if (pNf)
- {
- Poco::AutoPtr<MessageNotification> pMsgNf = pNf.cast<MessageNotification>();
- Poco::Message message;
- parse(pMsgNf->message(), message);
- message["addr"] =pMsgNf->sourceAddress().host().toString();
- _pListener->log(message);
- }
- }
- catch (Poco::Exception&)
- {
- // parsing exception, what should we do?
- }
- catch (...)
- {
- }
- }
-}
-
-
-void SyslogParser::safeStop()
-{
- _stopped = true;
-}
-
-
-void SyslogParser::parse(const std::string& line, Poco::Message& message)
-{
- // <int> -> int: lower 3 bits severity, upper bits: facility
- std::size_t pos = 0;
- RemoteSyslogChannel::Severity severity;
- RemoteSyslogChannel::Facility fac;
- parsePrio(line, pos, severity, fac);
-
- // the next field decide if we parse an old BSD message or a new syslog message
- // BSD: expects a month value in string form: Jan, Feb...
- // SYSLOG expects a version number: 1
-
- if (Poco::Ascii::isDigit(line[pos]))
- {
- parseNew(line, severity, fac, pos, message);
- }
+//
+// RemoteSyslogListener.cpp
+//
+// Library: Net
+// Package: Logging
+// Module: RemoteSyslogListener
+//
+// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/RemoteSyslogListener.h"
+#include "Poco/Net/RemoteSyslogChannel.h"
+#include "Poco/Net/DatagramSocket.h"
+#include "Poco/Net/SocketAddress.h"
+#include "Poco/Runnable.h"
+#include "Poco/Notification.h"
+#include "Poco/AutoPtr.h"
+#include "Poco/NumberParser.h"
+#include "Poco/NumberFormatter.h"
+#include "Poco/DateTimeParser.h"
+#include "Poco/Message.h"
+#include "Poco/LoggingFactory.h"
+#include "Poco/Buffer.h"
+#include "Poco/Ascii.h"
+#include <cstddef>
+
+
+namespace Poco {
+namespace Net {
+
+
+//
+// MessageNotification
+//
+
+
+class MessageNotification: public Poco::Notification
+{
+public:
+ MessageNotification(const char* buffer, std::size_t length, const Poco::Net::SocketAddress& sourceAddress):
+ _message(buffer, length),
+ _sourceAddress(sourceAddress)
+ {
+ }
+
+ MessageNotification(const std::string& message, const Poco::Net::SocketAddress& sourceAddress):
+ _message(message),
+ _sourceAddress(sourceAddress)
+ {
+ }
+
+ ~MessageNotification()
+ {
+ }
+
+ const std::string& message() const
+ {
+ return _message;
+ }
+
+ const Poco::Net::SocketAddress& sourceAddress() const
+ {
+ return _sourceAddress;
+ }
+
+private:
+ std::string _message;
+ Poco::Net::SocketAddress _sourceAddress;
+};
+
+
+//
+// RemoteUDPListener
+//
+
+
+class RemoteUDPListener: public Poco::Runnable
+{
+public:
+ enum
+ {
+ WAITTIME_MILLISEC = 1000,
+ BUFFER_SIZE = 65536
+ };
+
+ RemoteUDPListener(Poco::NotificationQueue& queue, Poco::UInt16 port);
+ ~RemoteUDPListener();
+
+ void run();
+ void safeStop();
+
+private:
+ Poco::NotificationQueue& _queue;
+ DatagramSocket _socket;
+ bool _stopped;
+};
+
+
+RemoteUDPListener::RemoteUDPListener(Poco::NotificationQueue& queue, Poco::UInt16 port):
+ _queue(queue),
+ _socket(Poco::Net::SocketAddress(Poco::Net::IPAddress(), port)),
+ _stopped(false)
+{
+}
+
+
+RemoteUDPListener::~RemoteUDPListener()
+{
+}
+
+
+void RemoteUDPListener::run()
+{
+ Poco::Buffer<char> buffer(BUFFER_SIZE);
+ Poco::Timespan waitTime(WAITTIME_MILLISEC* 1000);
+ while (!_stopped)
+ {
+ try
+ {
+ if (_socket.poll(waitTime, Socket::SELECT_READ))
+ {
+ Poco::Net::SocketAddress sourceAddress;
+ int n = _socket.receiveFrom(buffer.begin(), BUFFER_SIZE, sourceAddress);
+ if (n > 0)
+ {
+ _queue.enqueueNotification(new MessageNotification(buffer.begin(), n, sourceAddress));
+ }
+ }
+ }
+ catch (...)
+ {
+ // lazy exception catching
+ }
+ }
+}
+
+
+void RemoteUDPListener::safeStop()
+{
+ _stopped = true;
+}
+
+
+//
+// SyslogParser
+//
+
+
+class SyslogParser: public Poco::Runnable
+{
+public:
+ static const std::string NILVALUE;
+
+ enum
+ {
+ WAITTIME_MILLISEC = 1000
+ };
+
+ SyslogParser(Poco::NotificationQueue& queue, RemoteSyslogListener* pListener);
+ ~SyslogParser();
+
+ void parse(const std::string& line, Poco::Message& message);
+ void run();
+ void safeStop();
+
+ static Poco::Message::Priority convert(RemoteSyslogChannel::Severity severity);
+
+private:
+ void parsePrio(const std::string& line, std::size_t& pos, RemoteSyslogChannel::Severity& severity, RemoteSyslogChannel::Facility& fac);
+ void parseNew(const std::string& line, RemoteSyslogChannel::Severity severity, RemoteSyslogChannel::Facility fac, std::size_t& pos, Poco::Message& message);
+ void parseBSD(const std::string& line, RemoteSyslogChannel::Severity severity, RemoteSyslogChannel::Facility fac, std::size_t& pos, Poco::Message& message);
+
+ static std::string parseUntilSpace(const std::string& line, std::size_t& pos);
+ /// Parses until it encounters the next space char, returns the string from pos, excluding space
+ /// pos will point past the space char
+
+ static std::string parseStructuredData(const std::string& line, std::size_t& pos);
+ /// Parses the structured data field.
+
+ static std::string parseStructuredDataToken(const std::string& line, std::size_t& pos);
+ /// Parses a token from the structured data field.
+
+private:
+ Poco::NotificationQueue& _queue;
+ bool _stopped;
+ RemoteSyslogListener* _pListener;
+};
+
+
+const std::string SyslogParser::NILVALUE("-");
+
+
+SyslogParser::SyslogParser(Poco::NotificationQueue& queue, RemoteSyslogListener* pListener):
+ _queue(queue),
+ _stopped(false),
+ _pListener(pListener)
+{
+ poco_check_ptr (_pListener);
+}
+
+
+SyslogParser::~SyslogParser()
+{
+}
+
+
+void SyslogParser::run()
+{
+ while (!_stopped)
+ {
+ try
+ {
+ Poco::AutoPtr<Poco::Notification> pNf(_queue.waitDequeueNotification(WAITTIME_MILLISEC));
+ if (pNf)
+ {
+ Poco::AutoPtr<MessageNotification> pMsgNf = pNf.cast<MessageNotification>();
+ Poco::Message message;
+ parse(pMsgNf->message(), message);
+ message["addr"] =pMsgNf->sourceAddress().host().toString();
+ _pListener->log(message);
+ }
+ }
+ catch (Poco::Exception&)
+ {
+ // parsing exception, what should we do?
+ }
+ catch (...)
+ {
+ }
+ }
+}
+
+
+void SyslogParser::safeStop()
+{
+ _stopped = true;
+}
+
+
+void SyslogParser::parse(const std::string& line, Poco::Message& message)
+{
+ // <int> -> int: lower 3 bits severity, upper bits: facility
+ std::size_t pos = 0;
+ RemoteSyslogChannel::Severity severity;
+ RemoteSyslogChannel::Facility fac;
+ parsePrio(line, pos, severity, fac);
+
+ // the next field decide if we parse an old BSD message or a new syslog message
+ // BSD: expects a month value in string form: Jan, Feb...
+ // SYSLOG expects a version number: 1
+
+ if (Poco::Ascii::isDigit(line[pos]))
+ {
+ parseNew(line, severity, fac, pos, message);
+ }
+ else
+ {
+ parseBSD(line, severity, fac, pos, message);
+ }
+ poco_assert (pos == line.size());
+}
+
+
+void SyslogParser::parsePrio(const std::string& line, std::size_t& pos, RemoteSyslogChannel::Severity& severity, RemoteSyslogChannel::Facility& fac)
+{
+ poco_assert (pos < line.size());
+ poco_assert (line[pos] == '<');
+ ++pos;
+ std::size_t start = pos;
+
+ while (pos < line.size() && Poco::Ascii::isDigit(line[pos]))
+ ++pos;
+
+ poco_assert (line[pos] == '>');
+ poco_assert (pos - start > 0);
+ std::string valStr = line.substr(start, pos - start);
+ ++pos; // skip the >
+
+ int val = Poco::NumberParser::parse(valStr);
+ poco_assert (val >= 0 && val <= (RemoteSyslogChannel::SYSLOG_LOCAL7 + RemoteSyslogChannel::SYSLOG_DEBUG));
+
+ Poco::UInt16 pri = static_cast<Poco::UInt16>(val);
+ // now get the lowest 3 bits
+ severity = static_cast<RemoteSyslogChannel::Severity>(pri & 0x0007u);
+ fac = static_cast<RemoteSyslogChannel::Facility>(pri & 0xfff8u);
+}
+
+
+void SyslogParser::parseNew(const std::string& line, RemoteSyslogChannel::Severity severity, RemoteSyslogChannel::Facility /*fac*/, std::size_t& pos, Poco::Message& message)
+{
+ Poco::Message::Priority prio = convert(severity);
+ // rest of the unparsed header is:
+ // VERSION SP TIMESTAMP SP HOSTNAME SP APP-NAME SP PROCID SP MSGID
+ std::string versionStr(parseUntilSpace(line, pos));
+ std::string timeStr(parseUntilSpace(line, pos)); // can be the nilvalue!
+ std::string hostName(parseUntilSpace(line, pos));
+ std::string appName(parseUntilSpace(line, pos));
+ std::string procId(parseUntilSpace(line, pos));
+ std::string msgId(parseUntilSpace(line, pos));
+ std::string sd(parseStructuredData(line, pos));
+ std::string messageText(line.substr(pos));
+ pos = line.size();
+ Poco::DateTime date;
+ int tzd = 0;
+ bool hasDate = Poco::DateTimeParser::tryParse(RemoteSyslogChannel::SYSLOG_TIMEFORMAT, timeStr, date, tzd);
+ Poco::Message logEntry(msgId, messageText, prio);
+ logEntry[RemoteSyslogListener::LOG_PROP_HOST] = hostName;
+ logEntry[RemoteSyslogListener::LOG_PROP_APP] = appName;
+ logEntry[RemoteSyslogListener::LOG_PROP_STRUCTURED_DATA] = sd;
+
+ if (hasDate)
+ logEntry.setTime(date.timestamp());
+ int lval(0);
+ Poco::NumberParser::tryParse(procId, lval);
+ logEntry.setPid(lval);
+ message.swap(logEntry);
+}
+
+
+void SyslogParser::parseBSD(const std::string& line, RemoteSyslogChannel::Severity severity, RemoteSyslogChannel::Facility /*fac*/, std::size_t& pos, Poco::Message& message)
+{
+ Poco::Message::Priority prio = convert(severity);
+ // rest of the unparsed header is:
+ // "%b %f %H:%M:%S" SP hostname|ipaddress
+ // detect three spaces
+ int spaceCnt = 0;
+ std::size_t start = pos;
+ while (spaceCnt < 3 && pos < line.size())
+ {
+ if (line[pos] == ' ')
+ {
+ spaceCnt++;
+ if (spaceCnt == 1)
+ {
+ // size must be 3 chars for month
+ if (pos - start != 3)
+ {
+ // probably a shortened time value, or the hostname
+ // assume hostName
+ Poco::Message logEntry(line.substr(start, pos-start), line.substr(pos+1), prio);
+ message.swap(logEntry);
+ return;
+ }
+ }
+ else if (spaceCnt == 2)
+ {
+ // a day value!
+ if (!(Poco::Ascii::isDigit(line[pos-1]) && (Poco::Ascii::isDigit(line[pos-2]) || Poco::Ascii::isSpace(line[pos-2]))))
+ {
+ // assume the next field is a hostname
+ spaceCnt = 3;
+ }
+ }
+ if (pos + 1 < line.size() && line[pos+1] == ' ')
+ {
+ // we have two spaces when the day value is smaller than 10!
+ ++pos; // skip one
+ }
+ }
+ ++pos;
+ }
+ std::string timeStr(line.substr(start, pos-start-1));
+ int tzd(0);
+ Poco::DateTime date;
+ int year = date.year(); // year is not included, use the current one
+ bool hasDate = Poco::DateTimeParser::tryParse(RemoteSyslogChannel::BSD_TIMEFORMAT, timeStr, date, tzd);
+ if (hasDate)
+ {
+ int m = date.month();
+ int d = date.day();
+ int h = date.hour();
+ int min = date.minute();
+ int sec = date.second();
+ date = Poco::DateTime(year, m, d, h, min, sec);
+ }
+ // next entry is host SP
+ std::string hostName(parseUntilSpace(line, pos));
+
+ // TAG: at most 32 alphanumeric chars, ANY non alphannumeric indicates start of message content
+ // ignore: treat everything as content
+ std::string messageText(line.substr(pos));
+ pos = line.size();
+ Poco::Message logEntry(hostName, messageText, prio);
+ logEntry.setTime(date.timestamp());
+ message.swap(logEntry);
+}
+
+
+std::string SyslogParser::parseUntilSpace(const std::string& line, std::size_t& pos)
+{
+ std::size_t start = pos;
+ while (pos < line.size() && !Poco::Ascii::isSpace(line[pos]))
+ ++pos;
+ // skip space
+ ++pos;
+ return line.substr(start, pos-start-1);
+}
+
+
+std::string SyslogParser::parseStructuredData(const std::string& line, std::size_t& pos)
+{
+ std::string sd;
+ if (pos < line.size())
+ {
+ if (line[pos] == '-')
+ {
+ ++pos;
+ }
+ else if (line[pos] == '[')
+ {
+ std::string tok = parseStructuredDataToken(line, pos);
+ while (tok == "[")
+ {
+ sd += tok;
+ tok = parseStructuredDataToken(line, pos);
+ while (tok != "]" && !tok.empty())
+ {
+ sd += tok;
+ tok = parseStructuredDataToken(line, pos);
+ }
+ sd += tok;
+ if (pos < line.size() && line[pos] == '[') tok = parseStructuredDataToken(line, pos);
+ }
+ }
+ if (pos < line.size() && Poco::Ascii::isSpace(line[pos])) ++pos;
+ }
+ return sd;
+}
+
+
+std::string SyslogParser::parseStructuredDataToken(const std::string& line, std::size_t& pos)
+{
+ std::string tok;
+ if (pos < line.size())
+ {
+ if (Poco::Ascii::isSpace(line[pos]) || line[pos] == '=' || line[pos] == '[' || line[pos] == ']')
+ {
+ tok += line[pos++];
+ }
+ else if (line[pos] == '"')
+ {
+ tok += line[pos++];
+ while (pos < line.size() && line[pos] != '"')
+ {
+ tok += line[pos++];
+ }
+ tok += '"';
+ if (pos < line.size()) pos++;
+ }
+ else
+ {
+ while (pos < line.size() && !Poco::Ascii::isSpace(line[pos]) && line[pos] != '=')
+ {
+ tok += line[pos++];
+ }
+ }
+ }
+ return tok;
+}
+
+Poco::Message::Priority SyslogParser::convert(RemoteSyslogChannel::Severity severity)
+{
+ switch (severity)
+ {
+ case RemoteSyslogChannel::SYSLOG_EMERGENCY:
+ return Poco::Message::PRIO_FATAL;
+ case RemoteSyslogChannel::SYSLOG_ALERT:
+ return Poco::Message::PRIO_FATAL;
+ case RemoteSyslogChannel::SYSLOG_CRITICAL:
+ return Poco::Message::PRIO_CRITICAL;
+ case RemoteSyslogChannel::SYSLOG_ERROR:
+ return Poco::Message::PRIO_ERROR;
+ case RemoteSyslogChannel::SYSLOG_WARNING:
+ return Poco::Message::PRIO_WARNING;
+ case RemoteSyslogChannel::SYSLOG_NOTICE:
+ return Poco::Message::PRIO_NOTICE;
+ case RemoteSyslogChannel::SYSLOG_INFORMATIONAL:
+ return Poco::Message::PRIO_INFORMATION;
+ case RemoteSyslogChannel::SYSLOG_DEBUG:
+ return Poco::Message::PRIO_DEBUG;
+ }
+ throw Poco::LogicException("Illegal severity value in message");
+}
+
+
+//
+// RemoteSyslogListener
+//
+
+
+const std::string RemoteSyslogListener::PROP_PORT("port");
+const std::string RemoteSyslogListener::PROP_THREADS("threads");
+
+const std::string RemoteSyslogListener::LOG_PROP_APP("app");
+const std::string RemoteSyslogListener::LOG_PROP_HOST("host");
+const std::string RemoteSyslogListener::LOG_PROP_STRUCTURED_DATA("structured-data");
+
+
+RemoteSyslogListener::RemoteSyslogListener():
+ _pListener(0),
+ _pParser(0),
+ _port(RemoteSyslogChannel::SYSLOG_PORT),
+ _threads(1)
+{
+}
+
+
+RemoteSyslogListener::RemoteSyslogListener(Poco::UInt16 port):
+ _pListener(0),
+ _pParser(0),
+ _port(port),
+ _threads(1)
+{
+}
+
+
+RemoteSyslogListener::RemoteSyslogListener(Poco::UInt16 port, int threads):
+ _pListener(0),
+ _pParser(0),
+ _port(port),
+ _threads(threads)
+{
+}
+
+
+RemoteSyslogListener::~RemoteSyslogListener()
+{
+}
+
+
+void RemoteSyslogListener::processMessage(const std::string& messageText)
+{
+ Poco::Message message;
+ _pParser->parse(messageText, message);
+ log(message);
+}
+
+
+void RemoteSyslogListener::enqueueMessage(const std::string& messageText, const Poco::Net::SocketAddress& senderAddress)
+{
+ _queue.enqueueNotification(new MessageNotification(messageText, senderAddress));
+}
+
+
+void RemoteSyslogListener::setProperty(const std::string& name, const std::string& value)
+{
+ if (name == PROP_PORT)
+ {
+ int val = Poco::NumberParser::parse(value);
+ if (val >= 0 && val < 65536)
+ _port = static_cast<Poco::UInt16>(val);
+ else
+ throw Poco::InvalidArgumentException("Not a valid port number", value);
+ }
+ else if (name == PROP_THREADS)
+ {
+ int val = Poco::NumberParser::parse(value);
+ if (val > 0 && val < 16)
+ _threads = val;
+ else
+ throw Poco::InvalidArgumentException("Invalid number of threads", value);
+ }
else
- {
- parseBSD(line, severity, fac, pos, message);
- }
- poco_assert (pos == line.size());
-}
-
-
-void SyslogParser::parsePrio(const std::string& line, std::size_t& pos, RemoteSyslogChannel::Severity& severity, RemoteSyslogChannel::Facility& fac)
-{
- poco_assert (pos < line.size());
- poco_assert (line[pos] == '<');
- ++pos;
- std::size_t start = pos;
-
- while (pos < line.size() && Poco::Ascii::isDigit(line[pos]))
- ++pos;
-
- poco_assert (line[pos] == '>');
- poco_assert (pos - start > 0);
- std::string valStr = line.substr(start, pos - start);
- ++pos; // skip the >
-
- int val = Poco::NumberParser::parse(valStr);
- poco_assert (val >= 0 && val <= (RemoteSyslogChannel::SYSLOG_LOCAL7 + RemoteSyslogChannel::SYSLOG_DEBUG));
-
- Poco::UInt16 pri = static_cast<Poco::UInt16>(val);
- // now get the lowest 3 bits
- severity = static_cast<RemoteSyslogChannel::Severity>(pri & 0x0007u);
- fac = static_cast<RemoteSyslogChannel::Facility>(pri & 0xfff8u);
-}
-
-
-void SyslogParser::parseNew(const std::string& line, RemoteSyslogChannel::Severity severity, RemoteSyslogChannel::Facility /*fac*/, std::size_t& pos, Poco::Message& message)
-{
- Poco::Message::Priority prio = convert(severity);
- // rest of the unparsed header is:
- // VERSION SP TIMESTAMP SP HOSTNAME SP APP-NAME SP PROCID SP MSGID
- std::string versionStr(parseUntilSpace(line, pos));
- std::string timeStr(parseUntilSpace(line, pos)); // can be the nilvalue!
- std::string hostName(parseUntilSpace(line, pos));
- std::string appName(parseUntilSpace(line, pos));
- std::string procId(parseUntilSpace(line, pos));
- std::string msgId(parseUntilSpace(line, pos));
- std::string sd(parseStructuredData(line, pos));
- std::string messageText(line.substr(pos));
- pos = line.size();
- Poco::DateTime date;
- int tzd = 0;
- bool hasDate = Poco::DateTimeParser::tryParse(RemoteSyslogChannel::SYSLOG_TIMEFORMAT, timeStr, date, tzd);
- Poco::Message logEntry(msgId, messageText, prio);
- logEntry[RemoteSyslogListener::LOG_PROP_HOST] = hostName;
- logEntry[RemoteSyslogListener::LOG_PROP_APP] = appName;
- logEntry[RemoteSyslogListener::LOG_PROP_STRUCTURED_DATA] = sd;
-
- if (hasDate)
- logEntry.setTime(date.timestamp());
- int lval(0);
- Poco::NumberParser::tryParse(procId, lval);
- logEntry.setPid(lval);
- message.swap(logEntry);
-}
-
-
-void SyslogParser::parseBSD(const std::string& line, RemoteSyslogChannel::Severity severity, RemoteSyslogChannel::Facility /*fac*/, std::size_t& pos, Poco::Message& message)
-{
- Poco::Message::Priority prio = convert(severity);
- // rest of the unparsed header is:
- // "%b %f %H:%M:%S" SP hostname|ipaddress
- // detect three spaces
- int spaceCnt = 0;
- std::size_t start = pos;
- while (spaceCnt < 3 && pos < line.size())
- {
- if (line[pos] == ' ')
- {
- spaceCnt++;
- if (spaceCnt == 1)
- {
- // size must be 3 chars for month
- if (pos - start != 3)
- {
- // probably a shortened time value, or the hostname
- // assume hostName
- Poco::Message logEntry(line.substr(start, pos-start), line.substr(pos+1), prio);
- message.swap(logEntry);
- return;
- }
- }
- else if (spaceCnt == 2)
- {
- // a day value!
- if (!(Poco::Ascii::isDigit(line[pos-1]) && (Poco::Ascii::isDigit(line[pos-2]) || Poco::Ascii::isSpace(line[pos-2]))))
- {
- // assume the next field is a hostname
- spaceCnt = 3;
- }
- }
- if (pos + 1 < line.size() && line[pos+1] == ' ')
- {
- // we have two spaces when the day value is smaller than 10!
- ++pos; // skip one
- }
- }
- ++pos;
- }
- std::string timeStr(line.substr(start, pos-start-1));
- int tzd(0);
- Poco::DateTime date;
- int year = date.year(); // year is not included, use the current one
- bool hasDate = Poco::DateTimeParser::tryParse(RemoteSyslogChannel::BSD_TIMEFORMAT, timeStr, date, tzd);
- if (hasDate)
- {
- int m = date.month();
- int d = date.day();
- int h = date.hour();
- int min = date.minute();
- int sec = date.second();
- date = Poco::DateTime(year, m, d, h, min, sec);
- }
- // next entry is host SP
- std::string hostName(parseUntilSpace(line, pos));
-
- // TAG: at most 32 alphanumeric chars, ANY non alphannumeric indicates start of message content
- // ignore: treat everything as content
- std::string messageText(line.substr(pos));
- pos = line.size();
- Poco::Message logEntry(hostName, messageText, prio);
- logEntry.setTime(date.timestamp());
- message.swap(logEntry);
-}
-
-
-std::string SyslogParser::parseUntilSpace(const std::string& line, std::size_t& pos)
-{
- std::size_t start = pos;
- while (pos < line.size() && !Poco::Ascii::isSpace(line[pos]))
- ++pos;
- // skip space
- ++pos;
- return line.substr(start, pos-start-1);
-}
-
-
-std::string SyslogParser::parseStructuredData(const std::string& line, std::size_t& pos)
-{
- std::string sd;
- if (pos < line.size())
- {
- if (line[pos] == '-')
- {
- ++pos;
- }
- else if (line[pos] == '[')
- {
- std::string tok = parseStructuredDataToken(line, pos);
- while (tok == "[")
- {
- sd += tok;
- tok = parseStructuredDataToken(line, pos);
- while (tok != "]" && !tok.empty())
- {
- sd += tok;
- tok = parseStructuredDataToken(line, pos);
- }
- sd += tok;
- if (pos < line.size() && line[pos] == '[') tok = parseStructuredDataToken(line, pos);
- }
- }
- if (pos < line.size() && Poco::Ascii::isSpace(line[pos])) ++pos;
- }
- return sd;
-}
-
-
-std::string SyslogParser::parseStructuredDataToken(const std::string& line, std::size_t& pos)
-{
- std::string tok;
- if (pos < line.size())
- {
- if (Poco::Ascii::isSpace(line[pos]) || line[pos] == '=' || line[pos] == '[' || line[pos] == ']')
- {
- tok += line[pos++];
- }
- else if (line[pos] == '"')
- {
- tok += line[pos++];
- while (pos < line.size() && line[pos] != '"')
- {
- tok += line[pos++];
- }
- tok += '"';
- if (pos < line.size()) pos++;
- }
- else
- {
- while (pos < line.size() && !Poco::Ascii::isSpace(line[pos]) && line[pos] != '=')
- {
- tok += line[pos++];
- }
- }
- }
- return tok;
-}
-
-Poco::Message::Priority SyslogParser::convert(RemoteSyslogChannel::Severity severity)
-{
- switch (severity)
- {
- case RemoteSyslogChannel::SYSLOG_EMERGENCY:
- return Poco::Message::PRIO_FATAL;
- case RemoteSyslogChannel::SYSLOG_ALERT:
- return Poco::Message::PRIO_FATAL;
- case RemoteSyslogChannel::SYSLOG_CRITICAL:
- return Poco::Message::PRIO_CRITICAL;
- case RemoteSyslogChannel::SYSLOG_ERROR:
- return Poco::Message::PRIO_ERROR;
- case RemoteSyslogChannel::SYSLOG_WARNING:
- return Poco::Message::PRIO_WARNING;
- case RemoteSyslogChannel::SYSLOG_NOTICE:
- return Poco::Message::PRIO_NOTICE;
- case RemoteSyslogChannel::SYSLOG_INFORMATIONAL:
- return Poco::Message::PRIO_INFORMATION;
- case RemoteSyslogChannel::SYSLOG_DEBUG:
- return Poco::Message::PRIO_DEBUG;
- }
- throw Poco::LogicException("Illegal severity value in message");
-}
-
-
-//
-// RemoteSyslogListener
-//
-
-
-const std::string RemoteSyslogListener::PROP_PORT("port");
-const std::string RemoteSyslogListener::PROP_THREADS("threads");
-
-const std::string RemoteSyslogListener::LOG_PROP_APP("app");
-const std::string RemoteSyslogListener::LOG_PROP_HOST("host");
-const std::string RemoteSyslogListener::LOG_PROP_STRUCTURED_DATA("structured-data");
-
-
-RemoteSyslogListener::RemoteSyslogListener():
- _pListener(0),
- _pParser(0),
- _port(RemoteSyslogChannel::SYSLOG_PORT),
- _threads(1)
-{
-}
-
-
-RemoteSyslogListener::RemoteSyslogListener(Poco::UInt16 port):
- _pListener(0),
- _pParser(0),
- _port(port),
- _threads(1)
-{
-}
-
-
-RemoteSyslogListener::RemoteSyslogListener(Poco::UInt16 port, int threads):
- _pListener(0),
- _pParser(0),
- _port(port),
- _threads(threads)
-{
-}
-
-
-RemoteSyslogListener::~RemoteSyslogListener()
-{
-}
-
-
-void RemoteSyslogListener::processMessage(const std::string& messageText)
-{
- Poco::Message message;
- _pParser->parse(messageText, message);
- log(message);
-}
-
-
-void RemoteSyslogListener::enqueueMessage(const std::string& messageText, const Poco::Net::SocketAddress& senderAddress)
-{
- _queue.enqueueNotification(new MessageNotification(messageText, senderAddress));
-}
-
-
-void RemoteSyslogListener::setProperty(const std::string& name, const std::string& value)
-{
- if (name == PROP_PORT)
- {
- int val = Poco::NumberParser::parse(value);
- if (val >= 0 && val < 65536)
- _port = static_cast<Poco::UInt16>(val);
- else
- throw Poco::InvalidArgumentException("Not a valid port number", value);
- }
- else if (name == PROP_THREADS)
- {
- int val = Poco::NumberParser::parse(value);
- if (val > 0 && val < 16)
- _threads = val;
- else
- throw Poco::InvalidArgumentException("Invalid number of threads", value);
- }
- else
- {
- SplitterChannel::setProperty(name, value);
- }
-}
-
-
-std::string RemoteSyslogListener::getProperty(const std::string& name) const
-{
- if (name == PROP_PORT)
- return Poco::NumberFormatter::format(_port);
- else if (name == PROP_THREADS)
- return Poco::NumberFormatter::format(_threads);
- else
- return SplitterChannel::getProperty(name);
-}
-
-
-void RemoteSyslogListener::open()
-{
- SplitterChannel::open();
- _pParser = new SyslogParser(_queue, this);
- if (_port > 0)
- {
- _pListener = new RemoteUDPListener(_queue, _port);
- }
- for (int i = 0; i < _threads; i++)
- {
- _threadPool.start(*_pParser);
- }
- if (_pListener)
- {
- _threadPool.start(*_pListener);
- }
-}
-
-
-void RemoteSyslogListener::close()
-{
- if (_pListener)
- {
- _pListener->safeStop();
- }
- if (_pParser)
- {
- _pParser->safeStop();
- }
- _queue.clear();
- _threadPool.joinAll();
- delete _pListener;
- delete _pParser;
- _pListener = 0;
- _pParser = 0;
- SplitterChannel::close();
-}
-
-
-void RemoteSyslogListener::registerChannel()
-{
- Poco::LoggingFactory::defaultFactory().registerChannelClass("RemoteSyslogListener", new Poco::Instantiator<RemoteSyslogListener, Poco::Channel>);
-}
-
-
-} } // namespace Poco::Net
+ {
+ SplitterChannel::setProperty(name, value);
+ }
+}
+
+
+std::string RemoteSyslogListener::getProperty(const std::string& name) const
+{
+ if (name == PROP_PORT)
+ return Poco::NumberFormatter::format(_port);
+ else if (name == PROP_THREADS)
+ return Poco::NumberFormatter::format(_threads);
+ else
+ return SplitterChannel::getProperty(name);
+}
+
+
+void RemoteSyslogListener::open()
+{
+ SplitterChannel::open();
+ _pParser = new SyslogParser(_queue, this);
+ if (_port > 0)
+ {
+ _pListener = new RemoteUDPListener(_queue, _port);
+ }
+ for (int i = 0; i < _threads; i++)
+ {
+ _threadPool.start(*_pParser);
+ }
+ if (_pListener)
+ {
+ _threadPool.start(*_pListener);
+ }
+}
+
+
+void RemoteSyslogListener::close()
+{
+ if (_pListener)
+ {
+ _pListener->safeStop();
+ }
+ if (_pParser)
+ {
+ _pParser->safeStop();
+ }
+ _queue.clear();
+ _threadPool.joinAll();
+ delete _pListener;
+ delete _pParser;
+ _pListener = 0;
+ _pParser = 0;
+ SplitterChannel::close();
+}
+
+
+void RemoteSyslogListener::registerChannel()
+{
+ Poco::LoggingFactory::defaultFactory().registerChannelClass("RemoteSyslogListener", new Poco::Instantiator<RemoteSyslogListener, Poco::Channel>);
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/SMTPChannel.cpp b/contrib/libs/poco/Net/src/SMTPChannel.cpp
index f4b6a9f169..a498179a44 100644
--- a/contrib/libs/poco/Net/src/SMTPChannel.cpp
+++ b/contrib/libs/poco/Net/src/SMTPChannel.cpp
@@ -1,210 +1,210 @@
-//
-// SMTPChannel.cpp
-//
-// Library: Net
-// Package: Logging
-// Module: SMTPChannel
-//
-// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/SMTPChannel.h"
-#include "Poco/Net/MailMessage.h"
-#include "Poco/Net/MailRecipient.h"
-#include "Poco/Net/SMTPClientSession.h"
-#include "Poco/Net/StringPartSource.h"
-#include "Poco/Message.h"
-#include "Poco/DateTimeFormatter.h"
-#include "Poco/DateTimeFormat.h"
-#include "Poco/LocalDateTime.h"
-#include "Poco/LoggingFactory.h"
-#include "Poco/Instantiator.h"
-#include "Poco/NumberFormatter.h"
-#include "Poco/FileStream.h"
-#include "Poco/File.h"
-#include "Poco/Environment.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-const std::string SMTPChannel::PROP_MAILHOST("mailhost");
-const std::string SMTPChannel::PROP_SENDER("sender");
-const std::string SMTPChannel::PROP_RECIPIENT("recipient");
-const std::string SMTPChannel::PROP_LOCAL("local");
-const std::string SMTPChannel::PROP_ATTACHMENT("attachment");
-const std::string SMTPChannel::PROP_TYPE("type");
-const std::string SMTPChannel::PROP_DELETE("delete");
-const std::string SMTPChannel::PROP_THROW("throw");
-
-
-SMTPChannel::SMTPChannel():
- _mailHost("localhost"),
- _local(true),
- _type("text/plain"),
- _delete(false),
- _throw(false)
-{
-}
-
-
-SMTPChannel::SMTPChannel(const std::string& mailhost, const std::string& sender, const std::string& recipient):
- _mailHost(mailhost),
- _sender(sender),
- _recipient(recipient),
- _local(true),
- _type("text/plain"),
- _delete(false),
- _throw(false)
-{
-}
-
-
-SMTPChannel::~SMTPChannel()
-{
- try
- {
- close();
- }
- catch (...)
- {
- poco_unexpected();
+//
+// SMTPChannel.cpp
+//
+// Library: Net
+// Package: Logging
+// Module: SMTPChannel
+//
+// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/SMTPChannel.h"
+#include "Poco/Net/MailMessage.h"
+#include "Poco/Net/MailRecipient.h"
+#include "Poco/Net/SMTPClientSession.h"
+#include "Poco/Net/StringPartSource.h"
+#include "Poco/Message.h"
+#include "Poco/DateTimeFormatter.h"
+#include "Poco/DateTimeFormat.h"
+#include "Poco/LocalDateTime.h"
+#include "Poco/LoggingFactory.h"
+#include "Poco/Instantiator.h"
+#include "Poco/NumberFormatter.h"
+#include "Poco/FileStream.h"
+#include "Poco/File.h"
+#include "Poco/Environment.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+const std::string SMTPChannel::PROP_MAILHOST("mailhost");
+const std::string SMTPChannel::PROP_SENDER("sender");
+const std::string SMTPChannel::PROP_RECIPIENT("recipient");
+const std::string SMTPChannel::PROP_LOCAL("local");
+const std::string SMTPChannel::PROP_ATTACHMENT("attachment");
+const std::string SMTPChannel::PROP_TYPE("type");
+const std::string SMTPChannel::PROP_DELETE("delete");
+const std::string SMTPChannel::PROP_THROW("throw");
+
+
+SMTPChannel::SMTPChannel():
+ _mailHost("localhost"),
+ _local(true),
+ _type("text/plain"),
+ _delete(false),
+ _throw(false)
+{
+}
+
+
+SMTPChannel::SMTPChannel(const std::string& mailhost, const std::string& sender, const std::string& recipient):
+ _mailHost(mailhost),
+ _sender(sender),
+ _recipient(recipient),
+ _local(true),
+ _type("text/plain"),
+ _delete(false),
+ _throw(false)
+{
+}
+
+
+SMTPChannel::~SMTPChannel()
+{
+ try
+ {
+ close();
+ }
+ catch (...)
+ {
+ poco_unexpected();
+ }
+}
+
+
+void SMTPChannel::open()
+{
+}
+
+
+void SMTPChannel::close()
+{
+}
+
+
+void SMTPChannel::log(const Message& msg)
+{
+ try
+ {
+ MailMessage message;
+ message.setSender(_sender);
+ message.addRecipient(MailRecipient(MailRecipient::PRIMARY_RECIPIENT, _recipient));
+ message.setSubject("Log Message from " + _sender);
+ std::stringstream content;
+ content << "Log Message\r\n"
+ << "===========\r\n\r\n"
+ << "Host: " << Environment::nodeName() << "\r\n"
+ << "Logger: " << msg.getSource() << "\r\n";
+
+ if (_local)
+ {
+ DateTime dt(msg.getTime());
+ content << "Timestamp: " << DateTimeFormatter::format(LocalDateTime(dt), DateTimeFormat::RFC822_FORMAT) << "\r\n";
+ }
+ else
+ content << "Timestamp: " << DateTimeFormatter::format(msg.getTime(), DateTimeFormat::RFC822_FORMAT) << "\r\n";
+
+ content << "Priority: " << NumberFormatter::format(msg.getPriority()) << "\r\n"
+ << "Process ID: " << NumberFormatter::format(msg.getPid()) << "\r\n"
+ << "Thread: " << msg.getThread() << " (ID: " << msg.getTid() << ")\r\n"
+ << "Message text: " << msg.getText() << "\r\n\r\n";
+
+ message.addContent(new StringPartSource(content.str()));
+
+ if (!_attachment.empty())
+ {
+ {
+ Poco::FileInputStream fis(_attachment, std::ios::in | std::ios::binary | std::ios::ate);
+ if (fis.good())
+ {
+ typedef std::allocator<std::string::value_type>::size_type SST;
+
+ std::streamoff size = fis.tellg();
+ poco_assert (std::numeric_limits<unsigned int>::max() >= size);
+ poco_assert (std::numeric_limits<SST>::max() >= size);
+ char* pMem = new char [static_cast<unsigned int>(size)];
+ fis.seekg(std::ios::beg);
+ fis.read(pMem, size);
+ message.addAttachment(_attachment,
+ new StringPartSource(std::string(pMem, static_cast<SST>(size)),
+ _type,
+ _attachment));
+
+ delete [] pMem;
+ }
+ }
+ if (_delete) File(_attachment).remove();
+ }
+
+ SMTPClientSession session(_mailHost);
+ session.login();
+ session.sendMessage(message);
+ session.close();
}
-}
-
-
-void SMTPChannel::open()
-{
-}
-
-
-void SMTPChannel::close()
-{
-}
-
-
-void SMTPChannel::log(const Message& msg)
-{
- try
+ catch (Exception&)
{
- MailMessage message;
- message.setSender(_sender);
- message.addRecipient(MailRecipient(MailRecipient::PRIMARY_RECIPIENT, _recipient));
- message.setSubject("Log Message from " + _sender);
- std::stringstream content;
- content << "Log Message\r\n"
- << "===========\r\n\r\n"
- << "Host: " << Environment::nodeName() << "\r\n"
- << "Logger: " << msg.getSource() << "\r\n";
-
- if (_local)
- {
- DateTime dt(msg.getTime());
- content << "Timestamp: " << DateTimeFormatter::format(LocalDateTime(dt), DateTimeFormat::RFC822_FORMAT) << "\r\n";
- }
- else
- content << "Timestamp: " << DateTimeFormatter::format(msg.getTime(), DateTimeFormat::RFC822_FORMAT) << "\r\n";
-
- content << "Priority: " << NumberFormatter::format(msg.getPriority()) << "\r\n"
- << "Process ID: " << NumberFormatter::format(msg.getPid()) << "\r\n"
- << "Thread: " << msg.getThread() << " (ID: " << msg.getTid() << ")\r\n"
- << "Message text: " << msg.getText() << "\r\n\r\n";
-
- message.addContent(new StringPartSource(content.str()));
-
- if (!_attachment.empty())
- {
- {
- Poco::FileInputStream fis(_attachment, std::ios::in | std::ios::binary | std::ios::ate);
- if (fis.good())
- {
- typedef std::allocator<std::string::value_type>::size_type SST;
-
- std::streamoff size = fis.tellg();
- poco_assert (std::numeric_limits<unsigned int>::max() >= size);
- poco_assert (std::numeric_limits<SST>::max() >= size);
- char* pMem = new char [static_cast<unsigned int>(size)];
- fis.seekg(std::ios::beg);
- fis.read(pMem, size);
- message.addAttachment(_attachment,
- new StringPartSource(std::string(pMem, static_cast<SST>(size)),
- _type,
- _attachment));
-
- delete [] pMem;
- }
- }
- if (_delete) File(_attachment).remove();
- }
-
- SMTPClientSession session(_mailHost);
- session.login();
- session.sendMessage(message);
- session.close();
- }
- catch (Exception&)
- {
- if (_throw) throw;
- }
-}
-
-
-void SMTPChannel::setProperty(const std::string& name, const std::string& value)
-{
- if (name == PROP_MAILHOST)
- _mailHost = value;
- else if (name == PROP_SENDER)
- _sender = value;
- else if (name == PROP_RECIPIENT)
- _recipient = value;
- else if (name == PROP_LOCAL)
- _local = isTrue(value);
- else if (name == PROP_ATTACHMENT)
- _attachment = value;
- else if (name == PROP_TYPE)
- _type = value;
- else if (name == PROP_DELETE)
- _delete = isTrue(value);
- else if (name == PROP_THROW)
- _throw = isTrue(value);
- else
- Channel::setProperty(name, value);
-}
-
-
-std::string SMTPChannel::getProperty(const std::string& name) const
-{
- if (name == PROP_MAILHOST)
- return _mailHost;
- else if (name == PROP_SENDER)
- return _sender;
- else if (name == PROP_RECIPIENT)
- return _recipient;
- else if (name == PROP_LOCAL)
- return _local ? "true" : "false";
- else if (name == PROP_ATTACHMENT)
- return _attachment;
- else if (name == PROP_TYPE)
- return _type;
- else if (name == PROP_DELETE)
- return _delete ? "true" : "false";
- else if (name == PROP_THROW)
- return _throw ? "true" : "false";
+ if (_throw) throw;
+ }
+}
+
+
+void SMTPChannel::setProperty(const std::string& name, const std::string& value)
+{
+ if (name == PROP_MAILHOST)
+ _mailHost = value;
+ else if (name == PROP_SENDER)
+ _sender = value;
+ else if (name == PROP_RECIPIENT)
+ _recipient = value;
+ else if (name == PROP_LOCAL)
+ _local = isTrue(value);
+ else if (name == PROP_ATTACHMENT)
+ _attachment = value;
+ else if (name == PROP_TYPE)
+ _type = value;
+ else if (name == PROP_DELETE)
+ _delete = isTrue(value);
+ else if (name == PROP_THROW)
+ _throw = isTrue(value);
else
- return Channel::getProperty(name);
-}
-
-
-void SMTPChannel::registerChannel()
-{
- Poco::LoggingFactory::defaultFactory().registerChannelClass("SMTPChannel",
- new Poco::Instantiator<SMTPChannel, Poco::Channel>);
-}
-
-
-} } // namespace Poco::Net
+ Channel::setProperty(name, value);
+}
+
+
+std::string SMTPChannel::getProperty(const std::string& name) const
+{
+ if (name == PROP_MAILHOST)
+ return _mailHost;
+ else if (name == PROP_SENDER)
+ return _sender;
+ else if (name == PROP_RECIPIENT)
+ return _recipient;
+ else if (name == PROP_LOCAL)
+ return _local ? "true" : "false";
+ else if (name == PROP_ATTACHMENT)
+ return _attachment;
+ else if (name == PROP_TYPE)
+ return _type;
+ else if (name == PROP_DELETE)
+ return _delete ? "true" : "false";
+ else if (name == PROP_THROW)
+ return _throw ? "true" : "false";
+ else
+ return Channel::getProperty(name);
+}
+
+
+void SMTPChannel::registerChannel()
+{
+ Poco::LoggingFactory::defaultFactory().registerChannelClass("SMTPChannel",
+ new Poco::Instantiator<SMTPChannel, Poco::Channel>);
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/SMTPClientSession.cpp b/contrib/libs/poco/Net/src/SMTPClientSession.cpp
index 78ba2784a7..35612381ee 100644
--- a/contrib/libs/poco/Net/src/SMTPClientSession.cpp
+++ b/contrib/libs/poco/Net/src/SMTPClientSession.cpp
@@ -1,466 +1,466 @@
-//
-// SMTPClientSession.cpp
-//
-// Library: Net
-// Package: Mail
-// Module: SMTPClientSession
-//
-// Copyright (c) 2005-2008, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/SMTPClientSession.h"
-#include "Poco/Net/MailMessage.h"
-#include "Poco/Net/MailRecipient.h"
-#include "Poco/Net/MailStream.h"
-#include "Poco/Net/SocketAddress.h"
-#include "Poco/Net/SocketStream.h"
-#include "Poco/Net/NetException.h"
-#include "Poco/Environment.h"
-#include "Poco/Net/NetworkInterface.h"
-#include "Poco/HMACEngine.h"
-#include "Poco/MD5Engine.h"
-#include "Poco/SHA1Engine.h"
-#include "Poco/DigestStream.h"
-#include "Poco/StreamCopier.h"
-#include "Poco/Base64Encoder.h"
-#include "Poco/Base64Decoder.h"
-#include "Poco/String.h"
-#include <sstream>
-#include <fstream>
-#include <iostream>
-
-
-using Poco::DigestEngine;
-using Poco::HMACEngine;
-using Poco::MD5Engine;
-using Poco::SHA1Engine;
-using Poco::DigestOutputStream;
-using Poco::StreamCopier;
-using Poco::Base64Encoder;
-using Poco::Base64Decoder;
-using Poco::Environment;
-
-
-namespace Poco {
-namespace Net {
-
-
-SMTPClientSession::SMTPClientSession(const StreamSocket& socket):
- _socket(socket),
- _isOpen(false)
-{
-}
-
-
-SMTPClientSession::SMTPClientSession(const std::string& host, Poco::UInt16 port):
- _socket(SocketAddress(host, port)),
- _isOpen(false)
-{
-}
-
-
-SMTPClientSession::~SMTPClientSession()
-{
- try
- {
- close();
- }
- catch (...)
- {
- }
-}
-
-
-void SMTPClientSession::setTimeout(const Poco::Timespan& timeout)
-{
- _socket.setReceiveTimeout(timeout);
-}
-
-
-Poco::Timespan SMTPClientSession::getTimeout() const
-{
- return _socket.getReceiveTimeout();
-}
-
-
-void SMTPClientSession::login(const std::string& hostname, std::string& response)
-{
- open();
- int status = sendCommand("EHLO", hostname, response);
- if (isPermanentNegative(status))
- status = sendCommand("HELO", hostname, response);
- if (!isPositiveCompletion(status)) throw SMTPException("Login failed", response, status);
-}
-
-
-void SMTPClientSession::login(const std::string& hostname)
-{
- std::string response;
- login(hostname, response);
-}
-
-
-void SMTPClientSession::login()
-{
- login(Environment::nodeName());
-}
-
-
-void SMTPClientSession::loginUsingCRAMMD5(const std::string& username, const std::string& password)
-{
- HMACEngine<MD5Engine> hmac(password);
- loginUsingCRAM(username, "CRAM-MD5", hmac);
-}
-
-
-void SMTPClientSession::loginUsingCRAMSHA1(const std::string& username, const std::string& password)
-{
- HMACEngine<SHA1Engine> hmac(password);
- loginUsingCRAM(username, "CRAM-SHA1", hmac);
-}
-
-
-void SMTPClientSession::loginUsingCRAM(const std::string& username, const std::string& method, Poco::DigestEngine& hmac)
-{
- std::string response;
- int status = sendCommand(std::string("AUTH ") + method, response);
-
- if (!isPositiveIntermediate(status)) throw SMTPException(std::string("Cannot authenticate using ") + method, response, status);
- std::string challengeBase64 = response.substr(4);
-
- std::istringstream istr(challengeBase64);
- Base64Decoder decoder(istr);
- std::string challenge;
- StreamCopier::copyToString(decoder, challenge);
-
- hmac.update(challenge);
-
- const DigestEngine::Digest& digest = hmac.digest();
- std::string digestString(DigestEngine::digestToHex(digest));
-
- std::string challengeResponse = username + " " + digestString;
-
- std::ostringstream challengeResponseBase64;
- Base64Encoder encoder(challengeResponseBase64);
- encoder.rdbuf()->setLineLength(0);
- encoder << challengeResponse;
- encoder.close();
-
- status = sendCommand(challengeResponseBase64.str(), response);
- if (!isPositiveCompletion(status)) throw SMTPException(std::string("Login using ") + method + " failed", response, status);
-}
-
-
-void SMTPClientSession::loginUsingLogin(const std::string& username, const std::string& password)
-{
- std::string response;
- int status = sendCommand("AUTH LOGIN", response);
- if (!isPositiveIntermediate(status)) throw SMTPException("Cannot authenticate using LOGIN", response, status);
-
- std::ostringstream usernameBase64;
- Base64Encoder usernameEncoder(usernameBase64);
- usernameEncoder.rdbuf()->setLineLength(0);
- usernameEncoder << username;
- usernameEncoder.close();
-
- std::ostringstream passwordBase64;
- Base64Encoder passwordEncoder(passwordBase64);
- passwordEncoder.rdbuf()->setLineLength(0);
- passwordEncoder << password;
- passwordEncoder.close();
-
- //Server request for username/password not defined could be either
- //S: login:
- //C: user_login
- //S: password:
- //C: user_password
- //or
- //S: password:
- //C: user_password
- //S: login:
- //C: user_login
-
- std::string decodedResponse;
- std::istringstream responseStream(response.substr(4));
- Base64Decoder responseDecoder(responseStream);
- StreamCopier::copyToString(responseDecoder, decodedResponse);
-
- if (Poco::icompare(decodedResponse, 0, 8, "username") == 0) // username first (md5("Username:"))
- {
- status = sendCommand(usernameBase64.str(), response);
- if (!isPositiveIntermediate(status)) throw SMTPException("Login using LOGIN username failed", response, status);
-
- status = sendCommand(passwordBase64.str(), response);
- if (!isPositiveCompletion(status)) throw SMTPException("Login using LOGIN password failed", response, status);
- }
- else if (Poco::icompare(decodedResponse, 0, 8, "password") == 0) // password first (md5("Password:"))
- {
- status = sendCommand(passwordBase64.str(), response);
- if (!isPositiveIntermediate(status)) throw SMTPException("Login using LOGIN password failed", response, status);
-
- status = sendCommand(usernameBase64.str(), response);
- if (!isPositiveCompletion(status)) throw SMTPException("Login using LOGIN username failed", response, status);
- }
-}
-
-
-void SMTPClientSession::loginUsingPlain(const std::string& username, const std::string& password)
-{
- std::ostringstream credentialsBase64;
- Base64Encoder credentialsEncoder(credentialsBase64);
- credentialsEncoder.rdbuf()->setLineLength(0);
- credentialsEncoder << '\0' << username << '\0' << password;
- credentialsEncoder.close();
-
- std::string response;
- int status = sendCommand("AUTH PLAIN", credentialsBase64.str(), response);
- if (!isPositiveCompletion(status)) throw SMTPException("Login using PLAIN failed", response, status);
-}
-
-
-void SMTPClientSession::loginUsingXOAUTH2(const std::string& username, const std::string& password)
-{
- std::ostringstream credentialsBase64;
- Base64Encoder credentialsEncoder(credentialsBase64);
- credentialsEncoder.rdbuf()->setLineLength(0);
- credentialsEncoder << "user=" << username << "\001auth=Bearer " << password << "\001\001";
- credentialsEncoder.close();
-
- std::string response;
- int status = sendCommand("AUTH XOAUTH2", credentialsBase64.str(), response);
- if (!isPositiveCompletion(status)) throw SMTPException("Login using XOAUTH2 failed", response, status);
-}
-
-
-void SMTPClientSession::login(LoginMethod loginMethod, const std::string& username, const std::string& password)
-{
- login(Environment::nodeName(), loginMethod, username, password);
-}
-
-
-void SMTPClientSession::login(const std::string& hostname, LoginMethod loginMethod, const std::string& username, const std::string& password)
-{
- std::string response;
- login(hostname, response);
-
- if (loginMethod == AUTH_CRAM_MD5)
- {
- if (response.find("CRAM-MD5", 0) != std::string::npos)
- {
- loginUsingCRAMMD5(username, password);
- }
- else throw SMTPException("The mail service does not support CRAM-MD5 authentication", response);
- }
- else if (loginMethod == AUTH_CRAM_SHA1)
- {
- if (response.find("CRAM-SHA1", 0) != std::string::npos)
- {
- loginUsingCRAMSHA1(username, password);
- }
- else throw SMTPException("The mail service does not support CRAM-SHA1 authentication", response);
- }
- else if (loginMethod == AUTH_LOGIN)
- {
- if (response.find("LOGIN", 0) != std::string::npos)
- {
- loginUsingLogin(username, password);
- }
- else throw SMTPException("The mail service does not support LOGIN authentication", response);
- }
- else if (loginMethod == AUTH_PLAIN)
- {
- if (response.find("PLAIN", 0) != std::string::npos)
- {
- loginUsingPlain(username, password);
- }
- else throw SMTPException("The mail service does not support PLAIN authentication", response);
- }
- else if (loginMethod == AUTH_XOAUTH2)
- {
- if (response.find("XOAUTH2", 0) != std::string::npos)
- {
- loginUsingXOAUTH2(username, password);
- }
- else throw SMTPException("The mail service does not support XOAUTH2 authentication", response);
- }
- else if (loginMethod != AUTH_NONE)
- {
- throw SMTPException("The autentication method is not supported");
- }
-}
-
-
-void SMTPClientSession::open()
-{
- if (!_isOpen)
- {
- std::string response;
- int status = _socket.receiveStatusMessage(response);
- if (!isPositiveCompletion(status)) throw SMTPException("The mail service is unavailable", response, status);
- _isOpen = true;
- }
-}
-
-
-void SMTPClientSession::close()
-{
- if (_isOpen)
- {
- std::string response;
- sendCommand("QUIT", response);
- _socket.close();
- _isOpen = false;
- }
-}
-
-
-void SMTPClientSession::sendCommands(const MailMessage& message, const Recipients* pRecipients)
-{
- std::string response;
- int status = 0;
- const std::string& fromField = message.getSender();
- std::string::size_type emailPos = fromField.find('<');
- if (emailPos == std::string::npos)
- {
- std::string sender("<");
- sender.append(fromField);
- sender.append(">");
- status = sendCommand("MAIL FROM:", sender, response);
- }
- else
- {
- status = sendCommand("MAIL FROM:", fromField.substr(emailPos, fromField.size() - emailPos), response);
- }
-
- if (!isPositiveCompletion(status)) throw SMTPException("Cannot send message", response, status);
-
- std::ostringstream recipient;
- if (pRecipients)
- {
- for (Recipients::const_iterator it = pRecipients->begin(); it != pRecipients->end(); ++it)
- {
- recipient << '<' << *it << '>';
- int status2 = sendCommand("RCPT TO:", recipient.str(), response);
- if (!isPositiveCompletion(status2)) throw SMTPException(std::string("Recipient rejected: ") + recipient.str(), response, status2);
- recipient.str("");
- }
- }
- else
- {
- for (MailMessage::Recipients::const_iterator it = message.recipients().begin(); it != message.recipients().end(); ++it)
- {
- recipient << '<' << it->getAddress() << '>';
- int status2 = sendCommand("RCPT TO:", recipient.str(), response);
- if (!isPositiveCompletion(status2)) throw SMTPException(std::string("Recipient rejected: ") + recipient.str(), response, status2);
- recipient.str("");
- }
- }
-
- status = sendCommand("DATA", response);
- if (!isPositiveIntermediate(status)) throw SMTPException("Cannot send message data", response, status);
-}
-
-
-void SMTPClientSession::sendAddresses(const std::string& from, const Recipients& recipients)
-{
- std::string response;
- int status = 0;
-
- std::string::size_type emailPos = from.find('<');
- if (emailPos == std::string::npos)
- {
- std::string sender("<");
- sender.append(from);
- sender.append(">");
- status = sendCommand("MAIL FROM:", sender, response);
- }
- else
- {
- status = sendCommand("MAIL FROM:", from.substr(emailPos, from.size() - emailPos), response);
- }
-
- if (!isPositiveCompletion(status)) throw SMTPException("Cannot send message", response, status);
-
- std::ostringstream recipient;
-
- for (Recipients::const_iterator it = recipients.begin(); it != recipients.end(); ++it)
- {
-
- recipient << '<' << *it << '>';
- int status2 = sendCommand("RCPT TO:", recipient.str(), response);
- if (!isPositiveCompletion(status2)) throw SMTPException(std::string("Recipient rejected: ") + recipient.str(), response, status2);
- recipient.str("");
- }
-}
-
-
-void SMTPClientSession::sendData()
-{
- std::string response;
- int status = sendCommand("DATA", response);
- if (!isPositiveIntermediate(status)) throw SMTPException("Cannot send message data", response, status);
-}
-
-
-void SMTPClientSession::sendMessage(const MailMessage& message)
-{
- sendCommands(message);
- transportMessage(message);
-}
-
-
-void SMTPClientSession::sendMessage(const MailMessage& message, const Recipients& recipients)
-{
- sendCommands(message, &recipients);
- transportMessage(message);
-}
-
-
-void SMTPClientSession::transportMessage(const MailMessage& message)
-{
- SocketOutputStream socketStream(_socket);
- MailOutputStream mailStream(socketStream);
- message.write(mailStream);
- mailStream.close();
- socketStream.flush();
-
- std::string response;
- int status = _socket.receiveStatusMessage(response);
- if (!isPositiveCompletion(status)) throw SMTPException("The server rejected the message", response, status);
-}
-
-
-int SMTPClientSession::sendCommand(const std::string& command, std::string& response)
-{
- _socket.sendMessage(command);
- return _socket.receiveStatusMessage(response);
-}
-
-
-int SMTPClientSession::sendCommand(const std::string& command, const std::string& arg, std::string& response)
-{
- _socket.sendMessage(command, arg);
- return _socket.receiveStatusMessage(response);
-}
-
-
-void SMTPClientSession::sendMessage(std::istream& istr)
-{
- std::string response;
- int status = 0;
-
- SocketOutputStream socketStream(_socket);
- MailOutputStream mailStream(socketStream);
- StreamCopier::copyStream(istr, mailStream);
- mailStream.close();
- socketStream.flush();
- status = _socket.receiveStatusMessage(response);
- if (!isPositiveCompletion(status)) throw SMTPException("The server rejected the message", response, status);
-}
-
-
-} } // namespace Poco::Net
+//
+// SMTPClientSession.cpp
+//
+// Library: Net
+// Package: Mail
+// Module: SMTPClientSession
+//
+// Copyright (c) 2005-2008, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/SMTPClientSession.h"
+#include "Poco/Net/MailMessage.h"
+#include "Poco/Net/MailRecipient.h"
+#include "Poco/Net/MailStream.h"
+#include "Poco/Net/SocketAddress.h"
+#include "Poco/Net/SocketStream.h"
+#include "Poco/Net/NetException.h"
+#include "Poco/Environment.h"
+#include "Poco/Net/NetworkInterface.h"
+#include "Poco/HMACEngine.h"
+#include "Poco/MD5Engine.h"
+#include "Poco/SHA1Engine.h"
+#include "Poco/DigestStream.h"
+#include "Poco/StreamCopier.h"
+#include "Poco/Base64Encoder.h"
+#include "Poco/Base64Decoder.h"
+#include "Poco/String.h"
+#include <sstream>
+#include <fstream>
+#include <iostream>
+
+
+using Poco::DigestEngine;
+using Poco::HMACEngine;
+using Poco::MD5Engine;
+using Poco::SHA1Engine;
+using Poco::DigestOutputStream;
+using Poco::StreamCopier;
+using Poco::Base64Encoder;
+using Poco::Base64Decoder;
+using Poco::Environment;
+
+
+namespace Poco {
+namespace Net {
+
+
+SMTPClientSession::SMTPClientSession(const StreamSocket& socket):
+ _socket(socket),
+ _isOpen(false)
+{
+}
+
+
+SMTPClientSession::SMTPClientSession(const std::string& host, Poco::UInt16 port):
+ _socket(SocketAddress(host, port)),
+ _isOpen(false)
+{
+}
+
+
+SMTPClientSession::~SMTPClientSession()
+{
+ try
+ {
+ close();
+ }
+ catch (...)
+ {
+ }
+}
+
+
+void SMTPClientSession::setTimeout(const Poco::Timespan& timeout)
+{
+ _socket.setReceiveTimeout(timeout);
+}
+
+
+Poco::Timespan SMTPClientSession::getTimeout() const
+{
+ return _socket.getReceiveTimeout();
+}
+
+
+void SMTPClientSession::login(const std::string& hostname, std::string& response)
+{
+ open();
+ int status = sendCommand("EHLO", hostname, response);
+ if (isPermanentNegative(status))
+ status = sendCommand("HELO", hostname, response);
+ if (!isPositiveCompletion(status)) throw SMTPException("Login failed", response, status);
+}
+
+
+void SMTPClientSession::login(const std::string& hostname)
+{
+ std::string response;
+ login(hostname, response);
+}
+
+
+void SMTPClientSession::login()
+{
+ login(Environment::nodeName());
+}
+
+
+void SMTPClientSession::loginUsingCRAMMD5(const std::string& username, const std::string& password)
+{
+ HMACEngine<MD5Engine> hmac(password);
+ loginUsingCRAM(username, "CRAM-MD5", hmac);
+}
+
+
+void SMTPClientSession::loginUsingCRAMSHA1(const std::string& username, const std::string& password)
+{
+ HMACEngine<SHA1Engine> hmac(password);
+ loginUsingCRAM(username, "CRAM-SHA1", hmac);
+}
+
+
+void SMTPClientSession::loginUsingCRAM(const std::string& username, const std::string& method, Poco::DigestEngine& hmac)
+{
+ std::string response;
+ int status = sendCommand(std::string("AUTH ") + method, response);
+
+ if (!isPositiveIntermediate(status)) throw SMTPException(std::string("Cannot authenticate using ") + method, response, status);
+ std::string challengeBase64 = response.substr(4);
+
+ std::istringstream istr(challengeBase64);
+ Base64Decoder decoder(istr);
+ std::string challenge;
+ StreamCopier::copyToString(decoder, challenge);
+
+ hmac.update(challenge);
+
+ const DigestEngine::Digest& digest = hmac.digest();
+ std::string digestString(DigestEngine::digestToHex(digest));
+
+ std::string challengeResponse = username + " " + digestString;
+
+ std::ostringstream challengeResponseBase64;
+ Base64Encoder encoder(challengeResponseBase64);
+ encoder.rdbuf()->setLineLength(0);
+ encoder << challengeResponse;
+ encoder.close();
+
+ status = sendCommand(challengeResponseBase64.str(), response);
+ if (!isPositiveCompletion(status)) throw SMTPException(std::string("Login using ") + method + " failed", response, status);
+}
+
+
+void SMTPClientSession::loginUsingLogin(const std::string& username, const std::string& password)
+{
+ std::string response;
+ int status = sendCommand("AUTH LOGIN", response);
+ if (!isPositiveIntermediate(status)) throw SMTPException("Cannot authenticate using LOGIN", response, status);
+
+ std::ostringstream usernameBase64;
+ Base64Encoder usernameEncoder(usernameBase64);
+ usernameEncoder.rdbuf()->setLineLength(0);
+ usernameEncoder << username;
+ usernameEncoder.close();
+
+ std::ostringstream passwordBase64;
+ Base64Encoder passwordEncoder(passwordBase64);
+ passwordEncoder.rdbuf()->setLineLength(0);
+ passwordEncoder << password;
+ passwordEncoder.close();
+
+ //Server request for username/password not defined could be either
+ //S: login:
+ //C: user_login
+ //S: password:
+ //C: user_password
+ //or
+ //S: password:
+ //C: user_password
+ //S: login:
+ //C: user_login
+
+ std::string decodedResponse;
+ std::istringstream responseStream(response.substr(4));
+ Base64Decoder responseDecoder(responseStream);
+ StreamCopier::copyToString(responseDecoder, decodedResponse);
+
+ if (Poco::icompare(decodedResponse, 0, 8, "username") == 0) // username first (md5("Username:"))
+ {
+ status = sendCommand(usernameBase64.str(), response);
+ if (!isPositiveIntermediate(status)) throw SMTPException("Login using LOGIN username failed", response, status);
+
+ status = sendCommand(passwordBase64.str(), response);
+ if (!isPositiveCompletion(status)) throw SMTPException("Login using LOGIN password failed", response, status);
+ }
+ else if (Poco::icompare(decodedResponse, 0, 8, "password") == 0) // password first (md5("Password:"))
+ {
+ status = sendCommand(passwordBase64.str(), response);
+ if (!isPositiveIntermediate(status)) throw SMTPException("Login using LOGIN password failed", response, status);
+
+ status = sendCommand(usernameBase64.str(), response);
+ if (!isPositiveCompletion(status)) throw SMTPException("Login using LOGIN username failed", response, status);
+ }
+}
+
+
+void SMTPClientSession::loginUsingPlain(const std::string& username, const std::string& password)
+{
+ std::ostringstream credentialsBase64;
+ Base64Encoder credentialsEncoder(credentialsBase64);
+ credentialsEncoder.rdbuf()->setLineLength(0);
+ credentialsEncoder << '\0' << username << '\0' << password;
+ credentialsEncoder.close();
+
+ std::string response;
+ int status = sendCommand("AUTH PLAIN", credentialsBase64.str(), response);
+ if (!isPositiveCompletion(status)) throw SMTPException("Login using PLAIN failed", response, status);
+}
+
+
+void SMTPClientSession::loginUsingXOAUTH2(const std::string& username, const std::string& password)
+{
+ std::ostringstream credentialsBase64;
+ Base64Encoder credentialsEncoder(credentialsBase64);
+ credentialsEncoder.rdbuf()->setLineLength(0);
+ credentialsEncoder << "user=" << username << "\001auth=Bearer " << password << "\001\001";
+ credentialsEncoder.close();
+
+ std::string response;
+ int status = sendCommand("AUTH XOAUTH2", credentialsBase64.str(), response);
+ if (!isPositiveCompletion(status)) throw SMTPException("Login using XOAUTH2 failed", response, status);
+}
+
+
+void SMTPClientSession::login(LoginMethod loginMethod, const std::string& username, const std::string& password)
+{
+ login(Environment::nodeName(), loginMethod, username, password);
+}
+
+
+void SMTPClientSession::login(const std::string& hostname, LoginMethod loginMethod, const std::string& username, const std::string& password)
+{
+ std::string response;
+ login(hostname, response);
+
+ if (loginMethod == AUTH_CRAM_MD5)
+ {
+ if (response.find("CRAM-MD5", 0) != std::string::npos)
+ {
+ loginUsingCRAMMD5(username, password);
+ }
+ else throw SMTPException("The mail service does not support CRAM-MD5 authentication", response);
+ }
+ else if (loginMethod == AUTH_CRAM_SHA1)
+ {
+ if (response.find("CRAM-SHA1", 0) != std::string::npos)
+ {
+ loginUsingCRAMSHA1(username, password);
+ }
+ else throw SMTPException("The mail service does not support CRAM-SHA1 authentication", response);
+ }
+ else if (loginMethod == AUTH_LOGIN)
+ {
+ if (response.find("LOGIN", 0) != std::string::npos)
+ {
+ loginUsingLogin(username, password);
+ }
+ else throw SMTPException("The mail service does not support LOGIN authentication", response);
+ }
+ else if (loginMethod == AUTH_PLAIN)
+ {
+ if (response.find("PLAIN", 0) != std::string::npos)
+ {
+ loginUsingPlain(username, password);
+ }
+ else throw SMTPException("The mail service does not support PLAIN authentication", response);
+ }
+ else if (loginMethod == AUTH_XOAUTH2)
+ {
+ if (response.find("XOAUTH2", 0) != std::string::npos)
+ {
+ loginUsingXOAUTH2(username, password);
+ }
+ else throw SMTPException("The mail service does not support XOAUTH2 authentication", response);
+ }
+ else if (loginMethod != AUTH_NONE)
+ {
+ throw SMTPException("The autentication method is not supported");
+ }
+}
+
+
+void SMTPClientSession::open()
+{
+ if (!_isOpen)
+ {
+ std::string response;
+ int status = _socket.receiveStatusMessage(response);
+ if (!isPositiveCompletion(status)) throw SMTPException("The mail service is unavailable", response, status);
+ _isOpen = true;
+ }
+}
+
+
+void SMTPClientSession::close()
+{
+ if (_isOpen)
+ {
+ std::string response;
+ sendCommand("QUIT", response);
+ _socket.close();
+ _isOpen = false;
+ }
+}
+
+
+void SMTPClientSession::sendCommands(const MailMessage& message, const Recipients* pRecipients)
+{
+ std::string response;
+ int status = 0;
+ const std::string& fromField = message.getSender();
+ std::string::size_type emailPos = fromField.find('<');
+ if (emailPos == std::string::npos)
+ {
+ std::string sender("<");
+ sender.append(fromField);
+ sender.append(">");
+ status = sendCommand("MAIL FROM:", sender, response);
+ }
+ else
+ {
+ status = sendCommand("MAIL FROM:", fromField.substr(emailPos, fromField.size() - emailPos), response);
+ }
+
+ if (!isPositiveCompletion(status)) throw SMTPException("Cannot send message", response, status);
+
+ std::ostringstream recipient;
+ if (pRecipients)
+ {
+ for (Recipients::const_iterator it = pRecipients->begin(); it != pRecipients->end(); ++it)
+ {
+ recipient << '<' << *it << '>';
+ int status2 = sendCommand("RCPT TO:", recipient.str(), response);
+ if (!isPositiveCompletion(status2)) throw SMTPException(std::string("Recipient rejected: ") + recipient.str(), response, status2);
+ recipient.str("");
+ }
+ }
+ else
+ {
+ for (MailMessage::Recipients::const_iterator it = message.recipients().begin(); it != message.recipients().end(); ++it)
+ {
+ recipient << '<' << it->getAddress() << '>';
+ int status2 = sendCommand("RCPT TO:", recipient.str(), response);
+ if (!isPositiveCompletion(status2)) throw SMTPException(std::string("Recipient rejected: ") + recipient.str(), response, status2);
+ recipient.str("");
+ }
+ }
+
+ status = sendCommand("DATA", response);
+ if (!isPositiveIntermediate(status)) throw SMTPException("Cannot send message data", response, status);
+}
+
+
+void SMTPClientSession::sendAddresses(const std::string& from, const Recipients& recipients)
+{
+ std::string response;
+ int status = 0;
+
+ std::string::size_type emailPos = from.find('<');
+ if (emailPos == std::string::npos)
+ {
+ std::string sender("<");
+ sender.append(from);
+ sender.append(">");
+ status = sendCommand("MAIL FROM:", sender, response);
+ }
+ else
+ {
+ status = sendCommand("MAIL FROM:", from.substr(emailPos, from.size() - emailPos), response);
+ }
+
+ if (!isPositiveCompletion(status)) throw SMTPException("Cannot send message", response, status);
+
+ std::ostringstream recipient;
+
+ for (Recipients::const_iterator it = recipients.begin(); it != recipients.end(); ++it)
+ {
+
+ recipient << '<' << *it << '>';
+ int status2 = sendCommand("RCPT TO:", recipient.str(), response);
+ if (!isPositiveCompletion(status2)) throw SMTPException(std::string("Recipient rejected: ") + recipient.str(), response, status2);
+ recipient.str("");
+ }
+}
+
+
+void SMTPClientSession::sendData()
+{
+ std::string response;
+ int status = sendCommand("DATA", response);
+ if (!isPositiveIntermediate(status)) throw SMTPException("Cannot send message data", response, status);
+}
+
+
+void SMTPClientSession::sendMessage(const MailMessage& message)
+{
+ sendCommands(message);
+ transportMessage(message);
+}
+
+
+void SMTPClientSession::sendMessage(const MailMessage& message, const Recipients& recipients)
+{
+ sendCommands(message, &recipients);
+ transportMessage(message);
+}
+
+
+void SMTPClientSession::transportMessage(const MailMessage& message)
+{
+ SocketOutputStream socketStream(_socket);
+ MailOutputStream mailStream(socketStream);
+ message.write(mailStream);
+ mailStream.close();
+ socketStream.flush();
+
+ std::string response;
+ int status = _socket.receiveStatusMessage(response);
+ if (!isPositiveCompletion(status)) throw SMTPException("The server rejected the message", response, status);
+}
+
+
+int SMTPClientSession::sendCommand(const std::string& command, std::string& response)
+{
+ _socket.sendMessage(command);
+ return _socket.receiveStatusMessage(response);
+}
+
+
+int SMTPClientSession::sendCommand(const std::string& command, const std::string& arg, std::string& response)
+{
+ _socket.sendMessage(command, arg);
+ return _socket.receiveStatusMessage(response);
+}
+
+
+void SMTPClientSession::sendMessage(std::istream& istr)
+{
+ std::string response;
+ int status = 0;
+
+ SocketOutputStream socketStream(_socket);
+ MailOutputStream mailStream(socketStream);
+ StreamCopier::copyStream(istr, mailStream);
+ mailStream.close();
+ socketStream.flush();
+ status = _socket.receiveStatusMessage(response);
+ if (!isPositiveCompletion(status)) throw SMTPException("The server rejected the message", response, status);
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/ServerSocket.cpp b/contrib/libs/poco/Net/src/ServerSocket.cpp
index cac0e8fa0a..c44a52b5b5 100644
--- a/contrib/libs/poco/Net/src/ServerSocket.cpp
+++ b/contrib/libs/poco/Net/src/ServerSocket.cpp
@@ -1,158 +1,158 @@
-//
-// ServerSocket.cpp
-//
-// Library: Net
-// Package: Sockets
-// Module: ServerSocket
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/ServerSocket.h"
-#include "Poco/Net/ServerSocketImpl.h"
-#include "Poco/Exception.h"
-
-
-using Poco::InvalidArgumentException;
-
-
-namespace Poco {
-namespace Net {
-
-
-ServerSocket::ServerSocket(): Socket(new ServerSocketImpl)
-{
-}
-
-
-ServerSocket::ServerSocket(const Socket& socket): Socket(socket)
-{
- if (!dynamic_cast<ServerSocketImpl*>(impl()))
- throw InvalidArgumentException("Cannot assign incompatible socket");
-}
-
-
-ServerSocket::ServerSocket(const SocketAddress& address, int backlog): Socket(new ServerSocketImpl)
-{
- impl()->bind(address, true);
- impl()->listen(backlog);
-}
-
-
-ServerSocket::ServerSocket(Poco::UInt16 port, int backlog): Socket(new ServerSocketImpl)
-{
- IPAddress wildcardAddr;
- SocketAddress address(wildcardAddr, port);
- impl()->bind(address, true);
- impl()->listen(backlog);
-}
-
-
-ServerSocket::ServerSocket(SocketImpl* pImpl, bool /*ignore*/): Socket(pImpl)
-{
-}
-
-
-ServerSocket::~ServerSocket()
-{
-}
-
-
-ServerSocket& ServerSocket::operator = (const Socket& socket)
-{
- if (dynamic_cast<ServerSocketImpl*>(socket.impl()))
- Socket::operator = (socket);
- else
- throw InvalidArgumentException("Cannot assign incompatible socket");
- return *this;
-}
-
-
-void ServerSocket::bind(const SocketAddress& address, bool reuseAddress)
-{
- impl()->bind(address, reuseAddress);
-}
-
-
-void ServerSocket::bind(const SocketAddress& address, bool reuseAddress, bool reusePort)
-{
- impl()->bind(address, reuseAddress, reusePort);
-}
-
-
-void ServerSocket::bind(Poco::UInt16 port, bool reuseAddress)
-{
- IPAddress wildcardAddr;
- SocketAddress address(wildcardAddr, port);
- impl()->bind(address, reuseAddress);
-}
-
-
-void ServerSocket::bind(Poco::UInt16 port, bool reuseAddress, bool reusePort)
-{
- IPAddress wildcardAddr;
- SocketAddress address(wildcardAddr, port);
- impl()->bind(address, reuseAddress, reusePort);
-}
-
-
-void ServerSocket::bind6(const SocketAddress& address, bool reuseAddress, bool ipV6Only)
-{
- impl()->bind6(address, reuseAddress, ipV6Only);
-}
-
-
-void ServerSocket::bind6(const SocketAddress& address, bool reuseAddress, bool reusePort, bool ipV6Only)
-{
- impl()->bind6(address, reuseAddress, reusePort, ipV6Only);
-}
-
-
-void ServerSocket::bind6(Poco::UInt16 port, bool reuseAddress, bool ipV6Only)
-{
-#if defined(POCO_HAVE_IPv6)
- IPAddress wildcardAddr(IPAddress::IPv6);
- SocketAddress address(wildcardAddr, port);
- impl()->bind6(address, reuseAddress, ipV6Only);
-#else
- throw Poco::NotImplementedException("No IPv6 support available");
-#endif // POCO_HAVE_IPv6
-}
-
-
-void ServerSocket::bind6(Poco::UInt16 port, bool reuseAddress, bool reusePort, bool ipV6Only)
-{
-#if defined(POCO_HAVE_IPv6)
- IPAddress wildcardAddr(IPAddress::IPv6);
- SocketAddress address(wildcardAddr, port);
- impl()->bind6(address, reuseAddress, reusePort, ipV6Only);
-#else
- throw Poco::NotImplementedException("No IPv6 support available");
-#endif // POCO_HAVE_IPv6
-}
-
-
-void ServerSocket::listen(int backlog)
-{
- impl()->listen(backlog);
-}
-
-
-StreamSocket ServerSocket::acceptConnection(SocketAddress& clientAddr)
-{
- return StreamSocket(impl()->acceptConnection(clientAddr));
-}
-
-
-StreamSocket ServerSocket::acceptConnection()
-{
- SocketAddress clientAddr;
- return StreamSocket(impl()->acceptConnection(clientAddr));
-}
-
-
-} } // namespace Poco::Net
+//
+// ServerSocket.cpp
+//
+// Library: Net
+// Package: Sockets
+// Module: ServerSocket
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/ServerSocket.h"
+#include "Poco/Net/ServerSocketImpl.h"
+#include "Poco/Exception.h"
+
+
+using Poco::InvalidArgumentException;
+
+
+namespace Poco {
+namespace Net {
+
+
+ServerSocket::ServerSocket(): Socket(new ServerSocketImpl)
+{
+}
+
+
+ServerSocket::ServerSocket(const Socket& socket): Socket(socket)
+{
+ if (!dynamic_cast<ServerSocketImpl*>(impl()))
+ throw InvalidArgumentException("Cannot assign incompatible socket");
+}
+
+
+ServerSocket::ServerSocket(const SocketAddress& address, int backlog): Socket(new ServerSocketImpl)
+{
+ impl()->bind(address, true);
+ impl()->listen(backlog);
+}
+
+
+ServerSocket::ServerSocket(Poco::UInt16 port, int backlog): Socket(new ServerSocketImpl)
+{
+ IPAddress wildcardAddr;
+ SocketAddress address(wildcardAddr, port);
+ impl()->bind(address, true);
+ impl()->listen(backlog);
+}
+
+
+ServerSocket::ServerSocket(SocketImpl* pImpl, bool /*ignore*/): Socket(pImpl)
+{
+}
+
+
+ServerSocket::~ServerSocket()
+{
+}
+
+
+ServerSocket& ServerSocket::operator = (const Socket& socket)
+{
+ if (dynamic_cast<ServerSocketImpl*>(socket.impl()))
+ Socket::operator = (socket);
+ else
+ throw InvalidArgumentException("Cannot assign incompatible socket");
+ return *this;
+}
+
+
+void ServerSocket::bind(const SocketAddress& address, bool reuseAddress)
+{
+ impl()->bind(address, reuseAddress);
+}
+
+
+void ServerSocket::bind(const SocketAddress& address, bool reuseAddress, bool reusePort)
+{
+ impl()->bind(address, reuseAddress, reusePort);
+}
+
+
+void ServerSocket::bind(Poco::UInt16 port, bool reuseAddress)
+{
+ IPAddress wildcardAddr;
+ SocketAddress address(wildcardAddr, port);
+ impl()->bind(address, reuseAddress);
+}
+
+
+void ServerSocket::bind(Poco::UInt16 port, bool reuseAddress, bool reusePort)
+{
+ IPAddress wildcardAddr;
+ SocketAddress address(wildcardAddr, port);
+ impl()->bind(address, reuseAddress, reusePort);
+}
+
+
+void ServerSocket::bind6(const SocketAddress& address, bool reuseAddress, bool ipV6Only)
+{
+ impl()->bind6(address, reuseAddress, ipV6Only);
+}
+
+
+void ServerSocket::bind6(const SocketAddress& address, bool reuseAddress, bool reusePort, bool ipV6Only)
+{
+ impl()->bind6(address, reuseAddress, reusePort, ipV6Only);
+}
+
+
+void ServerSocket::bind6(Poco::UInt16 port, bool reuseAddress, bool ipV6Only)
+{
+#if defined(POCO_HAVE_IPv6)
+ IPAddress wildcardAddr(IPAddress::IPv6);
+ SocketAddress address(wildcardAddr, port);
+ impl()->bind6(address, reuseAddress, ipV6Only);
+#else
+ throw Poco::NotImplementedException("No IPv6 support available");
+#endif // POCO_HAVE_IPv6
+}
+
+
+void ServerSocket::bind6(Poco::UInt16 port, bool reuseAddress, bool reusePort, bool ipV6Only)
+{
+#if defined(POCO_HAVE_IPv6)
+ IPAddress wildcardAddr(IPAddress::IPv6);
+ SocketAddress address(wildcardAddr, port);
+ impl()->bind6(address, reuseAddress, reusePort, ipV6Only);
+#else
+ throw Poco::NotImplementedException("No IPv6 support available");
+#endif // POCO_HAVE_IPv6
+}
+
+
+void ServerSocket::listen(int backlog)
+{
+ impl()->listen(backlog);
+}
+
+
+StreamSocket ServerSocket::acceptConnection(SocketAddress& clientAddr)
+{
+ return StreamSocket(impl()->acceptConnection(clientAddr));
+}
+
+
+StreamSocket ServerSocket::acceptConnection()
+{
+ SocketAddress clientAddr;
+ return StreamSocket(impl()->acceptConnection(clientAddr));
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/ServerSocketImpl.cpp b/contrib/libs/poco/Net/src/ServerSocketImpl.cpp
index b80b558a1f..7f6cd41bbf 100644
--- a/contrib/libs/poco/Net/src/ServerSocketImpl.cpp
+++ b/contrib/libs/poco/Net/src/ServerSocketImpl.cpp
@@ -1,32 +1,32 @@
-//
-// ServerSocketImpl.cpp
-//
-// Library: Net
-// Package: Sockets
-// Module: ServerSocketImpl
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/ServerSocketImpl.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-ServerSocketImpl::ServerSocketImpl()
-{
-}
-
-
-ServerSocketImpl::~ServerSocketImpl()
-{
-}
-
-
-} } // namespace Poco::Net
+//
+// ServerSocketImpl.cpp
+//
+// Library: Net
+// Package: Sockets
+// Module: ServerSocketImpl
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/ServerSocketImpl.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+ServerSocketImpl::ServerSocketImpl()
+{
+}
+
+
+ServerSocketImpl::~ServerSocketImpl()
+{
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/Socket.cpp b/contrib/libs/poco/Net/src/Socket.cpp
index a64a9c40d2..72a8bd9e2f 100644
--- a/contrib/libs/poco/Net/src/Socket.cpp
+++ b/contrib/libs/poco/Net/src/Socket.cpp
@@ -1,392 +1,392 @@
-//
-// Socket.cpp
-//
-// Library: Net
-// Package: Sockets
-// Module: Socket
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/Socket.h"
-#include "Poco/Net/StreamSocketImpl.h"
-#include "Poco/Timestamp.h"
-#include <algorithm>
-#include <string.h> // FD_SET needs memset on some platforms, so we can't use <cstring>
-#if defined(POCO_HAVE_FD_EPOLL)
-#include <sys/epoll.h>
-#elif defined(POCO_HAVE_FD_POLL)
-#include "Poco/SharedPtr.h"
-#include <poll.h>
-#endif
-
-
-namespace Poco {
-namespace Net {
-
-
-Socket::Socket():
- _pImpl(new StreamSocketImpl)
-{
-}
-
-
-Socket::Socket(SocketImpl* pImpl):
- _pImpl(pImpl)
-{
- poco_check_ptr (_pImpl);
-}
-
-
-Socket::Socket(const Socket& socket):
- _pImpl(socket._pImpl)
-{
- poco_check_ptr (_pImpl);
-
- _pImpl->duplicate();
-}
-
-
-Socket& Socket::operator = (const Socket& socket)
-{
- if (&socket != this)
- {
- if (_pImpl) _pImpl->release();
- _pImpl = socket._pImpl;
- if (_pImpl) _pImpl->duplicate();
- }
- return *this;
-}
-
-
-Socket::~Socket()
-{
- _pImpl->release();
-}
-
-
-int Socket::select(SocketList& readList, SocketList& writeList, SocketList& exceptList, const Poco::Timespan& timeout)
-{
-#if defined(POCO_HAVE_FD_EPOLL)
-
- int epollSize = readList.size() + writeList.size() + exceptList.size();
- if (epollSize == 0) return 0;
-
- int epollfd = -1;
- {
- struct epoll_event eventsIn[epollSize];
- memset(eventsIn, 0, sizeof(eventsIn));
- struct epoll_event* eventLast = eventsIn;
- for (SocketList::iterator it = readList.begin(); it != readList.end(); ++it)
- {
- poco_socket_t sockfd = it->sockfd();
- if (sockfd != POCO_INVALID_SOCKET)
- {
- struct epoll_event* e = eventsIn;
- for (; e != eventLast; ++e)
- {
- if (reinterpret_cast<Socket*>(e->data.ptr)->sockfd() == sockfd)
- break;
- }
- if (e == eventLast)
- {
- e->data.ptr = &(*it);
- ++eventLast;
- }
- e->events |= EPOLLIN;
- }
- }
-
- for (SocketList::iterator it = writeList.begin(); it != writeList.end(); ++it)
- {
- poco_socket_t sockfd = it->sockfd();
- if (sockfd != POCO_INVALID_SOCKET)
- {
- struct epoll_event* e = eventsIn;
- for (; e != eventLast; ++e)
- {
- if (reinterpret_cast<Socket*>(e->data.ptr)->sockfd() == sockfd)
- break;
- }
- if (e == eventLast)
- {
- e->data.ptr = &(*it);
- ++eventLast;
- }
- e->events |= EPOLLOUT;
- }
- }
-
- for (SocketList::iterator it = exceptList.begin(); it != exceptList.end(); ++it)
- {
- poco_socket_t sockfd = it->sockfd();
- if (sockfd != POCO_INVALID_SOCKET)
- {
- struct epoll_event* e = eventsIn;
- for (; e != eventLast; ++e)
- {
- if (reinterpret_cast<Socket*>(e->data.ptr)->sockfd() == sockfd)
- break;
- }
- if (e == eventLast)
- {
- e->data.ptr = &(*it);
- ++eventLast;
- }
- e->events |= EPOLLERR;
- }
- }
-
- epollSize = eventLast - eventsIn;
- if (epollSize == 0) return 0;
-
- epollfd = epoll_create(1);
- if (epollfd < 0)
- {
- SocketImpl::error("Can't create epoll queue");
- }
-
- for (struct epoll_event* e = eventsIn; e != eventLast; ++e)
- {
- poco_socket_t sockfd = reinterpret_cast<Socket*>(e->data.ptr)->sockfd();
- if (sockfd != POCO_INVALID_SOCKET)
- {
- if (epoll_ctl(epollfd, EPOLL_CTL_ADD, sockfd, e) < 0)
- {
- ::close(epollfd);
- SocketImpl::error("Can't insert socket to epoll queue");
- }
- }
- }
- }
-
- struct epoll_event eventsOut[epollSize];
- memset(eventsOut, 0, sizeof(eventsOut));
-
- Poco::Timespan remainingTime(timeout);
- int rc;
- do
- {
- Poco::Timestamp start;
- rc = epoll_wait(epollfd, eventsOut, epollSize, remainingTime.totalMilliseconds());
- if (rc < 0 && SocketImpl::lastError() == POCO_EINTR)
- {
- Poco::Timestamp end;
- Poco::Timespan waited = end - start;
- if (waited < remainingTime)
- remainingTime -= waited;
- else
- remainingTime = 0;
- }
- }
- while (rc < 0 && SocketImpl::lastError() == POCO_EINTR);
-
- ::close(epollfd);
- if (rc < 0) SocketImpl::error();
-
- SocketList readyReadList;
- SocketList readyWriteList;
- SocketList readyExceptList;
- for (int n = 0; n < rc; ++n)
- {
- if (eventsOut[n].events & EPOLLERR)
- readyExceptList.push_back(*reinterpret_cast<Socket*>(eventsOut[n].data.ptr));
- if (eventsOut[n].events & EPOLLIN)
- readyReadList.push_back(*reinterpret_cast<Socket*>(eventsOut[n].data.ptr));
- if (eventsOut[n].events & EPOLLOUT)
- readyWriteList.push_back(*reinterpret_cast<Socket*>(eventsOut[n].data.ptr));
- }
- std::swap(readList, readyReadList);
- std::swap(writeList, readyWriteList);
- std::swap(exceptList, readyExceptList);
- return readList.size() + writeList.size() + exceptList.size();
-
-#elif defined(POCO_HAVE_FD_POLL)
- typedef Poco::SharedPtr<pollfd, Poco::ReferenceCounter, Poco::ReleaseArrayPolicy<pollfd> > SharedPollArray;
-
- nfds_t nfd = readList.size() + writeList.size() + exceptList.size();
- if (0 == nfd) return 0;
-
- SharedPollArray pPollArr = new pollfd[nfd]();
-
- int idx = 0;
- for (SocketList::iterator it = readList.begin(); it != readList.end(); ++it)
- {
- pPollArr[idx].fd = int(it->sockfd());
- pPollArr[idx++].events |= POLLIN;
- }
-
- SocketList::iterator begR = readList.begin();
- SocketList::iterator endR = readList.end();
- for (SocketList::iterator it = writeList.begin(); it != writeList.end(); ++it)
- {
- SocketList::iterator pos = std::find(begR, endR, *it);
- if (pos != endR)
- {
- pPollArr[pos-begR].events |= POLLOUT;
- --nfd;
- }
- else
- {
- pPollArr[idx].fd = int(it->sockfd());
- pPollArr[idx++].events |= POLLOUT;
- }
- }
-
- SocketList::iterator begW = writeList.begin();
- SocketList::iterator endW = writeList.end();
- for (SocketList::iterator it = exceptList.begin(); it != exceptList.end(); ++it)
- {
- SocketList::iterator pos = std::find(begR, endR, *it);
- if (pos != endR) --nfd;
- else
- {
- SocketList::iterator pos = std::find(begW, endW, *it);
- if (pos != endW) --nfd;
- else pPollArr[idx++].fd = int(it->sockfd());
- }
- }
-
- Poco::Timespan remainingTime(timeout);
- int rc;
- do
- {
- Poco::Timestamp start;
- rc = ::poll(pPollArr, nfd, remainingTime.totalMilliseconds());
- if (rc < 0 && SocketImpl::lastError() == POCO_EINTR)
- {
- Poco::Timestamp end;
- Poco::Timespan waited = end - start;
- if (waited < remainingTime) remainingTime -= waited;
- else remainingTime = 0;
- }
- }
- while (rc < 0 && SocketImpl::lastError() == POCO_EINTR);
- if (rc < 0) SocketImpl::error();
-
- SocketList readyReadList;
- SocketList readyWriteList;
- SocketList readyExceptList;
-
- SocketList::iterator begE = exceptList.begin();
- SocketList::iterator endE = exceptList.end();
- for (int idx = 0; idx < nfd; ++idx)
- {
- SocketList::iterator slIt = std::find_if(begR, endR, Socket::FDCompare(pPollArr[idx].fd));
- if (POLLIN & pPollArr[idx].revents && slIt != endR) readyReadList.push_back(*slIt);
- slIt = std::find_if(begW, endW, Socket::FDCompare(pPollArr[idx].fd));
- if (POLLOUT & pPollArr[idx].revents && slIt != endW) readyWriteList.push_back(*slIt);
- slIt = std::find_if(begE, endE, Socket::FDCompare(pPollArr[idx].fd));
- if (POLLERR & pPollArr[idx].revents && slIt != endE) readyExceptList.push_back(*slIt);
- }
- std::swap(readList, readyReadList);
- std::swap(writeList, readyWriteList);
- std::swap(exceptList, readyExceptList);
- return readList.size() + writeList.size() + exceptList.size();
-
-#else
-
- fd_set fdRead;
- fd_set fdWrite;
- fd_set fdExcept;
- int nfd = 0;
- FD_ZERO(&fdRead);
- for (SocketList::const_iterator it = readList.begin(); it != readList.end(); ++it)
- {
- poco_socket_t fd = it->sockfd();
- if (fd != POCO_INVALID_SOCKET)
- {
- if (int(fd) > nfd)
- nfd = int(fd);
- FD_SET(fd, &fdRead);
- }
- }
- FD_ZERO(&fdWrite);
- for (SocketList::const_iterator it = writeList.begin(); it != writeList.end(); ++it)
- {
- poco_socket_t fd = it->sockfd();
- if (fd != POCO_INVALID_SOCKET)
- {
- if (int(fd) > nfd)
- nfd = int(fd);
- FD_SET(fd, &fdWrite);
- }
- }
- FD_ZERO(&fdExcept);
- for (SocketList::const_iterator it = exceptList.begin(); it != exceptList.end(); ++it)
- {
- poco_socket_t fd = it->sockfd();
- if (fd != POCO_INVALID_SOCKET)
- {
- if (int(fd) > nfd)
- nfd = int(fd);
- FD_SET(fd, &fdExcept);
- }
- }
- if (nfd == 0) return 0;
- Poco::Timespan remainingTime(timeout);
- int rc;
- do
- {
- struct timeval tv;
- tv.tv_sec = (long) remainingTime.totalSeconds();
- tv.tv_usec = (long) remainingTime.useconds();
- Poco::Timestamp start;
- rc = ::select(nfd + 1, &fdRead, &fdWrite, &fdExcept, &tv);
- if (rc < 0 && SocketImpl::lastError() == POCO_EINTR)
- {
- Poco::Timestamp end;
- Poco::Timespan waited = end - start;
- if (waited < remainingTime)
- remainingTime -= waited;
- else
- remainingTime = 0;
- }
- }
- while (rc < 0 && SocketImpl::lastError() == POCO_EINTR);
- if (rc < 0) SocketImpl::error();
-
- SocketList readyReadList;
- for (SocketList::const_iterator it = readList.begin(); it != readList.end(); ++it)
- {
- poco_socket_t fd = it->sockfd();
- if (fd != POCO_INVALID_SOCKET)
- {
- if (FD_ISSET(fd, &fdRead))
- readyReadList.push_back(*it);
- }
- }
- std::swap(readList, readyReadList);
- SocketList readyWriteList;
- for (SocketList::const_iterator it = writeList.begin(); it != writeList.end(); ++it)
- {
- poco_socket_t fd = it->sockfd();
- if (fd != POCO_INVALID_SOCKET)
- {
- if (FD_ISSET(fd, &fdWrite))
- readyWriteList.push_back(*it);
- }
- }
- std::swap(writeList, readyWriteList);
- SocketList readyExceptList;
- for (SocketList::const_iterator it = exceptList.begin(); it != exceptList.end(); ++it)
- {
- poco_socket_t fd = it->sockfd();
- if (fd != POCO_INVALID_SOCKET)
- {
- if (FD_ISSET(fd, &fdExcept))
- readyExceptList.push_back(*it);
- }
- }
- std::swap(exceptList, readyExceptList);
- return rc;
-
-#endif // POCO_HAVE_FD_EPOLL
-}
-
-
-} } // namespace Poco::Net
+//
+// Socket.cpp
+//
+// Library: Net
+// Package: Sockets
+// Module: Socket
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/Socket.h"
+#include "Poco/Net/StreamSocketImpl.h"
+#include "Poco/Timestamp.h"
+#include <algorithm>
+#include <string.h> // FD_SET needs memset on some platforms, so we can't use <cstring>
+#if defined(POCO_HAVE_FD_EPOLL)
+#include <sys/epoll.h>
+#elif defined(POCO_HAVE_FD_POLL)
+#include "Poco/SharedPtr.h"
+#include <poll.h>
+#endif
+
+
+namespace Poco {
+namespace Net {
+
+
+Socket::Socket():
+ _pImpl(new StreamSocketImpl)
+{
+}
+
+
+Socket::Socket(SocketImpl* pImpl):
+ _pImpl(pImpl)
+{
+ poco_check_ptr (_pImpl);
+}
+
+
+Socket::Socket(const Socket& socket):
+ _pImpl(socket._pImpl)
+{
+ poco_check_ptr (_pImpl);
+
+ _pImpl->duplicate();
+}
+
+
+Socket& Socket::operator = (const Socket& socket)
+{
+ if (&socket != this)
+ {
+ if (_pImpl) _pImpl->release();
+ _pImpl = socket._pImpl;
+ if (_pImpl) _pImpl->duplicate();
+ }
+ return *this;
+}
+
+
+Socket::~Socket()
+{
+ _pImpl->release();
+}
+
+
+int Socket::select(SocketList& readList, SocketList& writeList, SocketList& exceptList, const Poco::Timespan& timeout)
+{
+#if defined(POCO_HAVE_FD_EPOLL)
+
+ int epollSize = readList.size() + writeList.size() + exceptList.size();
+ if (epollSize == 0) return 0;
+
+ int epollfd = -1;
+ {
+ struct epoll_event eventsIn[epollSize];
+ memset(eventsIn, 0, sizeof(eventsIn));
+ struct epoll_event* eventLast = eventsIn;
+ for (SocketList::iterator it = readList.begin(); it != readList.end(); ++it)
+ {
+ poco_socket_t sockfd = it->sockfd();
+ if (sockfd != POCO_INVALID_SOCKET)
+ {
+ struct epoll_event* e = eventsIn;
+ for (; e != eventLast; ++e)
+ {
+ if (reinterpret_cast<Socket*>(e->data.ptr)->sockfd() == sockfd)
+ break;
+ }
+ if (e == eventLast)
+ {
+ e->data.ptr = &(*it);
+ ++eventLast;
+ }
+ e->events |= EPOLLIN;
+ }
+ }
+
+ for (SocketList::iterator it = writeList.begin(); it != writeList.end(); ++it)
+ {
+ poco_socket_t sockfd = it->sockfd();
+ if (sockfd != POCO_INVALID_SOCKET)
+ {
+ struct epoll_event* e = eventsIn;
+ for (; e != eventLast; ++e)
+ {
+ if (reinterpret_cast<Socket*>(e->data.ptr)->sockfd() == sockfd)
+ break;
+ }
+ if (e == eventLast)
+ {
+ e->data.ptr = &(*it);
+ ++eventLast;
+ }
+ e->events |= EPOLLOUT;
+ }
+ }
+
+ for (SocketList::iterator it = exceptList.begin(); it != exceptList.end(); ++it)
+ {
+ poco_socket_t sockfd = it->sockfd();
+ if (sockfd != POCO_INVALID_SOCKET)
+ {
+ struct epoll_event* e = eventsIn;
+ for (; e != eventLast; ++e)
+ {
+ if (reinterpret_cast<Socket*>(e->data.ptr)->sockfd() == sockfd)
+ break;
+ }
+ if (e == eventLast)
+ {
+ e->data.ptr = &(*it);
+ ++eventLast;
+ }
+ e->events |= EPOLLERR;
+ }
+ }
+
+ epollSize = eventLast - eventsIn;
+ if (epollSize == 0) return 0;
+
+ epollfd = epoll_create(1);
+ if (epollfd < 0)
+ {
+ SocketImpl::error("Can't create epoll queue");
+ }
+
+ for (struct epoll_event* e = eventsIn; e != eventLast; ++e)
+ {
+ poco_socket_t sockfd = reinterpret_cast<Socket*>(e->data.ptr)->sockfd();
+ if (sockfd != POCO_INVALID_SOCKET)
+ {
+ if (epoll_ctl(epollfd, EPOLL_CTL_ADD, sockfd, e) < 0)
+ {
+ ::close(epollfd);
+ SocketImpl::error("Can't insert socket to epoll queue");
+ }
+ }
+ }
+ }
+
+ struct epoll_event eventsOut[epollSize];
+ memset(eventsOut, 0, sizeof(eventsOut));
+
+ Poco::Timespan remainingTime(timeout);
+ int rc;
+ do
+ {
+ Poco::Timestamp start;
+ rc = epoll_wait(epollfd, eventsOut, epollSize, remainingTime.totalMilliseconds());
+ if (rc < 0 && SocketImpl::lastError() == POCO_EINTR)
+ {
+ Poco::Timestamp end;
+ Poco::Timespan waited = end - start;
+ if (waited < remainingTime)
+ remainingTime -= waited;
+ else
+ remainingTime = 0;
+ }
+ }
+ while (rc < 0 && SocketImpl::lastError() == POCO_EINTR);
+
+ ::close(epollfd);
+ if (rc < 0) SocketImpl::error();
+
+ SocketList readyReadList;
+ SocketList readyWriteList;
+ SocketList readyExceptList;
+ for (int n = 0; n < rc; ++n)
+ {
+ if (eventsOut[n].events & EPOLLERR)
+ readyExceptList.push_back(*reinterpret_cast<Socket*>(eventsOut[n].data.ptr));
+ if (eventsOut[n].events & EPOLLIN)
+ readyReadList.push_back(*reinterpret_cast<Socket*>(eventsOut[n].data.ptr));
+ if (eventsOut[n].events & EPOLLOUT)
+ readyWriteList.push_back(*reinterpret_cast<Socket*>(eventsOut[n].data.ptr));
+ }
+ std::swap(readList, readyReadList);
+ std::swap(writeList, readyWriteList);
+ std::swap(exceptList, readyExceptList);
+ return readList.size() + writeList.size() + exceptList.size();
+
+#elif defined(POCO_HAVE_FD_POLL)
+ typedef Poco::SharedPtr<pollfd, Poco::ReferenceCounter, Poco::ReleaseArrayPolicy<pollfd> > SharedPollArray;
+
+ nfds_t nfd = readList.size() + writeList.size() + exceptList.size();
+ if (0 == nfd) return 0;
+
+ SharedPollArray pPollArr = new pollfd[nfd]();
+
+ int idx = 0;
+ for (SocketList::iterator it = readList.begin(); it != readList.end(); ++it)
+ {
+ pPollArr[idx].fd = int(it->sockfd());
+ pPollArr[idx++].events |= POLLIN;
+ }
+
+ SocketList::iterator begR = readList.begin();
+ SocketList::iterator endR = readList.end();
+ for (SocketList::iterator it = writeList.begin(); it != writeList.end(); ++it)
+ {
+ SocketList::iterator pos = std::find(begR, endR, *it);
+ if (pos != endR)
+ {
+ pPollArr[pos-begR].events |= POLLOUT;
+ --nfd;
+ }
+ else
+ {
+ pPollArr[idx].fd = int(it->sockfd());
+ pPollArr[idx++].events |= POLLOUT;
+ }
+ }
+
+ SocketList::iterator begW = writeList.begin();
+ SocketList::iterator endW = writeList.end();
+ for (SocketList::iterator it = exceptList.begin(); it != exceptList.end(); ++it)
+ {
+ SocketList::iterator pos = std::find(begR, endR, *it);
+ if (pos != endR) --nfd;
+ else
+ {
+ SocketList::iterator pos = std::find(begW, endW, *it);
+ if (pos != endW) --nfd;
+ else pPollArr[idx++].fd = int(it->sockfd());
+ }
+ }
+
+ Poco::Timespan remainingTime(timeout);
+ int rc;
+ do
+ {
+ Poco::Timestamp start;
+ rc = ::poll(pPollArr, nfd, remainingTime.totalMilliseconds());
+ if (rc < 0 && SocketImpl::lastError() == POCO_EINTR)
+ {
+ Poco::Timestamp end;
+ Poco::Timespan waited = end - start;
+ if (waited < remainingTime) remainingTime -= waited;
+ else remainingTime = 0;
+ }
+ }
+ while (rc < 0 && SocketImpl::lastError() == POCO_EINTR);
+ if (rc < 0) SocketImpl::error();
+
+ SocketList readyReadList;
+ SocketList readyWriteList;
+ SocketList readyExceptList;
+
+ SocketList::iterator begE = exceptList.begin();
+ SocketList::iterator endE = exceptList.end();
+ for (int idx = 0; idx < nfd; ++idx)
+ {
+ SocketList::iterator slIt = std::find_if(begR, endR, Socket::FDCompare(pPollArr[idx].fd));
+ if (POLLIN & pPollArr[idx].revents && slIt != endR) readyReadList.push_back(*slIt);
+ slIt = std::find_if(begW, endW, Socket::FDCompare(pPollArr[idx].fd));
+ if (POLLOUT & pPollArr[idx].revents && slIt != endW) readyWriteList.push_back(*slIt);
+ slIt = std::find_if(begE, endE, Socket::FDCompare(pPollArr[idx].fd));
+ if (POLLERR & pPollArr[idx].revents && slIt != endE) readyExceptList.push_back(*slIt);
+ }
+ std::swap(readList, readyReadList);
+ std::swap(writeList, readyWriteList);
+ std::swap(exceptList, readyExceptList);
+ return readList.size() + writeList.size() + exceptList.size();
+
+#else
+
+ fd_set fdRead;
+ fd_set fdWrite;
+ fd_set fdExcept;
+ int nfd = 0;
+ FD_ZERO(&fdRead);
+ for (SocketList::const_iterator it = readList.begin(); it != readList.end(); ++it)
+ {
+ poco_socket_t fd = it->sockfd();
+ if (fd != POCO_INVALID_SOCKET)
+ {
+ if (int(fd) > nfd)
+ nfd = int(fd);
+ FD_SET(fd, &fdRead);
+ }
+ }
+ FD_ZERO(&fdWrite);
+ for (SocketList::const_iterator it = writeList.begin(); it != writeList.end(); ++it)
+ {
+ poco_socket_t fd = it->sockfd();
+ if (fd != POCO_INVALID_SOCKET)
+ {
+ if (int(fd) > nfd)
+ nfd = int(fd);
+ FD_SET(fd, &fdWrite);
+ }
+ }
+ FD_ZERO(&fdExcept);
+ for (SocketList::const_iterator it = exceptList.begin(); it != exceptList.end(); ++it)
+ {
+ poco_socket_t fd = it->sockfd();
+ if (fd != POCO_INVALID_SOCKET)
+ {
+ if (int(fd) > nfd)
+ nfd = int(fd);
+ FD_SET(fd, &fdExcept);
+ }
+ }
+ if (nfd == 0) return 0;
+ Poco::Timespan remainingTime(timeout);
+ int rc;
+ do
+ {
+ struct timeval tv;
+ tv.tv_sec = (long) remainingTime.totalSeconds();
+ tv.tv_usec = (long) remainingTime.useconds();
+ Poco::Timestamp start;
+ rc = ::select(nfd + 1, &fdRead, &fdWrite, &fdExcept, &tv);
+ if (rc < 0 && SocketImpl::lastError() == POCO_EINTR)
+ {
+ Poco::Timestamp end;
+ Poco::Timespan waited = end - start;
+ if (waited < remainingTime)
+ remainingTime -= waited;
+ else
+ remainingTime = 0;
+ }
+ }
+ while (rc < 0 && SocketImpl::lastError() == POCO_EINTR);
+ if (rc < 0) SocketImpl::error();
+
+ SocketList readyReadList;
+ for (SocketList::const_iterator it = readList.begin(); it != readList.end(); ++it)
+ {
+ poco_socket_t fd = it->sockfd();
+ if (fd != POCO_INVALID_SOCKET)
+ {
+ if (FD_ISSET(fd, &fdRead))
+ readyReadList.push_back(*it);
+ }
+ }
+ std::swap(readList, readyReadList);
+ SocketList readyWriteList;
+ for (SocketList::const_iterator it = writeList.begin(); it != writeList.end(); ++it)
+ {
+ poco_socket_t fd = it->sockfd();
+ if (fd != POCO_INVALID_SOCKET)
+ {
+ if (FD_ISSET(fd, &fdWrite))
+ readyWriteList.push_back(*it);
+ }
+ }
+ std::swap(writeList, readyWriteList);
+ SocketList readyExceptList;
+ for (SocketList::const_iterator it = exceptList.begin(); it != exceptList.end(); ++it)
+ {
+ poco_socket_t fd = it->sockfd();
+ if (fd != POCO_INVALID_SOCKET)
+ {
+ if (FD_ISSET(fd, &fdExcept))
+ readyExceptList.push_back(*it);
+ }
+ }
+ std::swap(exceptList, readyExceptList);
+ return rc;
+
+#endif // POCO_HAVE_FD_EPOLL
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/SocketAddress.cpp b/contrib/libs/poco/Net/src/SocketAddress.cpp
index d9a53451df..0782ca3eea 100644
--- a/contrib/libs/poco/Net/src/SocketAddress.cpp
+++ b/contrib/libs/poco/Net/src/SocketAddress.cpp
@@ -1,435 +1,435 @@
-//
-// SocketAddress.cpp
-//
-// Library: Net
-// Package: NetCore
-// Module: SocketAddress
-//
-// Copyright (c) 2005-2011, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/SocketAddress.h"
-#include "Poco/Net/IPAddress.h"
-#include "Poco/Net/NetException.h"
-#include "Poco/Net/DNS.h"
-#include "Poco/RefCountedObject.h"
-#include "Poco/NumberParser.h"
-#include "Poco/BinaryReader.h"
-#include "Poco/BinaryWriter.h"
-#include <algorithm>
-#include <cstring>
-
-
-using Poco::RefCountedObject;
-using Poco::NumberParser;
-using Poco::UInt16;
-using Poco::InvalidArgumentException;
-using Poco::Net::Impl::SocketAddressImpl;
-using Poco::Net::Impl::IPv4SocketAddressImpl;
-#ifdef POCO_HAVE_IPv6
-using Poco::Net::Impl::IPv6SocketAddressImpl;
-#endif
-#ifdef POCO_OS_FAMILY_UNIX
-using Poco::Net::Impl::LocalSocketAddressImpl;
-#endif
-
-
-namespace Poco {
-namespace Net {
-
-
-struct AFLT
-{
- bool operator () (const IPAddress& a1, const IPAddress& a2)
- {
- return a1.af() < a2.af();
- }
-};
-
-
-//
-// SocketAddress
-//
-
-
-#if !defined(_MSC_VER) || defined(__STDC__)
-// Go home MSVC, you're drunk...
-// See http://stackoverflow.com/questions/5899857/multiple-definition-error-for-static-const-class-members
-const SocketAddress::Family SocketAddress::IPv4;
-#if defined(POCO_HAVE_IPv6)
-const SocketAddress::Family SocketAddress::IPv6;
-#endif
-#if defined(POCO_OS_FAMILY_UNIX)
-const SocketAddress::Family SocketAddress::UNIX_LOCAL;
-#endif
-#endif
-
-
-SocketAddress::SocketAddress()
-{
- newIPv4();
-}
-
-
-SocketAddress::SocketAddress(Family fam)
-{
- init(IPAddress(fam), 0);
-}
-
-
-SocketAddress::SocketAddress(const IPAddress& hostAddress, Poco::UInt16 portNumber)
-{
- init(hostAddress, portNumber);
-}
-
-
-SocketAddress::SocketAddress(Poco::UInt16 portNumber)
-{
- init(IPAddress(), portNumber);
-}
-
-
-SocketAddress::SocketAddress(Family fam, Poco::UInt16 portNumber)
-{
- init(IPAddress(fam), portNumber);
-}
-
-
-SocketAddress::SocketAddress(const std::string& hostAddress, Poco::UInt16 portNumber)
-{
- init(hostAddress, portNumber);
-}
-
-
-SocketAddress::SocketAddress(Family fam, const std::string& hostAddress, Poco::UInt16 portNumber)
-{
- init(fam, hostAddress, portNumber);
-}
-
-
-SocketAddress::SocketAddress(const std::string& hostAddress, const std::string& portNumber)
-{
- init(hostAddress, resolveService(portNumber));
-}
-
-
-SocketAddress::SocketAddress(Family fam, const std::string& hostAddress, const std::string& portNumber)
-{
- init(fam, hostAddress, resolveService(portNumber));
-}
-
-
-SocketAddress::SocketAddress(Family fam, const std::string& addr)
-{
- init(fam, addr);
-}
-
-
-SocketAddress::SocketAddress(const std::string& hostAndPort)
-{
- init(hostAndPort);
-}
-
-
-SocketAddress::SocketAddress(const SocketAddress& socketAddress)
-{
- if (socketAddress.family() == IPv4)
- newIPv4(reinterpret_cast<const sockaddr_in*>(socketAddress.addr()));
-#if defined(POCO_HAVE_IPv6)
- else if (socketAddress.family() == IPv6)
- newIPv6(reinterpret_cast<const sockaddr_in6*>(socketAddress.addr()));
-#endif
-#if defined(POCO_OS_FAMILY_UNIX)
- else if (socketAddress.family() == UNIX_LOCAL)
- newLocal(reinterpret_cast<const sockaddr_un*>(socketAddress.addr()));
-#endif
-}
-
-
-SocketAddress::SocketAddress(const struct sockaddr* sockAddr, poco_socklen_t length)
-{
- if (length == sizeof(struct sockaddr_in) && sockAddr->sa_family == AF_INET)
- newIPv4(reinterpret_cast<const struct sockaddr_in*>(sockAddr));
-#if defined(POCO_HAVE_IPv6)
- else if (length == sizeof(struct sockaddr_in6) && sockAddr->sa_family == AF_INET6)
- newIPv6(reinterpret_cast<const struct sockaddr_in6*>(sockAddr));
-#endif
-#if defined(POCO_OS_FAMILY_UNIX)
- else if (length > 0 && length <= sizeof(struct sockaddr_un) && sockAddr->sa_family == AF_UNIX)
- newLocal(reinterpret_cast<const sockaddr_un*>(sockAddr));
-#endif
- else throw Poco::InvalidArgumentException("Invalid address length or family passed to SocketAddress()");
-}
-
-
-SocketAddress::~SocketAddress()
-{
-}
-
-
-bool SocketAddress::operator < (const SocketAddress& socketAddress) const
-{
- if (family() < socketAddress.family()) return true;
- if (family() > socketAddress.family()) return false;
-#if defined(POCO_OS_FAMILY_UNIX)
- if (family() == UNIX_LOCAL) return toString() < socketAddress.toString();
-#endif
- if (host() < socketAddress.host()) return true;
- if (host() > socketAddress.host()) return false;
- return (port() < socketAddress.port());
-}
-
-
-SocketAddress& SocketAddress::operator = (const SocketAddress& socketAddress)
-{
- if (&socketAddress != this)
- {
- if (socketAddress.family() == IPv4)
- newIPv4(reinterpret_cast<const sockaddr_in*>(socketAddress.addr()));
-#if defined(POCO_HAVE_IPv6)
- else if (socketAddress.family() == IPv6)
- newIPv6(reinterpret_cast<const sockaddr_in6*>(socketAddress.addr()));
-#endif
-#if defined(POCO_OS_FAMILY_UNIX)
- else if (socketAddress.family() == UNIX_LOCAL)
- newLocal(reinterpret_cast<const sockaddr_un*>(socketAddress.addr()));
-#endif
- }
- return *this;
-}
-
-
-IPAddress SocketAddress::host() const
-{
- return pImpl()->host();
-}
-
-
-Poco::UInt16 SocketAddress::port() const
-{
- return ntohs(pImpl()->port());
-}
-
-
-poco_socklen_t SocketAddress::length() const
-{
- return pImpl()->length();
-}
-
-
-const struct sockaddr* SocketAddress::addr() const
-{
- return pImpl()->addr();
-}
-
-
-int SocketAddress::af() const
-{
- return pImpl()->af();
-}
-
-
-SocketAddress::Family SocketAddress::family() const
-{
- return static_cast<Family>(pImpl()->family());
-}
-
-
-std::string SocketAddress::toString() const
-{
- return pImpl()->toString();
-}
-
-
-void SocketAddress::init(const IPAddress& hostAddress, Poco::UInt16 portNumber)
-{
- if (hostAddress.family() == IPAddress::IPv4)
- newIPv4(hostAddress, portNumber);
-#if defined(POCO_HAVE_IPv6)
- else if (hostAddress.family() == IPAddress::IPv6)
- newIPv6(hostAddress, portNumber);
-#endif
- else throw Poco::NotImplementedException("unsupported IP address family");
-}
-
-
-void SocketAddress::init(const std::string& hostAddress, Poco::UInt16 portNumber)
-{
- IPAddress ip;
- if (IPAddress::tryParse(hostAddress, ip))
- {
- init(ip, portNumber);
- }
- else
- {
- HostEntry he = DNS::hostByName(hostAddress);
- HostEntry::AddressList addresses = he.addresses();
- if (addresses.size() > 0)
- {
-#if defined(POCO_HAVE_IPv6) && defined(POCO_SOCKETADDRESS_PREFER_IPv4)
- // if we get both IPv4 and IPv6 addresses, prefer IPv4
- std::stable_sort(addresses.begin(), addresses.end(), AFLT());
-#endif
- init(addresses[0], portNumber);
- }
- else throw HostNotFoundException("No address found for host", hostAddress);
- }
-}
-
-
-void SocketAddress::init(Family fam, const std::string& hostAddress, Poco::UInt16 portNumber)
-{
- IPAddress ip;
- if (IPAddress::tryParse(hostAddress, ip))
- {
- if (ip.family() != fam) throw AddressFamilyMismatchException(hostAddress);
- init(ip, portNumber);
- }
- else
- {
- HostEntry he = DNS::hostByName(hostAddress);
- HostEntry::AddressList addresses = he.addresses();
- if (addresses.size() > 0)
- {
- for (HostEntry::AddressList::const_iterator it = addresses.begin(); it != addresses.end(); ++it)
- {
- if (it->family() == fam)
- {
- init(*it, portNumber);
- return;
- }
- }
- throw AddressFamilyMismatchException(hostAddress);
- }
- else throw HostNotFoundException("No address found for host", hostAddress);
- }
-}
-
-
-void SocketAddress::init(Family fam, const std::string& address)
-{
-#if defined(POCO_OS_FAMILY_UNIX)
- if (fam == UNIX_LOCAL)
- {
- newLocal(address);
- }
- else
-#endif
- {
- std::string host;
- std::string port;
- std::string::const_iterator it = address.begin();
- std::string::const_iterator end = address.end();
-
- if (*it == '[')
- {
- ++it;
- while (it != end && *it != ']') host += *it++;
- if (it == end) throw InvalidArgumentException("Malformed IPv6 address");
- ++it;
- }
- else
- {
- while (it != end && *it != ':') host += *it++;
- }
- if (it != end && *it == ':')
- {
- ++it;
- while (it != end) port += *it++;
- }
- else throw InvalidArgumentException("Missing port number");
- init(fam, host, resolveService(port));
- }
-}
-
-
-void SocketAddress::init(const std::string& hostAndPort)
-{
- poco_assert (!hostAndPort.empty());
-
- std::string host;
- std::string port;
- std::string::const_iterator it = hostAndPort.begin();
- std::string::const_iterator end = hostAndPort.end();
-
-#if defined(POCO_OS_FAMILY_UNIX)
- if (*it == '/')
- {
- newLocal(hostAndPort);
- return;
- }
-#endif
- if (*it == '[')
- {
- ++it;
- while (it != end && *it != ']') host += *it++;
- if (it == end) throw InvalidArgumentException("Malformed IPv6 address");
- ++it;
- }
- else
- {
- while (it != end && *it != ':') host += *it++;
- }
- if (it != end && *it == ':')
- {
- ++it;
- while (it != end) port += *it++;
- }
- else throw InvalidArgumentException("Missing port number");
- init(host, resolveService(port));
-}
-
-
-Poco::UInt16 SocketAddress::resolveService(const std::string& service)
-{
- unsigned port;
- if (NumberParser::tryParseUnsigned(service, port) && port <= 0xFFFF)
- {
- return (UInt16) port;
- }
- else
- {
-#if defined(POCO_VXWORKS)
- throw ServiceNotFoundException(service);
-#else
- struct servent* se = getservbyname(service.c_str(), NULL);
- if (se)
- return ntohs(se->s_port);
- else
- throw ServiceNotFoundException(service);
-#endif
- }
-}
-
-
-} } // namespace Poco::Net
-
-
-Poco::BinaryWriter& operator << (Poco::BinaryWriter& writer, const Poco::Net::SocketAddress& value)
-{
- writer << value.host();
- writer << value.port();
- return writer;
-}
-
-
-Poco::BinaryReader& operator >> (Poco::BinaryReader& reader, Poco::Net::SocketAddress& value)
-{
- Poco::Net::IPAddress host;
- reader >> host;
- Poco::UInt16 port;
- reader >> port;
- value = Poco::Net::SocketAddress(host, port);
- return reader;
-}
-
-
-std::ostream& operator << (std::ostream& ostr, const Poco::Net::SocketAddress& address)
-{
- ostr << address.toString();
- return ostr;
-}
+//
+// SocketAddress.cpp
+//
+// Library: Net
+// Package: NetCore
+// Module: SocketAddress
+//
+// Copyright (c) 2005-2011, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/SocketAddress.h"
+#include "Poco/Net/IPAddress.h"
+#include "Poco/Net/NetException.h"
+#include "Poco/Net/DNS.h"
+#include "Poco/RefCountedObject.h"
+#include "Poco/NumberParser.h"
+#include "Poco/BinaryReader.h"
+#include "Poco/BinaryWriter.h"
+#include <algorithm>
+#include <cstring>
+
+
+using Poco::RefCountedObject;
+using Poco::NumberParser;
+using Poco::UInt16;
+using Poco::InvalidArgumentException;
+using Poco::Net::Impl::SocketAddressImpl;
+using Poco::Net::Impl::IPv4SocketAddressImpl;
+#ifdef POCO_HAVE_IPv6
+using Poco::Net::Impl::IPv6SocketAddressImpl;
+#endif
+#ifdef POCO_OS_FAMILY_UNIX
+using Poco::Net::Impl::LocalSocketAddressImpl;
+#endif
+
+
+namespace Poco {
+namespace Net {
+
+
+struct AFLT
+{
+ bool operator () (const IPAddress& a1, const IPAddress& a2)
+ {
+ return a1.af() < a2.af();
+ }
+};
+
+
+//
+// SocketAddress
+//
+
+
+#if !defined(_MSC_VER) || defined(__STDC__)
+// Go home MSVC, you're drunk...
+// See http://stackoverflow.com/questions/5899857/multiple-definition-error-for-static-const-class-members
+const SocketAddress::Family SocketAddress::IPv4;
+#if defined(POCO_HAVE_IPv6)
+const SocketAddress::Family SocketAddress::IPv6;
+#endif
+#if defined(POCO_OS_FAMILY_UNIX)
+const SocketAddress::Family SocketAddress::UNIX_LOCAL;
+#endif
+#endif
+
+
+SocketAddress::SocketAddress()
+{
+ newIPv4();
+}
+
+
+SocketAddress::SocketAddress(Family fam)
+{
+ init(IPAddress(fam), 0);
+}
+
+
+SocketAddress::SocketAddress(const IPAddress& hostAddress, Poco::UInt16 portNumber)
+{
+ init(hostAddress, portNumber);
+}
+
+
+SocketAddress::SocketAddress(Poco::UInt16 portNumber)
+{
+ init(IPAddress(), portNumber);
+}
+
+
+SocketAddress::SocketAddress(Family fam, Poco::UInt16 portNumber)
+{
+ init(IPAddress(fam), portNumber);
+}
+
+
+SocketAddress::SocketAddress(const std::string& hostAddress, Poco::UInt16 portNumber)
+{
+ init(hostAddress, portNumber);
+}
+
+
+SocketAddress::SocketAddress(Family fam, const std::string& hostAddress, Poco::UInt16 portNumber)
+{
+ init(fam, hostAddress, portNumber);
+}
+
+
+SocketAddress::SocketAddress(const std::string& hostAddress, const std::string& portNumber)
+{
+ init(hostAddress, resolveService(portNumber));
+}
+
+
+SocketAddress::SocketAddress(Family fam, const std::string& hostAddress, const std::string& portNumber)
+{
+ init(fam, hostAddress, resolveService(portNumber));
+}
+
+
+SocketAddress::SocketAddress(Family fam, const std::string& addr)
+{
+ init(fam, addr);
+}
+
+
+SocketAddress::SocketAddress(const std::string& hostAndPort)
+{
+ init(hostAndPort);
+}
+
+
+SocketAddress::SocketAddress(const SocketAddress& socketAddress)
+{
+ if (socketAddress.family() == IPv4)
+ newIPv4(reinterpret_cast<const sockaddr_in*>(socketAddress.addr()));
+#if defined(POCO_HAVE_IPv6)
+ else if (socketAddress.family() == IPv6)
+ newIPv6(reinterpret_cast<const sockaddr_in6*>(socketAddress.addr()));
+#endif
+#if defined(POCO_OS_FAMILY_UNIX)
+ else if (socketAddress.family() == UNIX_LOCAL)
+ newLocal(reinterpret_cast<const sockaddr_un*>(socketAddress.addr()));
+#endif
+}
+
+
+SocketAddress::SocketAddress(const struct sockaddr* sockAddr, poco_socklen_t length)
+{
+ if (length == sizeof(struct sockaddr_in) && sockAddr->sa_family == AF_INET)
+ newIPv4(reinterpret_cast<const struct sockaddr_in*>(sockAddr));
+#if defined(POCO_HAVE_IPv6)
+ else if (length == sizeof(struct sockaddr_in6) && sockAddr->sa_family == AF_INET6)
+ newIPv6(reinterpret_cast<const struct sockaddr_in6*>(sockAddr));
+#endif
+#if defined(POCO_OS_FAMILY_UNIX)
+ else if (length > 0 && length <= sizeof(struct sockaddr_un) && sockAddr->sa_family == AF_UNIX)
+ newLocal(reinterpret_cast<const sockaddr_un*>(sockAddr));
+#endif
+ else throw Poco::InvalidArgumentException("Invalid address length or family passed to SocketAddress()");
+}
+
+
+SocketAddress::~SocketAddress()
+{
+}
+
+
+bool SocketAddress::operator < (const SocketAddress& socketAddress) const
+{
+ if (family() < socketAddress.family()) return true;
+ if (family() > socketAddress.family()) return false;
+#if defined(POCO_OS_FAMILY_UNIX)
+ if (family() == UNIX_LOCAL) return toString() < socketAddress.toString();
+#endif
+ if (host() < socketAddress.host()) return true;
+ if (host() > socketAddress.host()) return false;
+ return (port() < socketAddress.port());
+}
+
+
+SocketAddress& SocketAddress::operator = (const SocketAddress& socketAddress)
+{
+ if (&socketAddress != this)
+ {
+ if (socketAddress.family() == IPv4)
+ newIPv4(reinterpret_cast<const sockaddr_in*>(socketAddress.addr()));
+#if defined(POCO_HAVE_IPv6)
+ else if (socketAddress.family() == IPv6)
+ newIPv6(reinterpret_cast<const sockaddr_in6*>(socketAddress.addr()));
+#endif
+#if defined(POCO_OS_FAMILY_UNIX)
+ else if (socketAddress.family() == UNIX_LOCAL)
+ newLocal(reinterpret_cast<const sockaddr_un*>(socketAddress.addr()));
+#endif
+ }
+ return *this;
+}
+
+
+IPAddress SocketAddress::host() const
+{
+ return pImpl()->host();
+}
+
+
+Poco::UInt16 SocketAddress::port() const
+{
+ return ntohs(pImpl()->port());
+}
+
+
+poco_socklen_t SocketAddress::length() const
+{
+ return pImpl()->length();
+}
+
+
+const struct sockaddr* SocketAddress::addr() const
+{
+ return pImpl()->addr();
+}
+
+
+int SocketAddress::af() const
+{
+ return pImpl()->af();
+}
+
+
+SocketAddress::Family SocketAddress::family() const
+{
+ return static_cast<Family>(pImpl()->family());
+}
+
+
+std::string SocketAddress::toString() const
+{
+ return pImpl()->toString();
+}
+
+
+void SocketAddress::init(const IPAddress& hostAddress, Poco::UInt16 portNumber)
+{
+ if (hostAddress.family() == IPAddress::IPv4)
+ newIPv4(hostAddress, portNumber);
+#if defined(POCO_HAVE_IPv6)
+ else if (hostAddress.family() == IPAddress::IPv6)
+ newIPv6(hostAddress, portNumber);
+#endif
+ else throw Poco::NotImplementedException("unsupported IP address family");
+}
+
+
+void SocketAddress::init(const std::string& hostAddress, Poco::UInt16 portNumber)
+{
+ IPAddress ip;
+ if (IPAddress::tryParse(hostAddress, ip))
+ {
+ init(ip, portNumber);
+ }
+ else
+ {
+ HostEntry he = DNS::hostByName(hostAddress);
+ HostEntry::AddressList addresses = he.addresses();
+ if (addresses.size() > 0)
+ {
+#if defined(POCO_HAVE_IPv6) && defined(POCO_SOCKETADDRESS_PREFER_IPv4)
+ // if we get both IPv4 and IPv6 addresses, prefer IPv4
+ std::stable_sort(addresses.begin(), addresses.end(), AFLT());
+#endif
+ init(addresses[0], portNumber);
+ }
+ else throw HostNotFoundException("No address found for host", hostAddress);
+ }
+}
+
+
+void SocketAddress::init(Family fam, const std::string& hostAddress, Poco::UInt16 portNumber)
+{
+ IPAddress ip;
+ if (IPAddress::tryParse(hostAddress, ip))
+ {
+ if (ip.family() != fam) throw AddressFamilyMismatchException(hostAddress);
+ init(ip, portNumber);
+ }
+ else
+ {
+ HostEntry he = DNS::hostByName(hostAddress);
+ HostEntry::AddressList addresses = he.addresses();
+ if (addresses.size() > 0)
+ {
+ for (HostEntry::AddressList::const_iterator it = addresses.begin(); it != addresses.end(); ++it)
+ {
+ if (it->family() == fam)
+ {
+ init(*it, portNumber);
+ return;
+ }
+ }
+ throw AddressFamilyMismatchException(hostAddress);
+ }
+ else throw HostNotFoundException("No address found for host", hostAddress);
+ }
+}
+
+
+void SocketAddress::init(Family fam, const std::string& address)
+{
+#if defined(POCO_OS_FAMILY_UNIX)
+ if (fam == UNIX_LOCAL)
+ {
+ newLocal(address);
+ }
+ else
+#endif
+ {
+ std::string host;
+ std::string port;
+ std::string::const_iterator it = address.begin();
+ std::string::const_iterator end = address.end();
+
+ if (*it == '[')
+ {
+ ++it;
+ while (it != end && *it != ']') host += *it++;
+ if (it == end) throw InvalidArgumentException("Malformed IPv6 address");
+ ++it;
+ }
+ else
+ {
+ while (it != end && *it != ':') host += *it++;
+ }
+ if (it != end && *it == ':')
+ {
+ ++it;
+ while (it != end) port += *it++;
+ }
+ else throw InvalidArgumentException("Missing port number");
+ init(fam, host, resolveService(port));
+ }
+}
+
+
+void SocketAddress::init(const std::string& hostAndPort)
+{
+ poco_assert (!hostAndPort.empty());
+
+ std::string host;
+ std::string port;
+ std::string::const_iterator it = hostAndPort.begin();
+ std::string::const_iterator end = hostAndPort.end();
+
+#if defined(POCO_OS_FAMILY_UNIX)
+ if (*it == '/')
+ {
+ newLocal(hostAndPort);
+ return;
+ }
+#endif
+ if (*it == '[')
+ {
+ ++it;
+ while (it != end && *it != ']') host += *it++;
+ if (it == end) throw InvalidArgumentException("Malformed IPv6 address");
+ ++it;
+ }
+ else
+ {
+ while (it != end && *it != ':') host += *it++;
+ }
+ if (it != end && *it == ':')
+ {
+ ++it;
+ while (it != end) port += *it++;
+ }
+ else throw InvalidArgumentException("Missing port number");
+ init(host, resolveService(port));
+}
+
+
+Poco::UInt16 SocketAddress::resolveService(const std::string& service)
+{
+ unsigned port;
+ if (NumberParser::tryParseUnsigned(service, port) && port <= 0xFFFF)
+ {
+ return (UInt16) port;
+ }
+ else
+ {
+#if defined(POCO_VXWORKS)
+ throw ServiceNotFoundException(service);
+#else
+ struct servent* se = getservbyname(service.c_str(), NULL);
+ if (se)
+ return ntohs(se->s_port);
+ else
+ throw ServiceNotFoundException(service);
+#endif
+ }
+}
+
+
+} } // namespace Poco::Net
+
+
+Poco::BinaryWriter& operator << (Poco::BinaryWriter& writer, const Poco::Net::SocketAddress& value)
+{
+ writer << value.host();
+ writer << value.port();
+ return writer;
+}
+
+
+Poco::BinaryReader& operator >> (Poco::BinaryReader& reader, Poco::Net::SocketAddress& value)
+{
+ Poco::Net::IPAddress host;
+ reader >> host;
+ Poco::UInt16 port;
+ reader >> port;
+ value = Poco::Net::SocketAddress(host, port);
+ return reader;
+}
+
+
+std::ostream& operator << (std::ostream& ostr, const Poco::Net::SocketAddress& address)
+{
+ ostr << address.toString();
+ return ostr;
+}
diff --git a/contrib/libs/poco/Net/src/SocketAddressImpl.cpp b/contrib/libs/poco/Net/src/SocketAddressImpl.cpp
index 0c1b0f28d7..57690170f2 100644
--- a/contrib/libs/poco/Net/src/SocketAddressImpl.cpp
+++ b/contrib/libs/poco/Net/src/SocketAddressImpl.cpp
@@ -1,184 +1,184 @@
-//
-// SocketAddressImpl.cpp
-//
-// Library: Net
-// Package: NetCore
-// Module: SocketAddressImpl
-//
-// Copyright (c) 2005-2011, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/SocketAddressImpl.h"
-#include "Poco/Net/SocketDefs.h"
-#include "Poco/NumberFormatter.h"
-#include <cstring>
-
-
-namespace Poco {
-namespace Net {
-namespace Impl {
-
-
-//
-// SocketAddressImpl
-//
-
-
-SocketAddressImpl::SocketAddressImpl()
-{
-}
-
-
-SocketAddressImpl::~SocketAddressImpl()
-{
-}
-
-
-//
-// IPv4SocketAddressImpl
-//
-
-
-IPv4SocketAddressImpl::IPv4SocketAddressImpl()
-{
- std::memset(&_addr, 0, sizeof(_addr));
- _addr.sin_family = AF_INET;
- poco_set_sin_len(&_addr);
-}
-
-
-IPv4SocketAddressImpl::IPv4SocketAddressImpl(const struct sockaddr_in* addr)
-{
- std::memcpy(&_addr, addr, sizeof(_addr));
-}
-
-
-IPv4SocketAddressImpl::IPv4SocketAddressImpl(const void* addr, UInt16 port)
-{
- std::memset(&_addr, 0, sizeof(_addr));
- _addr.sin_family = AF_INET;
- poco_set_sin_len(&_addr);
- std::memcpy(&_addr.sin_addr, addr, sizeof(_addr.sin_addr));
- _addr.sin_port = port;
-}
-
-
-std::string IPv4SocketAddressImpl::toString() const
-{
- std::string result;
- result.append(host().toString());
- result.append(":");
- NumberFormatter::append(result, ntohs(port()));
- return result;
-}
-
-
-#if defined(POCO_HAVE_IPv6)
-
-
-//
-// IPv6SocketAddressImpl
-//
-
-
-IPv6SocketAddressImpl::IPv6SocketAddressImpl(const struct sockaddr_in6* addr)
-{
- std::memcpy(&_addr, addr, sizeof(_addr));
-}
-
-
-IPv6SocketAddressImpl::IPv6SocketAddressImpl(const void* addr, UInt16 port)
-{
- std::memset(&_addr, 0, sizeof(_addr));
- _addr.sin6_family = AF_INET6;
- poco_set_sin6_len(&_addr);
- std::memcpy(&_addr.sin6_addr, addr, sizeof(_addr.sin6_addr));
- _addr.sin6_port = port;
-}
-
-
-IPv6SocketAddressImpl::IPv6SocketAddressImpl(const void* addr, UInt16 port, UInt32 scope)
-{
- std::memset(&_addr, 0, sizeof(_addr));
- _addr.sin6_family = AF_INET6;
- poco_set_sin6_len(&_addr);
- std::memcpy(&_addr.sin6_addr, addr, sizeof(_addr.sin6_addr));
- _addr.sin6_port = port;
- _addr.sin6_scope_id = scope;
-}
-
-
-std::string IPv6SocketAddressImpl::toString() const
-{
- std::string result;
- result.append("[");
- result.append(host().toString());
- result.append("]");
- result.append(":");
- NumberFormatter::append(result, ntohs(port()));
- return result;
-}
-
-
-#endif // POCO_HAVE_IPv6
-
-
-#if defined(POCO_OS_FAMILY_UNIX)
-
-
-//
-// LocalSocketAddressImpl
-//
-
-
-LocalSocketAddressImpl::LocalSocketAddressImpl(const struct sockaddr_un* addr)
-{
- _pAddr = new sockaddr_un;
- std::memcpy(_pAddr, addr, sizeof(struct sockaddr_un));
-}
-
-
-LocalSocketAddressImpl::LocalSocketAddressImpl(const char* path)
-{
- poco_assert (std::strlen(path) < sizeof(_pAddr->sun_path));
-
- _pAddr = new sockaddr_un;
- poco_set_sun_len(_pAddr, std::strlen(path) + sizeof(struct sockaddr_un) - sizeof(_pAddr->sun_path) + 1);
- _pAddr->sun_family = AF_UNIX;
- std::strcpy(_pAddr->sun_path, path);
-}
-
-
-LocalSocketAddressImpl::LocalSocketAddressImpl(const char* path, std::size_t length)
-{
- poco_assert (length < sizeof(_pAddr->sun_path));
-
- _pAddr = new sockaddr_un;
- poco_set_sun_len(_pAddr, length + sizeof(struct sockaddr_un) - sizeof(_pAddr->sun_path) + 1);
- _pAddr->sun_family = AF_UNIX;
- std::memcpy(_pAddr->sun_path, path, length);
- _pAddr->sun_path[length] = 0;
-}
-
-
-LocalSocketAddressImpl::~LocalSocketAddressImpl()
-{
- delete _pAddr;
-}
-
-
-std::string LocalSocketAddressImpl::toString() const
-{
- std::string result(path());
- return result;
-}
-
-
-#endif // POCO_OS_FAMILY_UNIX
-
-
-} } } // namespace Poco::Net::Impl
+//
+// SocketAddressImpl.cpp
+//
+// Library: Net
+// Package: NetCore
+// Module: SocketAddressImpl
+//
+// Copyright (c) 2005-2011, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/SocketAddressImpl.h"
+#include "Poco/Net/SocketDefs.h"
+#include "Poco/NumberFormatter.h"
+#include <cstring>
+
+
+namespace Poco {
+namespace Net {
+namespace Impl {
+
+
+//
+// SocketAddressImpl
+//
+
+
+SocketAddressImpl::SocketAddressImpl()
+{
+}
+
+
+SocketAddressImpl::~SocketAddressImpl()
+{
+}
+
+
+//
+// IPv4SocketAddressImpl
+//
+
+
+IPv4SocketAddressImpl::IPv4SocketAddressImpl()
+{
+ std::memset(&_addr, 0, sizeof(_addr));
+ _addr.sin_family = AF_INET;
+ poco_set_sin_len(&_addr);
+}
+
+
+IPv4SocketAddressImpl::IPv4SocketAddressImpl(const struct sockaddr_in* addr)
+{
+ std::memcpy(&_addr, addr, sizeof(_addr));
+}
+
+
+IPv4SocketAddressImpl::IPv4SocketAddressImpl(const void* addr, UInt16 port)
+{
+ std::memset(&_addr, 0, sizeof(_addr));
+ _addr.sin_family = AF_INET;
+ poco_set_sin_len(&_addr);
+ std::memcpy(&_addr.sin_addr, addr, sizeof(_addr.sin_addr));
+ _addr.sin_port = port;
+}
+
+
+std::string IPv4SocketAddressImpl::toString() const
+{
+ std::string result;
+ result.append(host().toString());
+ result.append(":");
+ NumberFormatter::append(result, ntohs(port()));
+ return result;
+}
+
+
+#if defined(POCO_HAVE_IPv6)
+
+
+//
+// IPv6SocketAddressImpl
+//
+
+
+IPv6SocketAddressImpl::IPv6SocketAddressImpl(const struct sockaddr_in6* addr)
+{
+ std::memcpy(&_addr, addr, sizeof(_addr));
+}
+
+
+IPv6SocketAddressImpl::IPv6SocketAddressImpl(const void* addr, UInt16 port)
+{
+ std::memset(&_addr, 0, sizeof(_addr));
+ _addr.sin6_family = AF_INET6;
+ poco_set_sin6_len(&_addr);
+ std::memcpy(&_addr.sin6_addr, addr, sizeof(_addr.sin6_addr));
+ _addr.sin6_port = port;
+}
+
+
+IPv6SocketAddressImpl::IPv6SocketAddressImpl(const void* addr, UInt16 port, UInt32 scope)
+{
+ std::memset(&_addr, 0, sizeof(_addr));
+ _addr.sin6_family = AF_INET6;
+ poco_set_sin6_len(&_addr);
+ std::memcpy(&_addr.sin6_addr, addr, sizeof(_addr.sin6_addr));
+ _addr.sin6_port = port;
+ _addr.sin6_scope_id = scope;
+}
+
+
+std::string IPv6SocketAddressImpl::toString() const
+{
+ std::string result;
+ result.append("[");
+ result.append(host().toString());
+ result.append("]");
+ result.append(":");
+ NumberFormatter::append(result, ntohs(port()));
+ return result;
+}
+
+
+#endif // POCO_HAVE_IPv6
+
+
+#if defined(POCO_OS_FAMILY_UNIX)
+
+
+//
+// LocalSocketAddressImpl
+//
+
+
+LocalSocketAddressImpl::LocalSocketAddressImpl(const struct sockaddr_un* addr)
+{
+ _pAddr = new sockaddr_un;
+ std::memcpy(_pAddr, addr, sizeof(struct sockaddr_un));
+}
+
+
+LocalSocketAddressImpl::LocalSocketAddressImpl(const char* path)
+{
+ poco_assert (std::strlen(path) < sizeof(_pAddr->sun_path));
+
+ _pAddr = new sockaddr_un;
+ poco_set_sun_len(_pAddr, std::strlen(path) + sizeof(struct sockaddr_un) - sizeof(_pAddr->sun_path) + 1);
+ _pAddr->sun_family = AF_UNIX;
+ std::strcpy(_pAddr->sun_path, path);
+}
+
+
+LocalSocketAddressImpl::LocalSocketAddressImpl(const char* path, std::size_t length)
+{
+ poco_assert (length < sizeof(_pAddr->sun_path));
+
+ _pAddr = new sockaddr_un;
+ poco_set_sun_len(_pAddr, length + sizeof(struct sockaddr_un) - sizeof(_pAddr->sun_path) + 1);
+ _pAddr->sun_family = AF_UNIX;
+ std::memcpy(_pAddr->sun_path, path, length);
+ _pAddr->sun_path[length] = 0;
+}
+
+
+LocalSocketAddressImpl::~LocalSocketAddressImpl()
+{
+ delete _pAddr;
+}
+
+
+std::string LocalSocketAddressImpl::toString() const
+{
+ std::string result(path());
+ return result;
+}
+
+
+#endif // POCO_OS_FAMILY_UNIX
+
+
+} } } // namespace Poco::Net::Impl
diff --git a/contrib/libs/poco/Net/src/SocketImpl.cpp b/contrib/libs/poco/Net/src/SocketImpl.cpp
index 45bb353a44..92c664ec82 100644
--- a/contrib/libs/poco/Net/src/SocketImpl.cpp
+++ b/contrib/libs/poco/Net/src/SocketImpl.cpp
@@ -1,1134 +1,1134 @@
-//
-// SocketImpl.cpp
-//
-// Library: Net
-// Package: Sockets
-// Module: SocketImpl
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/SocketImpl.h"
-#include "Poco/Net/NetException.h"
-#include "Poco/Net/StreamSocketImpl.h"
-#include "Poco/NumberFormatter.h"
-#include "Poco/Timestamp.h"
-#include <string.h> // FD_SET needs memset on some platforms, so we can't use <cstring>
-
-
-#if defined(_WIN32) && _WIN32_WINNT >= 0x0600
-#ifndef POCO_HAVE_FD_POLL
-#define POCO_HAVE_FD_POLL 1
-#endif
-#elif defined(POCO_OS_FAMILY_BSD)
-#ifndef POCO_HAVE_FD_POLL
-#define POCO_HAVE_FD_POLL 1
-#endif
-#endif
-
-
-#if defined(POCO_HAVE_FD_EPOLL)
-#include <sys/epoll.h>
-#elif defined(POCO_HAVE_FD_POLL)
-#ifndef _WIN32
-#include <poll.h>
-#endif
-#endif
-
-
-#if defined(sun) || defined(__sun) || defined(__sun__)
-#include <unistd.h>
-#include <stropts.h>
-#endif
-
-
-#ifdef POCO_OS_FAMILY_WINDOWS
-#include <windows.h>
-#endif
-
-
-using Poco::IOException;
-using Poco::TimeoutException;
-using Poco::InvalidArgumentException;
-using Poco::NumberFormatter;
-using Poco::Timespan;
-
-
-namespace Poco {
-namespace Net {
-
-
-bool checkIsBrokenTimeout()
-{
-#if defined(POCO_BROKEN_TIMEOUTS)
- return true;
-#elif defined(POCO_OS_FAMILY_WINDOWS)
- // on Windows 7 and lower, socket timeouts have a minimum of 500ms, use poll for timeouts on this case
- // https://social.msdn.microsoft.com/Forums/en-US/76620f6d-22b1-4872-aaf0-833204f3f867/minimum-timeout-value-for-sorcvtimeo
- OSVERSIONINFO vi;
- vi.dwOSVersionInfoSize = sizeof(vi);
- if (GetVersionEx(&vi) == 0) return true; //throw SystemException("Cannot get OS version information");
- return vi.dwMajorVersion < 6 || (vi.dwMajorVersion == 6 && vi.dwMinorVersion < 2);
-#else
- return false;
-#endif
-}
-
-
-SocketImpl::SocketImpl():
- _sockfd(POCO_INVALID_SOCKET),
- _blocking(true),
- _isBrokenTimeout(checkIsBrokenTimeout())
-{
-}
-
-
-SocketImpl::SocketImpl(poco_socket_t sockfd):
- _sockfd(sockfd),
+//
+// SocketImpl.cpp
+//
+// Library: Net
+// Package: Sockets
+// Module: SocketImpl
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/SocketImpl.h"
+#include "Poco/Net/NetException.h"
+#include "Poco/Net/StreamSocketImpl.h"
+#include "Poco/NumberFormatter.h"
+#include "Poco/Timestamp.h"
+#include <string.h> // FD_SET needs memset on some platforms, so we can't use <cstring>
+
+
+#if defined(_WIN32) && _WIN32_WINNT >= 0x0600
+#ifndef POCO_HAVE_FD_POLL
+#define POCO_HAVE_FD_POLL 1
+#endif
+#elif defined(POCO_OS_FAMILY_BSD)
+#ifndef POCO_HAVE_FD_POLL
+#define POCO_HAVE_FD_POLL 1
+#endif
+#endif
+
+
+#if defined(POCO_HAVE_FD_EPOLL)
+#include <sys/epoll.h>
+#elif defined(POCO_HAVE_FD_POLL)
+#ifndef _WIN32
+#include <poll.h>
+#endif
+#endif
+
+
+#if defined(sun) || defined(__sun) || defined(__sun__)
+#include <unistd.h>
+#include <stropts.h>
+#endif
+
+
+#ifdef POCO_OS_FAMILY_WINDOWS
+#include <windows.h>
+#endif
+
+
+using Poco::IOException;
+using Poco::TimeoutException;
+using Poco::InvalidArgumentException;
+using Poco::NumberFormatter;
+using Poco::Timespan;
+
+
+namespace Poco {
+namespace Net {
+
+
+bool checkIsBrokenTimeout()
+{
+#if defined(POCO_BROKEN_TIMEOUTS)
+ return true;
+#elif defined(POCO_OS_FAMILY_WINDOWS)
+ // on Windows 7 and lower, socket timeouts have a minimum of 500ms, use poll for timeouts on this case
+ // https://social.msdn.microsoft.com/Forums/en-US/76620f6d-22b1-4872-aaf0-833204f3f867/minimum-timeout-value-for-sorcvtimeo
+ OSVERSIONINFO vi;
+ vi.dwOSVersionInfoSize = sizeof(vi);
+ if (GetVersionEx(&vi) == 0) return true; //throw SystemException("Cannot get OS version information");
+ return vi.dwMajorVersion < 6 || (vi.dwMajorVersion == 6 && vi.dwMinorVersion < 2);
+#else
+ return false;
+#endif
+}
+
+
+SocketImpl::SocketImpl():
+ _sockfd(POCO_INVALID_SOCKET),
_blocking(true),
- _isBrokenTimeout(checkIsBrokenTimeout())
-{
-}
-
-
-SocketImpl::~SocketImpl()
-{
- close();
-}
-
-
-SocketImpl* SocketImpl::acceptConnection(SocketAddress& clientAddr)
-{
- if (_sockfd == POCO_INVALID_SOCKET) throw InvalidSocketException();
-
- sockaddr_storage buffer;
- struct sockaddr* pSA = reinterpret_cast<struct sockaddr*>(&buffer);
- poco_socklen_t saLen = sizeof(buffer);
- poco_socket_t sd;
- do
- {
- sd = ::accept(_sockfd, pSA, &saLen);
- }
- while (sd == POCO_INVALID_SOCKET && lastError() == POCO_EINTR);
- if (sd != POCO_INVALID_SOCKET)
- {
- clientAddr = SocketAddress(pSA, saLen);
- return new StreamSocketImpl(sd);
- }
- error(); // will throw
- return 0;
-}
-
-
-void SocketImpl::connect(const SocketAddress& address)
-{
- if (_sockfd == POCO_INVALID_SOCKET)
- {
- init(address.af());
- }
- int rc;
- do
- {
-#if defined(POCO_VXWORKS)
- rc = ::connect(_sockfd, (sockaddr*) address.addr(), address.length());
-#else
- rc = ::connect(_sockfd, address.addr(), address.length());
-#endif
- }
- while (rc != 0 && lastError() == POCO_EINTR);
- if (rc != 0)
- {
- int err = lastError();
- error(err, address.toString());
- }
-}
-
-
-void SocketImpl::connect(const SocketAddress& address, const Poco::Timespan& timeout)
-{
- if (_sockfd == POCO_INVALID_SOCKET)
- {
- init(address.af());
- }
- setBlocking(false);
- try
- {
-#if defined(POCO_VXWORKS)
- int rc = ::connect(_sockfd, (sockaddr*) address.addr(), address.length());
-#else
- int rc = ::connect(_sockfd, address.addr(), address.length());
-#endif
- if (rc != 0)
- {
- int err = lastError();
- if (err != POCO_EINPROGRESS && err != POCO_EWOULDBLOCK)
- error(err, address.toString());
- if (!poll(timeout, SELECT_READ | SELECT_WRITE | SELECT_ERROR))
- throw Poco::TimeoutException("connect timed out", address.toString());
- err = socketError();
- if (err != 0) error(err);
- }
- }
- catch (Poco::Exception&)
- {
- setBlocking(true);
- throw;
- }
- setBlocking(true);
-}
-
-
-void SocketImpl::connectNB(const SocketAddress& address)
-{
- if (_sockfd == POCO_INVALID_SOCKET)
- {
- init(address.af());
- }
- setBlocking(false);
-#if defined(POCO_VXWORKS)
- int rc = ::connect(_sockfd, (sockaddr*) address.addr(), address.length());
-#else
- int rc = ::connect(_sockfd, address.addr(), address.length());
-#endif
+ _isBrokenTimeout(checkIsBrokenTimeout())
+{
+}
+
+
+SocketImpl::SocketImpl(poco_socket_t sockfd):
+ _sockfd(sockfd),
+ _blocking(true),
+ _isBrokenTimeout(checkIsBrokenTimeout())
+{
+}
+
+
+SocketImpl::~SocketImpl()
+{
+ close();
+}
+
+
+SocketImpl* SocketImpl::acceptConnection(SocketAddress& clientAddr)
+{
+ if (_sockfd == POCO_INVALID_SOCKET) throw InvalidSocketException();
+
+ sockaddr_storage buffer;
+ struct sockaddr* pSA = reinterpret_cast<struct sockaddr*>(&buffer);
+ poco_socklen_t saLen = sizeof(buffer);
+ poco_socket_t sd;
+ do
+ {
+ sd = ::accept(_sockfd, pSA, &saLen);
+ }
+ while (sd == POCO_INVALID_SOCKET && lastError() == POCO_EINTR);
+ if (sd != POCO_INVALID_SOCKET)
+ {
+ clientAddr = SocketAddress(pSA, saLen);
+ return new StreamSocketImpl(sd);
+ }
+ error(); // will throw
+ return 0;
+}
+
+
+void SocketImpl::connect(const SocketAddress& address)
+{
+ if (_sockfd == POCO_INVALID_SOCKET)
+ {
+ init(address.af());
+ }
+ int rc;
+ do
+ {
+#if defined(POCO_VXWORKS)
+ rc = ::connect(_sockfd, (sockaddr*) address.addr(), address.length());
+#else
+ rc = ::connect(_sockfd, address.addr(), address.length());
+#endif
+ }
+ while (rc != 0 && lastError() == POCO_EINTR);
if (rc != 0)
- {
- int err = lastError();
- if (err != POCO_EINPROGRESS && err != POCO_EWOULDBLOCK)
- error(err, address.toString());
- }
-}
-
-
-void SocketImpl::bind(const SocketAddress& address, bool reuseAddress)
-{
- bind(address, reuseAddress, reuseAddress);
-}
-
-
-void SocketImpl::bind(const SocketAddress& address, bool reuseAddress, bool reusePort)
-{
- if (_sockfd == POCO_INVALID_SOCKET)
- {
- init(address.af());
- }
- if (reuseAddress)
- setReuseAddress(true);
- if (reusePort)
- setReusePort(true);
-#if defined(POCO_VXWORKS)
- int rc = ::bind(_sockfd, (sockaddr*) address.addr(), address.length());
-#else
- int rc = ::bind(_sockfd, address.addr(), address.length());
-#endif
- if (rc != 0) error(address.toString());
-}
-
-
-void SocketImpl::bind6(const SocketAddress& address, bool reuseAddress, bool ipV6Only)
-{
- bind6(address, reuseAddress, true, ipV6Only);
-}
-
-
-void SocketImpl::bind6(const SocketAddress& address, bool reuseAddress, bool reusePort, bool ipV6Only)
-{
-#if defined(POCO_HAVE_IPv6)
- if (address.family() != SocketAddress::IPv6)
- throw Poco::InvalidArgumentException("SocketAddress must be an IPv6 address");
-
- if (_sockfd == POCO_INVALID_SOCKET)
- {
- init(address.af());
- }
-#ifdef IPV6_V6ONLY
- setOption(IPPROTO_IPV6, IPV6_V6ONLY, ipV6Only ? 1 : 0);
-#else
- if (ipV6Only) throw Poco::NotImplementedException("IPV6_V6ONLY not defined.");
-#endif
- if (reuseAddress)
- setReuseAddress(true);
- if (reusePort)
- setReusePort(true);
- int rc = ::bind(_sockfd, address.addr(), address.length());
- if (rc != 0) error(address.toString());
-#else
- throw Poco::NotImplementedException("No IPv6 support available");
-#endif
-}
-
-
-void SocketImpl::listen(int backlog)
-{
- if (_sockfd == POCO_INVALID_SOCKET) throw InvalidSocketException();
-
- int rc = ::listen(_sockfd, backlog);
- if (rc != 0) error();
-}
-
-
-void SocketImpl::close()
-{
- if (_sockfd != POCO_INVALID_SOCKET)
- {
- poco_closesocket(_sockfd);
- _sockfd = POCO_INVALID_SOCKET;
- }
-}
-
-
-void SocketImpl::shutdownReceive()
-{
- if (_sockfd == POCO_INVALID_SOCKET) throw InvalidSocketException();
-
- int rc = ::shutdown(_sockfd, 0);
- if (rc != 0) error();
-}
-
-
-void SocketImpl::shutdownSend()
-{
- if (_sockfd == POCO_INVALID_SOCKET) throw InvalidSocketException();
-
- int rc = ::shutdown(_sockfd, 1);
- if (rc != 0) error();
-}
-
-
-void SocketImpl::shutdown()
-{
- if (_sockfd == POCO_INVALID_SOCKET) throw InvalidSocketException();
-
- int rc = ::shutdown(_sockfd, 2);
- if (rc != 0) error();
-}
-
-
-int SocketImpl::sendBytes(const void* buffer, int length, int flags)
-{
- if (_isBrokenTimeout)
- {
- if (_sndTimeout.totalMicroseconds() != 0)
- {
- if (!poll(_sndTimeout, SELECT_WRITE))
- throw TimeoutException();
- }
- }
-
- int rc;
- do
- {
- if (_sockfd == POCO_INVALID_SOCKET) throw InvalidSocketException();
- rc = ::send(_sockfd, reinterpret_cast<const char*>(buffer), length, flags);
- }
- while (_blocking && rc < 0 && lastError() == POCO_EINTR);
+ {
+ int err = lastError();
+ error(err, address.toString());
+ }
+}
+
+
+void SocketImpl::connect(const SocketAddress& address, const Poco::Timespan& timeout)
+{
+ if (_sockfd == POCO_INVALID_SOCKET)
+ {
+ init(address.af());
+ }
+ setBlocking(false);
+ try
+ {
+#if defined(POCO_VXWORKS)
+ int rc = ::connect(_sockfd, (sockaddr*) address.addr(), address.length());
+#else
+ int rc = ::connect(_sockfd, address.addr(), address.length());
+#endif
+ if (rc != 0)
+ {
+ int err = lastError();
+ if (err != POCO_EINPROGRESS && err != POCO_EWOULDBLOCK)
+ error(err, address.toString());
+ if (!poll(timeout, SELECT_READ | SELECT_WRITE | SELECT_ERROR))
+ throw Poco::TimeoutException("connect timed out", address.toString());
+ err = socketError();
+ if (err != 0) error(err);
+ }
+ }
+ catch (Poco::Exception&)
+ {
+ setBlocking(true);
+ throw;
+ }
+ setBlocking(true);
+}
+
+
+void SocketImpl::connectNB(const SocketAddress& address)
+{
+ if (_sockfd == POCO_INVALID_SOCKET)
+ {
+ init(address.af());
+ }
+ setBlocking(false);
+#if defined(POCO_VXWORKS)
+ int rc = ::connect(_sockfd, (sockaddr*) address.addr(), address.length());
+#else
+ int rc = ::connect(_sockfd, address.addr(), address.length());
+#endif
+ if (rc != 0)
+ {
+ int err = lastError();
+ if (err != POCO_EINPROGRESS && err != POCO_EWOULDBLOCK)
+ error(err, address.toString());
+ }
+}
+
+
+void SocketImpl::bind(const SocketAddress& address, bool reuseAddress)
+{
+ bind(address, reuseAddress, reuseAddress);
+}
+
+
+void SocketImpl::bind(const SocketAddress& address, bool reuseAddress, bool reusePort)
+{
+ if (_sockfd == POCO_INVALID_SOCKET)
+ {
+ init(address.af());
+ }
+ if (reuseAddress)
+ setReuseAddress(true);
+ if (reusePort)
+ setReusePort(true);
+#if defined(POCO_VXWORKS)
+ int rc = ::bind(_sockfd, (sockaddr*) address.addr(), address.length());
+#else
+ int rc = ::bind(_sockfd, address.addr(), address.length());
+#endif
+ if (rc != 0) error(address.toString());
+}
+
+
+void SocketImpl::bind6(const SocketAddress& address, bool reuseAddress, bool ipV6Only)
+{
+ bind6(address, reuseAddress, true, ipV6Only);
+}
+
+
+void SocketImpl::bind6(const SocketAddress& address, bool reuseAddress, bool reusePort, bool ipV6Only)
+{
+#if defined(POCO_HAVE_IPv6)
+ if (address.family() != SocketAddress::IPv6)
+ throw Poco::InvalidArgumentException("SocketAddress must be an IPv6 address");
+
+ if (_sockfd == POCO_INVALID_SOCKET)
+ {
+ init(address.af());
+ }
+#ifdef IPV6_V6ONLY
+ setOption(IPPROTO_IPV6, IPV6_V6ONLY, ipV6Only ? 1 : 0);
+#else
+ if (ipV6Only) throw Poco::NotImplementedException("IPV6_V6ONLY not defined.");
+#endif
+ if (reuseAddress)
+ setReuseAddress(true);
+ if (reusePort)
+ setReusePort(true);
+ int rc = ::bind(_sockfd, address.addr(), address.length());
+ if (rc != 0) error(address.toString());
+#else
+ throw Poco::NotImplementedException("No IPv6 support available");
+#endif
+}
+
+
+void SocketImpl::listen(int backlog)
+{
+ if (_sockfd == POCO_INVALID_SOCKET) throw InvalidSocketException();
+
+ int rc = ::listen(_sockfd, backlog);
+ if (rc != 0) error();
+}
+
+
+void SocketImpl::close()
+{
+ if (_sockfd != POCO_INVALID_SOCKET)
+ {
+ poco_closesocket(_sockfd);
+ _sockfd = POCO_INVALID_SOCKET;
+ }
+}
+
+
+void SocketImpl::shutdownReceive()
+{
+ if (_sockfd == POCO_INVALID_SOCKET) throw InvalidSocketException();
+
+ int rc = ::shutdown(_sockfd, 0);
+ if (rc != 0) error();
+}
+
+
+void SocketImpl::shutdownSend()
+{
+ if (_sockfd == POCO_INVALID_SOCKET) throw InvalidSocketException();
+
+ int rc = ::shutdown(_sockfd, 1);
+ if (rc != 0) error();
+}
+
+
+void SocketImpl::shutdown()
+{
+ if (_sockfd == POCO_INVALID_SOCKET) throw InvalidSocketException();
+
+ int rc = ::shutdown(_sockfd, 2);
+ if (rc != 0) error();
+}
+
+
+int SocketImpl::sendBytes(const void* buffer, int length, int flags)
+{
+ if (_isBrokenTimeout)
+ {
+ if (_sndTimeout.totalMicroseconds() != 0)
+ {
+ if (!poll(_sndTimeout, SELECT_WRITE))
+ throw TimeoutException();
+ }
+ }
+
+ int rc;
+ do
+ {
+ if (_sockfd == POCO_INVALID_SOCKET) throw InvalidSocketException();
+ rc = ::send(_sockfd, reinterpret_cast<const char*>(buffer), length, flags);
+ }
+ while (_blocking && rc < 0 && lastError() == POCO_EINTR);
+ if (rc < 0)
+ {
+ int err = lastError();
+ if (err == POCO_EAGAIN || err == POCO_ETIMEDOUT)
+ throw TimeoutException();
+ else
+ error(err);
+ }
+ return rc;
+}
+
+
+int SocketImpl::receiveBytes(void* buffer, int length, int flags)
+{
+ if (_isBrokenTimeout)
+ {
+ if (_recvTimeout.totalMicroseconds() != 0)
+ {
+ if (!poll(_recvTimeout, SELECT_READ))
+ throw TimeoutException();
+ }
+ }
+
+ int rc;
+ do
+ {
+ if (_sockfd == POCO_INVALID_SOCKET) throw InvalidSocketException();
+ rc = ::recv(_sockfd, reinterpret_cast<char*>(buffer), length, flags);
+ }
+ while (_blocking && rc < 0 && lastError() == POCO_EINTR);
if (rc < 0)
- {
- int err = lastError();
- if (err == POCO_EAGAIN || err == POCO_ETIMEDOUT)
- throw TimeoutException();
- else
- error(err);
- }
- return rc;
-}
-
-
-int SocketImpl::receiveBytes(void* buffer, int length, int flags)
-{
- if (_isBrokenTimeout)
- {
- if (_recvTimeout.totalMicroseconds() != 0)
- {
- if (!poll(_recvTimeout, SELECT_READ))
- throw TimeoutException();
- }
- }
-
- int rc;
- do
- {
- if (_sockfd == POCO_INVALID_SOCKET) throw InvalidSocketException();
- rc = ::recv(_sockfd, reinterpret_cast<char*>(buffer), length, flags);
- }
- while (_blocking && rc < 0 && lastError() == POCO_EINTR);
- if (rc < 0)
- {
- int err = lastError();
- if (err == POCO_EAGAIN && !_blocking)
- ;
- else if (err == POCO_EAGAIN || err == POCO_ETIMEDOUT)
- throw TimeoutException(err);
- else
- error(err);
- }
- return rc;
-}
-
-
-int SocketImpl::sendTo(const void* buffer, int length, const SocketAddress& address, int flags)
-{
- int rc;
- do
- {
- if (_sockfd == POCO_INVALID_SOCKET) throw InvalidSocketException();
-#if defined(POCO_VXWORKS)
- rc = ::sendto(_sockfd, (char*) buffer, length, flags, (sockaddr*) address.addr(), address.length());
-#else
- rc = ::sendto(_sockfd, reinterpret_cast<const char*>(buffer), length, flags, address.addr(), address.length());
-#endif
- }
- while (_blocking && rc < 0 && lastError() == POCO_EINTR);
- if (rc < 0) error();
- return rc;
-}
-
-
-int SocketImpl::receiveFrom(void* buffer, int length, SocketAddress& address, int flags)
-{
- if (_isBrokenTimeout)
- {
- if (_recvTimeout.totalMicroseconds() != 0)
- {
- if (!poll(_recvTimeout, SELECT_READ))
- throw TimeoutException();
- }
- }
-
- sockaddr_storage abuffer;
- struct sockaddr* pSA = reinterpret_cast<struct sockaddr*>(&abuffer);
- poco_socklen_t saLen = sizeof(abuffer);
- int rc;
- do
- {
- if (_sockfd == POCO_INVALID_SOCKET) throw InvalidSocketException();
- rc = ::recvfrom(_sockfd, reinterpret_cast<char*>(buffer), length, flags, pSA, &saLen);
- }
- while (_blocking && rc < 0 && lastError() == POCO_EINTR);
- if (rc >= 0)
- {
- address = SocketAddress(pSA, saLen);
- }
- else
- {
- int err = lastError();
- if (err == POCO_EAGAIN && !_blocking)
- ;
- else if (err == POCO_EAGAIN || err == POCO_ETIMEDOUT)
- throw TimeoutException(err);
- else
- error(err);
- }
- return rc;
-}
-
-
-void SocketImpl::sendUrgent(unsigned char data)
-{
- if (_sockfd == POCO_INVALID_SOCKET) throw InvalidSocketException();
-
- int rc = ::send(_sockfd, reinterpret_cast<const char*>(&data), sizeof(data), MSG_OOB);
- if (rc < 0) error();
-}
-
-
-int SocketImpl::available()
-{
- int result = 0;
- ioctl(FIONREAD, result);
- return result;
-}
-
-
-bool SocketImpl::secure() const
-{
- return false;
-}
-
-
+ {
+ int err = lastError();
+ if (err == POCO_EAGAIN && !_blocking)
+ ;
+ else if (err == POCO_EAGAIN || err == POCO_ETIMEDOUT)
+ throw TimeoutException(err);
+ else
+ error(err);
+ }
+ return rc;
+}
+
+
+int SocketImpl::sendTo(const void* buffer, int length, const SocketAddress& address, int flags)
+{
+ int rc;
+ do
+ {
+ if (_sockfd == POCO_INVALID_SOCKET) throw InvalidSocketException();
+#if defined(POCO_VXWORKS)
+ rc = ::sendto(_sockfd, (char*) buffer, length, flags, (sockaddr*) address.addr(), address.length());
+#else
+ rc = ::sendto(_sockfd, reinterpret_cast<const char*>(buffer), length, flags, address.addr(), address.length());
+#endif
+ }
+ while (_blocking && rc < 0 && lastError() == POCO_EINTR);
+ if (rc < 0) error();
+ return rc;
+}
+
+
+int SocketImpl::receiveFrom(void* buffer, int length, SocketAddress& address, int flags)
+{
+ if (_isBrokenTimeout)
+ {
+ if (_recvTimeout.totalMicroseconds() != 0)
+ {
+ if (!poll(_recvTimeout, SELECT_READ))
+ throw TimeoutException();
+ }
+ }
+
+ sockaddr_storage abuffer;
+ struct sockaddr* pSA = reinterpret_cast<struct sockaddr*>(&abuffer);
+ poco_socklen_t saLen = sizeof(abuffer);
+ int rc;
+ do
+ {
+ if (_sockfd == POCO_INVALID_SOCKET) throw InvalidSocketException();
+ rc = ::recvfrom(_sockfd, reinterpret_cast<char*>(buffer), length, flags, pSA, &saLen);
+ }
+ while (_blocking && rc < 0 && lastError() == POCO_EINTR);
+ if (rc >= 0)
+ {
+ address = SocketAddress(pSA, saLen);
+ }
+ else
+ {
+ int err = lastError();
+ if (err == POCO_EAGAIN && !_blocking)
+ ;
+ else if (err == POCO_EAGAIN || err == POCO_ETIMEDOUT)
+ throw TimeoutException(err);
+ else
+ error(err);
+ }
+ return rc;
+}
+
+
+void SocketImpl::sendUrgent(unsigned char data)
+{
+ if (_sockfd == POCO_INVALID_SOCKET) throw InvalidSocketException();
+
+ int rc = ::send(_sockfd, reinterpret_cast<const char*>(&data), sizeof(data), MSG_OOB);
+ if (rc < 0) error();
+}
+
+
+int SocketImpl::available()
+{
+ int result = 0;
+ ioctl(FIONREAD, result);
+ return result;
+}
+
+
+bool SocketImpl::secure() const
+{
+ return false;
+}
+
+
bool SocketImpl::pollImpl(Poco::Timespan& remainingTime, int mode)
-{
- poco_socket_t sockfd = _sockfd;
- if (sockfd == POCO_INVALID_SOCKET) throw InvalidSocketException();
-
-#if defined(POCO_HAVE_FD_EPOLL)
-
- int epollfd = epoll_create(1);
- if (epollfd < 0)
- {
- error("Can't create epoll queue");
- }
-
- struct epoll_event evin;
- memset(&evin, 0, sizeof(evin));
-
- if (mode & SELECT_READ)
- evin.events |= EPOLLIN;
- if (mode & SELECT_WRITE)
- evin.events |= EPOLLOUT;
- if (mode & SELECT_ERROR)
- evin.events |= EPOLLERR;
-
- if (epoll_ctl(epollfd, EPOLL_CTL_ADD, sockfd, &evin) < 0)
- {
- ::close(epollfd);
- error("Can't insert socket to epoll queue");
- }
-
- int rc;
- do
- {
- struct epoll_event evout;
- memset(&evout, 0, sizeof(evout));
-
- Poco::Timestamp start;
- rc = epoll_wait(epollfd, &evout, 1, remainingTime.totalMilliseconds());
- if (rc < 0 && lastError() == POCO_EINTR)
- {
- Poco::Timestamp end;
- Poco::Timespan waited = end - start;
- if (waited < remainingTime)
- remainingTime -= waited;
- else
- remainingTime = 0;
- }
- }
- while (rc < 0 && lastError() == POCO_EINTR);
-
- ::close(epollfd);
- if (rc < 0) error();
- return rc > 0;
-
-#elif defined(POCO_HAVE_FD_POLL)
-
- pollfd pollBuf;
-
- memset(&pollBuf, 0, sizeof(pollfd));
- pollBuf.fd = _sockfd;
- if (mode & SELECT_READ) pollBuf.events |= POLLIN;
- if (mode & SELECT_WRITE) pollBuf.events |= POLLOUT;
-
- int rc;
- do
- {
- Poco::Timestamp start;
-#ifdef _WIN32
- rc = WSAPoll(&pollBuf, 1, static_cast<INT>(remainingTime.totalMilliseconds()));
-#else
- rc = ::poll(&pollBuf, 1, remainingTime.totalMilliseconds());
-#endif
- if (rc < 0 && lastError() == POCO_EINTR)
- {
- Poco::Timestamp end;
- Poco::Timespan waited = end - start;
- if (waited < remainingTime)
- remainingTime -= waited;
- else
- remainingTime = 0;
- }
- }
- while (rc < 0 && lastError() == POCO_EINTR);
- if (rc < 0) error();
- return rc > 0;
-
-#else
-
- fd_set fdRead;
- fd_set fdWrite;
- fd_set fdExcept;
- FD_ZERO(&fdRead);
- FD_ZERO(&fdWrite);
- FD_ZERO(&fdExcept);
- if (mode & SELECT_READ)
- {
- FD_SET(sockfd, &fdRead);
- }
- if (mode & SELECT_WRITE)
- {
- FD_SET(sockfd, &fdWrite);
- }
- if (mode & SELECT_ERROR)
- {
- FD_SET(sockfd, &fdExcept);
- }
- int errorCode = POCO_ENOERR;
- int rc;
- do
- {
- struct timeval tv;
- tv.tv_sec = (long) remainingTime.totalSeconds();
- tv.tv_usec = (long) remainingTime.useconds();
- Poco::Timestamp start;
- rc = ::select(int(sockfd) + 1, &fdRead, &fdWrite, &fdExcept, &tv);
- if (rc < 0 && (errorCode = lastError()) == POCO_EINTR)
- {
- Poco::Timestamp end;
- Poco::Timespan waited = end - start;
- if (waited < remainingTime)
- remainingTime -= waited;
- else
- remainingTime = 0;
- }
- }
- while (rc < 0 && errorCode == POCO_EINTR);
- if (rc < 0) error(errorCode);
- return rc > 0;
-
-#endif // POCO_HAVE_FD_EPOLL
-}
-
+{
+ poco_socket_t sockfd = _sockfd;
+ if (sockfd == POCO_INVALID_SOCKET) throw InvalidSocketException();
+
+#if defined(POCO_HAVE_FD_EPOLL)
+
+ int epollfd = epoll_create(1);
+ if (epollfd < 0)
+ {
+ error("Can't create epoll queue");
+ }
+
+ struct epoll_event evin;
+ memset(&evin, 0, sizeof(evin));
+
+ if (mode & SELECT_READ)
+ evin.events |= EPOLLIN;
+ if (mode & SELECT_WRITE)
+ evin.events |= EPOLLOUT;
+ if (mode & SELECT_ERROR)
+ evin.events |= EPOLLERR;
+
+ if (epoll_ctl(epollfd, EPOLL_CTL_ADD, sockfd, &evin) < 0)
+ {
+ ::close(epollfd);
+ error("Can't insert socket to epoll queue");
+ }
+
+ int rc;
+ do
+ {
+ struct epoll_event evout;
+ memset(&evout, 0, sizeof(evout));
+
+ Poco::Timestamp start;
+ rc = epoll_wait(epollfd, &evout, 1, remainingTime.totalMilliseconds());
+ if (rc < 0 && lastError() == POCO_EINTR)
+ {
+ Poco::Timestamp end;
+ Poco::Timespan waited = end - start;
+ if (waited < remainingTime)
+ remainingTime -= waited;
+ else
+ remainingTime = 0;
+ }
+ }
+ while (rc < 0 && lastError() == POCO_EINTR);
+
+ ::close(epollfd);
+ if (rc < 0) error();
+ return rc > 0;
+
+#elif defined(POCO_HAVE_FD_POLL)
+
+ pollfd pollBuf;
+
+ memset(&pollBuf, 0, sizeof(pollfd));
+ pollBuf.fd = _sockfd;
+ if (mode & SELECT_READ) pollBuf.events |= POLLIN;
+ if (mode & SELECT_WRITE) pollBuf.events |= POLLOUT;
+
+ int rc;
+ do
+ {
+ Poco::Timestamp start;
+#ifdef _WIN32
+ rc = WSAPoll(&pollBuf, 1, static_cast<INT>(remainingTime.totalMilliseconds()));
+#else
+ rc = ::poll(&pollBuf, 1, remainingTime.totalMilliseconds());
+#endif
+ if (rc < 0 && lastError() == POCO_EINTR)
+ {
+ Poco::Timestamp end;
+ Poco::Timespan waited = end - start;
+ if (waited < remainingTime)
+ remainingTime -= waited;
+ else
+ remainingTime = 0;
+ }
+ }
+ while (rc < 0 && lastError() == POCO_EINTR);
+ if (rc < 0) error();
+ return rc > 0;
+
+#else
+
+ fd_set fdRead;
+ fd_set fdWrite;
+ fd_set fdExcept;
+ FD_ZERO(&fdRead);
+ FD_ZERO(&fdWrite);
+ FD_ZERO(&fdExcept);
+ if (mode & SELECT_READ)
+ {
+ FD_SET(sockfd, &fdRead);
+ }
+ if (mode & SELECT_WRITE)
+ {
+ FD_SET(sockfd, &fdWrite);
+ }
+ if (mode & SELECT_ERROR)
+ {
+ FD_SET(sockfd, &fdExcept);
+ }
+ int errorCode = POCO_ENOERR;
+ int rc;
+ do
+ {
+ struct timeval tv;
+ tv.tv_sec = (long) remainingTime.totalSeconds();
+ tv.tv_usec = (long) remainingTime.useconds();
+ Poco::Timestamp start;
+ rc = ::select(int(sockfd) + 1, &fdRead, &fdWrite, &fdExcept, &tv);
+ if (rc < 0 && (errorCode = lastError()) == POCO_EINTR)
+ {
+ Poco::Timestamp end;
+ Poco::Timespan waited = end - start;
+ if (waited < remainingTime)
+ remainingTime -= waited;
+ else
+ remainingTime = 0;
+ }
+ }
+ while (rc < 0 && errorCode == POCO_EINTR);
+ if (rc < 0) error(errorCode);
+ return rc > 0;
+
+#endif // POCO_HAVE_FD_EPOLL
+}
+
bool SocketImpl::poll(const Poco::Timespan& timeout, int mode)
{
Poco::Timespan remainingTime(timeout);
return pollImpl(remainingTime, mode);
}
-
-void SocketImpl::setSendBufferSize(int size)
-{
- setOption(SOL_SOCKET, SO_SNDBUF, size);
-}
-
-
-int SocketImpl::getSendBufferSize()
-{
- int result;
- getOption(SOL_SOCKET, SO_SNDBUF, result);
- return result;
-}
-
-
-void SocketImpl::setReceiveBufferSize(int size)
-{
- setOption(SOL_SOCKET, SO_RCVBUF, size);
-}
-
-
-int SocketImpl::getReceiveBufferSize()
-{
- int result;
- getOption(SOL_SOCKET, SO_RCVBUF, result);
- return result;
-}
-
-
-void SocketImpl::setSendTimeout(const Poco::Timespan& timeout)
-{
+
+void SocketImpl::setSendBufferSize(int size)
+{
+ setOption(SOL_SOCKET, SO_SNDBUF, size);
+}
+
+
+int SocketImpl::getSendBufferSize()
+{
+ int result;
+ getOption(SOL_SOCKET, SO_SNDBUF, result);
+ return result;
+}
+
+
+void SocketImpl::setReceiveBufferSize(int size)
+{
+ setOption(SOL_SOCKET, SO_RCVBUF, size);
+}
+
+
+int SocketImpl::getReceiveBufferSize()
+{
+ int result;
+ getOption(SOL_SOCKET, SO_RCVBUF, result);
+ return result;
+}
+
+
+void SocketImpl::setSendTimeout(const Poco::Timespan& timeout)
+{
#if defined(_WIN32)
- int value = (int) timeout.totalMilliseconds();
- setOption(SOL_SOCKET, SO_SNDTIMEO, value);
+ int value = (int) timeout.totalMilliseconds();
+ setOption(SOL_SOCKET, SO_SNDTIMEO, value);
#else
- setOption(SOL_SOCKET, SO_SNDTIMEO, timeout);
-#endif
+ setOption(SOL_SOCKET, SO_SNDTIMEO, timeout);
+#endif
_sndTimeout = timeout;
-}
-
-
-Poco::Timespan SocketImpl::getSendTimeout()
-{
- Timespan result;
-#if defined(_WIN32) && !defined(POCO_BROKEN_TIMEOUTS)
- int value;
- getOption(SOL_SOCKET, SO_SNDTIMEO, value);
- result = Timespan::TimeDiff(value)*1000;
-#elif !defined(POCO_BROKEN_TIMEOUTS)
- getOption(SOL_SOCKET, SO_SNDTIMEO, result);
-#endif
- if (_isBrokenTimeout)
- result = _sndTimeout;
- return result;
-}
-
-
-void SocketImpl::setReceiveTimeout(const Poco::Timespan& timeout)
-{
-#if defined(_WIN32)
- int value = (int) timeout.totalMilliseconds();
- setOption(SOL_SOCKET, SO_RCVTIMEO, value);
-#else
- setOption(SOL_SOCKET, SO_RCVTIMEO, timeout);
-#endif
+}
+
+
+Poco::Timespan SocketImpl::getSendTimeout()
+{
+ Timespan result;
+#if defined(_WIN32) && !defined(POCO_BROKEN_TIMEOUTS)
+ int value;
+ getOption(SOL_SOCKET, SO_SNDTIMEO, value);
+ result = Timespan::TimeDiff(value)*1000;
+#elif !defined(POCO_BROKEN_TIMEOUTS)
+ getOption(SOL_SOCKET, SO_SNDTIMEO, result);
+#endif
+ if (_isBrokenTimeout)
+ result = _sndTimeout;
+ return result;
+}
+
+
+void SocketImpl::setReceiveTimeout(const Poco::Timespan& timeout)
+{
+#if defined(_WIN32)
+ int value = (int) timeout.totalMilliseconds();
+ setOption(SOL_SOCKET, SO_RCVTIMEO, value);
+#else
+ setOption(SOL_SOCKET, SO_RCVTIMEO, timeout);
+#endif
_recvTimeout = timeout;
-}
-
-
-Poco::Timespan SocketImpl::getReceiveTimeout()
-{
- Timespan result;
-#if defined(_WIN32) && !defined(POCO_BROKEN_TIMEOUTS)
- int value;
- getOption(SOL_SOCKET, SO_RCVTIMEO, value);
- result = Timespan::TimeDiff(value)*1000;
-#elif !defined(POCO_BROKEN_TIMEOUTS)
- getOption(SOL_SOCKET, SO_RCVTIMEO, result);
-#endif
- if (_isBrokenTimeout)
- result = _recvTimeout;
- return result;
-}
-
-
-SocketAddress SocketImpl::address()
-{
- if (_sockfd == POCO_INVALID_SOCKET) throw InvalidSocketException();
-
- sockaddr_storage buffer;
- struct sockaddr* pSA = reinterpret_cast<struct sockaddr*>(&buffer);
- poco_socklen_t saLen = sizeof(buffer);
- int rc = ::getsockname(_sockfd, pSA, &saLen);
- if (rc == 0)
- return SocketAddress(pSA, saLen);
- else
- error();
- return SocketAddress();
-}
-
-
-SocketAddress SocketImpl::peerAddress()
-{
- if (_sockfd == POCO_INVALID_SOCKET) throw InvalidSocketException();
-
- sockaddr_storage buffer;
- struct sockaddr* pSA = reinterpret_cast<struct sockaddr*>(&buffer);
- poco_socklen_t saLen = sizeof(buffer);
- int rc = ::getpeername(_sockfd, pSA, &saLen);
- if (rc == 0)
- return SocketAddress(pSA, saLen);
+}
+
+
+Poco::Timespan SocketImpl::getReceiveTimeout()
+{
+ Timespan result;
+#if defined(_WIN32) && !defined(POCO_BROKEN_TIMEOUTS)
+ int value;
+ getOption(SOL_SOCKET, SO_RCVTIMEO, value);
+ result = Timespan::TimeDiff(value)*1000;
+#elif !defined(POCO_BROKEN_TIMEOUTS)
+ getOption(SOL_SOCKET, SO_RCVTIMEO, result);
+#endif
+ if (_isBrokenTimeout)
+ result = _recvTimeout;
+ return result;
+}
+
+
+SocketAddress SocketImpl::address()
+{
+ if (_sockfd == POCO_INVALID_SOCKET) throw InvalidSocketException();
+
+ sockaddr_storage buffer;
+ struct sockaddr* pSA = reinterpret_cast<struct sockaddr*>(&buffer);
+ poco_socklen_t saLen = sizeof(buffer);
+ int rc = ::getsockname(_sockfd, pSA, &saLen);
+ if (rc == 0)
+ return SocketAddress(pSA, saLen);
else
- error();
- return SocketAddress();
-}
-
-
-void SocketImpl::setOption(int level, int option, int value)
-{
- setRawOption(level, option, &value, sizeof(value));
-}
-
-
-void SocketImpl::setOption(int level, int option, unsigned value)
-{
- setRawOption(level, option, &value, sizeof(value));
-}
-
-
-void SocketImpl::setOption(int level, int option, unsigned char value)
-{
- setRawOption(level, option, &value, sizeof(value));
-}
-
-
-void SocketImpl::setOption(int level, int option, const IPAddress& value)
-{
- setRawOption(level, option, value.addr(), value.length());
-}
-
-
-void SocketImpl::setOption(int level, int option, const Poco::Timespan& value)
-{
- struct timeval tv;
- tv.tv_sec = (long) value.totalSeconds();
- tv.tv_usec = (long) value.useconds();
-
- setRawOption(level, option, &tv, sizeof(tv));
-}
-
-
-void SocketImpl::setRawOption(int level, int option, const void* value, poco_socklen_t length)
-{
- if (_sockfd == POCO_INVALID_SOCKET) throw InvalidSocketException();
-
-#if defined(POCO_VXWORKS)
- int rc = ::setsockopt(_sockfd, level, option, (char*) value, length);
-#else
- int rc = ::setsockopt(_sockfd, level, option, reinterpret_cast<const char*>(value), length);
-#endif
- if (rc == -1) error();
-}
-
-
-void SocketImpl::getOption(int level, int option, int& value)
-{
- poco_socklen_t len = sizeof(value);
- getRawOption(level, option, &value, len);
-}
-
-
-void SocketImpl::getOption(int level, int option, unsigned& value)
-{
- poco_socklen_t len = sizeof(value);
- getRawOption(level, option, &value, len);
-}
-
-
-void SocketImpl::getOption(int level, int option, unsigned char& value)
-{
- poco_socklen_t len = sizeof(value);
- getRawOption(level, option, &value, len);
-}
-
-
-void SocketImpl::getOption(int level, int option, Poco::Timespan& value)
-{
- struct timeval tv;
- poco_socklen_t len = sizeof(tv);
- getRawOption(level, option, &tv, len);
- value.assign(tv.tv_sec, tv.tv_usec);
-}
-
-
-void SocketImpl::getOption(int level, int option, IPAddress& value)
-{
- char buffer[IPAddress::MAX_ADDRESS_LENGTH];
- poco_socklen_t len = sizeof(buffer);
- getRawOption(level, option, buffer, len);
- value = IPAddress(buffer, len);
-}
-
-
-void SocketImpl::getRawOption(int level, int option, void* value, poco_socklen_t& length)
-{
- if (_sockfd == POCO_INVALID_SOCKET) throw InvalidSocketException();
-
- int rc = ::getsockopt(_sockfd, level, option, reinterpret_cast<char*>(value), &length);
- if (rc == -1) error();
-}
-
-
-void SocketImpl::setLinger(bool on, int seconds)
-{
- struct linger l;
- l.l_onoff = on ? 1 : 0;
- l.l_linger = static_cast<u_short>(seconds);
- setRawOption(SOL_SOCKET, SO_LINGER, &l, sizeof(l));
-}
-
-
-void SocketImpl::getLinger(bool& on, int& seconds)
-{
- struct linger l;
- poco_socklen_t len = sizeof(l);
- getRawOption(SOL_SOCKET, SO_LINGER, &l, len);
- on = l.l_onoff != 0;
- seconds = l.l_linger;
-}
-
-
-void SocketImpl::setNoDelay(bool flag)
-{
- int value = flag ? 1 : 0;
- setOption(IPPROTO_TCP, TCP_NODELAY, value);
-}
-
-
-bool SocketImpl::getNoDelay()
-{
- int value(0);
- getOption(IPPROTO_TCP, TCP_NODELAY, value);
- return value != 0;
-}
-
-
-void SocketImpl::setKeepAlive(bool flag)
-{
- int value = flag ? 1 : 0;
- setOption(SOL_SOCKET, SO_KEEPALIVE, value);
-}
-
-
-bool SocketImpl::getKeepAlive()
-{
- int value(0);
- getOption(SOL_SOCKET, SO_KEEPALIVE, value);
- return value != 0;
-}
-
-
-void SocketImpl::setReuseAddress(bool flag)
-{
- int value = flag ? 1 : 0;
- setOption(SOL_SOCKET, SO_REUSEADDR, value);
-}
-
-
-bool SocketImpl::getReuseAddress()
-{
- int value(0);
- getOption(SOL_SOCKET, SO_REUSEADDR, value);
- return value != 0;
-}
-
-
-void SocketImpl::setReusePort(bool flag)
-{
-#ifdef SO_REUSEPORT
- try
- {
- int value = flag ? 1 : 0;
- setOption(SOL_SOCKET, SO_REUSEPORT, value);
- }
- catch (IOException&)
- {
- // ignore error, since not all implementations
- // support SO_REUSEPORT, even if the macro
- // is defined.
- }
-#else
- (void)flag;
-#endif
-}
-
-
-bool SocketImpl::getReusePort()
-{
-#ifdef SO_REUSEPORT
- int value(0);
- getOption(SOL_SOCKET, SO_REUSEPORT, value);
- return value != 0;
-#else
- return false;
-#endif
-}
-
-
-void SocketImpl::setOOBInline(bool flag)
-{
- int value = flag ? 1 : 0;
- setOption(SOL_SOCKET, SO_OOBINLINE, value);
-}
-
-
-bool SocketImpl::getOOBInline()
-{
- int value(0);
- getOption(SOL_SOCKET, SO_OOBINLINE, value);
- return value != 0;
-}
-
-
-void SocketImpl::setBroadcast(bool flag)
-{
- int value = flag ? 1 : 0;
- setOption(SOL_SOCKET, SO_BROADCAST, value);
-}
-
-
-bool SocketImpl::getBroadcast()
-{
- int value(0);
- getOption(SOL_SOCKET, SO_BROADCAST, value);
- return value != 0;
-}
-
-
-void SocketImpl::setBlocking(bool flag)
-{
-#if !defined(POCO_OS_FAMILY_UNIX)
- int arg = flag ? 0 : 1;
- ioctl(FIONBIO, arg);
-#else
- int arg = fcntl(F_GETFL);
- long flags = arg & ~O_NONBLOCK;
- if (!flag) flags |= O_NONBLOCK;
- (void) fcntl(F_SETFL, flags);
-#endif
- _blocking = flag;
-}
-
-
-int SocketImpl::socketError()
-{
- int result(0);
- getOption(SOL_SOCKET, SO_ERROR, result);
- return result;
-}
-
-
-void SocketImpl::init(int af)
-{
- initSocket(af, SOCK_STREAM);
-}
-
-
-void SocketImpl::initSocket(int af, int type, int proto)
-{
- poco_assert (_sockfd == POCO_INVALID_SOCKET);
-
- _sockfd = ::socket(af, type, proto);
- if (_sockfd == POCO_INVALID_SOCKET)
- error();
-
-#if defined(__MACH__) && defined(__APPLE__) || defined(__FreeBSD__)
- // SIGPIPE sends a signal that if unhandled (which is the default)
- // will crash the process. This only happens on UNIX, and not Linux.
- //
- // In order to have POCO sockets behave the same across platforms, it is
- // best to just ignore SIGPIPE altogether.
- setOption(SOL_SOCKET, SO_NOSIGPIPE, 1);
-#endif
-}
-
-
-void SocketImpl::ioctl(poco_ioctl_request_t request, int& arg)
-{
-#if defined(_WIN32)
- int rc = ioctlsocket(_sockfd, request, reinterpret_cast<u_long*>(&arg));
-#elif defined(POCO_VXWORKS)
- int rc = ::ioctl(_sockfd, request, (int) &arg);
-#else
- int rc = ::ioctl(_sockfd, request, &arg);
-#endif
- if (rc != 0) error();
-}
-
-
-void SocketImpl::ioctl(poco_ioctl_request_t request, void* arg)
-{
-#if defined(_WIN32)
- int rc = ioctlsocket(_sockfd, request, reinterpret_cast<u_long*>(arg));
-#elif defined(POCO_VXWORKS)
- int rc = ::ioctl(_sockfd, request, (int) arg);
-#else
- int rc = ::ioctl(_sockfd, request, arg);
-#endif
- if (rc != 0) error();
-}
-
-
-#if defined(POCO_OS_FAMILY_UNIX)
-int SocketImpl::fcntl(poco_fcntl_request_t request)
-{
- int rc = ::fcntl(_sockfd, request);
- if (rc == -1) error();
- return rc;
-}
-
-
-int SocketImpl::fcntl(poco_fcntl_request_t request, long arg)
-{
- int rc = ::fcntl(_sockfd, request, arg);
- if (rc == -1) error();
- return rc;
-}
-#endif
-
-
-void SocketImpl::reset(poco_socket_t aSocket)
-{
- _sockfd = aSocket;
-}
-
-
-void SocketImpl::error()
-{
- int err = lastError();
- std::string empty;
- error(err, empty);
-}
-
-
-void SocketImpl::error(const std::string& arg)
-{
- error(lastError(), arg);
-}
-
-
-void SocketImpl::error(int code)
-{
- std::string arg;
- error(code, arg);
-}
-
-
-void SocketImpl::error(int code, const std::string& arg)
-{
- switch (code)
- {
- case POCO_ENOERR: return;
- case POCO_ESYSNOTREADY:
- throw NetException("Net subsystem not ready", code);
- case POCO_ENOTINIT:
- throw NetException("Net subsystem not initialized", code);
- case POCO_EINTR:
- throw IOException("Interrupted", code);
- case POCO_EACCES:
- throw IOException("Permission denied", code);
- case POCO_EFAULT:
- throw IOException("Bad address", code);
- case POCO_EINVAL:
- throw InvalidArgumentException(code);
- case POCO_EMFILE:
- throw IOException("Too many open files", code);
- case POCO_EWOULDBLOCK:
- throw IOException("Operation would block", code);
- case POCO_EINPROGRESS:
- throw IOException("Operation now in progress", code);
- case POCO_EALREADY:
- throw IOException("Operation already in progress", code);
- case POCO_ENOTSOCK:
- throw IOException("Socket operation attempted on non-socket", code);
- case POCO_EDESTADDRREQ:
- throw NetException("Destination address required", code);
- case POCO_EMSGSIZE:
- throw NetException("Message too long", code);
- case POCO_EPROTOTYPE:
- throw NetException("Wrong protocol type", code);
- case POCO_ENOPROTOOPT:
- throw NetException("Protocol not available", code);
- case POCO_EPROTONOSUPPORT:
- throw NetException("Protocol not supported", code);
- case POCO_ESOCKTNOSUPPORT:
- throw NetException("Socket type not supported", code);
- case POCO_ENOTSUP:
- throw NetException("Operation not supported", code);
- case POCO_EPFNOSUPPORT:
- throw NetException("Protocol family not supported", code);
- case POCO_EAFNOSUPPORT:
- throw NetException("Address family not supported", code);
- case POCO_EADDRINUSE:
- throw NetException("Address already in use", arg, code);
- case POCO_EADDRNOTAVAIL:
- throw NetException("Cannot assign requested address", arg, code);
- case POCO_ENETDOWN:
- throw NetException("Network is down", code);
- case POCO_ENETUNREACH:
- throw NetException("Network is unreachable", code);
- case POCO_ENETRESET:
- throw NetException("Network dropped connection on reset", code);
- case POCO_ECONNABORTED:
- throw ConnectionAbortedException(code);
- case POCO_ECONNRESET:
- throw ConnectionResetException(code);
- case POCO_ENOBUFS:
- throw IOException("No buffer space available", code);
- case POCO_EISCONN:
- throw NetException("Socket is already connected", code);
- case POCO_ENOTCONN:
- throw NetException("Socket is not connected", code);
- case POCO_ESHUTDOWN:
- throw NetException("Cannot send after socket shutdown", code);
- case POCO_ETIMEDOUT:
- throw TimeoutException(code);
- case POCO_ECONNREFUSED:
- throw ConnectionRefusedException(arg, code);
- case POCO_EHOSTDOWN:
- throw NetException("Host is down", arg, code);
- case POCO_EHOSTUNREACH:
- throw NetException("No route to host", arg, code);
-#if defined(POCO_OS_FAMILY_UNIX)
- case EPIPE:
- throw IOException("Broken pipe", code);
- case EBADF:
- throw IOException("Bad socket descriptor", code);
- case ENOENT:
- throw IOException("Not found", arg, code);
-#endif
- default:
- throw IOException(NumberFormatter::format(code), arg, code);
- }
-}
-
-
-} } // namespace Poco::Net
+ error();
+ return SocketAddress();
+}
+
+
+SocketAddress SocketImpl::peerAddress()
+{
+ if (_sockfd == POCO_INVALID_SOCKET) throw InvalidSocketException();
+
+ sockaddr_storage buffer;
+ struct sockaddr* pSA = reinterpret_cast<struct sockaddr*>(&buffer);
+ poco_socklen_t saLen = sizeof(buffer);
+ int rc = ::getpeername(_sockfd, pSA, &saLen);
+ if (rc == 0)
+ return SocketAddress(pSA, saLen);
+ else
+ error();
+ return SocketAddress();
+}
+
+
+void SocketImpl::setOption(int level, int option, int value)
+{
+ setRawOption(level, option, &value, sizeof(value));
+}
+
+
+void SocketImpl::setOption(int level, int option, unsigned value)
+{
+ setRawOption(level, option, &value, sizeof(value));
+}
+
+
+void SocketImpl::setOption(int level, int option, unsigned char value)
+{
+ setRawOption(level, option, &value, sizeof(value));
+}
+
+
+void SocketImpl::setOption(int level, int option, const IPAddress& value)
+{
+ setRawOption(level, option, value.addr(), value.length());
+}
+
+
+void SocketImpl::setOption(int level, int option, const Poco::Timespan& value)
+{
+ struct timeval tv;
+ tv.tv_sec = (long) value.totalSeconds();
+ tv.tv_usec = (long) value.useconds();
+
+ setRawOption(level, option, &tv, sizeof(tv));
+}
+
+
+void SocketImpl::setRawOption(int level, int option, const void* value, poco_socklen_t length)
+{
+ if (_sockfd == POCO_INVALID_SOCKET) throw InvalidSocketException();
+
+#if defined(POCO_VXWORKS)
+ int rc = ::setsockopt(_sockfd, level, option, (char*) value, length);
+#else
+ int rc = ::setsockopt(_sockfd, level, option, reinterpret_cast<const char*>(value), length);
+#endif
+ if (rc == -1) error();
+}
+
+
+void SocketImpl::getOption(int level, int option, int& value)
+{
+ poco_socklen_t len = sizeof(value);
+ getRawOption(level, option, &value, len);
+}
+
+
+void SocketImpl::getOption(int level, int option, unsigned& value)
+{
+ poco_socklen_t len = sizeof(value);
+ getRawOption(level, option, &value, len);
+}
+
+
+void SocketImpl::getOption(int level, int option, unsigned char& value)
+{
+ poco_socklen_t len = sizeof(value);
+ getRawOption(level, option, &value, len);
+}
+
+
+void SocketImpl::getOption(int level, int option, Poco::Timespan& value)
+{
+ struct timeval tv;
+ poco_socklen_t len = sizeof(tv);
+ getRawOption(level, option, &tv, len);
+ value.assign(tv.tv_sec, tv.tv_usec);
+}
+
+
+void SocketImpl::getOption(int level, int option, IPAddress& value)
+{
+ char buffer[IPAddress::MAX_ADDRESS_LENGTH];
+ poco_socklen_t len = sizeof(buffer);
+ getRawOption(level, option, buffer, len);
+ value = IPAddress(buffer, len);
+}
+
+
+void SocketImpl::getRawOption(int level, int option, void* value, poco_socklen_t& length)
+{
+ if (_sockfd == POCO_INVALID_SOCKET) throw InvalidSocketException();
+
+ int rc = ::getsockopt(_sockfd, level, option, reinterpret_cast<char*>(value), &length);
+ if (rc == -1) error();
+}
+
+
+void SocketImpl::setLinger(bool on, int seconds)
+{
+ struct linger l;
+ l.l_onoff = on ? 1 : 0;
+ l.l_linger = static_cast<u_short>(seconds);
+ setRawOption(SOL_SOCKET, SO_LINGER, &l, sizeof(l));
+}
+
+
+void SocketImpl::getLinger(bool& on, int& seconds)
+{
+ struct linger l;
+ poco_socklen_t len = sizeof(l);
+ getRawOption(SOL_SOCKET, SO_LINGER, &l, len);
+ on = l.l_onoff != 0;
+ seconds = l.l_linger;
+}
+
+
+void SocketImpl::setNoDelay(bool flag)
+{
+ int value = flag ? 1 : 0;
+ setOption(IPPROTO_TCP, TCP_NODELAY, value);
+}
+
+
+bool SocketImpl::getNoDelay()
+{
+ int value(0);
+ getOption(IPPROTO_TCP, TCP_NODELAY, value);
+ return value != 0;
+}
+
+
+void SocketImpl::setKeepAlive(bool flag)
+{
+ int value = flag ? 1 : 0;
+ setOption(SOL_SOCKET, SO_KEEPALIVE, value);
+}
+
+
+bool SocketImpl::getKeepAlive()
+{
+ int value(0);
+ getOption(SOL_SOCKET, SO_KEEPALIVE, value);
+ return value != 0;
+}
+
+
+void SocketImpl::setReuseAddress(bool flag)
+{
+ int value = flag ? 1 : 0;
+ setOption(SOL_SOCKET, SO_REUSEADDR, value);
+}
+
+
+bool SocketImpl::getReuseAddress()
+{
+ int value(0);
+ getOption(SOL_SOCKET, SO_REUSEADDR, value);
+ return value != 0;
+}
+
+
+void SocketImpl::setReusePort(bool flag)
+{
+#ifdef SO_REUSEPORT
+ try
+ {
+ int value = flag ? 1 : 0;
+ setOption(SOL_SOCKET, SO_REUSEPORT, value);
+ }
+ catch (IOException&)
+ {
+ // ignore error, since not all implementations
+ // support SO_REUSEPORT, even if the macro
+ // is defined.
+ }
+#else
+ (void)flag;
+#endif
+}
+
+
+bool SocketImpl::getReusePort()
+{
+#ifdef SO_REUSEPORT
+ int value(0);
+ getOption(SOL_SOCKET, SO_REUSEPORT, value);
+ return value != 0;
+#else
+ return false;
+#endif
+}
+
+
+void SocketImpl::setOOBInline(bool flag)
+{
+ int value = flag ? 1 : 0;
+ setOption(SOL_SOCKET, SO_OOBINLINE, value);
+}
+
+
+bool SocketImpl::getOOBInline()
+{
+ int value(0);
+ getOption(SOL_SOCKET, SO_OOBINLINE, value);
+ return value != 0;
+}
+
+
+void SocketImpl::setBroadcast(bool flag)
+{
+ int value = flag ? 1 : 0;
+ setOption(SOL_SOCKET, SO_BROADCAST, value);
+}
+
+
+bool SocketImpl::getBroadcast()
+{
+ int value(0);
+ getOption(SOL_SOCKET, SO_BROADCAST, value);
+ return value != 0;
+}
+
+
+void SocketImpl::setBlocking(bool flag)
+{
+#if !defined(POCO_OS_FAMILY_UNIX)
+ int arg = flag ? 0 : 1;
+ ioctl(FIONBIO, arg);
+#else
+ int arg = fcntl(F_GETFL);
+ long flags = arg & ~O_NONBLOCK;
+ if (!flag) flags |= O_NONBLOCK;
+ (void) fcntl(F_SETFL, flags);
+#endif
+ _blocking = flag;
+}
+
+
+int SocketImpl::socketError()
+{
+ int result(0);
+ getOption(SOL_SOCKET, SO_ERROR, result);
+ return result;
+}
+
+
+void SocketImpl::init(int af)
+{
+ initSocket(af, SOCK_STREAM);
+}
+
+
+void SocketImpl::initSocket(int af, int type, int proto)
+{
+ poco_assert (_sockfd == POCO_INVALID_SOCKET);
+
+ _sockfd = ::socket(af, type, proto);
+ if (_sockfd == POCO_INVALID_SOCKET)
+ error();
+
+#if defined(__MACH__) && defined(__APPLE__) || defined(__FreeBSD__)
+ // SIGPIPE sends a signal that if unhandled (which is the default)
+ // will crash the process. This only happens on UNIX, and not Linux.
+ //
+ // In order to have POCO sockets behave the same across platforms, it is
+ // best to just ignore SIGPIPE altogether.
+ setOption(SOL_SOCKET, SO_NOSIGPIPE, 1);
+#endif
+}
+
+
+void SocketImpl::ioctl(poco_ioctl_request_t request, int& arg)
+{
+#if defined(_WIN32)
+ int rc = ioctlsocket(_sockfd, request, reinterpret_cast<u_long*>(&arg));
+#elif defined(POCO_VXWORKS)
+ int rc = ::ioctl(_sockfd, request, (int) &arg);
+#else
+ int rc = ::ioctl(_sockfd, request, &arg);
+#endif
+ if (rc != 0) error();
+}
+
+
+void SocketImpl::ioctl(poco_ioctl_request_t request, void* arg)
+{
+#if defined(_WIN32)
+ int rc = ioctlsocket(_sockfd, request, reinterpret_cast<u_long*>(arg));
+#elif defined(POCO_VXWORKS)
+ int rc = ::ioctl(_sockfd, request, (int) arg);
+#else
+ int rc = ::ioctl(_sockfd, request, arg);
+#endif
+ if (rc != 0) error();
+}
+
+
+#if defined(POCO_OS_FAMILY_UNIX)
+int SocketImpl::fcntl(poco_fcntl_request_t request)
+{
+ int rc = ::fcntl(_sockfd, request);
+ if (rc == -1) error();
+ return rc;
+}
+
+
+int SocketImpl::fcntl(poco_fcntl_request_t request, long arg)
+{
+ int rc = ::fcntl(_sockfd, request, arg);
+ if (rc == -1) error();
+ return rc;
+}
+#endif
+
+
+void SocketImpl::reset(poco_socket_t aSocket)
+{
+ _sockfd = aSocket;
+}
+
+
+void SocketImpl::error()
+{
+ int err = lastError();
+ std::string empty;
+ error(err, empty);
+}
+
+
+void SocketImpl::error(const std::string& arg)
+{
+ error(lastError(), arg);
+}
+
+
+void SocketImpl::error(int code)
+{
+ std::string arg;
+ error(code, arg);
+}
+
+
+void SocketImpl::error(int code, const std::string& arg)
+{
+ switch (code)
+ {
+ case POCO_ENOERR: return;
+ case POCO_ESYSNOTREADY:
+ throw NetException("Net subsystem not ready", code);
+ case POCO_ENOTINIT:
+ throw NetException("Net subsystem not initialized", code);
+ case POCO_EINTR:
+ throw IOException("Interrupted", code);
+ case POCO_EACCES:
+ throw IOException("Permission denied", code);
+ case POCO_EFAULT:
+ throw IOException("Bad address", code);
+ case POCO_EINVAL:
+ throw InvalidArgumentException(code);
+ case POCO_EMFILE:
+ throw IOException("Too many open files", code);
+ case POCO_EWOULDBLOCK:
+ throw IOException("Operation would block", code);
+ case POCO_EINPROGRESS:
+ throw IOException("Operation now in progress", code);
+ case POCO_EALREADY:
+ throw IOException("Operation already in progress", code);
+ case POCO_ENOTSOCK:
+ throw IOException("Socket operation attempted on non-socket", code);
+ case POCO_EDESTADDRREQ:
+ throw NetException("Destination address required", code);
+ case POCO_EMSGSIZE:
+ throw NetException("Message too long", code);
+ case POCO_EPROTOTYPE:
+ throw NetException("Wrong protocol type", code);
+ case POCO_ENOPROTOOPT:
+ throw NetException("Protocol not available", code);
+ case POCO_EPROTONOSUPPORT:
+ throw NetException("Protocol not supported", code);
+ case POCO_ESOCKTNOSUPPORT:
+ throw NetException("Socket type not supported", code);
+ case POCO_ENOTSUP:
+ throw NetException("Operation not supported", code);
+ case POCO_EPFNOSUPPORT:
+ throw NetException("Protocol family not supported", code);
+ case POCO_EAFNOSUPPORT:
+ throw NetException("Address family not supported", code);
+ case POCO_EADDRINUSE:
+ throw NetException("Address already in use", arg, code);
+ case POCO_EADDRNOTAVAIL:
+ throw NetException("Cannot assign requested address", arg, code);
+ case POCO_ENETDOWN:
+ throw NetException("Network is down", code);
+ case POCO_ENETUNREACH:
+ throw NetException("Network is unreachable", code);
+ case POCO_ENETRESET:
+ throw NetException("Network dropped connection on reset", code);
+ case POCO_ECONNABORTED:
+ throw ConnectionAbortedException(code);
+ case POCO_ECONNRESET:
+ throw ConnectionResetException(code);
+ case POCO_ENOBUFS:
+ throw IOException("No buffer space available", code);
+ case POCO_EISCONN:
+ throw NetException("Socket is already connected", code);
+ case POCO_ENOTCONN:
+ throw NetException("Socket is not connected", code);
+ case POCO_ESHUTDOWN:
+ throw NetException("Cannot send after socket shutdown", code);
+ case POCO_ETIMEDOUT:
+ throw TimeoutException(code);
+ case POCO_ECONNREFUSED:
+ throw ConnectionRefusedException(arg, code);
+ case POCO_EHOSTDOWN:
+ throw NetException("Host is down", arg, code);
+ case POCO_EHOSTUNREACH:
+ throw NetException("No route to host", arg, code);
+#if defined(POCO_OS_FAMILY_UNIX)
+ case EPIPE:
+ throw IOException("Broken pipe", code);
+ case EBADF:
+ throw IOException("Bad socket descriptor", code);
+ case ENOENT:
+ throw IOException("Not found", arg, code);
+#endif
+ default:
+ throw IOException(NumberFormatter::format(code), arg, code);
+ }
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/SocketNotification.cpp b/contrib/libs/poco/Net/src/SocketNotification.cpp
index 337794fecd..da3c922da5 100644
--- a/contrib/libs/poco/Net/src/SocketNotification.cpp
+++ b/contrib/libs/poco/Net/src/SocketNotification.cpp
@@ -1,105 +1,105 @@
-//
-// SocketNotification.cpp
-//
-// Library: Net
-// Package: Reactor
-// Module: SocketNotification
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/SocketNotification.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-SocketNotification::SocketNotification(SocketReactor* pReactor):
- _pReactor(pReactor)
-{
-}
-
-
-SocketNotification::~SocketNotification()
-{
-}
-
-
-void SocketNotification::setSocket(const Socket& socket)
-{
- _socket = socket;
-}
-
-
-ReadableNotification::ReadableNotification(SocketReactor* pReactor):
- SocketNotification(pReactor)
-{
-}
-
-
-ReadableNotification::~ReadableNotification()
-{
-}
-
-
-WritableNotification::WritableNotification(SocketReactor* pReactor):
- SocketNotification(pReactor)
-{
-}
-
-
-WritableNotification::~WritableNotification()
-{
-}
-
-
-ErrorNotification::ErrorNotification(SocketReactor* pReactor):
- SocketNotification(pReactor)
-{
-}
-
-
-ErrorNotification::~ErrorNotification()
-{
-}
-
-
-TimeoutNotification::TimeoutNotification(SocketReactor* pReactor):
- SocketNotification(pReactor)
-{
-}
-
-
-TimeoutNotification::~TimeoutNotification()
-{
-}
-
-
-IdleNotification::IdleNotification(SocketReactor* pReactor):
- SocketNotification(pReactor)
-{
-}
-
-
-IdleNotification::~IdleNotification()
-{
-}
-
-
-ShutdownNotification::ShutdownNotification(SocketReactor* pReactor):
- SocketNotification(pReactor)
-{
-}
-
-
-ShutdownNotification::~ShutdownNotification()
-{
-}
-
-
-} } // namespace Poco::Net
+//
+// SocketNotification.cpp
+//
+// Library: Net
+// Package: Reactor
+// Module: SocketNotification
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/SocketNotification.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+SocketNotification::SocketNotification(SocketReactor* pReactor):
+ _pReactor(pReactor)
+{
+}
+
+
+SocketNotification::~SocketNotification()
+{
+}
+
+
+void SocketNotification::setSocket(const Socket& socket)
+{
+ _socket = socket;
+}
+
+
+ReadableNotification::ReadableNotification(SocketReactor* pReactor):
+ SocketNotification(pReactor)
+{
+}
+
+
+ReadableNotification::~ReadableNotification()
+{
+}
+
+
+WritableNotification::WritableNotification(SocketReactor* pReactor):
+ SocketNotification(pReactor)
+{
+}
+
+
+WritableNotification::~WritableNotification()
+{
+}
+
+
+ErrorNotification::ErrorNotification(SocketReactor* pReactor):
+ SocketNotification(pReactor)
+{
+}
+
+
+ErrorNotification::~ErrorNotification()
+{
+}
+
+
+TimeoutNotification::TimeoutNotification(SocketReactor* pReactor):
+ SocketNotification(pReactor)
+{
+}
+
+
+TimeoutNotification::~TimeoutNotification()
+{
+}
+
+
+IdleNotification::IdleNotification(SocketReactor* pReactor):
+ SocketNotification(pReactor)
+{
+}
+
+
+IdleNotification::~IdleNotification()
+{
+}
+
+
+ShutdownNotification::ShutdownNotification(SocketReactor* pReactor):
+ SocketNotification(pReactor)
+{
+}
+
+
+ShutdownNotification::~ShutdownNotification()
+{
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/SocketNotifier.cpp b/contrib/libs/poco/Net/src/SocketNotifier.cpp
index 8c9bcebe28..9bbf6ca826 100644
--- a/contrib/libs/poco/Net/src/SocketNotifier.cpp
+++ b/contrib/libs/poco/Net/src/SocketNotifier.cpp
@@ -1,89 +1,89 @@
-//
-// SocketNotifier.cpp
-//
-// Library: Net
-// Package: Reactor
-// Module: SocketNotifier
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/SocketNotifier.h"
-#include "Poco/Net/SocketReactor.h"
-#include "Poco/Net/SocketNotification.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-SocketNotifier::SocketNotifier(const Socket& socket):
- _socket(socket)
-{
-}
-
-
-SocketNotifier::~SocketNotifier()
-{
-}
-
-
-void SocketNotifier::addObserver(SocketReactor* pReactor, const Poco::AbstractObserver& observer)
-{
- _nc.addObserver(observer);
- if (observer.accepts(pReactor->_pReadableNotification))
- _events.insert(pReactor->_pReadableNotification.get());
- else if (observer.accepts(pReactor->_pWritableNotification))
- _events.insert(pReactor->_pWritableNotification.get());
- else if (observer.accepts(pReactor->_pErrorNotification))
- _events.insert(pReactor->_pErrorNotification.get());
- else if (observer.accepts(pReactor->_pTimeoutNotification))
- _events.insert(pReactor->_pTimeoutNotification.get());
-}
-
-
-void SocketNotifier::removeObserver(SocketReactor* pReactor, const Poco::AbstractObserver& observer)
-{
- _nc.removeObserver(observer);
- EventSet::iterator it = _events.end();
- if (observer.accepts(pReactor->_pReadableNotification))
- it = _events.find(pReactor->_pReadableNotification.get());
- else if (observer.accepts(pReactor->_pWritableNotification))
- it = _events.find(pReactor->_pWritableNotification.get());
- else if (observer.accepts(pReactor->_pErrorNotification))
- it = _events.find(pReactor->_pErrorNotification.get());
- else if (observer.accepts(pReactor->_pTimeoutNotification))
- it = _events.find(pReactor->_pTimeoutNotification.get());
- if (it != _events.end())
- _events.erase(it);
-}
-
-
-namespace
-{
- static Socket nullSocket;
-}
-
-
-void SocketNotifier::dispatch(SocketNotification* pNotification)
-{
- pNotification->setSocket(_socket);
- pNotification->duplicate();
- try
- {
- _nc.postNotification(pNotification);
- }
- catch (...)
- {
- pNotification->setSocket(nullSocket);
- throw;
- }
- pNotification->setSocket(nullSocket);
-}
-
-
-} } // namespace Poco::Net
+//
+// SocketNotifier.cpp
+//
+// Library: Net
+// Package: Reactor
+// Module: SocketNotifier
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/SocketNotifier.h"
+#include "Poco/Net/SocketReactor.h"
+#include "Poco/Net/SocketNotification.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+SocketNotifier::SocketNotifier(const Socket& socket):
+ _socket(socket)
+{
+}
+
+
+SocketNotifier::~SocketNotifier()
+{
+}
+
+
+void SocketNotifier::addObserver(SocketReactor* pReactor, const Poco::AbstractObserver& observer)
+{
+ _nc.addObserver(observer);
+ if (observer.accepts(pReactor->_pReadableNotification))
+ _events.insert(pReactor->_pReadableNotification.get());
+ else if (observer.accepts(pReactor->_pWritableNotification))
+ _events.insert(pReactor->_pWritableNotification.get());
+ else if (observer.accepts(pReactor->_pErrorNotification))
+ _events.insert(pReactor->_pErrorNotification.get());
+ else if (observer.accepts(pReactor->_pTimeoutNotification))
+ _events.insert(pReactor->_pTimeoutNotification.get());
+}
+
+
+void SocketNotifier::removeObserver(SocketReactor* pReactor, const Poco::AbstractObserver& observer)
+{
+ _nc.removeObserver(observer);
+ EventSet::iterator it = _events.end();
+ if (observer.accepts(pReactor->_pReadableNotification))
+ it = _events.find(pReactor->_pReadableNotification.get());
+ else if (observer.accepts(pReactor->_pWritableNotification))
+ it = _events.find(pReactor->_pWritableNotification.get());
+ else if (observer.accepts(pReactor->_pErrorNotification))
+ it = _events.find(pReactor->_pErrorNotification.get());
+ else if (observer.accepts(pReactor->_pTimeoutNotification))
+ it = _events.find(pReactor->_pTimeoutNotification.get());
+ if (it != _events.end())
+ _events.erase(it);
+}
+
+
+namespace
+{
+ static Socket nullSocket;
+}
+
+
+void SocketNotifier::dispatch(SocketNotification* pNotification)
+{
+ pNotification->setSocket(_socket);
+ pNotification->duplicate();
+ try
+ {
+ _nc.postNotification(pNotification);
+ }
+ catch (...)
+ {
+ pNotification->setSocket(nullSocket);
+ throw;
+ }
+ pNotification->setSocket(nullSocket);
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/SocketReactor.cpp b/contrib/libs/poco/Net/src/SocketReactor.cpp
index 65ead0272a..79150e2842 100644
--- a/contrib/libs/poco/Net/src/SocketReactor.cpp
+++ b/contrib/libs/poco/Net/src/SocketReactor.cpp
@@ -1,297 +1,297 @@
-//
-// SocketReactor.cpp
-//
-// Library: Net
-// Package: Reactor
-// Module: SocketReactor
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/SocketReactor.h"
-#include "Poco/Net/SocketNotification.h"
-#include "Poco/Net/SocketNotifier.h"
-#include "Poco/ErrorHandler.h"
-#include "Poco/Thread.h"
-#include "Poco/Exception.h"
-
-
-using Poco::FastMutex;
-using Poco::Exception;
-using Poco::ErrorHandler;
-
-
-namespace Poco {
-namespace Net {
-
-
-SocketReactor::SocketReactor():
- _stop(false),
- _timeout(DEFAULT_TIMEOUT),
- _pReadableNotification(new ReadableNotification(this)),
- _pWritableNotification(new WritableNotification(this)),
- _pErrorNotification(new ErrorNotification(this)),
- _pTimeoutNotification(new TimeoutNotification(this)),
- _pIdleNotification(new IdleNotification(this)),
- _pShutdownNotification(new ShutdownNotification(this)),
- _pThread(0)
-{
-}
-
-
-SocketReactor::SocketReactor(const Poco::Timespan& timeout):
- _stop(false),
- _timeout(timeout),
- _pReadableNotification(new ReadableNotification(this)),
- _pWritableNotification(new WritableNotification(this)),
- _pErrorNotification(new ErrorNotification(this)),
- _pTimeoutNotification(new TimeoutNotification(this)),
- _pIdleNotification(new IdleNotification(this)),
- _pShutdownNotification(new ShutdownNotification(this)),
- _pThread(0)
-{
-}
-
-
-SocketReactor::~SocketReactor()
-{
-}
-
-
-void SocketReactor::run()
-{
- _pThread = Thread::current();
-
- Socket::SocketList readable;
- Socket::SocketList writable;
- Socket::SocketList except;
-
- while (!_stop)
- {
- try
- {
- readable.clear();
- writable.clear();
- except.clear();
- int nSockets = 0;
- {
- FastMutex::ScopedLock lock(_mutex);
- for (EventHandlerMap::iterator it = _handlers.begin(); it != _handlers.end(); ++it)
- {
- if (it->second->accepts(_pReadableNotification))
- {
- readable.push_back(it->first);
- nSockets++;
- }
- if (it->second->accepts(_pWritableNotification))
- {
- writable.push_back(it->first);
- nSockets++;
- }
- if (it->second->accepts(_pErrorNotification))
- {
- except.push_back(it->first);
- nSockets++;
- }
- }
- }
- if (nSockets == 0)
- {
- onIdle();
- Thread::trySleep(static_cast<long>(_timeout.totalMilliseconds()));
- }
- else if (Socket::select(readable, writable, except, _timeout))
- {
- onBusy();
-
- for (Socket::SocketList::iterator it = readable.begin(); it != readable.end(); ++it)
- dispatch(*it, _pReadableNotification);
- for (Socket::SocketList::iterator it = writable.begin(); it != writable.end(); ++it)
- dispatch(*it, _pWritableNotification);
- for (Socket::SocketList::iterator it = except.begin(); it != except.end(); ++it)
- dispatch(*it, _pErrorNotification);
- }
- else onTimeout();
- }
- catch (Exception& exc)
- {
- ErrorHandler::handle(exc);
- }
- catch (std::exception& exc)
- {
- ErrorHandler::handle(exc);
- }
- catch (...)
- {
- ErrorHandler::handle();
- }
- }
- onShutdown();
-}
-
-
-void SocketReactor::stop()
-{
- _stop = true;
-}
-
-
-void SocketReactor::wakeUp()
-{
- if (_pThread) _pThread->wakeUp();
-}
-
-
-void SocketReactor::setTimeout(const Poco::Timespan& timeout)
-{
- _timeout = timeout;
-}
-
-
-const Poco::Timespan& SocketReactor::getTimeout() const
-{
- return _timeout;
-}
-
-
-void SocketReactor::addEventHandler(const Socket& socket, const Poco::AbstractObserver& observer)
-{
- NotifierPtr pNotifier;
- {
- FastMutex::ScopedLock lock(_mutex);
-
- EventHandlerMap::iterator it = _handlers.find(socket);
- if (it == _handlers.end())
- {
- pNotifier = new SocketNotifier(socket);
- _handlers[socket] = pNotifier;
- }
- else pNotifier = it->second;
- }
- if (!pNotifier->hasObserver(observer))
- pNotifier->addObserver(this, observer);
-}
-
-
-bool SocketReactor::hasEventHandler(const Socket& socket, const Poco::AbstractObserver& observer)
-{
- NotifierPtr pNotifier;
- {
- FastMutex::ScopedLock lock(_mutex);
-
- EventHandlerMap::iterator it = _handlers.find(socket);
- if (it != _handlers.end())
- {
- if (it->second->hasObserver(observer))
- return true;
- }
- }
-
- return false;
-}
-
-
-void SocketReactor::removeEventHandler(const Socket& socket, const Poco::AbstractObserver& observer)
-{
- NotifierPtr pNotifier;
- {
- FastMutex::ScopedLock lock(_mutex);
-
- EventHandlerMap::iterator it = _handlers.find(socket);
- if (it != _handlers.end())
- {
- pNotifier = it->second;
- if (pNotifier->hasObserver(observer) && pNotifier->countObservers() == 1)
- {
- _handlers.erase(it);
- }
- }
- }
- if (pNotifier && pNotifier->hasObserver(observer))
- {
- pNotifier->removeObserver(this, observer);
- }
-
-}
-
-
-void SocketReactor::onTimeout()
-{
- dispatch(_pTimeoutNotification);
-}
-
-
-void SocketReactor::onIdle()
-{
- dispatch(_pIdleNotification);
-}
-
-
-void SocketReactor::onShutdown()
-{
- dispatch(_pShutdownNotification);
-}
-
-
-void SocketReactor::onBusy()
-{
-}
-
-
-void SocketReactor::dispatch(const Socket& socket, SocketNotification* pNotification)
-{
- NotifierPtr pNotifier;
- {
- FastMutex::ScopedLock lock(_mutex);
- EventHandlerMap::iterator it = _handlers.find(socket);
- if (it != _handlers.end())
- pNotifier = it->second;
- else
- return;
- }
- dispatch(pNotifier, pNotification);
-}
-
-
-void SocketReactor::dispatch(SocketNotification* pNotification)
-{
- std::vector<NotifierPtr> delegates;
- delegates.reserve(_handlers.size());
- {
- FastMutex::ScopedLock lock(_mutex);
- for (EventHandlerMap::iterator it = _handlers.begin(); it != _handlers.end(); ++it)
- delegates.push_back(it->second);
- }
- for (std::vector<NotifierPtr>::iterator it = delegates.begin(); it != delegates.end(); ++it)
- {
- dispatch(*it, pNotification);
- }
-}
-
-
-void SocketReactor::dispatch(NotifierPtr& pNotifier, SocketNotification* pNotification)
-{
- try
- {
- pNotifier->dispatch(pNotification);
- }
- catch (Exception& exc)
- {
- ErrorHandler::handle(exc);
- }
- catch (std::exception& exc)
- {
- ErrorHandler::handle(exc);
- }
- catch (...)
- {
- ErrorHandler::handle();
- }
-}
-
-
-} } // namespace Poco::Net
+//
+// SocketReactor.cpp
+//
+// Library: Net
+// Package: Reactor
+// Module: SocketReactor
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/SocketReactor.h"
+#include "Poco/Net/SocketNotification.h"
+#include "Poco/Net/SocketNotifier.h"
+#include "Poco/ErrorHandler.h"
+#include "Poco/Thread.h"
+#include "Poco/Exception.h"
+
+
+using Poco::FastMutex;
+using Poco::Exception;
+using Poco::ErrorHandler;
+
+
+namespace Poco {
+namespace Net {
+
+
+SocketReactor::SocketReactor():
+ _stop(false),
+ _timeout(DEFAULT_TIMEOUT),
+ _pReadableNotification(new ReadableNotification(this)),
+ _pWritableNotification(new WritableNotification(this)),
+ _pErrorNotification(new ErrorNotification(this)),
+ _pTimeoutNotification(new TimeoutNotification(this)),
+ _pIdleNotification(new IdleNotification(this)),
+ _pShutdownNotification(new ShutdownNotification(this)),
+ _pThread(0)
+{
+}
+
+
+SocketReactor::SocketReactor(const Poco::Timespan& timeout):
+ _stop(false),
+ _timeout(timeout),
+ _pReadableNotification(new ReadableNotification(this)),
+ _pWritableNotification(new WritableNotification(this)),
+ _pErrorNotification(new ErrorNotification(this)),
+ _pTimeoutNotification(new TimeoutNotification(this)),
+ _pIdleNotification(new IdleNotification(this)),
+ _pShutdownNotification(new ShutdownNotification(this)),
+ _pThread(0)
+{
+}
+
+
+SocketReactor::~SocketReactor()
+{
+}
+
+
+void SocketReactor::run()
+{
+ _pThread = Thread::current();
+
+ Socket::SocketList readable;
+ Socket::SocketList writable;
+ Socket::SocketList except;
+
+ while (!_stop)
+ {
+ try
+ {
+ readable.clear();
+ writable.clear();
+ except.clear();
+ int nSockets = 0;
+ {
+ FastMutex::ScopedLock lock(_mutex);
+ for (EventHandlerMap::iterator it = _handlers.begin(); it != _handlers.end(); ++it)
+ {
+ if (it->second->accepts(_pReadableNotification))
+ {
+ readable.push_back(it->first);
+ nSockets++;
+ }
+ if (it->second->accepts(_pWritableNotification))
+ {
+ writable.push_back(it->first);
+ nSockets++;
+ }
+ if (it->second->accepts(_pErrorNotification))
+ {
+ except.push_back(it->first);
+ nSockets++;
+ }
+ }
+ }
+ if (nSockets == 0)
+ {
+ onIdle();
+ Thread::trySleep(static_cast<long>(_timeout.totalMilliseconds()));
+ }
+ else if (Socket::select(readable, writable, except, _timeout))
+ {
+ onBusy();
+
+ for (Socket::SocketList::iterator it = readable.begin(); it != readable.end(); ++it)
+ dispatch(*it, _pReadableNotification);
+ for (Socket::SocketList::iterator it = writable.begin(); it != writable.end(); ++it)
+ dispatch(*it, _pWritableNotification);
+ for (Socket::SocketList::iterator it = except.begin(); it != except.end(); ++it)
+ dispatch(*it, _pErrorNotification);
+ }
+ else onTimeout();
+ }
+ catch (Exception& exc)
+ {
+ ErrorHandler::handle(exc);
+ }
+ catch (std::exception& exc)
+ {
+ ErrorHandler::handle(exc);
+ }
+ catch (...)
+ {
+ ErrorHandler::handle();
+ }
+ }
+ onShutdown();
+}
+
+
+void SocketReactor::stop()
+{
+ _stop = true;
+}
+
+
+void SocketReactor::wakeUp()
+{
+ if (_pThread) _pThread->wakeUp();
+}
+
+
+void SocketReactor::setTimeout(const Poco::Timespan& timeout)
+{
+ _timeout = timeout;
+}
+
+
+const Poco::Timespan& SocketReactor::getTimeout() const
+{
+ return _timeout;
+}
+
+
+void SocketReactor::addEventHandler(const Socket& socket, const Poco::AbstractObserver& observer)
+{
+ NotifierPtr pNotifier;
+ {
+ FastMutex::ScopedLock lock(_mutex);
+
+ EventHandlerMap::iterator it = _handlers.find(socket);
+ if (it == _handlers.end())
+ {
+ pNotifier = new SocketNotifier(socket);
+ _handlers[socket] = pNotifier;
+ }
+ else pNotifier = it->second;
+ }
+ if (!pNotifier->hasObserver(observer))
+ pNotifier->addObserver(this, observer);
+}
+
+
+bool SocketReactor::hasEventHandler(const Socket& socket, const Poco::AbstractObserver& observer)
+{
+ NotifierPtr pNotifier;
+ {
+ FastMutex::ScopedLock lock(_mutex);
+
+ EventHandlerMap::iterator it = _handlers.find(socket);
+ if (it != _handlers.end())
+ {
+ if (it->second->hasObserver(observer))
+ return true;
+ }
+ }
+
+ return false;
+}
+
+
+void SocketReactor::removeEventHandler(const Socket& socket, const Poco::AbstractObserver& observer)
+{
+ NotifierPtr pNotifier;
+ {
+ FastMutex::ScopedLock lock(_mutex);
+
+ EventHandlerMap::iterator it = _handlers.find(socket);
+ if (it != _handlers.end())
+ {
+ pNotifier = it->second;
+ if (pNotifier->hasObserver(observer) && pNotifier->countObservers() == 1)
+ {
+ _handlers.erase(it);
+ }
+ }
+ }
+ if (pNotifier && pNotifier->hasObserver(observer))
+ {
+ pNotifier->removeObserver(this, observer);
+ }
+
+}
+
+
+void SocketReactor::onTimeout()
+{
+ dispatch(_pTimeoutNotification);
+}
+
+
+void SocketReactor::onIdle()
+{
+ dispatch(_pIdleNotification);
+}
+
+
+void SocketReactor::onShutdown()
+{
+ dispatch(_pShutdownNotification);
+}
+
+
+void SocketReactor::onBusy()
+{
+}
+
+
+void SocketReactor::dispatch(const Socket& socket, SocketNotification* pNotification)
+{
+ NotifierPtr pNotifier;
+ {
+ FastMutex::ScopedLock lock(_mutex);
+ EventHandlerMap::iterator it = _handlers.find(socket);
+ if (it != _handlers.end())
+ pNotifier = it->second;
+ else
+ return;
+ }
+ dispatch(pNotifier, pNotification);
+}
+
+
+void SocketReactor::dispatch(SocketNotification* pNotification)
+{
+ std::vector<NotifierPtr> delegates;
+ delegates.reserve(_handlers.size());
+ {
+ FastMutex::ScopedLock lock(_mutex);
+ for (EventHandlerMap::iterator it = _handlers.begin(); it != _handlers.end(); ++it)
+ delegates.push_back(it->second);
+ }
+ for (std::vector<NotifierPtr>::iterator it = delegates.begin(); it != delegates.end(); ++it)
+ {
+ dispatch(*it, pNotification);
+ }
+}
+
+
+void SocketReactor::dispatch(NotifierPtr& pNotifier, SocketNotification* pNotification)
+{
+ try
+ {
+ pNotifier->dispatch(pNotification);
+ }
+ catch (Exception& exc)
+ {
+ ErrorHandler::handle(exc);
+ }
+ catch (std::exception& exc)
+ {
+ ErrorHandler::handle(exc);
+ }
+ catch (...)
+ {
+ ErrorHandler::handle();
+ }
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/SocketStream.cpp b/contrib/libs/poco/Net/src/SocketStream.cpp
index a23f4a627d..77ae8c2442 100644
--- a/contrib/libs/poco/Net/src/SocketStream.cpp
+++ b/contrib/libs/poco/Net/src/SocketStream.cpp
@@ -1,156 +1,156 @@
-//
-// SocketStream.cpp
-//
-// Library: Net
-// Package: Sockets
-// Module: SocketStream
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/SocketStream.h"
-#include "Poco/Net/StreamSocketImpl.h"
-#include "Poco/Exception.h"
-
-
-using Poco::BufferedBidirectionalStreamBuf;
-using Poco::InvalidArgumentException;
-
-
-namespace Poco {
-namespace Net {
-
-
-//
-// SocketStreamBuf
-//
-
-
-SocketStreamBuf::SocketStreamBuf(const Socket& socket):
- BufferedBidirectionalStreamBuf(STREAM_BUFFER_SIZE, std::ios::in | std::ios::out),
- _pImpl(dynamic_cast<StreamSocketImpl*>(socket.impl()))
-{
- if (_pImpl)
- _pImpl->duplicate();
- else
- throw InvalidArgumentException("Invalid or null SocketImpl passed to SocketStreamBuf");
-}
-
-
-SocketStreamBuf::~SocketStreamBuf()
-{
- _pImpl->release();
-}
-
-
-int SocketStreamBuf::readFromDevice(char* buffer, std::streamsize length)
-{
- return _pImpl->receiveBytes(buffer, (int) length);
-}
-
-
-int SocketStreamBuf::writeToDevice(const char* buffer, std::streamsize length)
-{
- return _pImpl->sendBytes(buffer, (int) length);
-}
-
-
-//
-// SocketIOS
-//
-
-
-SocketIOS::SocketIOS(const Socket& socket):
- _buf(socket)
-{
- poco_ios_init(&_buf);
-}
-
-
-SocketIOS::~SocketIOS()
-{
- try
- {
- _buf.sync();
- }
- catch (...)
- {
- }
-}
-
-
-SocketStreamBuf* SocketIOS::rdbuf()
-{
- return &_buf;
-}
-
-
-void SocketIOS::close()
-{
- _buf.sync();
- _buf.socketImpl()->close();
-}
-
-
-StreamSocket SocketIOS::socket() const
-{
- return StreamSocket(_buf.socketImpl());
-}
-
-
-//
-// SocketOutputStream
-//
-
-
-SocketOutputStream::SocketOutputStream(const Socket& socket):
- SocketIOS(socket),
- std::ostream(&_buf)
-{
-}
-
-
-SocketOutputStream::~SocketOutputStream()
-{
-}
-
-
-//
-// SocketInputStream
-//
-
-
-SocketInputStream::SocketInputStream(const Socket& socket):
- SocketIOS(socket),
- std::istream(&_buf)
-{
-}
-
-
-SocketInputStream::~SocketInputStream()
-{
-}
-
-
-//
-// SocketStream
-//
-
-
-SocketStream::SocketStream(const Socket& socket):
- SocketIOS(socket),
- std::iostream(&_buf)
-{
-}
-
-
-SocketStream::~SocketStream()
-{
-}
-
-
-} } // namespace Poco::Net
+//
+// SocketStream.cpp
+//
+// Library: Net
+// Package: Sockets
+// Module: SocketStream
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/SocketStream.h"
+#include "Poco/Net/StreamSocketImpl.h"
+#include "Poco/Exception.h"
+
+
+using Poco::BufferedBidirectionalStreamBuf;
+using Poco::InvalidArgumentException;
+
+
+namespace Poco {
+namespace Net {
+
+
+//
+// SocketStreamBuf
+//
+
+
+SocketStreamBuf::SocketStreamBuf(const Socket& socket):
+ BufferedBidirectionalStreamBuf(STREAM_BUFFER_SIZE, std::ios::in | std::ios::out),
+ _pImpl(dynamic_cast<StreamSocketImpl*>(socket.impl()))
+{
+ if (_pImpl)
+ _pImpl->duplicate();
+ else
+ throw InvalidArgumentException("Invalid or null SocketImpl passed to SocketStreamBuf");
+}
+
+
+SocketStreamBuf::~SocketStreamBuf()
+{
+ _pImpl->release();
+}
+
+
+int SocketStreamBuf::readFromDevice(char* buffer, std::streamsize length)
+{
+ return _pImpl->receiveBytes(buffer, (int) length);
+}
+
+
+int SocketStreamBuf::writeToDevice(const char* buffer, std::streamsize length)
+{
+ return _pImpl->sendBytes(buffer, (int) length);
+}
+
+
+//
+// SocketIOS
+//
+
+
+SocketIOS::SocketIOS(const Socket& socket):
+ _buf(socket)
+{
+ poco_ios_init(&_buf);
+}
+
+
+SocketIOS::~SocketIOS()
+{
+ try
+ {
+ _buf.sync();
+ }
+ catch (...)
+ {
+ }
+}
+
+
+SocketStreamBuf* SocketIOS::rdbuf()
+{
+ return &_buf;
+}
+
+
+void SocketIOS::close()
+{
+ _buf.sync();
+ _buf.socketImpl()->close();
+}
+
+
+StreamSocket SocketIOS::socket() const
+{
+ return StreamSocket(_buf.socketImpl());
+}
+
+
+//
+// SocketOutputStream
+//
+
+
+SocketOutputStream::SocketOutputStream(const Socket& socket):
+ SocketIOS(socket),
+ std::ostream(&_buf)
+{
+}
+
+
+SocketOutputStream::~SocketOutputStream()
+{
+}
+
+
+//
+// SocketInputStream
+//
+
+
+SocketInputStream::SocketInputStream(const Socket& socket):
+ SocketIOS(socket),
+ std::istream(&_buf)
+{
+}
+
+
+SocketInputStream::~SocketInputStream()
+{
+}
+
+
+//
+// SocketStream
+//
+
+
+SocketStream::SocketStream(const Socket& socket):
+ SocketIOS(socket),
+ std::iostream(&_buf)
+{
+}
+
+
+SocketStream::~SocketStream()
+{
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/StreamSocket.cpp b/contrib/libs/poco/Net/src/StreamSocket.cpp
index 6675027c6d..598d2991c6 100644
--- a/contrib/libs/poco/Net/src/StreamSocket.cpp
+++ b/contrib/libs/poco/Net/src/StreamSocket.cpp
@@ -1,150 +1,150 @@
-//
-// StreamSocket.cpp
-//
-// Library: Net
-// Package: Sockets
-// Module: StreamSocket
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/StreamSocket.h"
-#include "Poco/Net/StreamSocketImpl.h"
-#include "Poco/FIFOBuffer.h"
-#include "Poco/Mutex.h"
-#include "Poco/Exception.h"
-
-
-using Poco::InvalidArgumentException;
-using Poco::Mutex;
-using Poco::ScopedLock;
-
-
-namespace Poco {
-namespace Net {
-
-
-StreamSocket::StreamSocket(): Socket(new StreamSocketImpl)
-{
-}
-
-
-StreamSocket::StreamSocket(const SocketAddress& address): Socket(new StreamSocketImpl(address.family()))
-{
- connect(address);
-}
-
-
-StreamSocket::StreamSocket(SocketAddress::Family family): Socket(new StreamSocketImpl(family))
-{
-}
-
-
-StreamSocket::StreamSocket(const Socket& socket): Socket(socket)
-{
- if (!dynamic_cast<StreamSocketImpl*>(impl()))
- throw InvalidArgumentException("Cannot assign incompatible socket");
-}
-
-
-StreamSocket::StreamSocket(SocketImpl* pImpl): Socket(pImpl)
-{
- if (!dynamic_cast<StreamSocketImpl*>(impl()))
- throw InvalidArgumentException("Cannot assign incompatible socket");
-}
-
-
-StreamSocket::~StreamSocket()
-{
-}
-
-
-StreamSocket& StreamSocket::operator = (const Socket& socket)
-{
- if (dynamic_cast<StreamSocketImpl*>(socket.impl()))
- Socket::operator = (socket);
- else
- throw InvalidArgumentException("Cannot assign incompatible socket");
- return *this;
-}
-
-
-void StreamSocket::connect(const SocketAddress& address)
-{
- impl()->connect(address);
-}
-
-
-void StreamSocket::connect(const SocketAddress& address, const Poco::Timespan& timeout)
-{
- impl()->connect(address, timeout);
-}
-
-
-void StreamSocket::connectNB(const SocketAddress& address)
-{
- impl()->connectNB(address);
-}
-
-
-void StreamSocket::shutdownReceive()
-{
- impl()->shutdownReceive();
-}
-
-
-void StreamSocket::shutdownSend()
-{
- impl()->shutdownSend();
-}
-
-
-void StreamSocket::shutdown()
-{
- impl()->shutdown();
-}
-
-
-int StreamSocket::sendBytes(const void* buffer, int length, int flags)
-{
- return impl()->sendBytes(buffer, length, flags);
-}
-
-
-int StreamSocket::sendBytes(FIFOBuffer& fifoBuf)
-{
- ScopedLock<Mutex> l(fifoBuf.mutex());
-
- int ret = impl()->sendBytes(fifoBuf.begin(), (int) fifoBuf.used());
- if (ret > 0) fifoBuf.drain(ret);
- return ret;
-}
-
-
-int StreamSocket::receiveBytes(void* buffer, int length, int flags)
-{
- return impl()->receiveBytes(buffer, length, flags);
-}
-
-
-int StreamSocket::receiveBytes(FIFOBuffer& fifoBuf)
-{
- ScopedLock<Mutex> l(fifoBuf.mutex());
-
- int ret = impl()->receiveBytes(fifoBuf.next(), (int)fifoBuf.available());
- if (ret > 0) fifoBuf.advance(ret);
- return ret;
-}
-
-
-void StreamSocket::sendUrgent(unsigned char data)
-{
- impl()->sendUrgent(data);
-}
-
-
-} } // namespace Poco::Net
+//
+// StreamSocket.cpp
+//
+// Library: Net
+// Package: Sockets
+// Module: StreamSocket
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/StreamSocket.h"
+#include "Poco/Net/StreamSocketImpl.h"
+#include "Poco/FIFOBuffer.h"
+#include "Poco/Mutex.h"
+#include "Poco/Exception.h"
+
+
+using Poco::InvalidArgumentException;
+using Poco::Mutex;
+using Poco::ScopedLock;
+
+
+namespace Poco {
+namespace Net {
+
+
+StreamSocket::StreamSocket(): Socket(new StreamSocketImpl)
+{
+}
+
+
+StreamSocket::StreamSocket(const SocketAddress& address): Socket(new StreamSocketImpl(address.family()))
+{
+ connect(address);
+}
+
+
+StreamSocket::StreamSocket(SocketAddress::Family family): Socket(new StreamSocketImpl(family))
+{
+}
+
+
+StreamSocket::StreamSocket(const Socket& socket): Socket(socket)
+{
+ if (!dynamic_cast<StreamSocketImpl*>(impl()))
+ throw InvalidArgumentException("Cannot assign incompatible socket");
+}
+
+
+StreamSocket::StreamSocket(SocketImpl* pImpl): Socket(pImpl)
+{
+ if (!dynamic_cast<StreamSocketImpl*>(impl()))
+ throw InvalidArgumentException("Cannot assign incompatible socket");
+}
+
+
+StreamSocket::~StreamSocket()
+{
+}
+
+
+StreamSocket& StreamSocket::operator = (const Socket& socket)
+{
+ if (dynamic_cast<StreamSocketImpl*>(socket.impl()))
+ Socket::operator = (socket);
+ else
+ throw InvalidArgumentException("Cannot assign incompatible socket");
+ return *this;
+}
+
+
+void StreamSocket::connect(const SocketAddress& address)
+{
+ impl()->connect(address);
+}
+
+
+void StreamSocket::connect(const SocketAddress& address, const Poco::Timespan& timeout)
+{
+ impl()->connect(address, timeout);
+}
+
+
+void StreamSocket::connectNB(const SocketAddress& address)
+{
+ impl()->connectNB(address);
+}
+
+
+void StreamSocket::shutdownReceive()
+{
+ impl()->shutdownReceive();
+}
+
+
+void StreamSocket::shutdownSend()
+{
+ impl()->shutdownSend();
+}
+
+
+void StreamSocket::shutdown()
+{
+ impl()->shutdown();
+}
+
+
+int StreamSocket::sendBytes(const void* buffer, int length, int flags)
+{
+ return impl()->sendBytes(buffer, length, flags);
+}
+
+
+int StreamSocket::sendBytes(FIFOBuffer& fifoBuf)
+{
+ ScopedLock<Mutex> l(fifoBuf.mutex());
+
+ int ret = impl()->sendBytes(fifoBuf.begin(), (int) fifoBuf.used());
+ if (ret > 0) fifoBuf.drain(ret);
+ return ret;
+}
+
+
+int StreamSocket::receiveBytes(void* buffer, int length, int flags)
+{
+ return impl()->receiveBytes(buffer, length, flags);
+}
+
+
+int StreamSocket::receiveBytes(FIFOBuffer& fifoBuf)
+{
+ ScopedLock<Mutex> l(fifoBuf.mutex());
+
+ int ret = impl()->receiveBytes(fifoBuf.next(), (int)fifoBuf.available());
+ if (ret > 0) fifoBuf.advance(ret);
+ return ret;
+}
+
+
+void StreamSocket::sendUrgent(unsigned char data)
+{
+ impl()->sendUrgent(data);
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/StreamSocketImpl.cpp b/contrib/libs/poco/Net/src/StreamSocketImpl.cpp
index f1f0885f25..8116942db5 100644
--- a/contrib/libs/poco/Net/src/StreamSocketImpl.cpp
+++ b/contrib/libs/poco/Net/src/StreamSocketImpl.cpp
@@ -1,77 +1,77 @@
-//
-// StreamSocketImpl.cpp
-//
-// Library: Net
-// Package: Sockets
-// Module: StreamSocketImpl
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/StreamSocketImpl.h"
-#include "Poco/Exception.h"
-#include "Poco/Thread.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-StreamSocketImpl::StreamSocketImpl()
-{
-}
-
-
-StreamSocketImpl::StreamSocketImpl(SocketAddress::Family family)
-{
- if (family == SocketAddress::IPv4)
- init(AF_INET);
-#if defined(POCO_HAVE_IPv6)
- else if (family == SocketAddress::IPv6)
- init(AF_INET6);
-#endif
-#if defined(POCO_OS_FAMILY_UNIX)
- else if (family == SocketAddress::UNIX_LOCAL)
- init(AF_UNIX);
-#endif
- else throw Poco::InvalidArgumentException("Invalid or unsupported address family passed to StreamSocketImpl");
-}
-
-
-StreamSocketImpl::StreamSocketImpl(poco_socket_t sockfd): SocketImpl(sockfd)
-{
-}
-
-
-StreamSocketImpl::~StreamSocketImpl()
-{
-}
-
-
-int StreamSocketImpl::sendBytes(const void* buffer, int length, int flags)
-{
- const char* p = reinterpret_cast<const char*>(buffer);
- int remaining = length;
- int sent = 0;
- bool blocking = getBlocking();
- while (remaining > 0)
- {
- int n = SocketImpl::sendBytes(p, remaining, flags);
- poco_assert_dbg (n >= 0);
- p += n;
- sent += n;
- remaining -= n;
- if (blocking && remaining > 0)
- Poco::Thread::yield();
- else
- break;
- }
- return sent;
-}
-
-
-} } // namespace Poco::Net
+//
+// StreamSocketImpl.cpp
+//
+// Library: Net
+// Package: Sockets
+// Module: StreamSocketImpl
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/StreamSocketImpl.h"
+#include "Poco/Exception.h"
+#include "Poco/Thread.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+StreamSocketImpl::StreamSocketImpl()
+{
+}
+
+
+StreamSocketImpl::StreamSocketImpl(SocketAddress::Family family)
+{
+ if (family == SocketAddress::IPv4)
+ init(AF_INET);
+#if defined(POCO_HAVE_IPv6)
+ else if (family == SocketAddress::IPv6)
+ init(AF_INET6);
+#endif
+#if defined(POCO_OS_FAMILY_UNIX)
+ else if (family == SocketAddress::UNIX_LOCAL)
+ init(AF_UNIX);
+#endif
+ else throw Poco::InvalidArgumentException("Invalid or unsupported address family passed to StreamSocketImpl");
+}
+
+
+StreamSocketImpl::StreamSocketImpl(poco_socket_t sockfd): SocketImpl(sockfd)
+{
+}
+
+
+StreamSocketImpl::~StreamSocketImpl()
+{
+}
+
+
+int StreamSocketImpl::sendBytes(const void* buffer, int length, int flags)
+{
+ const char* p = reinterpret_cast<const char*>(buffer);
+ int remaining = length;
+ int sent = 0;
+ bool blocking = getBlocking();
+ while (remaining > 0)
+ {
+ int n = SocketImpl::sendBytes(p, remaining, flags);
+ poco_assert_dbg (n >= 0);
+ p += n;
+ sent += n;
+ remaining -= n;
+ if (blocking && remaining > 0)
+ Poco::Thread::yield();
+ else
+ break;
+ }
+ return sent;
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/StringPartSource.cpp b/contrib/libs/poco/Net/src/StringPartSource.cpp
index d007155a6c..a512449f69 100644
--- a/contrib/libs/poco/Net/src/StringPartSource.cpp
+++ b/contrib/libs/poco/Net/src/StringPartSource.cpp
@@ -1,67 +1,67 @@
-//
-// StringPartSource.cpp
-//
-// Library: Net
-// Package: Messages
-// Module: StringPartSource
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/StringPartSource.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-StringPartSource::StringPartSource(const std::string& str):
- PartSource("text/plain"),
- _istr(str)
-{
-}
-
-
-StringPartSource::StringPartSource(const std::string& str, const std::string& mediaType):
- PartSource(mediaType),
- _istr(str)
-{
-}
-
-
-StringPartSource::StringPartSource(const std::string& str, const std::string& mediaType, const std::string& filename):
- PartSource(mediaType),
- _istr(str),
- _filename(filename)
-{
-}
-
-
-StringPartSource::~StringPartSource()
-{
-}
-
-
-std::istream& StringPartSource::stream()
-{
- return _istr;
-}
-
-
-const std::string& StringPartSource::filename() const
-{
- return _filename;
-}
-
-
-std::streamsize StringPartSource::getContentLength() const
-{
- return _istr.str().length();
-}
-
-
-} } // namespace Poco::Net
+//
+// StringPartSource.cpp
+//
+// Library: Net
+// Package: Messages
+// Module: StringPartSource
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/StringPartSource.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+StringPartSource::StringPartSource(const std::string& str):
+ PartSource("text/plain"),
+ _istr(str)
+{
+}
+
+
+StringPartSource::StringPartSource(const std::string& str, const std::string& mediaType):
+ PartSource(mediaType),
+ _istr(str)
+{
+}
+
+
+StringPartSource::StringPartSource(const std::string& str, const std::string& mediaType, const std::string& filename):
+ PartSource(mediaType),
+ _istr(str),
+ _filename(filename)
+{
+}
+
+
+StringPartSource::~StringPartSource()
+{
+}
+
+
+std::istream& StringPartSource::stream()
+{
+ return _istr;
+}
+
+
+const std::string& StringPartSource::filename() const
+{
+ return _filename;
+}
+
+
+std::streamsize StringPartSource::getContentLength() const
+{
+ return _istr.str().length();
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/TCPServer.cpp b/contrib/libs/poco/Net/src/TCPServer.cpp
index 99d55f5a84..7a7282f785 100644
--- a/contrib/libs/poco/Net/src/TCPServer.cpp
+++ b/contrib/libs/poco/Net/src/TCPServer.cpp
@@ -1,243 +1,243 @@
-//
-// TCPServer.cpp
-//
-// Library: Net
-// Package: TCPServer
-// Module: TCPServer
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/TCPServer.h"
-#include "Poco/Net/TCPServerDispatcher.h"
-#include "Poco/Net/TCPServerConnection.h"
-#include "Poco/Net/TCPServerConnectionFactory.h"
-#include "Poco/Timespan.h"
-#include "Poco/Exception.h"
-#include "Poco/ErrorHandler.h"
-
-
-using Poco::ErrorHandler;
-
-
-namespace Poco {
-namespace Net {
-
-
-//
-// TCPServerConnectionFilter
-//
-
-
-TCPServerConnectionFilter::~TCPServerConnectionFilter()
-{
-}
-
-
-//
-// TCPServer
-//
-
-
-TCPServer::TCPServer(TCPServerConnectionFactory::Ptr pFactory, Poco::UInt16 portNumber, TCPServerParams::Ptr pParams):
- _socket(ServerSocket(portNumber)),
- _thread(threadName(_socket)),
- _stopped(true)
-{
- Poco::ThreadPool& pool = Poco::ThreadPool::defaultPool();
- if (pParams)
- {
- int toAdd = pParams->getMaxThreads() - pool.capacity();
- if (toAdd > 0) pool.addCapacity(toAdd);
- }
- _pDispatcher = new TCPServerDispatcher(pFactory, pool, pParams);
-
-}
-
-
-TCPServer::TCPServer(TCPServerConnectionFactory::Ptr pFactory, const ServerSocket& socket, TCPServerParams::Ptr pParams):
- _socket(socket),
- _thread(threadName(socket)),
- _stopped(true)
-{
- Poco::ThreadPool& pool = Poco::ThreadPool::defaultPool();
- if (pParams)
- {
- int toAdd = pParams->getMaxThreads() - pool.capacity();
- if (toAdd > 0) pool.addCapacity(toAdd);
- }
- _pDispatcher = new TCPServerDispatcher(pFactory, pool, pParams);
-}
-
-
-TCPServer::TCPServer(TCPServerConnectionFactory::Ptr pFactory, Poco::ThreadPool& threadPool, const ServerSocket& socket, TCPServerParams::Ptr pParams):
- _socket(socket),
- _pDispatcher(new TCPServerDispatcher(pFactory, threadPool, pParams)),
- _thread(threadName(socket)),
- _stopped(true)
-{
-}
-
-
-TCPServer::~TCPServer()
-{
- try
- {
- stop();
- _pDispatcher->release();
- }
- catch (...)
- {
- poco_unexpected();
- }
-}
-
-
-const TCPServerParams& TCPServer::params() const
-{
- return _pDispatcher->params();
-}
-
-
-void TCPServer::start()
-{
- poco_assert (_stopped);
-
- _stopped = false;
- _thread.start(*this);
-}
-
-
-void TCPServer::stop()
-{
- if (!_stopped)
- {
- _stopped = true;
- _thread.join();
- _pDispatcher->stop();
- }
-}
-
-
-void TCPServer::run()
-{
- while (!_stopped)
- {
- Poco::Timespan timeout(250000);
- try
- {
- if (_socket.poll(timeout, Socket::SELECT_READ))
- {
- try
- {
- StreamSocket ss = _socket.acceptConnection();
-
- if (!_pConnectionFilter || _pConnectionFilter->accept(ss))
- {
- // enable nodelay per default: OSX really needs that
-#if defined(POCO_OS_FAMILY_UNIX)
- if (ss.address().family() != AddressFamily::UNIX_LOCAL)
-#endif
- {
- ss.setNoDelay(true);
- }
- _pDispatcher->enqueue(ss);
- }
- }
- catch (Poco::Exception& exc)
- {
- ErrorHandler::handle(exc);
- }
- catch (std::exception& exc)
- {
- ErrorHandler::handle(exc);
- }
- catch (...)
- {
- ErrorHandler::handle();
- }
- }
- }
- catch (Poco::Exception& exc)
- {
- ErrorHandler::handle(exc);
- // possibly a resource issue since poll() failed;
- // give some time to recover before trying again
- Poco::Thread::sleep(50);
- }
- }
-}
-
-
-int TCPServer::currentThreads() const
-{
- return _pDispatcher->currentThreads();
-}
-
-
-int TCPServer::maxThreads() const
-{
- return _pDispatcher->maxThreads();
-}
-
-
-int TCPServer::totalConnections() const
-{
- return _pDispatcher->totalConnections();
-}
-
-
-int TCPServer::currentConnections() const
-{
- return _pDispatcher->currentConnections();
-}
-
-
-int TCPServer::maxConcurrentConnections() const
-{
- return _pDispatcher->maxConcurrentConnections();
-}
-
-
-int TCPServer::queuedConnections() const
-{
- return _pDispatcher->queuedConnections();
-}
-
-
-int TCPServer::refusedConnections() const
-{
- return _pDispatcher->refusedConnections();
-}
-
-
-void TCPServer::setConnectionFilter(const TCPServerConnectionFilter::Ptr& pConnectionFilter)
-{
- poco_assert (_stopped);
-
- _pConnectionFilter = pConnectionFilter;
-}
-
-
-std::string TCPServer::threadName(const ServerSocket& socket)
-{
-#if _WIN32_WCE == 0x0800
- // Workaround for WEC2013: only the first call to getsockname()
- // succeeds. To mitigate the impact of this bug, do not call
- // socket.address(), which calls getsockname(), here.
- std::string name("TCPServer");
- #pragma message("Using WEC2013 getsockname() workaround in TCPServer::threadName(). Remove when no longer needed.")
-#else
- std::string name("TCPServer: ");
- name.append(socket.address().toString());
-#endif
- return name;
-
-}
-
-
-} } // namespace Poco::Net
+//
+// TCPServer.cpp
+//
+// Library: Net
+// Package: TCPServer
+// Module: TCPServer
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/TCPServer.h"
+#include "Poco/Net/TCPServerDispatcher.h"
+#include "Poco/Net/TCPServerConnection.h"
+#include "Poco/Net/TCPServerConnectionFactory.h"
+#include "Poco/Timespan.h"
+#include "Poco/Exception.h"
+#include "Poco/ErrorHandler.h"
+
+
+using Poco::ErrorHandler;
+
+
+namespace Poco {
+namespace Net {
+
+
+//
+// TCPServerConnectionFilter
+//
+
+
+TCPServerConnectionFilter::~TCPServerConnectionFilter()
+{
+}
+
+
+//
+// TCPServer
+//
+
+
+TCPServer::TCPServer(TCPServerConnectionFactory::Ptr pFactory, Poco::UInt16 portNumber, TCPServerParams::Ptr pParams):
+ _socket(ServerSocket(portNumber)),
+ _thread(threadName(_socket)),
+ _stopped(true)
+{
+ Poco::ThreadPool& pool = Poco::ThreadPool::defaultPool();
+ if (pParams)
+ {
+ int toAdd = pParams->getMaxThreads() - pool.capacity();
+ if (toAdd > 0) pool.addCapacity(toAdd);
+ }
+ _pDispatcher = new TCPServerDispatcher(pFactory, pool, pParams);
+
+}
+
+
+TCPServer::TCPServer(TCPServerConnectionFactory::Ptr pFactory, const ServerSocket& socket, TCPServerParams::Ptr pParams):
+ _socket(socket),
+ _thread(threadName(socket)),
+ _stopped(true)
+{
+ Poco::ThreadPool& pool = Poco::ThreadPool::defaultPool();
+ if (pParams)
+ {
+ int toAdd = pParams->getMaxThreads() - pool.capacity();
+ if (toAdd > 0) pool.addCapacity(toAdd);
+ }
+ _pDispatcher = new TCPServerDispatcher(pFactory, pool, pParams);
+}
+
+
+TCPServer::TCPServer(TCPServerConnectionFactory::Ptr pFactory, Poco::ThreadPool& threadPool, const ServerSocket& socket, TCPServerParams::Ptr pParams):
+ _socket(socket),
+ _pDispatcher(new TCPServerDispatcher(pFactory, threadPool, pParams)),
+ _thread(threadName(socket)),
+ _stopped(true)
+{
+}
+
+
+TCPServer::~TCPServer()
+{
+ try
+ {
+ stop();
+ _pDispatcher->release();
+ }
+ catch (...)
+ {
+ poco_unexpected();
+ }
+}
+
+
+const TCPServerParams& TCPServer::params() const
+{
+ return _pDispatcher->params();
+}
+
+
+void TCPServer::start()
+{
+ poco_assert (_stopped);
+
+ _stopped = false;
+ _thread.start(*this);
+}
+
+
+void TCPServer::stop()
+{
+ if (!_stopped)
+ {
+ _stopped = true;
+ _thread.join();
+ _pDispatcher->stop();
+ }
+}
+
+
+void TCPServer::run()
+{
+ while (!_stopped)
+ {
+ Poco::Timespan timeout(250000);
+ try
+ {
+ if (_socket.poll(timeout, Socket::SELECT_READ))
+ {
+ try
+ {
+ StreamSocket ss = _socket.acceptConnection();
+
+ if (!_pConnectionFilter || _pConnectionFilter->accept(ss))
+ {
+ // enable nodelay per default: OSX really needs that
+#if defined(POCO_OS_FAMILY_UNIX)
+ if (ss.address().family() != AddressFamily::UNIX_LOCAL)
+#endif
+ {
+ ss.setNoDelay(true);
+ }
+ _pDispatcher->enqueue(ss);
+ }
+ }
+ catch (Poco::Exception& exc)
+ {
+ ErrorHandler::handle(exc);
+ }
+ catch (std::exception& exc)
+ {
+ ErrorHandler::handle(exc);
+ }
+ catch (...)
+ {
+ ErrorHandler::handle();
+ }
+ }
+ }
+ catch (Poco::Exception& exc)
+ {
+ ErrorHandler::handle(exc);
+ // possibly a resource issue since poll() failed;
+ // give some time to recover before trying again
+ Poco::Thread::sleep(50);
+ }
+ }
+}
+
+
+int TCPServer::currentThreads() const
+{
+ return _pDispatcher->currentThreads();
+}
+
+
+int TCPServer::maxThreads() const
+{
+ return _pDispatcher->maxThreads();
+}
+
+
+int TCPServer::totalConnections() const
+{
+ return _pDispatcher->totalConnections();
+}
+
+
+int TCPServer::currentConnections() const
+{
+ return _pDispatcher->currentConnections();
+}
+
+
+int TCPServer::maxConcurrentConnections() const
+{
+ return _pDispatcher->maxConcurrentConnections();
+}
+
+
+int TCPServer::queuedConnections() const
+{
+ return _pDispatcher->queuedConnections();
+}
+
+
+int TCPServer::refusedConnections() const
+{
+ return _pDispatcher->refusedConnections();
+}
+
+
+void TCPServer::setConnectionFilter(const TCPServerConnectionFilter::Ptr& pConnectionFilter)
+{
+ poco_assert (_stopped);
+
+ _pConnectionFilter = pConnectionFilter;
+}
+
+
+std::string TCPServer::threadName(const ServerSocket& socket)
+{
+#if _WIN32_WCE == 0x0800
+ // Workaround for WEC2013: only the first call to getsockname()
+ // succeeds. To mitigate the impact of this bug, do not call
+ // socket.address(), which calls getsockname(), here.
+ std::string name("TCPServer");
+ #pragma message("Using WEC2013 getsockname() workaround in TCPServer::threadName(). Remove when no longer needed.")
+#else
+ std::string name("TCPServer: ");
+ name.append(socket.address().toString());
+#endif
+ return name;
+
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/TCPServerConnection.cpp b/contrib/libs/poco/Net/src/TCPServerConnection.cpp
index 4af6c8027a..1072b182c2 100644
--- a/contrib/libs/poco/Net/src/TCPServerConnection.cpp
+++ b/contrib/libs/poco/Net/src/TCPServerConnection.cpp
@@ -1,60 +1,60 @@
-//
-// TCPServerConnection.cpp
-//
-// Library: Net
-// Package: TCPServer
-// Module: TCPServerConnection
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/TCPServerConnection.h"
-#include "Poco/Exception.h"
-#include "Poco/ErrorHandler.h"
-
-
-using Poco::Exception;
-using Poco::ErrorHandler;
-
-
-namespace Poco {
-namespace Net {
-
-
-TCPServerConnection::TCPServerConnection(const StreamSocket& socket):
- _socket(socket)
-{
-}
-
-
-TCPServerConnection::~TCPServerConnection()
-{
-}
-
-
-void TCPServerConnection::start()
-{
- try
- {
- run();
- }
- catch (Exception& exc)
- {
- ErrorHandler::handle(exc);
- }
- catch (std::exception& exc)
- {
- ErrorHandler::handle(exc);
- }
- catch (...)
- {
- ErrorHandler::handle();
- }
-}
-
-
-} } // namespace Poco::Net
+//
+// TCPServerConnection.cpp
+//
+// Library: Net
+// Package: TCPServer
+// Module: TCPServerConnection
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/TCPServerConnection.h"
+#include "Poco/Exception.h"
+#include "Poco/ErrorHandler.h"
+
+
+using Poco::Exception;
+using Poco::ErrorHandler;
+
+
+namespace Poco {
+namespace Net {
+
+
+TCPServerConnection::TCPServerConnection(const StreamSocket& socket):
+ _socket(socket)
+{
+}
+
+
+TCPServerConnection::~TCPServerConnection()
+{
+}
+
+
+void TCPServerConnection::start()
+{
+ try
+ {
+ run();
+ }
+ catch (Exception& exc)
+ {
+ ErrorHandler::handle(exc);
+ }
+ catch (std::exception& exc)
+ {
+ ErrorHandler::handle(exc);
+ }
+ catch (...)
+ {
+ ErrorHandler::handle();
+ }
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/TCPServerConnectionFactory.cpp b/contrib/libs/poco/Net/src/TCPServerConnectionFactory.cpp
index 074fda5739..a861e433d9 100644
--- a/contrib/libs/poco/Net/src/TCPServerConnectionFactory.cpp
+++ b/contrib/libs/poco/Net/src/TCPServerConnectionFactory.cpp
@@ -1,32 +1,32 @@
-//
-// TCPServerConnectionFactory.cpp
-//
-// Library: Net
-// Package: TCPServer
-// Module: TCPServerConnectionFactory
-//
-// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/TCPServerConnectionFactory.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-TCPServerConnectionFactory::TCPServerConnectionFactory()
-{
-}
-
-
-TCPServerConnectionFactory::~TCPServerConnectionFactory()
-{
-}
-
-
-} } // namespace Poco::Net
+//
+// TCPServerConnectionFactory.cpp
+//
+// Library: Net
+// Package: TCPServer
+// Module: TCPServerConnectionFactory
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/TCPServerConnectionFactory.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+TCPServerConnectionFactory::TCPServerConnectionFactory()
+{
+}
+
+
+TCPServerConnectionFactory::~TCPServerConnectionFactory()
+{
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/TCPServerDispatcher.cpp b/contrib/libs/poco/Net/src/TCPServerDispatcher.cpp
index af40bb9925..01474ec526 100644
--- a/contrib/libs/poco/Net/src/TCPServerDispatcher.cpp
+++ b/contrib/libs/poco/Net/src/TCPServerDispatcher.cpp
@@ -1,256 +1,256 @@
-//
-// TCPServerDispatcher.cpp
-//
-// Library: Net
-// Package: TCPServer
-// Module: TCPServerDispatcher
-//
-// Copyright (c) 2005-2007, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/TCPServerDispatcher.h"
-#include "Poco/Net/TCPServerConnectionFactory.h"
-#include "Poco/Notification.h"
-#include "Poco/AutoPtr.h"
-#include <memory>
-
-
-using Poco::Notification;
-using Poco::FastMutex;
-using Poco::AutoPtr;
-
-
-namespace Poco {
-namespace Net {
-
-
-class TCPConnectionNotification: public Notification
-{
-public:
- TCPConnectionNotification(const StreamSocket& socket):
- _socket(socket)
- {
- }
-
- ~TCPConnectionNotification()
- {
- }
-
- const StreamSocket& socket() const
- {
- return _socket;
- }
-
-private:
- StreamSocket _socket;
-};
-
-
-TCPServerDispatcher::TCPServerDispatcher(TCPServerConnectionFactory::Ptr pFactory, Poco::ThreadPool& threadPool, TCPServerParams::Ptr pParams):
- _rc(1),
- _pParams(pParams),
- _currentThreads(0),
- _totalConnections(0),
- _currentConnections(0),
- _maxConcurrentConnections(0),
- _refusedConnections(0),
- _stopped(false),
- _pConnectionFactory(pFactory),
- _threadPool(threadPool)
-{
- poco_check_ptr (pFactory);
-
- if (!_pParams)
- _pParams = new TCPServerParams;
-
- if (_pParams->getMaxThreads() == 0)
- _pParams->setMaxThreads(threadPool.capacity());
-}
-
-
-TCPServerDispatcher::~TCPServerDispatcher()
-{
-}
-
-
-void TCPServerDispatcher::duplicate()
-{
- _mutex.lock();
- ++_rc;
- _mutex.unlock();
-}
-
-
-void TCPServerDispatcher::release()
-{
- _mutex.lock();
- int rc = --_rc;
- _mutex.unlock();
- if (rc == 0) delete this;
-}
-
-
-void TCPServerDispatcher::run()
-{
- try
- {
- AutoPtr<TCPServerDispatcher> guard(this, true); // ensure object stays alive
-
- int idleTime = (int) _pParams->getThreadIdleTime().totalMilliseconds();
-
- for (;;)
- {
- AutoPtr<Notification> pNf = _queue.waitDequeueNotification(idleTime);
- if (pNf)
- {
- TCPConnectionNotification* pCNf = dynamic_cast<TCPConnectionNotification*>(pNf.get());
- if (pCNf)
- {
-#ifndef POCO_ENABLE_CPP11
- std::auto_ptr<TCPServerConnection> pConnection(_pConnectionFactory->createConnection(pCNf->socket()));
-#else
- std::unique_ptr<TCPServerConnection> pConnection(_pConnectionFactory->createConnection(pCNf->socket()));
-#endif // POCO_ENABLE_CPP11
- poco_check_ptr(pConnection.get());
- beginConnection();
- pConnection->start();
- endConnection();
- }
- }
-
- FastMutex::ScopedLock lock(_mutex);
- if (_stopped || (_currentThreads > 1 && _queue.empty()))
- {
- --_currentThreads;
- break;
- }
- }
- }
- catch (...)
- {
- FastMutex::ScopedLock lock(_mutex);
- --_currentThreads;
- throw;
- }
-}
-
-
-namespace
-{
- static const std::string threadName("TCPServerConnection");
-}
-
-
-void TCPServerDispatcher::enqueue(const StreamSocket& socket)
-{
- FastMutex::ScopedLock lock(_mutex);
-
- if (_queue.size() < _pParams->getMaxQueued())
- {
- if (!_queue.hasIdleThreads() && _currentThreads < _pParams->getMaxThreads())
- {
- try
- {
- _threadPool.startWithPriority(_pParams->getThreadPriority(), *this, threadName);
- ++_currentThreads;
- }
- catch (Poco::Exception&)
- {
- ++_refusedConnections;
- return;
- }
- }
- _queue.enqueueNotification(new TCPConnectionNotification(socket));
- }
- else
- {
- ++_refusedConnections;
- }
-}
-
-
-void TCPServerDispatcher::stop()
-{
- _stopped = true;
- _queue.clear();
- _queue.wakeUpAll();
-}
-
-
-int TCPServerDispatcher::currentThreads() const
-{
- FastMutex::ScopedLock lock(_mutex);
-
- return _currentThreads;
-}
-
-int TCPServerDispatcher::maxThreads() const
-{
- FastMutex::ScopedLock lock(_mutex);
-
- return _threadPool.capacity();
-}
-
-
-int TCPServerDispatcher::totalConnections() const
-{
- FastMutex::ScopedLock lock(_mutex);
-
- return _totalConnections;
-}
-
-
-int TCPServerDispatcher::currentConnections() const
-{
- FastMutex::ScopedLock lock(_mutex);
-
- return _currentConnections;
-}
-
-
-int TCPServerDispatcher::maxConcurrentConnections() const
-{
- FastMutex::ScopedLock lock(_mutex);
-
- return _maxConcurrentConnections;
-}
-
-
-int TCPServerDispatcher::queuedConnections() const
-{
- return _queue.size();
-}
-
-
-int TCPServerDispatcher::refusedConnections() const
-{
- FastMutex::ScopedLock lock(_mutex);
-
- return _refusedConnections;
-}
-
-
-void TCPServerDispatcher::beginConnection()
-{
- FastMutex::ScopedLock lock(_mutex);
-
- ++_totalConnections;
- ++_currentConnections;
- if (_currentConnections > _maxConcurrentConnections)
- _maxConcurrentConnections = _currentConnections;
-}
-
-
-void TCPServerDispatcher::endConnection()
-{
- FastMutex::ScopedLock lock(_mutex);
-
- --_currentConnections;
-}
-
-
-} } // namespace Poco::Net
+//
+// TCPServerDispatcher.cpp
+//
+// Library: Net
+// Package: TCPServer
+// Module: TCPServerDispatcher
+//
+// Copyright (c) 2005-2007, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/TCPServerDispatcher.h"
+#include "Poco/Net/TCPServerConnectionFactory.h"
+#include "Poco/Notification.h"
+#include "Poco/AutoPtr.h"
+#include <memory>
+
+
+using Poco::Notification;
+using Poco::FastMutex;
+using Poco::AutoPtr;
+
+
+namespace Poco {
+namespace Net {
+
+
+class TCPConnectionNotification: public Notification
+{
+public:
+ TCPConnectionNotification(const StreamSocket& socket):
+ _socket(socket)
+ {
+ }
+
+ ~TCPConnectionNotification()
+ {
+ }
+
+ const StreamSocket& socket() const
+ {
+ return _socket;
+ }
+
+private:
+ StreamSocket _socket;
+};
+
+
+TCPServerDispatcher::TCPServerDispatcher(TCPServerConnectionFactory::Ptr pFactory, Poco::ThreadPool& threadPool, TCPServerParams::Ptr pParams):
+ _rc(1),
+ _pParams(pParams),
+ _currentThreads(0),
+ _totalConnections(0),
+ _currentConnections(0),
+ _maxConcurrentConnections(0),
+ _refusedConnections(0),
+ _stopped(false),
+ _pConnectionFactory(pFactory),
+ _threadPool(threadPool)
+{
+ poco_check_ptr (pFactory);
+
+ if (!_pParams)
+ _pParams = new TCPServerParams;
+
+ if (_pParams->getMaxThreads() == 0)
+ _pParams->setMaxThreads(threadPool.capacity());
+}
+
+
+TCPServerDispatcher::~TCPServerDispatcher()
+{
+}
+
+
+void TCPServerDispatcher::duplicate()
+{
+ _mutex.lock();
+ ++_rc;
+ _mutex.unlock();
+}
+
+
+void TCPServerDispatcher::release()
+{
+ _mutex.lock();
+ int rc = --_rc;
+ _mutex.unlock();
+ if (rc == 0) delete this;
+}
+
+
+void TCPServerDispatcher::run()
+{
+ try
+ {
+ AutoPtr<TCPServerDispatcher> guard(this, true); // ensure object stays alive
+
+ int idleTime = (int) _pParams->getThreadIdleTime().totalMilliseconds();
+
+ for (;;)
+ {
+ AutoPtr<Notification> pNf = _queue.waitDequeueNotification(idleTime);
+ if (pNf)
+ {
+ TCPConnectionNotification* pCNf = dynamic_cast<TCPConnectionNotification*>(pNf.get());
+ if (pCNf)
+ {
+#ifndef POCO_ENABLE_CPP11
+ std::auto_ptr<TCPServerConnection> pConnection(_pConnectionFactory->createConnection(pCNf->socket()));
+#else
+ std::unique_ptr<TCPServerConnection> pConnection(_pConnectionFactory->createConnection(pCNf->socket()));
+#endif // POCO_ENABLE_CPP11
+ poco_check_ptr(pConnection.get());
+ beginConnection();
+ pConnection->start();
+ endConnection();
+ }
+ }
+
+ FastMutex::ScopedLock lock(_mutex);
+ if (_stopped || (_currentThreads > 1 && _queue.empty()))
+ {
+ --_currentThreads;
+ break;
+ }
+ }
+ }
+ catch (...)
+ {
+ FastMutex::ScopedLock lock(_mutex);
+ --_currentThreads;
+ throw;
+ }
+}
+
+
+namespace
+{
+ static const std::string threadName("TCPServerConnection");
+}
+
+
+void TCPServerDispatcher::enqueue(const StreamSocket& socket)
+{
+ FastMutex::ScopedLock lock(_mutex);
+
+ if (_queue.size() < _pParams->getMaxQueued())
+ {
+ if (!_queue.hasIdleThreads() && _currentThreads < _pParams->getMaxThreads())
+ {
+ try
+ {
+ _threadPool.startWithPriority(_pParams->getThreadPriority(), *this, threadName);
+ ++_currentThreads;
+ }
+ catch (Poco::Exception&)
+ {
+ ++_refusedConnections;
+ return;
+ }
+ }
+ _queue.enqueueNotification(new TCPConnectionNotification(socket));
+ }
+ else
+ {
+ ++_refusedConnections;
+ }
+}
+
+
+void TCPServerDispatcher::stop()
+{
+ _stopped = true;
+ _queue.clear();
+ _queue.wakeUpAll();
+}
+
+
+int TCPServerDispatcher::currentThreads() const
+{
+ FastMutex::ScopedLock lock(_mutex);
+
+ return _currentThreads;
+}
+
+int TCPServerDispatcher::maxThreads() const
+{
+ FastMutex::ScopedLock lock(_mutex);
+
+ return _threadPool.capacity();
+}
+
+
+int TCPServerDispatcher::totalConnections() const
+{
+ FastMutex::ScopedLock lock(_mutex);
+
+ return _totalConnections;
+}
+
+
+int TCPServerDispatcher::currentConnections() const
+{
+ FastMutex::ScopedLock lock(_mutex);
+
+ return _currentConnections;
+}
+
+
+int TCPServerDispatcher::maxConcurrentConnections() const
+{
+ FastMutex::ScopedLock lock(_mutex);
+
+ return _maxConcurrentConnections;
+}
+
+
+int TCPServerDispatcher::queuedConnections() const
+{
+ return _queue.size();
+}
+
+
+int TCPServerDispatcher::refusedConnections() const
+{
+ FastMutex::ScopedLock lock(_mutex);
+
+ return _refusedConnections;
+}
+
+
+void TCPServerDispatcher::beginConnection()
+{
+ FastMutex::ScopedLock lock(_mutex);
+
+ ++_totalConnections;
+ ++_currentConnections;
+ if (_currentConnections > _maxConcurrentConnections)
+ _maxConcurrentConnections = _currentConnections;
+}
+
+
+void TCPServerDispatcher::endConnection()
+{
+ FastMutex::ScopedLock lock(_mutex);
+
+ --_currentConnections;
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/TCPServerParams.cpp b/contrib/libs/poco/Net/src/TCPServerParams.cpp
index 9c97417c97..6a90374abc 100644
--- a/contrib/libs/poco/Net/src/TCPServerParams.cpp
+++ b/contrib/libs/poco/Net/src/TCPServerParams.cpp
@@ -1,64 +1,64 @@
-//
-// TCPServerParams.cpp
-//
-// Library: Net
-// Package: TCPServer
-// Module: TCPServerParams
-//
-// Copyright (c) 2005-2007, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/TCPServerParams.h"
-
-
-namespace Poco {
-namespace Net {
-
-
-TCPServerParams::TCPServerParams():
- _threadIdleTime(10000000),
- _maxThreads(0),
- _maxQueued(64),
- _threadPriority(Poco::Thread::PRIO_NORMAL)
-{
-}
-
-
-TCPServerParams::~TCPServerParams()
-{
-}
-
-
-void TCPServerParams::setThreadIdleTime(const Poco::Timespan& milliseconds)
-{
- _threadIdleTime = milliseconds;
-}
-
-
-void TCPServerParams::setMaxThreads(int count)
-{
- poco_assert (count > 0);
-
- _maxThreads = count;
-}
-
-
-void TCPServerParams::setMaxQueued(int count)
-{
- poco_assert (count >= 0);
-
- _maxQueued = count;
-}
-
-
-void TCPServerParams::setThreadPriority(Poco::Thread::Priority prio)
-{
- _threadPriority = prio;
-}
-
-
-} } // namespace Poco::Net
+//
+// TCPServerParams.cpp
+//
+// Library: Net
+// Package: TCPServer
+// Module: TCPServerParams
+//
+// Copyright (c) 2005-2007, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/TCPServerParams.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+TCPServerParams::TCPServerParams():
+ _threadIdleTime(10000000),
+ _maxThreads(0),
+ _maxQueued(64),
+ _threadPriority(Poco::Thread::PRIO_NORMAL)
+{
+}
+
+
+TCPServerParams::~TCPServerParams()
+{
+}
+
+
+void TCPServerParams::setThreadIdleTime(const Poco::Timespan& milliseconds)
+{
+ _threadIdleTime = milliseconds;
+}
+
+
+void TCPServerParams::setMaxThreads(int count)
+{
+ poco_assert (count > 0);
+
+ _maxThreads = count;
+}
+
+
+void TCPServerParams::setMaxQueued(int count)
+{
+ poco_assert (count >= 0);
+
+ _maxQueued = count;
+}
+
+
+void TCPServerParams::setThreadPriority(Poco::Thread::Priority prio)
+{
+ _threadPriority = prio;
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/WebSocket.cpp b/contrib/libs/poco/Net/src/WebSocket.cpp
index 51a63adc48..17816ad00a 100644
--- a/contrib/libs/poco/Net/src/WebSocket.cpp
+++ b/contrib/libs/poco/Net/src/WebSocket.cpp
@@ -1,263 +1,263 @@
-//
-// WebSocket.cpp
-//
-// Library: Net
-// Package: WebSocket
-// Module: WebSocket
-//
-// Copyright (c) 2012, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#include "Poco/Net/WebSocket.h"
-#include "Poco/Net/WebSocketImpl.h"
-#include "Poco/Net/HTTPServerRequestImpl.h"
-#include "Poco/Net/HTTPServerResponse.h"
-#include "Poco/Net/HTTPClientSession.h"
-#include "Poco/Net/HTTPServerSession.h"
-#include "Poco/Net/NetException.h"
-#include "Poco/MemoryStream.h"
-#include "Poco/NullStream.h"
-#include "Poco/BinaryWriter.h"
-#include "Poco/SHA1Engine.h"
-#include "Poco/Base64Encoder.h"
-#include "Poco/String.h"
-#include "Poco/Random.h"
-#include "Poco/StreamCopier.h"
-#include <sstream>
-
-
-namespace Poco {
-namespace Net {
-
-
-const std::string WebSocket::WEBSOCKET_GUID("258EAFA5-E914-47DA-95CA-C5AB0DC85B11");
-const std::string WebSocket::WEBSOCKET_VERSION("13");
-HTTPCredentials WebSocket::_defaultCreds;
-
-
-WebSocket::WebSocket(HTTPServerRequest& request, HTTPServerResponse& response):
- StreamSocket(accept(request, response))
-{
-}
-
-
-WebSocket::WebSocket(HTTPClientSession& cs, HTTPRequest& request, HTTPResponse& response):
- StreamSocket(connect(cs, request, response, _defaultCreds))
-{
-}
-
-
-WebSocket::WebSocket(HTTPClientSession& cs, HTTPRequest& request, HTTPResponse& response, HTTPCredentials& credentials):
- StreamSocket(connect(cs, request, response, credentials))
-{
-}
-
-
-WebSocket::WebSocket(const Socket& socket):
- StreamSocket(socket)
-{
- if (!dynamic_cast<WebSocketImpl*>(impl()))
- throw InvalidArgumentException("Cannot assign incompatible socket");
-}
-
-
-WebSocket::~WebSocket()
-{
-}
-
-
-WebSocket& WebSocket::operator = (const Socket& socket)
-{
- if (dynamic_cast<WebSocketImpl*>(socket.impl()))
- Socket::operator = (socket);
- else
- throw InvalidArgumentException("Cannot assign incompatible socket");
- return *this;
-}
-
-
-void WebSocket::shutdown()
-{
- shutdown(WS_NORMAL_CLOSE);
-}
-
-
-void WebSocket::shutdown(Poco::UInt16 statusCode, const std::string& statusMessage)
-{
- Poco::Buffer<char> buffer(statusMessage.size() + 2);
- Poco::MemoryOutputStream ostr(buffer.begin(), buffer.size());
- Poco::BinaryWriter writer(ostr, Poco::BinaryWriter::NETWORK_BYTE_ORDER);
- writer << statusCode;
- writer.writeRaw(statusMessage);
- sendFrame(buffer.begin(), static_cast<int>(ostr.charsWritten()), FRAME_FLAG_FIN | FRAME_OP_CLOSE);
-}
-
-
-int WebSocket::sendFrame(const void* buffer, int length, int flags)
-{
- flags |= FRAME_OP_SETRAW;
- return static_cast<WebSocketImpl*>(impl())->sendBytes(buffer, length, flags);
-}
-
-
-int WebSocket::receiveFrame(void* buffer, int length, int& flags)
-{
- int n = static_cast<WebSocketImpl*>(impl())->receiveBytes(buffer, length, 0);
- flags = static_cast<WebSocketImpl*>(impl())->frameFlags();
- return n;
-}
-
-
-int WebSocket::receiveFrame(Poco::Buffer<char>& buffer, int& flags)
-{
- int n = static_cast<WebSocketImpl*>(impl())->receiveBytes(buffer, 0);
- flags = static_cast<WebSocketImpl*>(impl())->frameFlags();
- return n;
-}
-
-
-WebSocket::Mode WebSocket::mode() const
-{
- return static_cast<WebSocketImpl*>(impl())->mustMaskPayload() ? WS_CLIENT : WS_SERVER;
-}
-
-
-void WebSocket::setMaxPayloadSize(int maxPayloadSize)
-{
- static_cast<WebSocketImpl*>(impl())->setMaxPayloadSize(maxPayloadSize);
-}
-
-
-int WebSocket::getMaxPayloadSize() const
-{
- return static_cast<WebSocketImpl*>(impl())->getMaxPayloadSize();
-}
-
-
-WebSocketImpl* WebSocket::accept(HTTPServerRequest& request, HTTPServerResponse& response)
-{
- if (request.hasToken("Connection", "upgrade") && icompare(request.get("Upgrade", ""), "websocket") == 0)
- {
- std::string version = request.get("Sec-WebSocket-Version", "");
- if (version.empty()) throw WebSocketException("Missing Sec-WebSocket-Version in handshake request", WS_ERR_HANDSHAKE_NO_VERSION);
- if (version != WEBSOCKET_VERSION) throw WebSocketException("Unsupported WebSocket version requested", version, WS_ERR_HANDSHAKE_UNSUPPORTED_VERSION);
- std::string key = request.get("Sec-WebSocket-Key", "");
- Poco::trimInPlace(key);
- if (key.empty()) throw WebSocketException("Missing Sec-WebSocket-Key in handshake request", WS_ERR_HANDSHAKE_NO_KEY);
-
- response.setStatusAndReason(HTTPResponse::HTTP_SWITCHING_PROTOCOLS);
- response.set("Upgrade", "websocket");
- response.set("Connection", "Upgrade");
- response.set("Sec-WebSocket-Accept", computeAccept(key));
- response.setContentLength(HTTPResponse::UNKNOWN_CONTENT_LENGTH);
- response.send().flush();
-
- HTTPServerRequestImpl& requestImpl = static_cast<HTTPServerRequestImpl&>(request);
- return new WebSocketImpl(static_cast<StreamSocketImpl*>(requestImpl.detachSocket().impl()), requestImpl.session(), false);
- }
- else throw WebSocketException("No WebSocket handshake", WS_ERR_NO_HANDSHAKE);
-}
-
-
-WebSocketImpl* WebSocket::connect(HTTPClientSession& cs, HTTPRequest& request, HTTPResponse& response, HTTPCredentials& credentials)
-{
- if (!cs.getProxyHost().empty() && !cs.secure())
- {
- cs.proxyTunnel();
- }
- std::string key = createKey();
- request.set("Connection", "Upgrade");
- request.set("Upgrade", "websocket");
- request.set("Sec-WebSocket-Version", WEBSOCKET_VERSION);
- request.set("Sec-WebSocket-Key", key);
- request.setChunkedTransferEncoding(false);
- cs.setKeepAlive(true);
- cs.sendRequest(request);
- std::istream& istr = cs.receiveResponse(response);
- if (response.getStatus() == HTTPResponse::HTTP_SWITCHING_PROTOCOLS)
- {
- return completeHandshake(cs, response, key);
- }
- else if (response.getStatus() == HTTPResponse::HTTP_UNAUTHORIZED)
- {
- if (!credentials.empty())
- {
- Poco::NullOutputStream null;
- Poco::StreamCopier::copyStream(istr, null);
- credentials.authenticate(request, response);
- if (!cs.getProxyHost().empty() && !cs.secure())
- {
- cs.reset();
- cs.proxyTunnel();
- }
- cs.sendRequest(request);
- cs.receiveResponse(response);
- if (response.getStatus() == HTTPResponse::HTTP_SWITCHING_PROTOCOLS)
- {
- return completeHandshake(cs, response, key);
- }
- else if (response.getStatus() == HTTPResponse::HTTP_UNAUTHORIZED)
- {
- throw WebSocketException("Not authorized", WS_ERR_UNAUTHORIZED);
- }
- }
- else throw WebSocketException("Not authorized", WS_ERR_UNAUTHORIZED);
- }
- if (response.getStatus() == HTTPResponse::HTTP_OK)
- {
- throw WebSocketException("The server does not understand the WebSocket protocol", WS_ERR_NO_HANDSHAKE);
- }
- else
- {
- throw WebSocketException("Cannot upgrade to WebSocket connection", response.getReason(), WS_ERR_NO_HANDSHAKE);
- }
-}
-
-
-WebSocketImpl* WebSocket::completeHandshake(HTTPClientSession& cs, HTTPResponse& response, const std::string& key)
-{
- std::string connection = response.get("Connection", "");
- if (Poco::icompare(connection, "Upgrade") != 0)
- throw WebSocketException("No Connection: Upgrade header in handshake response", WS_ERR_NO_HANDSHAKE);
- std::string upgrade = response.get("Upgrade", "");
- if (Poco::icompare(upgrade, "websocket") != 0)
- throw WebSocketException("No Upgrade: websocket header in handshake response", WS_ERR_NO_HANDSHAKE);
- std::string accept = response.get("Sec-WebSocket-Accept", "");
- if (accept != computeAccept(key))
- throw WebSocketException("Invalid or missing Sec-WebSocket-Accept header in handshake response", WS_ERR_HANDSHAKE_ACCEPT);
- return new WebSocketImpl(static_cast<StreamSocketImpl*>(cs.detachSocket().impl()), cs, true);
-}
-
-
-std::string WebSocket::createKey()
-{
- Poco::Random rnd;
- std::ostringstream ostr;
- Poco::Base64Encoder base64(ostr);
- Poco::BinaryWriter writer(base64);
- writer << rnd.next() << rnd.next() << rnd.next() << rnd.next();
- base64.close();
- return ostr.str();
-}
-
-
-std::string WebSocket::computeAccept(const std::string& key)
-{
- std::string accept(key);
- accept += WEBSOCKET_GUID;
- Poco::SHA1Engine sha1;
- sha1.update(accept);
- Poco::DigestEngine::Digest d = sha1.digest();
- std::ostringstream ostr;
- Poco::Base64Encoder base64(ostr);
- base64.write(reinterpret_cast<const char*>(&d[0]), d.size());
- base64.close();
- return ostr.str();
-}
-
-
-} } // namespace Poco::Net
+//
+// WebSocket.cpp
+//
+// Library: Net
+// Package: WebSocket
+// Module: WebSocket
+//
+// Copyright (c) 2012, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/WebSocket.h"
+#include "Poco/Net/WebSocketImpl.h"
+#include "Poco/Net/HTTPServerRequestImpl.h"
+#include "Poco/Net/HTTPServerResponse.h"
+#include "Poco/Net/HTTPClientSession.h"
+#include "Poco/Net/HTTPServerSession.h"
+#include "Poco/Net/NetException.h"
+#include "Poco/MemoryStream.h"
+#include "Poco/NullStream.h"
+#include "Poco/BinaryWriter.h"
+#include "Poco/SHA1Engine.h"
+#include "Poco/Base64Encoder.h"
+#include "Poco/String.h"
+#include "Poco/Random.h"
+#include "Poco/StreamCopier.h"
+#include <sstream>
+
+
+namespace Poco {
+namespace Net {
+
+
+const std::string WebSocket::WEBSOCKET_GUID("258EAFA5-E914-47DA-95CA-C5AB0DC85B11");
+const std::string WebSocket::WEBSOCKET_VERSION("13");
+HTTPCredentials WebSocket::_defaultCreds;
+
+
+WebSocket::WebSocket(HTTPServerRequest& request, HTTPServerResponse& response):
+ StreamSocket(accept(request, response))
+{
+}
+
+
+WebSocket::WebSocket(HTTPClientSession& cs, HTTPRequest& request, HTTPResponse& response):
+ StreamSocket(connect(cs, request, response, _defaultCreds))
+{
+}
+
+
+WebSocket::WebSocket(HTTPClientSession& cs, HTTPRequest& request, HTTPResponse& response, HTTPCredentials& credentials):
+ StreamSocket(connect(cs, request, response, credentials))
+{
+}
+
+
+WebSocket::WebSocket(const Socket& socket):
+ StreamSocket(socket)
+{
+ if (!dynamic_cast<WebSocketImpl*>(impl()))
+ throw InvalidArgumentException("Cannot assign incompatible socket");
+}
+
+
+WebSocket::~WebSocket()
+{
+}
+
+
+WebSocket& WebSocket::operator = (const Socket& socket)
+{
+ if (dynamic_cast<WebSocketImpl*>(socket.impl()))
+ Socket::operator = (socket);
+ else
+ throw InvalidArgumentException("Cannot assign incompatible socket");
+ return *this;
+}
+
+
+void WebSocket::shutdown()
+{
+ shutdown(WS_NORMAL_CLOSE);
+}
+
+
+void WebSocket::shutdown(Poco::UInt16 statusCode, const std::string& statusMessage)
+{
+ Poco::Buffer<char> buffer(statusMessage.size() + 2);
+ Poco::MemoryOutputStream ostr(buffer.begin(), buffer.size());
+ Poco::BinaryWriter writer(ostr, Poco::BinaryWriter::NETWORK_BYTE_ORDER);
+ writer << statusCode;
+ writer.writeRaw(statusMessage);
+ sendFrame(buffer.begin(), static_cast<int>(ostr.charsWritten()), FRAME_FLAG_FIN | FRAME_OP_CLOSE);
+}
+
+
+int WebSocket::sendFrame(const void* buffer, int length, int flags)
+{
+ flags |= FRAME_OP_SETRAW;
+ return static_cast<WebSocketImpl*>(impl())->sendBytes(buffer, length, flags);
+}
+
+
+int WebSocket::receiveFrame(void* buffer, int length, int& flags)
+{
+ int n = static_cast<WebSocketImpl*>(impl())->receiveBytes(buffer, length, 0);
+ flags = static_cast<WebSocketImpl*>(impl())->frameFlags();
+ return n;
+}
+
+
+int WebSocket::receiveFrame(Poco::Buffer<char>& buffer, int& flags)
+{
+ int n = static_cast<WebSocketImpl*>(impl())->receiveBytes(buffer, 0);
+ flags = static_cast<WebSocketImpl*>(impl())->frameFlags();
+ return n;
+}
+
+
+WebSocket::Mode WebSocket::mode() const
+{
+ return static_cast<WebSocketImpl*>(impl())->mustMaskPayload() ? WS_CLIENT : WS_SERVER;
+}
+
+
+void WebSocket::setMaxPayloadSize(int maxPayloadSize)
+{
+ static_cast<WebSocketImpl*>(impl())->setMaxPayloadSize(maxPayloadSize);
+}
+
+
+int WebSocket::getMaxPayloadSize() const
+{
+ return static_cast<WebSocketImpl*>(impl())->getMaxPayloadSize();
+}
+
+
+WebSocketImpl* WebSocket::accept(HTTPServerRequest& request, HTTPServerResponse& response)
+{
+ if (request.hasToken("Connection", "upgrade") && icompare(request.get("Upgrade", ""), "websocket") == 0)
+ {
+ std::string version = request.get("Sec-WebSocket-Version", "");
+ if (version.empty()) throw WebSocketException("Missing Sec-WebSocket-Version in handshake request", WS_ERR_HANDSHAKE_NO_VERSION);
+ if (version != WEBSOCKET_VERSION) throw WebSocketException("Unsupported WebSocket version requested", version, WS_ERR_HANDSHAKE_UNSUPPORTED_VERSION);
+ std::string key = request.get("Sec-WebSocket-Key", "");
+ Poco::trimInPlace(key);
+ if (key.empty()) throw WebSocketException("Missing Sec-WebSocket-Key in handshake request", WS_ERR_HANDSHAKE_NO_KEY);
+
+ response.setStatusAndReason(HTTPResponse::HTTP_SWITCHING_PROTOCOLS);
+ response.set("Upgrade", "websocket");
+ response.set("Connection", "Upgrade");
+ response.set("Sec-WebSocket-Accept", computeAccept(key));
+ response.setContentLength(HTTPResponse::UNKNOWN_CONTENT_LENGTH);
+ response.send().flush();
+
+ HTTPServerRequestImpl& requestImpl = static_cast<HTTPServerRequestImpl&>(request);
+ return new WebSocketImpl(static_cast<StreamSocketImpl*>(requestImpl.detachSocket().impl()), requestImpl.session(), false);
+ }
+ else throw WebSocketException("No WebSocket handshake", WS_ERR_NO_HANDSHAKE);
+}
+
+
+WebSocketImpl* WebSocket::connect(HTTPClientSession& cs, HTTPRequest& request, HTTPResponse& response, HTTPCredentials& credentials)
+{
+ if (!cs.getProxyHost().empty() && !cs.secure())
+ {
+ cs.proxyTunnel();
+ }
+ std::string key = createKey();
+ request.set("Connection", "Upgrade");
+ request.set("Upgrade", "websocket");
+ request.set("Sec-WebSocket-Version", WEBSOCKET_VERSION);
+ request.set("Sec-WebSocket-Key", key);
+ request.setChunkedTransferEncoding(false);
+ cs.setKeepAlive(true);
+ cs.sendRequest(request);
+ std::istream& istr = cs.receiveResponse(response);
+ if (response.getStatus() == HTTPResponse::HTTP_SWITCHING_PROTOCOLS)
+ {
+ return completeHandshake(cs, response, key);
+ }
+ else if (response.getStatus() == HTTPResponse::HTTP_UNAUTHORIZED)
+ {
+ if (!credentials.empty())
+ {
+ Poco::NullOutputStream null;
+ Poco::StreamCopier::copyStream(istr, null);
+ credentials.authenticate(request, response);
+ if (!cs.getProxyHost().empty() && !cs.secure())
+ {
+ cs.reset();
+ cs.proxyTunnel();
+ }
+ cs.sendRequest(request);
+ cs.receiveResponse(response);
+ if (response.getStatus() == HTTPResponse::HTTP_SWITCHING_PROTOCOLS)
+ {
+ return completeHandshake(cs, response, key);
+ }
+ else if (response.getStatus() == HTTPResponse::HTTP_UNAUTHORIZED)
+ {
+ throw WebSocketException("Not authorized", WS_ERR_UNAUTHORIZED);
+ }
+ }
+ else throw WebSocketException("Not authorized", WS_ERR_UNAUTHORIZED);
+ }
+ if (response.getStatus() == HTTPResponse::HTTP_OK)
+ {
+ throw WebSocketException("The server does not understand the WebSocket protocol", WS_ERR_NO_HANDSHAKE);
+ }
+ else
+ {
+ throw WebSocketException("Cannot upgrade to WebSocket connection", response.getReason(), WS_ERR_NO_HANDSHAKE);
+ }
+}
+
+
+WebSocketImpl* WebSocket::completeHandshake(HTTPClientSession& cs, HTTPResponse& response, const std::string& key)
+{
+ std::string connection = response.get("Connection", "");
+ if (Poco::icompare(connection, "Upgrade") != 0)
+ throw WebSocketException("No Connection: Upgrade header in handshake response", WS_ERR_NO_HANDSHAKE);
+ std::string upgrade = response.get("Upgrade", "");
+ if (Poco::icompare(upgrade, "websocket") != 0)
+ throw WebSocketException("No Upgrade: websocket header in handshake response", WS_ERR_NO_HANDSHAKE);
+ std::string accept = response.get("Sec-WebSocket-Accept", "");
+ if (accept != computeAccept(key))
+ throw WebSocketException("Invalid or missing Sec-WebSocket-Accept header in handshake response", WS_ERR_HANDSHAKE_ACCEPT);
+ return new WebSocketImpl(static_cast<StreamSocketImpl*>(cs.detachSocket().impl()), cs, true);
+}
+
+
+std::string WebSocket::createKey()
+{
+ Poco::Random rnd;
+ std::ostringstream ostr;
+ Poco::Base64Encoder base64(ostr);
+ Poco::BinaryWriter writer(base64);
+ writer << rnd.next() << rnd.next() << rnd.next() << rnd.next();
+ base64.close();
+ return ostr.str();
+}
+
+
+std::string WebSocket::computeAccept(const std::string& key)
+{
+ std::string accept(key);
+ accept += WEBSOCKET_GUID;
+ Poco::SHA1Engine sha1;
+ sha1.update(accept);
+ Poco::DigestEngine::Digest d = sha1.digest();
+ std::ostringstream ostr;
+ Poco::Base64Encoder base64(ostr);
+ base64.write(reinterpret_cast<const char*>(&d[0]), d.size());
+ base64.close();
+ return ostr.str();
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/src/WebSocketImpl.cpp b/contrib/libs/poco/Net/src/WebSocketImpl.cpp
index 46a0a13e6d..49fcad63c2 100644
--- a/contrib/libs/poco/Net/src/WebSocketImpl.cpp
+++ b/contrib/libs/poco/Net/src/WebSocketImpl.cpp
@@ -1,400 +1,400 @@
-//
-// WebSocketImpl.cpp
-//
-// Library: Net
-// Package: WebSocket
-// Module: WebSocketImpl
-//
-// Copyright (c) 2012, Applied Informatics Software Engineering GmbH.
-// and Contributors.
-//
-// SPDX-License-Identifier: BSL-1.0
-//
-
-
-#define NOMINMAX
-#include "Poco/Net/WebSocketImpl.h"
-#include "Poco/Net/NetException.h"
-#include "Poco/Net/WebSocket.h"
-#include "Poco/Net/HTTPSession.h"
-#include "Poco/Buffer.h"
-#include "Poco/BinaryWriter.h"
-#include "Poco/BinaryReader.h"
-#include "Poco/MemoryStream.h"
-#include "Poco/Format.h"
-#include <limits>
-#include <cstring>
-
-
-namespace Poco {
-namespace Net {
-
-
-WebSocketImpl::WebSocketImpl(StreamSocketImpl* pStreamSocketImpl, HTTPSession& session, bool mustMaskPayload):
- StreamSocketImpl(pStreamSocketImpl->sockfd()),
- _pStreamSocketImpl(pStreamSocketImpl),
- _maxPayloadSize(std::numeric_limits<int>::max()),
- _buffer(0),
- _bufferOffset(0),
- _frameFlags(0),
- _mustMaskPayload(mustMaskPayload)
-{
- poco_check_ptr(pStreamSocketImpl);
- _pStreamSocketImpl->duplicate();
- session.drainBuffer(_buffer);
-}
-
-
-WebSocketImpl::~WebSocketImpl()
-{
- try
- {
- _pStreamSocketImpl->release();
- reset();
- }
- catch (...)
- {
- poco_unexpected();
- }
-}
-
-
-int WebSocketImpl::sendBytes(const void* buffer, int length, int flags)
-{
- Poco::Buffer<char> frame(length + MAX_HEADER_LENGTH);
- Poco::MemoryOutputStream ostr(frame.begin(), frame.size());
- Poco::BinaryWriter writer(ostr, Poco::BinaryWriter::NETWORK_BYTE_ORDER);
-
- if (flags == 0) flags = WebSocket::FRAME_BINARY;
- flags &= 0xff;
- writer << static_cast<Poco::UInt8>(flags);
- Poco::UInt8 lengthByte(0);
- if (_mustMaskPayload)
- {
- lengthByte |= FRAME_FLAG_MASK;
- }
- if (length < 126)
- {
- lengthByte |= static_cast<Poco::UInt8>(length);
- writer << lengthByte;
- }
- else if (length < 65536)
- {
- lengthByte |= 126;
- writer << lengthByte << static_cast<Poco::UInt16>(length);
- }
- else
- {
- lengthByte |= 127;
- writer << lengthByte << static_cast<Poco::UInt64>(length);
- }
- if (_mustMaskPayload)
- {
- const Poco::UInt32 mask = _rnd.next();
- const char* m = reinterpret_cast<const char*>(&mask);
- const char* b = reinterpret_cast<const char*>(buffer);
- writer.writeRaw(m, 4);
- char* p = frame.begin() + ostr.charsWritten();
- for (int i = 0; i < length; i++)
- {
- p[i] = b[i] ^ m[i % 4];
- }
- }
- else
- {
- std::memcpy(frame.begin() + ostr.charsWritten(), buffer, length);
- }
- _pStreamSocketImpl->sendBytes(frame.begin(), length + static_cast<int>(ostr.charsWritten()));
- return length;
-}
-
-
-int WebSocketImpl::receiveHeader(char mask[4], bool& useMask)
-{
- char header[MAX_HEADER_LENGTH];
- int n = receiveNBytes(header, 2);
- if (n <= 0)
- {
- _frameFlags = 0;
- return n;
- }
- poco_assert (n == 2);
- Poco::UInt8 flags = static_cast<Poco::UInt8>(header[0]);
- _frameFlags = flags;
- Poco::UInt8 lengthByte = static_cast<Poco::UInt8>(header[1]);
- useMask = ((lengthByte & FRAME_FLAG_MASK) != 0);
- int payloadLength;
- lengthByte &= 0x7f;
- if (lengthByte == 127)
- {
- n = receiveNBytes(header + 2, 8);
- if (n <= 0)
- {
- _frameFlags = 0;
- return n;
- }
- Poco::MemoryInputStream istr(header + 2, 8);
- Poco::BinaryReader reader(istr, Poco::BinaryReader::NETWORK_BYTE_ORDER);
- Poco::UInt64 l;
- reader >> l;
- if (l > _maxPayloadSize) throw WebSocketException("Payload too big", WebSocket::WS_ERR_PAYLOAD_TOO_BIG);
- payloadLength = static_cast<int>(l);
- }
- else if (lengthByte == 126)
- {
- n = receiveNBytes(header + 2, 2);
- if (n <= 0)
- {
- _frameFlags = 0;
- return n;
- }
- Poco::MemoryInputStream istr(header + 2, 2);
- Poco::BinaryReader reader(istr, Poco::BinaryReader::NETWORK_BYTE_ORDER);
- Poco::UInt16 l;
- reader >> l;
- if (l > _maxPayloadSize) throw WebSocketException("Payload too big", WebSocket::WS_ERR_PAYLOAD_TOO_BIG);
- payloadLength = static_cast<int>(l);
- }
- else
- {
- if (lengthByte > _maxPayloadSize) throw WebSocketException("Payload too big", WebSocket::WS_ERR_PAYLOAD_TOO_BIG);
- payloadLength = lengthByte;
- }
-
- if (useMask)
- {
- n = receiveNBytes(mask, 4);
- if (n <= 0)
- {
- _frameFlags = 0;
- return n;
- }
- }
-
- return payloadLength;
-}
-
-
-void WebSocketImpl::setMaxPayloadSize(int maxPayloadSize)
-{
- poco_assert (maxPayloadSize > 0);
-
- _maxPayloadSize = maxPayloadSize;
-}
-
-
-int WebSocketImpl::receivePayload(char *buffer, int payloadLength, char mask[4], bool useMask)
-{
- int received = receiveNBytes(reinterpret_cast<char*>(buffer), payloadLength);
- if (received <= 0) throw WebSocketException("Incomplete frame received", WebSocket::WS_ERR_INCOMPLETE_FRAME);
-
- if (useMask)
- {
- for (int i = 0; i < received; i++)
- {
- buffer[i] ^= mask[i % 4];
- }
- }
- return received;
-}
-
-
-int WebSocketImpl::receiveBytes(void* buffer, int length, int)
-{
- char mask[4];
- bool useMask;
- int payloadLength = receiveHeader(mask, useMask);
- if (payloadLength <= 0)
- return payloadLength;
- if (payloadLength > length)
- throw WebSocketException(Poco::format("Insufficient buffer for payload size %d", payloadLength), WebSocket::WS_ERR_PAYLOAD_TOO_BIG);
- return receivePayload(reinterpret_cast<char*>(buffer), payloadLength, mask, useMask);
-}
-
-
-int WebSocketImpl::receiveBytes(Poco::Buffer<char>& buffer, int)
-{
- char mask[4];
- bool useMask;
- int payloadLength = receiveHeader(mask, useMask);
- if (payloadLength <= 0)
- return payloadLength;
- std::size_t oldSize = buffer.size();
- buffer.resize(oldSize + payloadLength);
- return receivePayload(buffer.begin() + oldSize, payloadLength, mask, useMask);
-}
-
-
-int WebSocketImpl::receiveNBytes(void* buffer, int bytes)
-{
- int received = receiveSomeBytes(reinterpret_cast<char*>(buffer), bytes);
- if (received > 0)
- {
- while (received < bytes)
- {
- int n = receiveSomeBytes(reinterpret_cast<char*>(buffer) + received, bytes - received);
- if (n > 0)
- received += n;
- else
- throw WebSocketException("Incomplete frame received", WebSocket::WS_ERR_INCOMPLETE_FRAME);
- }
- }
- return received;
-}
-
-
-int WebSocketImpl::receiveSomeBytes(char* buffer, int bytes)
-{
- int n = static_cast<int>(_buffer.size()) - _bufferOffset;
- if (n > 0)
- {
- if (bytes < n) n = bytes;
- std::memcpy(buffer, _buffer.begin() + _bufferOffset, n);
- _bufferOffset += n;
- return n;
- }
- else
- {
- return _pStreamSocketImpl->receiveBytes(buffer, bytes);
- }
-}
-
-
-SocketImpl* WebSocketImpl::acceptConnection(SocketAddress& /*clientAddr*/)
-{
- throw Poco::InvalidAccessException("Cannot acceptConnection() on a WebSocketImpl");
-}
-
-
-void WebSocketImpl::connect(const SocketAddress& /*address*/)
-{
- throw Poco::InvalidAccessException("Cannot connect() a WebSocketImpl");
-}
-
-
-void WebSocketImpl::connect(const SocketAddress& /*address*/, const Poco::Timespan& /*timeout*/)
-{
- throw Poco::InvalidAccessException("Cannot connect() a WebSocketImpl");
-}
-
-
-void WebSocketImpl::connectNB(const SocketAddress& /*address*/)
-{
- throw Poco::InvalidAccessException("Cannot connectNB() a WebSocketImpl");
-}
-
-
-void WebSocketImpl::bind(const SocketAddress& /*address*/, bool /*reuseAddress*/)
-{
- throw Poco::InvalidAccessException("Cannot bind() a WebSocketImpl");
-}
-
-
-void WebSocketImpl::bind(const SocketAddress& /*address*/, bool /*reuseAddress*/, bool /*reusePort*/)
-{
- throw Poco::InvalidAccessException("Cannot bind() a WebSocketImpl");
-}
-
-
-void WebSocketImpl::bind6(const SocketAddress& /*address*/, bool /*reuseAddress*/, bool /*ipV6Only*/)
-{
- throw Poco::InvalidAccessException("Cannot bind6() a WebSocketImpl");
-}
-
-
-void WebSocketImpl::bind6(const SocketAddress& /*address*/, bool /*reuseAddress*/, bool /*reusePort*/, bool /*ipV6Only*/)
-{
- throw Poco::InvalidAccessException("Cannot bind6() a WebSocketImpl");
-}
-
-
-void WebSocketImpl::listen(int /*backlog*/)
-{
- throw Poco::InvalidAccessException("Cannot listen() on a WebSocketImpl");
-}
-
-
-void WebSocketImpl::close()
-{
- _pStreamSocketImpl->close();
- reset();
-}
-
-
-void WebSocketImpl::shutdownReceive()
-{
- _pStreamSocketImpl->shutdownReceive();
-}
-
-
-void WebSocketImpl::shutdownSend()
-{
- _pStreamSocketImpl->shutdownSend();
-}
-
-
-void WebSocketImpl::shutdown()
-{
- _pStreamSocketImpl->shutdown();
-}
-
-
-int WebSocketImpl::sendTo(const void* /*buffer*/, int /*length*/, const SocketAddress& /*address*/, int /*flags*/)
-{
- throw Poco::InvalidAccessException("Cannot sendTo() on a WebSocketImpl");
-}
-
-
-int WebSocketImpl::receiveFrom(void* /*buffer*/, int /*length*/, SocketAddress& /*address*/, int /*flags*/)
-{
- throw Poco::InvalidAccessException("Cannot receiveFrom() on a WebSocketImpl");
-}
-
-
-void WebSocketImpl::sendUrgent(unsigned char /*data*/)
-{
- throw Poco::InvalidAccessException("Cannot sendUrgent() on a WebSocketImpl");
-}
-
-
-bool WebSocketImpl::secure() const
-{
- return _pStreamSocketImpl->secure();
-}
-
-
-void WebSocketImpl::setSendTimeout(const Poco::Timespan& timeout)
-{
- _pStreamSocketImpl->setSendTimeout(timeout);
-}
-
-
-Poco::Timespan WebSocketImpl::getSendTimeout()
-{
- return _pStreamSocketImpl->getSendTimeout();
-}
-
-
-void WebSocketImpl::setReceiveTimeout(const Poco::Timespan& timeout)
-{
- _pStreamSocketImpl->setReceiveTimeout(timeout);
-}
-
-
-Poco::Timespan WebSocketImpl::getReceiveTimeout()
-{
- return _pStreamSocketImpl->getReceiveTimeout();
-}
-
-
-int WebSocketImpl::available()
-{
- int n = static_cast<int>(_buffer.size()) - _bufferOffset;
- if (n > 0)
- return n + _pStreamSocketImpl->available();
- else
- return _pStreamSocketImpl->available();
-}
-
-
-} } // namespace Poco::Net
+//
+// WebSocketImpl.cpp
+//
+// Library: Net
+// Package: WebSocket
+// Module: WebSocketImpl
+//
+// Copyright (c) 2012, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#define NOMINMAX
+#include "Poco/Net/WebSocketImpl.h"
+#include "Poco/Net/NetException.h"
+#include "Poco/Net/WebSocket.h"
+#include "Poco/Net/HTTPSession.h"
+#include "Poco/Buffer.h"
+#include "Poco/BinaryWriter.h"
+#include "Poco/BinaryReader.h"
+#include "Poco/MemoryStream.h"
+#include "Poco/Format.h"
+#include <limits>
+#include <cstring>
+
+
+namespace Poco {
+namespace Net {
+
+
+WebSocketImpl::WebSocketImpl(StreamSocketImpl* pStreamSocketImpl, HTTPSession& session, bool mustMaskPayload):
+ StreamSocketImpl(pStreamSocketImpl->sockfd()),
+ _pStreamSocketImpl(pStreamSocketImpl),
+ _maxPayloadSize(std::numeric_limits<int>::max()),
+ _buffer(0),
+ _bufferOffset(0),
+ _frameFlags(0),
+ _mustMaskPayload(mustMaskPayload)
+{
+ poco_check_ptr(pStreamSocketImpl);
+ _pStreamSocketImpl->duplicate();
+ session.drainBuffer(_buffer);
+}
+
+
+WebSocketImpl::~WebSocketImpl()
+{
+ try
+ {
+ _pStreamSocketImpl->release();
+ reset();
+ }
+ catch (...)
+ {
+ poco_unexpected();
+ }
+}
+
+
+int WebSocketImpl::sendBytes(const void* buffer, int length, int flags)
+{
+ Poco::Buffer<char> frame(length + MAX_HEADER_LENGTH);
+ Poco::MemoryOutputStream ostr(frame.begin(), frame.size());
+ Poco::BinaryWriter writer(ostr, Poco::BinaryWriter::NETWORK_BYTE_ORDER);
+
+ if (flags == 0) flags = WebSocket::FRAME_BINARY;
+ flags &= 0xff;
+ writer << static_cast<Poco::UInt8>(flags);
+ Poco::UInt8 lengthByte(0);
+ if (_mustMaskPayload)
+ {
+ lengthByte |= FRAME_FLAG_MASK;
+ }
+ if (length < 126)
+ {
+ lengthByte |= static_cast<Poco::UInt8>(length);
+ writer << lengthByte;
+ }
+ else if (length < 65536)
+ {
+ lengthByte |= 126;
+ writer << lengthByte << static_cast<Poco::UInt16>(length);
+ }
+ else
+ {
+ lengthByte |= 127;
+ writer << lengthByte << static_cast<Poco::UInt64>(length);
+ }
+ if (_mustMaskPayload)
+ {
+ const Poco::UInt32 mask = _rnd.next();
+ const char* m = reinterpret_cast<const char*>(&mask);
+ const char* b = reinterpret_cast<const char*>(buffer);
+ writer.writeRaw(m, 4);
+ char* p = frame.begin() + ostr.charsWritten();
+ for (int i = 0; i < length; i++)
+ {
+ p[i] = b[i] ^ m[i % 4];
+ }
+ }
+ else
+ {
+ std::memcpy(frame.begin() + ostr.charsWritten(), buffer, length);
+ }
+ _pStreamSocketImpl->sendBytes(frame.begin(), length + static_cast<int>(ostr.charsWritten()));
+ return length;
+}
+
+
+int WebSocketImpl::receiveHeader(char mask[4], bool& useMask)
+{
+ char header[MAX_HEADER_LENGTH];
+ int n = receiveNBytes(header, 2);
+ if (n <= 0)
+ {
+ _frameFlags = 0;
+ return n;
+ }
+ poco_assert (n == 2);
+ Poco::UInt8 flags = static_cast<Poco::UInt8>(header[0]);
+ _frameFlags = flags;
+ Poco::UInt8 lengthByte = static_cast<Poco::UInt8>(header[1]);
+ useMask = ((lengthByte & FRAME_FLAG_MASK) != 0);
+ int payloadLength;
+ lengthByte &= 0x7f;
+ if (lengthByte == 127)
+ {
+ n = receiveNBytes(header + 2, 8);
+ if (n <= 0)
+ {
+ _frameFlags = 0;
+ return n;
+ }
+ Poco::MemoryInputStream istr(header + 2, 8);
+ Poco::BinaryReader reader(istr, Poco::BinaryReader::NETWORK_BYTE_ORDER);
+ Poco::UInt64 l;
+ reader >> l;
+ if (l > _maxPayloadSize) throw WebSocketException("Payload too big", WebSocket::WS_ERR_PAYLOAD_TOO_BIG);
+ payloadLength = static_cast<int>(l);
+ }
+ else if (lengthByte == 126)
+ {
+ n = receiveNBytes(header + 2, 2);
+ if (n <= 0)
+ {
+ _frameFlags = 0;
+ return n;
+ }
+ Poco::MemoryInputStream istr(header + 2, 2);
+ Poco::BinaryReader reader(istr, Poco::BinaryReader::NETWORK_BYTE_ORDER);
+ Poco::UInt16 l;
+ reader >> l;
+ if (l > _maxPayloadSize) throw WebSocketException("Payload too big", WebSocket::WS_ERR_PAYLOAD_TOO_BIG);
+ payloadLength = static_cast<int>(l);
+ }
+ else
+ {
+ if (lengthByte > _maxPayloadSize) throw WebSocketException("Payload too big", WebSocket::WS_ERR_PAYLOAD_TOO_BIG);
+ payloadLength = lengthByte;
+ }
+
+ if (useMask)
+ {
+ n = receiveNBytes(mask, 4);
+ if (n <= 0)
+ {
+ _frameFlags = 0;
+ return n;
+ }
+ }
+
+ return payloadLength;
+}
+
+
+void WebSocketImpl::setMaxPayloadSize(int maxPayloadSize)
+{
+ poco_assert (maxPayloadSize > 0);
+
+ _maxPayloadSize = maxPayloadSize;
+}
+
+
+int WebSocketImpl::receivePayload(char *buffer, int payloadLength, char mask[4], bool useMask)
+{
+ int received = receiveNBytes(reinterpret_cast<char*>(buffer), payloadLength);
+ if (received <= 0) throw WebSocketException("Incomplete frame received", WebSocket::WS_ERR_INCOMPLETE_FRAME);
+
+ if (useMask)
+ {
+ for (int i = 0; i < received; i++)
+ {
+ buffer[i] ^= mask[i % 4];
+ }
+ }
+ return received;
+}
+
+
+int WebSocketImpl::receiveBytes(void* buffer, int length, int)
+{
+ char mask[4];
+ bool useMask;
+ int payloadLength = receiveHeader(mask, useMask);
+ if (payloadLength <= 0)
+ return payloadLength;
+ if (payloadLength > length)
+ throw WebSocketException(Poco::format("Insufficient buffer for payload size %d", payloadLength), WebSocket::WS_ERR_PAYLOAD_TOO_BIG);
+ return receivePayload(reinterpret_cast<char*>(buffer), payloadLength, mask, useMask);
+}
+
+
+int WebSocketImpl::receiveBytes(Poco::Buffer<char>& buffer, int)
+{
+ char mask[4];
+ bool useMask;
+ int payloadLength = receiveHeader(mask, useMask);
+ if (payloadLength <= 0)
+ return payloadLength;
+ std::size_t oldSize = buffer.size();
+ buffer.resize(oldSize + payloadLength);
+ return receivePayload(buffer.begin() + oldSize, payloadLength, mask, useMask);
+}
+
+
+int WebSocketImpl::receiveNBytes(void* buffer, int bytes)
+{
+ int received = receiveSomeBytes(reinterpret_cast<char*>(buffer), bytes);
+ if (received > 0)
+ {
+ while (received < bytes)
+ {
+ int n = receiveSomeBytes(reinterpret_cast<char*>(buffer) + received, bytes - received);
+ if (n > 0)
+ received += n;
+ else
+ throw WebSocketException("Incomplete frame received", WebSocket::WS_ERR_INCOMPLETE_FRAME);
+ }
+ }
+ return received;
+}
+
+
+int WebSocketImpl::receiveSomeBytes(char* buffer, int bytes)
+{
+ int n = static_cast<int>(_buffer.size()) - _bufferOffset;
+ if (n > 0)
+ {
+ if (bytes < n) n = bytes;
+ std::memcpy(buffer, _buffer.begin() + _bufferOffset, n);
+ _bufferOffset += n;
+ return n;
+ }
+ else
+ {
+ return _pStreamSocketImpl->receiveBytes(buffer, bytes);
+ }
+}
+
+
+SocketImpl* WebSocketImpl::acceptConnection(SocketAddress& /*clientAddr*/)
+{
+ throw Poco::InvalidAccessException("Cannot acceptConnection() on a WebSocketImpl");
+}
+
+
+void WebSocketImpl::connect(const SocketAddress& /*address*/)
+{
+ throw Poco::InvalidAccessException("Cannot connect() a WebSocketImpl");
+}
+
+
+void WebSocketImpl::connect(const SocketAddress& /*address*/, const Poco::Timespan& /*timeout*/)
+{
+ throw Poco::InvalidAccessException("Cannot connect() a WebSocketImpl");
+}
+
+
+void WebSocketImpl::connectNB(const SocketAddress& /*address*/)
+{
+ throw Poco::InvalidAccessException("Cannot connectNB() a WebSocketImpl");
+}
+
+
+void WebSocketImpl::bind(const SocketAddress& /*address*/, bool /*reuseAddress*/)
+{
+ throw Poco::InvalidAccessException("Cannot bind() a WebSocketImpl");
+}
+
+
+void WebSocketImpl::bind(const SocketAddress& /*address*/, bool /*reuseAddress*/, bool /*reusePort*/)
+{
+ throw Poco::InvalidAccessException("Cannot bind() a WebSocketImpl");
+}
+
+
+void WebSocketImpl::bind6(const SocketAddress& /*address*/, bool /*reuseAddress*/, bool /*ipV6Only*/)
+{
+ throw Poco::InvalidAccessException("Cannot bind6() a WebSocketImpl");
+}
+
+
+void WebSocketImpl::bind6(const SocketAddress& /*address*/, bool /*reuseAddress*/, bool /*reusePort*/, bool /*ipV6Only*/)
+{
+ throw Poco::InvalidAccessException("Cannot bind6() a WebSocketImpl");
+}
+
+
+void WebSocketImpl::listen(int /*backlog*/)
+{
+ throw Poco::InvalidAccessException("Cannot listen() on a WebSocketImpl");
+}
+
+
+void WebSocketImpl::close()
+{
+ _pStreamSocketImpl->close();
+ reset();
+}
+
+
+void WebSocketImpl::shutdownReceive()
+{
+ _pStreamSocketImpl->shutdownReceive();
+}
+
+
+void WebSocketImpl::shutdownSend()
+{
+ _pStreamSocketImpl->shutdownSend();
+}
+
+
+void WebSocketImpl::shutdown()
+{
+ _pStreamSocketImpl->shutdown();
+}
+
+
+int WebSocketImpl::sendTo(const void* /*buffer*/, int /*length*/, const SocketAddress& /*address*/, int /*flags*/)
+{
+ throw Poco::InvalidAccessException("Cannot sendTo() on a WebSocketImpl");
+}
+
+
+int WebSocketImpl::receiveFrom(void* /*buffer*/, int /*length*/, SocketAddress& /*address*/, int /*flags*/)
+{
+ throw Poco::InvalidAccessException("Cannot receiveFrom() on a WebSocketImpl");
+}
+
+
+void WebSocketImpl::sendUrgent(unsigned char /*data*/)
+{
+ throw Poco::InvalidAccessException("Cannot sendUrgent() on a WebSocketImpl");
+}
+
+
+bool WebSocketImpl::secure() const
+{
+ return _pStreamSocketImpl->secure();
+}
+
+
+void WebSocketImpl::setSendTimeout(const Poco::Timespan& timeout)
+{
+ _pStreamSocketImpl->setSendTimeout(timeout);
+}
+
+
+Poco::Timespan WebSocketImpl::getSendTimeout()
+{
+ return _pStreamSocketImpl->getSendTimeout();
+}
+
+
+void WebSocketImpl::setReceiveTimeout(const Poco::Timespan& timeout)
+{
+ _pStreamSocketImpl->setReceiveTimeout(timeout);
+}
+
+
+Poco::Timespan WebSocketImpl::getReceiveTimeout()
+{
+ return _pStreamSocketImpl->getReceiveTimeout();
+}
+
+
+int WebSocketImpl::available()
+{
+ int n = static_cast<int>(_buffer.size()) - _bufferOffset;
+ if (n > 0)
+ return n + _pStreamSocketImpl->available();
+ else
+ return _pStreamSocketImpl->available();
+}
+
+
+} } // namespace Poco::Net
diff --git a/contrib/libs/poco/Net/ya.make b/contrib/libs/poco/Net/ya.make
index aa6bae8cc4..9feadc7027 100644
--- a/contrib/libs/poco/Net/ya.make
+++ b/contrib/libs/poco/Net/ya.make
@@ -1,7 +1,7 @@
-# Generated by devtools/yamaker.
-
-LIBRARY()
-
+# Generated by devtools/yamaker.
+
+LIBRARY()
+
OWNER(
orivej
g:cpp-contrib
@@ -15,131 +15,131 @@ LICENSE(
LICENSE_TEXTS(.yandex_meta/licenses.list.txt)
-PEERDIR(
- contrib/libs/poco/Foundation
-)
-
-ADDINCL(
- GLOBAL contrib/libs/poco/Net/include
- contrib/libs/poco/Foundation/include
- contrib/libs/poco/Net/src
-)
-
-NO_COMPILER_WARNINGS()
-
-NO_UTIL()
-
+PEERDIR(
+ contrib/libs/poco/Foundation
+)
+
+ADDINCL(
+ GLOBAL contrib/libs/poco/Net/include
+ contrib/libs/poco/Foundation/include
+ contrib/libs/poco/Net/src
+)
+
+NO_COMPILER_WARNINGS()
+
+NO_UTIL()
+
CFLAGS(
-DPOCO_SOCKETADDRESS_DONT_PREFER_IPV4
)
-
+
IF (OS_LINUX)
CFLAGS(
-DPOCO_HAVE_FD_EPOLL
)
-ENDIF()
-
-SRCS(
- src/AbstractHTTPRequestHandler.cpp
- src/DNS.cpp
- src/DatagramSocket.cpp
- src/DatagramSocketImpl.cpp
- src/DialogSocket.cpp
- src/FTPClientSession.cpp
- src/FTPStreamFactory.cpp
- src/FilePartSource.cpp
- src/HTMLForm.cpp
- src/HTTPAuthenticationParams.cpp
- src/HTTPBasicCredentials.cpp
- src/HTTPBufferAllocator.cpp
- src/HTTPChunkedStream.cpp
- src/HTTPClientSession.cpp
- src/HTTPCookie.cpp
- src/HTTPCredentials.cpp
- src/HTTPDigestCredentials.cpp
- src/HTTPFixedLengthStream.cpp
- src/HTTPHeaderStream.cpp
- src/HTTPIOStream.cpp
- src/HTTPMessage.cpp
- src/HTTPRequest.cpp
- src/HTTPRequestHandler.cpp
- src/HTTPRequestHandlerFactory.cpp
- src/HTTPResponse.cpp
- src/HTTPServer.cpp
- src/HTTPServerConnection.cpp
- src/HTTPServerConnectionFactory.cpp
- src/HTTPServerParams.cpp
- src/HTTPServerRequest.cpp
- src/HTTPServerRequestImpl.cpp
- src/HTTPServerResponse.cpp
- src/HTTPServerResponseImpl.cpp
- src/HTTPServerSession.cpp
- src/HTTPSession.cpp
- src/HTTPSessionFactory.cpp
- src/HTTPSessionInstantiator.cpp
- src/HTTPStream.cpp
- src/HTTPStreamFactory.cpp
- src/HostEntry.cpp
- src/ICMPClient.cpp
- src/ICMPEventArgs.cpp
- src/ICMPPacket.cpp
- src/ICMPPacketImpl.cpp
- src/ICMPSocket.cpp
- src/ICMPSocketImpl.cpp
- src/ICMPv4PacketImpl.cpp
- src/IPAddress.cpp
- src/IPAddressImpl.cpp
- src/MailMessage.cpp
- src/MailRecipient.cpp
- src/MailStream.cpp
- src/MediaType.cpp
- src/MessageHeader.cpp
- src/MulticastSocket.cpp
- src/MultipartReader.cpp
- src/MultipartWriter.cpp
- src/NTPClient.cpp
- src/NTPEventArgs.cpp
- src/NTPPacket.cpp
- src/NameValueCollection.cpp
- src/Net.cpp
- src/NetException.cpp
- src/NetworkInterface.cpp
- src/NullPartHandler.cpp
- src/OAuth10Credentials.cpp
- src/OAuth20Credentials.cpp
- src/POP3ClientSession.cpp
- src/PartHandler.cpp
- src/PartSource.cpp
- src/PartStore.cpp
- src/PollSet.cpp
- src/QuotedPrintableDecoder.cpp
- src/QuotedPrintableEncoder.cpp
- src/RawSocket.cpp
- src/RawSocketImpl.cpp
- src/RemoteSyslogChannel.cpp
- src/RemoteSyslogListener.cpp
- src/SMTPChannel.cpp
- src/SMTPClientSession.cpp
- src/ServerSocket.cpp
- src/ServerSocketImpl.cpp
- src/Socket.cpp
- src/SocketAddress.cpp
- src/SocketAddressImpl.cpp
- src/SocketImpl.cpp
- src/SocketNotification.cpp
- src/SocketNotifier.cpp
- src/SocketReactor.cpp
- src/SocketStream.cpp
- src/StreamSocket.cpp
- src/StreamSocketImpl.cpp
- src/StringPartSource.cpp
- src/TCPServer.cpp
- src/TCPServerConnection.cpp
- src/TCPServerConnectionFactory.cpp
- src/TCPServerDispatcher.cpp
- src/TCPServerParams.cpp
- src/WebSocket.cpp
- src/WebSocketImpl.cpp
-)
-
-END()
+ENDIF()
+
+SRCS(
+ src/AbstractHTTPRequestHandler.cpp
+ src/DNS.cpp
+ src/DatagramSocket.cpp
+ src/DatagramSocketImpl.cpp
+ src/DialogSocket.cpp
+ src/FTPClientSession.cpp
+ src/FTPStreamFactory.cpp
+ src/FilePartSource.cpp
+ src/HTMLForm.cpp
+ src/HTTPAuthenticationParams.cpp
+ src/HTTPBasicCredentials.cpp
+ src/HTTPBufferAllocator.cpp
+ src/HTTPChunkedStream.cpp
+ src/HTTPClientSession.cpp
+ src/HTTPCookie.cpp
+ src/HTTPCredentials.cpp
+ src/HTTPDigestCredentials.cpp
+ src/HTTPFixedLengthStream.cpp
+ src/HTTPHeaderStream.cpp
+ src/HTTPIOStream.cpp
+ src/HTTPMessage.cpp
+ src/HTTPRequest.cpp
+ src/HTTPRequestHandler.cpp
+ src/HTTPRequestHandlerFactory.cpp
+ src/HTTPResponse.cpp
+ src/HTTPServer.cpp
+ src/HTTPServerConnection.cpp
+ src/HTTPServerConnectionFactory.cpp
+ src/HTTPServerParams.cpp
+ src/HTTPServerRequest.cpp
+ src/HTTPServerRequestImpl.cpp
+ src/HTTPServerResponse.cpp
+ src/HTTPServerResponseImpl.cpp
+ src/HTTPServerSession.cpp
+ src/HTTPSession.cpp
+ src/HTTPSessionFactory.cpp
+ src/HTTPSessionInstantiator.cpp
+ src/HTTPStream.cpp
+ src/HTTPStreamFactory.cpp
+ src/HostEntry.cpp
+ src/ICMPClient.cpp
+ src/ICMPEventArgs.cpp
+ src/ICMPPacket.cpp
+ src/ICMPPacketImpl.cpp
+ src/ICMPSocket.cpp
+ src/ICMPSocketImpl.cpp
+ src/ICMPv4PacketImpl.cpp
+ src/IPAddress.cpp
+ src/IPAddressImpl.cpp
+ src/MailMessage.cpp
+ src/MailRecipient.cpp
+ src/MailStream.cpp
+ src/MediaType.cpp
+ src/MessageHeader.cpp
+ src/MulticastSocket.cpp
+ src/MultipartReader.cpp
+ src/MultipartWriter.cpp
+ src/NTPClient.cpp
+ src/NTPEventArgs.cpp
+ src/NTPPacket.cpp
+ src/NameValueCollection.cpp
+ src/Net.cpp
+ src/NetException.cpp
+ src/NetworkInterface.cpp
+ src/NullPartHandler.cpp
+ src/OAuth10Credentials.cpp
+ src/OAuth20Credentials.cpp
+ src/POP3ClientSession.cpp
+ src/PartHandler.cpp
+ src/PartSource.cpp
+ src/PartStore.cpp
+ src/PollSet.cpp
+ src/QuotedPrintableDecoder.cpp
+ src/QuotedPrintableEncoder.cpp
+ src/RawSocket.cpp
+ src/RawSocketImpl.cpp
+ src/RemoteSyslogChannel.cpp
+ src/RemoteSyslogListener.cpp
+ src/SMTPChannel.cpp
+ src/SMTPClientSession.cpp
+ src/ServerSocket.cpp
+ src/ServerSocketImpl.cpp
+ src/Socket.cpp
+ src/SocketAddress.cpp
+ src/SocketAddressImpl.cpp
+ src/SocketImpl.cpp
+ src/SocketNotification.cpp
+ src/SocketNotifier.cpp
+ src/SocketReactor.cpp
+ src/SocketStream.cpp
+ src/StreamSocket.cpp
+ src/StreamSocketImpl.cpp
+ src/StringPartSource.cpp
+ src/TCPServer.cpp
+ src/TCPServerConnection.cpp
+ src/TCPServerConnectionFactory.cpp
+ src/TCPServerDispatcher.cpp
+ src/TCPServerParams.cpp
+ src/WebSocket.cpp
+ src/WebSocketImpl.cpp
+)
+
+END()