œ_#ÁÕ§TE NAŒ“KeÉ:”(åŽÖJÞùY’‚ñùž7; «]Û ý`8g“¯B© jdÖÖ¸ðzœ¸¦4Ç3Kó^(ÍÖ¼ Õ€pvìwšõB4df$Èü^0˜…åÌC$#2FŽÑ§±¦ÛZ/÷š&m£ñzÒÖ ’.Î]!Î;ƒ(Õ–¢d/—#Kª+tZyuÏB>NÛÖ†(¸ŒSà'³„Y˜´-_•¦¼´˜OlNK§¶ÒàŠˆTHµƒeTPå·fïM’…þuÏÍüp6دªE£åü‡ZØ'CKF#â«;‹eyO Qp„†l"ö1èíÙP ÏŒúl! BÝ2ñª•_VÁÉ÷3eu`–F¸ìI--ö<¿žë¯4õ캿¢)34Å{wMÉ2ÆÖFŸ¥`e9Ú¶¸P‡.”FÔï rY ‚²ÈTB,{ÛœéJ}«àQ4¹0Rû4D‚B§S‘ dO•v¾„™Sן¯3FeŸ™«+ÓâwH dÕÛÌì·P4ë&¥#rÜÉ Ù¦ê†ý·xòqk¯2,¹§™E\ék‚×Sá”ÚºÙ⺷ö£6…à ʾ qSá³Å|;àû}4Ÿ($â¹VY~óÍ!èÜÒŒËX½Ù1j‚VíÍŸš³+œ]«½g{_{/vµ½\¢¶vÉWKÿ:ñám½ ¥ S²x‘t ŽšÝÙÿÀÇ^ný PK IW™k‚½÷ á _rels/.relsUT dìd dìd dìd’ÏNÃ0‡ï{ŠÈ÷ÕÝ@¡¥» ¤Ý*`%îÑ&QâÁöö‚J£ì°cœŸ¿|¶²ÙÆA½rL½wVE Šñ¶w†çúay * 9Kƒw¬áÈ ¶ÕbóÄIîI]’Ê—4t"á1™ŽGJ…ìòMããH’±Å@æ…ZÆuYÞ`üÍ€jÂT;«!îì T}|Û7MoøÞ›ýÈNN<|v–í2ÄÜ¥ÏèšbË¢Ázó˜Ë )„"£OÏ7ú{ZYÈ’yÞç#1'tuÉM?6o>Z´_å9›ëKÚ˜}?þ³žÏÌ·N>fµx PK IWª½e ¢ U € word/document.xmlUT dìdPK IWþË3” z €J¢ word/settings.xmlUT dìdPK IWC‡{š' ƒ €¤ docProps/custom.xmlUT dìdPK IW츱=Œ €‡¥ [Content_Types].xmlUT dìdPK IWV%ë±" €U§ docProps/app.xmlUT dìdPK IW€RŒ 3 €¶¨ docProps/core.xmlUT dìdPK IWkòDn ô €ª word/_rels/document.xml.relsUT dìdPK IW;$î €Î« word/fontTable.xmlUT dìdPK IW+åäz] ÷. €ý¬ word/numbering.xmlUT dìdPK IW¤2×r- ¿ €›° word/styles.xmlUT dìdPK IWMFÒ ø €´ word/header1.xmlUT dìdPK IWF— T e €· word/media/image1.jpegUT dìdPK IW!Yéáå €°Ë word/media/image2.pngUT dìdPK IW°Àºë ú €ÙÌ word/media/image3.pngUT dìdPK IW$“†ª L €Î word/footer1.xmlUT dìdPK IWzaGôM €ñÑ word/footer2.xmlUT dìdPK IW–µâº P €}Õ word/theme/theme1.xmlUT dìdPK IW™k‚½÷ á €{Û _rels/.relsUT PK ! bîh^ [Content_Types].xml ¢( ¬”ËNÃ0E÷HüCä-Jܲ@5í‚Ç*Q>Àēƪc[žiiÿž‰ûB¡j7±ÏÜ{2ñÍh²nm¶‚ˆÆ»R‹ÈÀU^7/ÅÇì%¿’rZYï @1__f› ˜q·ÃR4DáAJ¬h>€ãÚÇV߯¹ªZ¨9ÈÛÁàNVÞ8Ê©ÓãÑÔji){^óã-I‹"{Üv^¥P!XS)bR¹rú—K¾s(¸3Õ`cÞ0†½ÝÎß»¾7M4²©ŠôªZÆk+¿|\|z¿(Ž‹ôPúº6h_-[ž@!‚ÒØ Pk‹´2nÏ}Ä?£LËð Ýû%áÄßdºždN"m,à¥ÇžDO97*‚~§Èɸ8ÀOíc|n¦Ñ äEøÿöéºóÀBÉÀ!$}‡íàÈé;{ìÐå[ƒîñ–é2þ ÿÿ PK ! µU0#ô L _rels/.rels ¢( ¬’MOÃ0†ïHü‡È÷ÕÝBKwAH»!T~€Iܵ£$Ý¿'TƒG½~üÊÛÝ<êÈ!öâ4¬‹;#¶w†—úqu *&r–Fq¬áÄvÕõÕö™GJy(v½*«¸¨¡KÉß#FÓñD±Ï.W ¥†=™ZÆMYÞbø®ÕBS톰·7 ê“Ï›×–¦é ?ˆ9LìÒ™ÈsbgÙ®|Èl!õùUSh9i°bžr:"y_dlÀóD›¿ý|-NœÈR"4ø2ÏGÇ% õZ´4ñËyÄ7 ëÈðÉ‚‹¨Þ ÿÿ PK ! Q48wÛ — xl/workbook.xml¤UÙnâ0}iþ!cñ‡ *–¢AšVU×$dC¬&vÆv UÕŸë@XÊK§/¹p|Žï¹N÷b“¥Ö •Š ÞC¸î"‹òHÄŒ¯zèá~b·‘¥4á1I§=ôJºèÿüÑ] ù¼âÙ ®z(Ñ:GE ͈ª‹œrˆ,…̈†©\9*—”Ä*¡Tg©ã¹nàd„q´Eåg0ÄrÉ":Q‘Q®· ’¦D}•°\UhYô¸ŒÈç"·#‘å ±`)Ó¯%(²²(œ®¸d‘‚ì nZ w v¡ñª• t¶TÆ")”Xê:@;[Ògú±ë`|²›ó=ø’ïHúÂL÷¬dðEVÁ+8€a÷Ûh¬Uz%„Íû"ZsÏÍCýî’¥ôqk]‹äù5ÉL¦Rd¥Dé˘i÷P ¦bM/|dÉ",…¨çãFNoçiûéë>aêiçsó#ðÄ ÕTr¢éHp ÜIú®ÝJìQ"ÀÜÖ-ý[0I¡¦ÀZ Z…d¡nˆN¬B¦=4 g %PDF-1.4 %âãÏÓ 3 0 obj << /Linearized 1 /L 422775 ÿØÿà JFIF ÿÛ C ÿÛ C ÿÀ X" ÿÄ ÿÄ H !1A"Qaq2‘¡#±ÁBRÑ3Cbrá$S‚¢²ð4ñ%6DTc’ÂsÿÄ ÿÄ = !1AQ"aq‘Á2R¡±BÑð#3br’²4á$‚¢ÂñÿÚ ? áHBßÝ`„! !@B„ „! !@B„ „! !@B„ „! !@B„ „! !@B„ „! !@B„ „! !@B„ „! !@B„ „! !@B„ „! !@B„ „! !@B„ „! !@B„ „! !@B„ „! !@B„ „! !@B„ „! !@B„ „! !@B„ „! !@B„ „! !@B„ „! !@B„ „! !@B„ „! !@B„ „! ! stream
/*
+----------------------------------------------------------------------+
| Swoole |
+----------------------------------------------------------------------+
| This source file is subject to version 2.0 of the Apache license, |
| that is bundled with this package in the file LICENSE, and is |
| available through the world-wide-web at the following url: |
| http://www.apache.org/licenses/LICENSE-2.0.html |
| If you did not receive a copy of the Apache2.0 license and are unable|
| to obtain it through the world-wide-web, please send a note to |
| license@swoole.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Author: Tianfeng Han <mikan.tenny@gmail.com> |
+----------------------------------------------------------------------+
*/
#pragma once
#include "swoole_api.h"
#include "swoole_string.h"
#include "swoole_socket.h"
#include "swoole_reactor.h"
#include "swoole_protocol.h"
#include "swoole_proxy.h"
#define SW_HTTPS_PROXY_HANDSHAKE_RESPONSE "HTTP/1.1 200 Connection established"
namespace swoole {
namespace network {
class Client {
public:
int id = 0;
long timeout_id = 0; // timeout node id
int _sock_type = 0;
int _sock_domain = 0;
int _protocol = 0;
enum swFd_type fd_type;
bool active = false;
bool async = false;
bool keep = false;
bool destroyed = false;
bool http2 = false;
bool sleep_ = false;
bool wait_dns = false;
bool shutdow_rw = false;
bool shutdown_read = false;
bool shutdown_write = false;
bool remove_delay = false;
bool closed = false;
bool high_watermark = false;
/**
* one package: length check
*/
bool open_length_check = false;
bool open_eof_check = false;
Protocol protocol = {};
Socks5Proxy *socks5_proxy = nullptr;
HttpProxy *http_proxy = nullptr;
uint32_t reuse_count = 0;
const char *server_str = nullptr;
const char *server_host = nullptr;
int server_port = 0;
void *ptr = nullptr;
void *params = nullptr;
uint8_t server_strlen = 0;
double timeout = 0;
TimerNode *timer = nullptr;
/**
* signal interruption
*/
double interrupt_time = 0;
/**
* sendto, read only.
*/
Address server_addr = {};
/**
* recvfrom
*/
Address remote_addr = {};
Socket *socket;
void *object = nullptr;
String *buffer = nullptr;
uint32_t wait_length = 0;
uint32_t input_buffer_size = 0;
uint32_t buffer_high_watermark = 0;
uint32_t buffer_low_watermark = 0;
#ifdef SW_USE_OPENSSL
bool open_ssl = false;
bool ssl_wait_handshake = false;
SSL_CTX *ssl_context = nullptr;
swSSL_option ssl_option = {};
#endif
void (*onConnect)(Client *cli) = nullptr;
void (*onError)(Client *cli) = nullptr;
void (*onReceive)(Client *cli, const char *data, uint32_t length) = nullptr;
void (*onClose)(Client *cli) = nullptr;
void (*onBufferFull)(Client *cli) = nullptr;
void (*onBufferEmpty)(Client *cli) = nullptr;
int (*connect)(Client *cli, const char *host, int port, double _timeout, int sock_flag) = nullptr;
ssize_t (*send)(Client *cli, const char *data, size_t length, int flags) = nullptr;
int (*sendfile)(Client *cli, const char *filename, off_t offset, size_t length) = nullptr;
ssize_t (*recv)(Client *cli, char *data, size_t length, int flags) = nullptr;
static void init_reactor(Reactor *reactor);
Client(enum swSocket_type type, bool async);
~Client();
int sleep();
int wakeup();
int shutdown(int __how);
int close();
void destroy();
int socks5_handshake(const char *recv_data, size_t length);
#ifdef SW_USE_OPENSSL
int enable_ssl_encrypt();
int ssl_handshake();
int ssl_verify(int allow_self_signed);
#endif
};
//----------------------------------------Stream---------------------------------------
class Stream {
public:
String *buffer = nullptr;
Client client;
bool connected = false;
bool cancel = false;
int errCode = 0;
void *private_data = nullptr;
void *private_data_2 = nullptr;
long private_data_fd = -1;
std::function<void(Stream *stream, const char *data, uint32_t length)> response = nullptr;
int send(const char *data, size_t length);
void set_max_length(uint32_t max_length);
inline static Stream *create(const char *dst_host, int dst_port, enum swSocket_type type) {
Stream *stream = new Stream(dst_host, dst_port, type);
if (!stream->connected) {
delete stream;
return nullptr;
} else {
return stream;
}
}
~Stream();
static int recv_blocking(Socket *sock, void *__buf, size_t __len);
static void set_protocol(Protocol *protocol);
private:
Stream(const char *dst_host, int dst_port, enum swSocket_type type);
};
//----------------------------------------Stream End------------------------------------
class SyncClient {
protected:
Client client;
bool connected = false;
bool created;
bool async = false;
enum swSocket_type type;
public:
SyncClient(enum swSocket_type _type, bool _async = false) : client(_type, _async), async(_async), type(_type) {
created = client.socket != nullptr;
}
bool connect(const char *host, int port, double timeout = -1) {
if (connected || !created) {
return false;
}
if (client.connect(&client, host, port, timeout, 0) < 0) {
return false;
}
connected = true;
return true;
}
ssize_t send(const std::string &data) {
return client.send(&client, data.c_str(), data.length(), 0);
}
ssize_t send(const char *buf, size_t len) {
return client.send(&client, buf, len, 0);
}
ssize_t recv(char *buf, size_t len) {
return client.recv(&client, buf, len, 0);
}
bool close() {
if (!created || client.closed) {
return false;
}
client.close();
created = false;
return true;
}
virtual ~SyncClient() {
if (created) {
close();
}
}
};
class AsyncClient : public SyncClient {
protected:
std::function<void(AsyncClient *)> _onConnect = nullptr;
std::function<void(AsyncClient *)> _onError = nullptr;
std::function<void(AsyncClient *)> _onClose = nullptr;
std::function<void(AsyncClient *, const char *data, uint32_t length)> _onReceive = nullptr;
public:
AsyncClient(enum swSocket_type _type) : SyncClient(_type, true) {}
bool connect(const char *host, int port, double timeout = -1) {
client.object = this;
client.onConnect = [](Client *cli) {
AsyncClient *ac = (AsyncClient *) cli->object;
ac->_onConnect(ac);
};
client.onError = [](Client *cli) {
AsyncClient *ac = (AsyncClient *) cli->object;
ac->_onError(ac);
};
client.onClose = [](Client *cli) {
AsyncClient *ac = (AsyncClient *) cli->object;
ac->_onClose(ac);
};
client.onReceive = [](Client *cli, const char *data, uint32_t length) {
AsyncClient *ac = (AsyncClient *) cli->object;
ac->_onReceive(ac, data, length);
};
return SyncClient::connect(host, port, timeout);
}
void on_connect(std::function<void(AsyncClient *)> fn) {
_onConnect = fn;
}
void on_error(std::function<void(AsyncClient *)> fn) {
_onError = fn;
}
void on_close(std::function<void(AsyncClient *)> fn) {
_onClose = fn;
}
void on_receive(std::function<void(AsyncClient *, const char *data, size_t length)> fn) {
_onReceive = fn;
}
};
} // namespace network
} // namespace swoole