content = $content; } public function getBody() { return $this->content; } public function getLines(): array { return explode("\n", $this->content); } } interface HttpClient { public function request(string $method, string $url, array $headers = [], array $data = []): Response; } class ScriptClient implements HttpClient { private $proxy; private $credentials; public function __construct(string $settings) { $this->readSettings($settings); } private function getAuthorityComponent(string $authority = null, string $tag = null) { if(is_null($authority)){ return null; } if(!is_null($tag)){ $authority .= ":$tag"; } return $authority; } private function readSettings(string $file) { if(!is_file($file) || !is_readable($file)){ return; } $stmts = file($file); $settings = array_reduce($stmts, function($c, $stmt){ list($key, $val) = \array_pad(array_map('trim', explode(':', $stmt)), 2, null); $c[$key] = $val; return $c; }, []); $this->proxy = $this->getAuthorityComponent($settings['proxy_host'], $settings['proxy_port']); $this->credentials = $this->getAuthorityComponent($settings['proxy_user'], $settings['proxy_pass']); } public function request(string $method, string $uri, array $headers = [], array $data = []): Response { $options = [ 'http' => [ 'method' => strtoupper($method), 'header' => $headers + [$this->credentials ? 'Proxy-Authorization: Basic ' . base64_encode($this->credentials) : null], 'proxy' => $this->proxy, 'content' => http_build_query($data), ], ]; $context = stream_context_create($options); $body = file_get_contents($uri, false, $context); if($body === false){ trigger_error( "Unable to contact the Server. Are outbound connections disabled? " . "(If a proxy is required for outbound traffic, you may configure " . "the honey pot to use a proxy. For instructions, visit " . "http://www.projecthoneypot.org/settings_help.php)", E_USER_ERROR ); } return new TextResponse($body); } } trait AliasingTrait { private $aliases = []; public function searchAliases($search, array $aliases, array $collector = [], $parent = null): array { foreach($aliases as $alias => $value){ if(is_array($value)){ return $this->searchAliases($search, $value, $collector, $alias); } if($search === $value){ $collector[] = $parent ?? $alias; } } return $collector; } public function getAliases($search): array { $aliases = $this->searchAliases($search, $this->aliases); return !empty($aliases) ? $aliases : [$search]; } public function aliasMatch($alias, $key) { return $key === $alias; } public function setAlias($key, $alias) { $this->aliases[$alias] = $key; } public function setAliases(array $array) { array_walk($array, function($v, $k){ $this->aliases[$k] = $v; }); } } abstract class Data { protected $key; protected $value; public function __construct($key, $value) { $this->key = $key; $this->value = $value; } public function key() { return $this->key; } public function value() { return $this->value; } } class DataCollection { use AliasingTrait; private $data; public function __construct(Data ...$data) { $this->data = $data; } public function set(Data ...$data) { array_map(function(Data $data){ $index = $this->getIndexByKey($data->key()); if(is_null($index)){ $this->data[] = $data; } else { $this->data[$index] = $data; } }, $data); } public function getByKey($key) { $key = $this->getIndexByKey($key); return !is_null($key) ? $this->data[$key] : null; } public function getValueByKey($key) { $data = $this->getByKey($key); return !is_null($data) ? $data->value() : null; } private function getIndexByKey($key) { $result = []; array_walk($this->data, function(Data $data, $index) use ($key, &$result){ if($data->key() == $key){ $result[] = $index; } }); return !empty($result) ? reset($result) : null; } } interface Transcriber { public function transcribe(array $data): DataCollection; public function canTranscribe($value): bool; } class StringData extends Data { public function __construct($key, string $value) { parent::__construct($key, $value); } } class CompressedData extends Data { public function __construct($key, string $value) { parent::__construct($key, $value); } public function value() { $url_decoded = base64_decode(str_replace(['-','_'],['+','/'],$this->value)); if(substr(bin2hex($url_decoded), 0, 6) === '1f8b08'){ return gzdecode($url_decoded); } else { return $this->value; } } } class FlagData extends Data { private $data; public function setData($data) { $this->data = $data; } public function value() { return $this->value ? ($this->data ?? null) : null; } } class CallbackData extends Data { private $arguments = []; public function __construct($key, callable $value) { parent::__construct($key, $value); } public function setArgument($pos, $param) { $this->arguments[$pos] = $param; } public function value() { ksort($this->arguments); return \call_user_func_array($this->value, $this->arguments); } } class DataFactory { private $data; private $callbacks; private function setData(array $data, string $class, DataCollection $dc = null) { $dc = $dc ?? new DataCollection; array_walk($data, function($value, $key) use($dc, $class){ $dc->set(new $class($key, $value)); }); return $dc; } public function setStaticData(array $data) { $this->data = $this->setData($data, StringData::class, $this->data); } public function setCompressedData(array $data) { $this->data = $this->setData($data, CompressedData::class, $this->data); } public function setCallbackData(array $data) { $this->callbacks = $this->setData($data, CallbackData::class, $this->callbacks); } public function fromSourceKey($sourceKey, $key, $value) { $keys = $this->data->getAliases($key); $key = reset($keys); $data = $this->data->getValueByKey($key); switch($sourceKey){ case 'directives': $flag = new FlagData($key, $value); if(!is_null($data)){ $flag->setData($data); } return $flag; case 'email': case 'emailmethod': $callback = $this->callbacks->getByKey($key); if(!is_null($callback)){ $pos = array_search($sourceKey, ['email', 'emailmethod']); $callback->setArgument($pos, $value); $this->callbacks->set($callback); return $callback; } default: return new StringData($key, $value); } } } class DataTranscriber implements Transcriber { private $template; private $data; private $factory; private $transcribingMode = false; public function __construct(DataCollection $data, DataFactory $factory) { $this->data = $data; $this->factory = $factory; } public function canTranscribe($value): bool { if($value == ''){ $this->transcribingMode = true; return false; } if($value == ''){ $this->transcribingMode = false; } return $this->transcribingMode; } public function transcribe(array $body): DataCollection { $data = $this->collectData($this->data, $body); return $data; } public function collectData(DataCollection $collector, array $array, $parents = []): DataCollection { foreach($array as $key => $value){ if($this->canTranscribe($value)){ $value = $this->parse($key, $value, $parents); $parents[] = $key; if(is_array($value)){ $this->collectData($collector, $value, $parents); } else { $data = $this->factory->fromSourceKey($parents[1], $key, $value); if(!is_null($data->value())){ $collector->set($data); } } array_pop($parents); } } return $collector; } public function parse($key, $value, $parents = []) { if(is_string($value)){ if(key($parents) !== NULL){ $keys = $this->data->getAliases($key); if(count($keys) > 1 || $keys[0] !== $key){ return \array_fill_keys($keys, $value); } } end($parents); if(key($parents) === NULL && false !== strpos($value, '=')){ list($key, $value) = explode('=', $value, 2); return [$key => urldecode($value)]; } if($key === 'directives'){ return explode(',', $value); } } return $value; } } interface Template { public function render(DataCollection $data): string; } class ArrayTemplate implements Template { public $template; public function __construct(array $template = []) { $this->template = $template; } public function render(DataCollection $data): string { $output = array_reduce($this->template, function($output, $key) use($data){ $output[] = $data->getValueByKey($key) ?? null; return $output; }, []); ksort($output); return implode("\n", array_filter($output)); } } class Script { private $client; private $transcriber; private $template; private $templateData; private $factory; public function __construct(HttpClient $client, Transcriber $transcriber, Template $template, DataCollection $templateData, DataFactory $factory) { $this->client = $client; $this->transcriber = $transcriber; $this->template = $template; $this->templateData = $templateData; $this->factory = $factory; } public static function run(string $host, int $port, string $script, string $settings = '') { $client = new ScriptClient($settings); $templateData = new DataCollection; $templateData->setAliases([ 'doctype' => 0, 'head1' => 1, 'robots' => 8, 'nocollect' => 9, 'head2' => 1, 'top' => 2, 'legal' => 3, 'style' => 5, 'vanity' => 6, 'bottom' => 7, 'emailCallback' => ['email','emailmethod'], ]); $factory = new DataFactory; $factory->setStaticData([ 'doctype' => '', 'head1' => '', 'head2' => 'www.mxchange.de', 'top' => '
', 'bottom' => '
', ]); $factory->setCompressedData([ 'robots' => 'H4sIAAAAAAAAA7PJTS1JVMhLzE21VSrKT8ovKVZSSM7PK0nNK7FVSsvPyckvV7KzwacoLz-xKDkjsyyVoLrMvJTUCiU7AAMBN69zAAAA', 'nocollect' => 'H4sIAAAAAAAAA7PJTS1JVMhLzE21VcrL103NTczM0U3Oz8lJTS7JzM9TUkjOzytJzSuxVdJXsgMAKsBXli0AAAA', 'legal' => 'H4sIAAAAAAAAA61bbXPbuBH-3l-BOh1fMuM4jhM7TpnLjM5WEnXu7IylJHMf-QJJaEiAB4BS1V_fxe6SBPXintN-0NFk-ALsPvvsswvcO59mpRSZsYW0Px-dHYlclmWdFoXSi-7c1WnO5-_fefv-L-98IZzflPLno7nR_vk8rVS5-buojDbhZpkcvT_WmasTwYd3meUr4a_Z8vjJy7OXdNkbsQlHA9deXiZLGU6-yeMnb68Sh8_B9deJTItwki6kxqeWsmr_8Swx-jk9leET_df2f__4ydWrpA6feIvnt-EtLxN6F77J1e_--vy5mJs8LcUfTWq9tGKNtjDfpRbPn79XOJ7amgWOq_Gm_fS4SlU4TrzAY1oaHDPM-u2bxOFgnDc2HFdp2dA5jcHSJK0czqObxvt3weIiN6WxP6-Xysv37t2LcO39uxfZ--E8xylOcUnvpEE9PfpHwwakgYTvvklyukkHx5wlux-p24-wp87OEzEnW8Kc9AbfNZV2Fb_7v_nhd9PglSql59OsQf99VU51zz-5ukwmU3RHVjbzuXC1shtRGgcuya1xYMq1FnKxCF6ZhGc-j-Cp82SGY_ryyxTf9cIXj0HuQxavtywefmuZBUte4MRgXjgRKzw6Eh6Kpu4J44R3J8jx4cqpmKEbvCWr8qOnh22Jd6BtaivL1EsnnCznFgyo0R4A33DPp6ZKw1Fad4IDSyscYIXPaimLQAOpB5hvgA50A-9prDWNDkzg8E0BoWc0v_ArBUUkzVoQYuUpTOeKoioVK5wGh-0J3xzi3iB0whD7ixUF9uF57vphwX6oU-KIcJd2ZFd8rFA5AsnKhYqCCb53leDYwr002lpaHJSkCJAUiLnH51ROTkgzs_rzgTnfA5PcaNeFTV23RpsRE9oeQsiTd_eI3d_BqG_eJvcY02Dfl8mX8Y9gegc5DMsm-ycOxFZETps2LkWOqJkLj7iUIs2RM-Zkni1_7TXC98gIfeSTU5xHj4mvkXMy4_uTQqKxgITJZz0pBB9xYqBbzEJz5OGQyyaOOA6ngPXKNH4pVukCbgBUFzth6ZcK3-hFSgnhYVT6zWFcpjEZQiSOOqY_Y6Z3IrVtEMGlSnbYKHdfu-TXdlFltMj6kQGbspMWwyHv9Uu-45duShJuxRFbYjGYAODvVdK_MVjm7FVih98ZfbzvT6bj23ByO4NnLy-T_wdc59Zgzs-9QIwszEpSlOYEXzmnZEZmUJqN-RYw0gdWUDy74O0hPI3D1aocP-WI-yjHuxPK64qsoPF1m56l8VOSQkn9WyLE8nAvYBBfoA0Z-AVogB3HqCjTOkloptGBvEFSE_JfCGWYNxC0Z6Z_GKYLS6jDsZouA4FtiC4VDkwWhNHg8MBP_DndTussKQ7THGU80yz6UeSmD6F2ANV_iScTEuIZkbmp6KGeppmdNY26zx5SdNljPCY6vUHQ3n6km0APjEfXj4Ph3sBJdwJnawZ0Cjf3gc38abXqTHmeMIrLkqBTqFWfYOkdVkW2XCsfwxbG9nl8PYnBqtja5AiEiGtALeUKiAISDyClAQ-vDKQzCB0bUONOCUrwj5kpNuFSz9K6AKQhBHpx209Ki4ip_RKBui4B7uGFuUktoFfBN6VNUa-luoVpKZ3rnUmzplxAVwrbCaSLRJGEAn2zpe33ekftSTd7bjN7UrMTvkeeZfrQR89ISVR0XpcqEm-KUxACN6VreLL0FLhOkks88-pp5L4_M_gtaKWUwlCnUVliRJ36JbxjoUKpAgZe0UCXkoyo5opjXnT4-RT08etYjcOFN1fJ7_iP4u7D_4OtczImFXcSSimkocNZjaQFPSSdHIwtmBD-e_4y4oCG0yRam8h2Cbl9K0bCxIAnYjT8GjudrnLg4EtuTVQHSnIwiWbOfXlXN7a_JUGYlTCCgSOeMsSAxTlSrMIKl4o_R9j-yR1mVzSIKzcPFFaIEB9_K-Zft0zRWMp5Gwd1yfFqQqGrpBeVRb2_Eev-RThl02fXRdpP-SxiLMDjlgN-gEAXgnxtIgdpwVGJhjKiGSrlT6P7r_3dv42n_cnsEwiQtz8mQB6s_mYDHCEltuKz7BsK9OVc0nhdZCrS0HRySx2Cp47YZmFTHSOGctyWZSdUE4PHnVpoiPMcWDzUgcD3UL8BPRRWrdIyyDnXgEZyziDnX4M0i4YOdRqmKqgRGQqNhUJyA68yc0UdoqpxORxAgcHLshQOitgmAps1KE9arXWynTEuiC6ZIdkgUSNIF6JTtjqUkRfJNKJastCpmOCxSlVJacH0pD3IDeD1i-Tz53imeiO6jhKICJJ2pcgkzltmmUgzVSq_aRNV6rlmcBAa3oCmq03-HWKkqcKNzLgUCquIIhZ9Pap8LwReJ35PhBex4POR-pElWSffcvz9-PounlZjBbY9OH2pCGQNTVURB_uhqcbTGT43HX3sQmTK4ulRIml8_9tANQes4dzbAj_mhoppEpHzPIAOjmsaGd3BBVIRPRvQcn5GgjSyBDbyxgN2vx-kdEUc15aYxsdMbmU6wCj5znbwPHubUM-M3RkpaLr3bxdnMUWGkJ_HM9CRQKLUrdPvoMDWqixZtRdYHahM9YKW5_br5Ho08LLyOHbVqq_BpyHLUGsiSPfLN8ydrLgl2YBSEujILjVdJBWVMp5maPSWge9vpruFu_ayx3c_-fOECs8_GtlX68qJzsi3H09w0E-nxHIImx-gZU7rV8kN2rRUFbCUDyI3hG3sfkkYAu2LZm5Lcb2nimm1FwYbSNWv_CC6sO1Rcw3j3JaZIJLut7PB6-QnbvUyCKNMajuiK07EILx383bXZ-tyAT96Kn43UdhzyBlN8oIltiyOn7we4OqXXynYd9zayhsfo0Ra3eldkLEk0jTrLSbvEWGY6wEoNfqOpsrFMFHzIEBixkH7dcDS9Fr_MFNK8RQ_txHU2SxC0YCNUOlDX8t5CDXIe1mVWqhBXFwifxzNPoXj7I7IjsZx90E8mvkO97swCrFtN0i2bXeJ-wl0QDd-o2nTCgYAtmsxcJa8SNoKKQQqRRjd24iGpIDZzK2SkEcLmRvbh0Q3xbVVW44gEVFCdZArmzdlSgphNigsIdPJ_tvM3_gmqPdQxWChDgwweD0n_aJXLwUXcV4Q9TZi3kRAIqCXYM-WgrsPxcQ4-rYL3j2sCGIHvymyDesa7SSQk85laxXPIMqkR7ELRR4VEsiihFqtZU6RsNox3nQyEIGfqeg2_9osZKi4yzKtoQjWaeNk2vZpqL8JXzhqbXSZ5NSPcY7WVJAcsWUxuQ1_fxofVqETekvIgySBH4Xfm8nQ07vfkW15tkBHa3fahT4gUnbs4lmgGUvccCLS1rVUvHVNdc8qcDvX3N3uyzWOKTvndbITgbzE0kgM-hKW-d5x8y1fCmoMcr-rhR8FT6yujuNFjGhMo1vAwdU-sqSGrUBFAgwTC_tueSewMrlZSgLW1CN9IwQKktulXCivoKaX4rtWi1DLmvkcUQqZLYMpLVNggzyta_g7LDxqsjcjHicqD7c4ejKObX0_4N8vu6UMvIpO3rxqvafbae1bIGz7yZTrIPa6PIWMCzh5nQhM9zfjW2TdyfX49NGAJUbdAxTJMme2lJEvfqF62XGcQx6n49JExddxtPBMV-rjvkUfWe3D0GzM6IYUTiFPuGuObl3K2qdcfTUaNQq4DwIdJL7JVjJ0x6DMU8jQ1Mfe0wxus8lioFSh6KnJF2Biu8f336NEWeFdquwJnFyziCOlTUSEJl5LiWb-jy_3A54IVVfoq_dUMJD6ZYp0OioqpMwRgabq-5vxOuHhDsHUR-Ul9z-Pae25JivbtMoanXuseF2toMIzNUSTch6kh5aQAJ2Xso6zP09pOqwbRrtdobToFjih_pyr_YNtRcnGRHy3ER12ZnfE5Aj5D5O-GfFD0P9wONAHQQz3PEVDCxp-n4O5y-zaqrQnKchJ3xAUDy09dZsUDm9EmMl2TQsqKLUjlm_vgFRfXyRDzgE0cdWYkZpZmbKpMFPvUYLzQc3MeWW5tSrZFW0XifQcN1GVjlFALraSN0M0JL8gySDyAseen7PxmPm2UHQzuY4nIgui53atiqUIlYVaTH18BOWG2cdLSqpLkfWFlcnljuVI4BqlvZk74BZIWCupGynyJgO8W1kBobDOuDkM7644sEfP8JybKpI2qHQ5FQq2h9en7sX13Q9heRh89IKjaF_E64SXokE1UXWLoSQtgQoHm7lo2dhQuQJPmdZxnRyMLAgxdJ58-W20ne8u2iUaKP8JCSfRvoy4BzpgxrTD2Dk3sQhuhezBYuPFR79MPfNtWJHGv-0qzljRHqFo3LPJ3aCMWIgsSmAw9AAMEJ2FtPAvjVuKOSSa0P2D8siCDgJA8Or2nnSxjFwKOuSIjziIIJrDsd2rI1PaKuR2xdIvX6ZdadldPkjulmQ1zUAxrVM0WDSyPu0o9H6EOviWG1aPhVtM6ryIyqkzyllPKXAdb04JJSTFyBphNhdTWkeZi-01httBpNGGpQEniG_UgTHUTlR6DlHqpQPVB9W9rUAYaKOhYCOB14fFHkXQmo8axD5eX2p_QA9yv-1bXTA3A_TInRMV77hgcRAFYnoYQ8MiaRjhhgQvyNnQ4PZibSpaFGwWy_5uTh9QwOOsnh2uSWhNyXKhiB_WXvSdNG5E0I4bydSwSG1xeIic4Aq0wlp2_eLQkAiSZZgAph-oTEOQfpmNfxycjpc5QQ9Gmgf3450PSQgqPTLQMi1R1DkuhTDf4A6iq0RhbLXbLAdFUmBfqvodOKJWNUhRYaxaKA1oDIo0M2thNKbe2aDRDIxLLXNFug7EVtThnPftgWG9UZZxqC-bKDG20RgRbEVvpv7HnvwzlMSmTLfCkVW5wOW1Teu-t4ONdpKD3ArPrYGqTi2udMCkEYuFpP1CbpnWElxWgZAP69jU72eAGQYbtcp420y7W6rtfm__ilPaZNE42v5laVzDJfb7CW1cmIrRLZNGoVxtQkvTqrB4vwb3B8r3YXnGAPHrgch9NAKPnlGnpShU5NQq2gTVQusAubTyL-P9Tt8prUne4rTWcrueut9Xx9G2K4opIMSHi5sg-Q7SQ7ihYmfE8X0Zrx2nvC2sKYqS6Pew2lzFkcoNrxJhWAGh44CXUWtcmW39ETOOa7p1ZE5-FNtxPPT72x4o8Cm5uH6bThD6B2XbP2n3LxfCktsraA_e7Lj900L2qiv31PJgai3F7sRmd4OlicvQvrx8k1z_D-QYyr1sS9UBnJ4RbtuOVLtEfRYvszYkXyKzshjf_tW8tu7NCS8aVDUB8tue_WK1jZrcLo6YnCRi2w9z3I9QNLIFruEA-xxMoHvpbClqautz9dbtlQhaUzM397zkefOH5VqvoFgRCGDIr8ixra32WiMsrz7Yf2ct4xpeIbayaHSR6nwTFouhGOGFUe5QQS09iP6RoBb8-PNs9OPAMCvahc-b53mp6SD2Wdx85s4flXhFvA5vuv4r37v9I5ZeU9pq4tqaa97wfy3sLOaF7cUUzVT3Rft86dZU9TQbrVAOpFlKi1i8gLD9s37T4xx7M4LkloEETxsDzCIUfpA8wGtab8S835EFrItvLXjbk2IuCMUlRSBZpuH_QWCvbaig5kUYqD5C74u3CZDz4axXlW1ZdBq_YoJy6ib8eXs97pH5aGTQrku96ShE9lf_7G8wyX5_58D8L-KOyAO_HlfUH9X7kdqmLvIC-nXvyLabKlFg3d5sWe0F_i87LzBM4Q_4h_8AL5fyp_czAAA', 'style' => 'H4sIAAAAAAAAAyXMOw6AIAwA0KuQuIqfFYgj96hSEgxpTemAMd7dwXeAF5reFTeYTkjyHFxZ3BBj9JlJ3c41mXW5ugEpUMcG1GxDKdkrdrUJDxbQwuSICf0b5v_7AIttqRNXAAAA', 'vanity' => 'H4sIAAAAAAAAA22S207DMAyGX8XKbmEdp0nL2goxDSEk2MThgsu0ydpAiCPHrOztSbtxwUGRJTuKv_93kpxV5QzUxrkYVG19U4iJ6MugtD6UFZI21GeRd84UolL1W0P44bUczWazeWc1t_L0bBI-56LMmVJo2CpnG18IxvDdeIBKOAmfcJriIsV56tpLHJNtWpYRndXDkdFiseiJyZuHA2ODnmWFTkOvB4qsckdR-XgcDdnNvEaHJEfT6XSelGXvKWC0bNFLMk6x3ZrEvMyznlrmGes_duGQO7NhAb_MnyXVSVrn-2kVtGQ2hWiZg8yyruvGgfDV1NyiN7uAPEZqMgG1UzEW4lVpEuXd8u5q-QCra1g_rG6Xiye4Wd0vX2C9esozVeYV_Uv-8Mn0-7jGd_ED95h24UbR1kQ2BGtCTgbSyHBvuEN664HJ1tZqo6HawfMAGqSGC8j6R8uG31B-Ab6VGicVAgAA', ]); $factory->setCallbackData([ 'emailCallback' => function($email, $style = null){ $value = $email; $display = 'style="display:' . ['none',' none'][random_int(0,1)] . '"'; $style = $style ?? random_int(0,5); $props[] = "href=\"mailto:$email\""; $wrap = function($value, $style) use($display){ switch($style){ case 2: return ""; case 4: return "$value"; case 5: $id = 'sumach'; return "
$value
\n"; default: return $value; } }; switch($style){ case 0: $value = ''; break; case 3: $value = $wrap($email, 2); break; case 1: $props[] = $display; break; } $props = implode(' ', $props); $link = "$value"; return $wrap($link, $style); } ]); $transcriber = new DataTranscriber($templateData, $factory); $template = new ArrayTemplate([ 'doctype', 'injDocType', 'head1', 'injHead1HTMLMsg', 'robots', 'injRobotHTMLMsg', 'nocollect', 'injNoCollectHTMLMsg', 'head2', 'injHead2HTMLMsg', 'top', 'injTopHTMLMsg', 'actMsg', 'errMsg', 'customMsg', 'legal', 'injLegalHTMLMsg', 'altLegalMsg', 'emailCallback', 'injEmailHTMLMsg', 'style', 'injStyleHTMLMsg', 'vanity', 'injVanityHTMLMsg', 'altVanityMsg', 'bottom', 'injBottomHTMLMsg', ]); $hp = new Script($client, $transcriber, $template, $templateData, $factory); $hp->handle($host, $port, $script); } public function handle($host, $port, $script) { $data = [ 'tag1' => '7b8a66bc336b69c9af3e1af568a2b17d', 'tag2' => 'f2a27588503b628def5deabe3efc37a9', 'tag3' => '3649d4e9bcfd3422fb4f9d22ae0a2a91', 'tag4' => md5_file(__FILE__), 'version' => "php-".phpversion(), 'ip' => $_SERVER['REMOTE_ADDR'], 'svrn' => $_SERVER['SERVER_NAME'], 'svp' => $_SERVER['SERVER_PORT'], 'sn' => $_SERVER['SCRIPT_NAME'] ?? '', 'svip' => $_SERVER['SERVER_ADDR'] ?? '', 'rquri' => $_SERVER['REQUEST_URI'] ?? '', 'phpself' => $_SERVER['PHP_SELF'] ?? '', 'ref' => $_SERVER['HTTP_REFERER'] ?? '', 'uagnt' => $_SERVER['HTTP_USER_AGENT'] ?? '', ]; $headers = [ "User-Agent: PHPot {$data['tag2']}", "Content-Type: application/x-www-form-urlencoded", "Cache-Control: no-store, no-cache", "Accept: */*", "Pragma: no-cache", ]; $subResponse = $this->client->request("POST", "http://$host:$port/$script", $headers, $data); $data = $this->transcriber->transcribe($subResponse->getLines()); $response = new TextResponse($this->template->render($data)); $this->serve($response); } public function serve(Response $response) { header("Cache-Control: no-store, no-cache"); header("Pragma: no-cache"); print $response->getBody(); } } Script::run(__REQUEST_HOST, __REQUEST_PORT, __REQUEST_SCRIPT, __DIR__ . '/phpot_settings.php');