PHP socket模拟POST请求

<?php
if (! function_exists ( ‘socket_post‘ )) {
	function socket_post($url, $data, $referer = ‘‘) {
		if (! is_array ( $data )) {
			return;
		}
		$data = http_build_query ( $data );
		$url = parse_url ( $url );
		if (empty ( $url [‘scheme‘] ) || $url [‘scheme‘] != ‘http‘) {
			die ( "Error: Only HTTP request are supported !" );
		}
		$host = $url [‘host‘];
		$path = isset ( $url [‘path‘] ) ? $url [‘path‘] : ‘/‘;
		// open a socket connection on port 80 - timeout: 30 sec
		$fp = fsockopen ( $host, 80, $errno, $errstr, 30 );
		if ($fp) {
			// send the request headers:
			$length = strlen ( $data );
			$POST = <<<HEADER
POST {$path} HTTP/1.1
Accept: text/plain, text/html
Referer: {$referer}
Accept-Language: zh-CN,zh;q=0.8
Content-Type: application/x-www-form-urlencode
Cookie: token=value; pub_cookietime=2592000; pub_sauth1=value; pub_sauth2=value
User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17
Host: {$host}
Content-Length: {$length}
Pragma: no-cache
Cache-Control: no-cache
Connection: close\r\n
{$data}
HEADER;
			fwrite ( $fp, $POST );
			$result = ‘‘;
			while ( ! feof ( $fp ) ) {
				// receive the results of the request
				$result .= fread ( $fp, 512 );
			}
		} else {
			return array (
					‘status‘ => ‘error‘,
					‘error‘ => "$errstr ($errno)"
			);
		}

		// close the socket connection:
		fclose ( $fp );

		// split the result header from the content
		$result = explode ( "\r\n\r\n", $result, 2 );

		// return as structured array:
		return array (
				‘status‘ => ‘ok‘,
				‘header‘ => isset ( $result [0] ) ? $result [0] : ‘‘,
				‘content‘ => isset ( $result [1] ) ? $result [1] : ‘‘
		);

}
}
print_r ( socket_post ( ‘http://blog.51cto.com/‘, array (
		‘name=‘ => ‘qiufeng‘,
		‘password‘ => md5 ( ‘www.fengdingbo.com‘ )
) ) );
?>
时间: 2024-10-03 22:55:03

PHP socket模拟POST请求的相关文章

PHP+SOCKET 模拟HTTP请求

HTTP消息结构 客户端请求包括四部份:请求行(状态行).请求头.空行.请求主体(数据),如下图: 服务端响应包括四部份:响应行(状态行).响应头.空行.响应主体(数据),如图: HTTP请求方法: POST .GET  .HEADE.  PUT.  TRACE  .DELETE .OPTIONS .CONNECT  (前三种最实用),有这麽多的请求方法,但web服务器不一定所有的都支持. GET   基本一致,请求指定的页面信息,并返回实体主体. HEAD  基本和GET一致 ,只不过返回的响

使用socket模拟Http请求

这里举一个简单的例子,使用socket来模拟一段http访问百度代码 封装的工具类如下,方法叫XHttp() package com.spider.net; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.Socke

Python socket模拟HTTP请求

0x00 起 最近在做一个对时间要求比较高的扫描器,需要封装一下SOCKET模拟HTTP发包的一些常用函数.简单的说,就是重写一下requests中的get.post方法. 今天在写的时候,遇到一枚很奇怪的问题,对同一个URL,POST请求能正常返回信息,而一旦切到GET,socket time out. 伪代码如下: get_str = 'GET %s HTTP/1.1\r\nHost: %s\r\nUser-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64)

python用socket模拟post请求

今天用python的socket模拟了下post请求,通过这个实例可以更加了解python中socket的使用,以及http请求和socket的相互关系等知识. #coding=utf-8 import socket if __name__=="__main__": s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(("www.xxxxx.com",80)) #pyhon 字符串很长时可以

java socket模拟http请求

我们模拟SSLSocket连接,请求博客园首页,并打印响应消息.代码引用来自<Java网络编程精解>作者:孙卫琴 写这篇博客为了说明模拟过程中出现的一些问题,模拟时请先在浏览器访问目标路径,F12查看网络,查看原始的网络请求头. 注意: 1.HTTP请求报文包含请求行.请求头部.空行.请求包体4个部分组成. 2.模拟请求头部时Accept-Encoding不要使用压缩,否则响应结果会出现乱码 3.请求头部结束使用回车换行符结束 代码如下: package com.beluga.hello.ht

用socket 模拟http请求

using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; class HttpHelper { #region 模拟客户端socket连接 private static Socket ConnectSocket(string server

利用socket模拟http的混合表单上传(在一个请求中提交表单并上传多个文件)

在很多企业级应用中,我们都没法直接通过开发语言sdk包封装的http工具来模拟http复合表单(multipart/form-data),特别是在跨语言跨平台的编程过程中,其实实现方案并不复杂,只要你了解了http协议中复合表单的报文结构就很简单了: httpheader ------时间戳------ 表单参数1 ------时间戳------ 表单参数2 ------时间戳------ 文件1的描述+二进制信息 ------时间戳------ 文件2的描述+二进制信息 下面我们进一步以一段c

轻松把玩HttpAsyncClient之模拟post请求示例

如果看到过我前些天写过的<轻松把玩HttpClient之模拟post请求示例>这篇文章,你再看本文就是小菜一碟了,如果你顺便懂一些NIO,基本上是毫无压力了.因为HttpAsyncClient相对于HttpClient,就多了一个NIO,这也是为什么支持异步的原因. 不过我有一个疑问,虽说NIO是同步非阻塞IO,但是HttpAsyncClient提供了回调的机制,这点儿跟netty很像,所以可以模拟类似于AIO的效果.但是官网上的例子却基本上都是使用Future<HttpResponse

关于curl java 模拟http请求

近期笔者项目需求java模拟http请求,获取dns解析 tcp连接等详细耗时信息. java api中提供的urlConnection 及apache提供的httpClient都不能胜任该需求,二次开发太费时间.于是google之. 最后 得出两种解决办法: 一是使用HTTP4J. 该开源项目使用socket方式,模拟请求,记录时间戳,基本满足需求.对于header自定义等细节,可在此基础上比较方便的二次开发.只是,其中有一些bug需要修复, 如https链接时获取不到ssl时间等.使用该项目