0) { $data = ''; if (msg_receive($queue, $required_msgtype, $msgtype, $maxsize, $data, $serialize_needed, $option_receive, $err)===true) { echo "[-] Received a Message...\n"; $data = json_decode($data); $return_type = $data->rt; $url = $data->url; $header = ''; if ($url && ($data->validity >= time())) { echo "[-] Message is Valid...\n"; $url_data = parse_url($url); $req_path = $url_data['path']; if (array_key_exists('query', $url_data) && !empty($url_data['query'])) $req_path .= '?' . $url_data['query']; $req = ""; $req .= "GET $req_path HTTP/1.1\r\n"; $req .= "Host: {$url_data['host']}\r\n"; $req .= "Connection: Keep-Alive\r\n"; $req .= "Keep-Alive: 300\r\n"; $req .= "Accept-Encoding: deflate\r\n"; $req .= "Accept: */*\r\n"; $req .= "\r\n\r\n"; # If no socket or socket closed create a socket $socket = pfsockopen($url_data['host'], 80); $transfer_start = microtime(true); $response = ''; fputs($socket, $req); stream_set_blocking($socket, true); stream_set_timeout($socket, 5); $socket_info = stream_get_meta_data($socket); do { $header .= fread($socket, 1); } while (!preg_match('/\\r\\n\\r\\n$/', $header)); echo $header; if (!strstr($header, "Transfer-Encoding: chunked")) { while (!feof($socket)) { $response .= fgets($socket, 128); } } else { while ($chunk_length = hexdec(fgets($socket))) { $responseContentChunk = ''; $read_length = 0; while ($read_length < $chunk_length) { $responseContentChunk .= fread($socket, $chunk_length - $read_length); $read_length = strlen($responseContentChunk); } $response .= $responseContentChunk; fgets($socket); } } $transfer_end = microtime(true); $transfer_time = $transfer_end - $transfer_start; echo "[-] Transfer took {$transfer_time} seconds\n"; # Strip Headers //$response = trim(substr($response, strpos($response, "\r\n\r\n"))); $return_start = microtime(true); $ret_queue = msg_get_queue($data->rt); $response_arr = str_split($response, $max_message_size); # Send the Chunks $chunk_count = 0; foreach ($response_arr as $a) { $retry_count = 0; $message = array( 'chunks' => sizeof($response_arr), 'chunk' => $chunk_count, 'encoding' => (strstr($header, "Content-Encoding")) ? 'deflate' : 'plain', 'data' => $a, ); while ($retry_count <= 5) { if (@msg_send($ret_queue, 1, $message, true, false, $err)) { $retry_count = 100; } else { $retry_count++; usleep(5000); } if ($retry_count == 5) { echo "[!] Chunk Transfer Failed\n"; } } $chunk_count++; } $return_end = microtime(true); $return_time = $return_start - $return_end; echo "[-] Return to Caller took {$return_time} seconds\n"; } } } # Flush everything if (ob_get_length()){ @ob_flush(); @flush(); @ob_end_flush(); } sleep(1); }