替代curl非常简洁明了的http请求库

替代curl非常简洁明了的http请求库

来源:https://gitee.com/brh/http

备注:作者已逝

<?php defined('SYSPATH') or die('No direct script access.');
/**
 * Provides http server communication options using [Stream]
 * Mainly used to communiate with http
 * Add Support HTTP/1.1 by Default
 * Only Support Connection Close Mode
 *
 * @author     anthony Chen
 */
class Http {

	public static $allow_self_signed = true;
	public static $non_blocking = false;
	/**
	 * @var  array  default header options
	 */
	public static $default_options = array (
			'User-Agent'=> 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit /538.36 (KHTML, like Gecko) Pexcel/6.998',
			'Connection'=> 'Close' //Need to close the request every time for HTTP 1.1
		);

	/**
	 * return Array lines of headers
	 * Overwrite by $options
	 *
	 * @param Array $options, key value pairs of Header options
	 * 
	 * @return Array,Array line of headers
	 */
	private static function getHeaders($options){
		if ($options === NULL) {
			// Use default options
			$options = self::$default_options;
		} else {
			//Merge the $options with $default_options, if the value set in $options,
			//Value in $default_options will be overwrite
			$options =$options + self::$default_options ;
		}

		$headers = array();
		foreach($options as $k=>$v){
			$headers[] = $k.': '.$v;
		}

		return $headers;
	}

	/**
	 * Returns the output of a http URL. 
	 * may be used.
	 *
	 * @param   string   http base URL or FULL url
	 * @param   array    Header options
	 * @param   array $data Get Param
	 * @param   array &$rr_headers,Request Response headers
	 * 		    if Assigned,the response header will be populated
	 * 			If ['fingerprint'] is set, then finger is checked in SSL Context
	 * 			If ['ignore_errors'] is set, then ignore http error code other than 200
	 *
	 * @return  string, Raw String of Http body
	 */
	public static function get($url, array $options = NULL,$data = NULL,&$rr_headers = NULL) {
		$headers = self::getHeaders($options);
		$params = ['http' => [
			'method' => 'GET',
			//Defautl HTTP 1.1 and with Connection Close
			'protocol_version'=>'1.1',
			//'Connection'=> 'Close' //Need to close the request every time for HTTP 1.1
		]];

		if(Arr::get($rr_headers,'ignore_errors') == true){
			$params['http']['ignore_errors'] = true;
		}

		$params['http']['header'] = $headers;

		if($data){
			$url .= '?'.http_build_query($data); 
		}
		$ctx = stream_context_create($params);
		if(self::$allow_self_signed == true){
			stream_context_set_option($ctx,["ssl"=>["allow_self_signed"=>true,"verify_peer_name"=>false,"verify_peer"=>false]]);
			$_finger = Arr::get($rr_headers,'fingerprint');
			if($_finger){
				stream_context_set_option($ctx,["ssl"=>["peer_fingerprint"=>$_finger]]);
			}
		}

		$fp = fopen($url, 'rb', false, $ctx);
		if (!$fp) {
			throw new Exception("Connection failed: $url");
		}

		if(self::$non_blocking == TRUE){
			stream_set_blocking($fp,0);
		}

		if($rr_headers !== NULL){
			$rr_headers = stream_get_meta_data($fp);
		}

		$response = stream_get_contents($fp);
		if ($response === false) {
			throw new Exception("Reading data Failed: $url");
		}
		fclose($fp);
		return $response;
	}

	/**
	 * Post with request options and data 
	 *
	 * @param String url, FULL url
	 * @param Array $options , key=>value pairs array
	 * @param Array $data ,Post Data pairs
	 * @param   array &$rr_headers,Request Response headers
	 * 		    if Assigned,the response header will be populated
	 * 			If ['fingerprint'] is set, then finger is checked in SSL Context
	 * 			If ['ignore_errors'] is set, then ignore http error code other than 200
	 * @return  string, Raw String of Http body
	 */
	public static function post($url,  $options = null,$data=NULL,&$rr_headers = NULL) {
		//Restricted the Form formate
		if(is_array($data)){
			$data = http_build_query($data);
		}

		$options['Content-type'] = Arr::get($options,'Content-type','application/x-www-form-urlencoded');
		$options['Content-Length'] =Arr::get($options,'Content-Length',strlen($data));

		$params = ['http' => [
			'method' => 'POST',
			'protocol_version'=>'1.1',
			//'Connection'=> 'Close', //Need to close the request every time for HTTP 1.1
			//'ignore_errors'=>true,
			'content' => $data
		]];

		if(Arr::get($rr_headers,'ignore_errors') == true){
			$params['http']['ignore_errors'] = true;
		}

		$headers = self::getHeaders($options);
		$params['http']['header'] = $headers;

		$ctx = stream_context_create($params);
		if(self::$allow_self_signed == true){
			stream_context_set_option($ctx,["ssl"=>["allow_self_signed"=>true,"verify_peer_name"=>false,"verify_peer"=>false]]);
			$_finger = Arr::get($rr_headers,'fingerprint');
			if($_finger){
				stream_context_set_option($ctx,["ssl"=>["peer_fingerprint"=>$_finger]]);
			}
		}

		$fp = fopen($url, 'rb', false, $ctx);
		if (!$fp) {
			throw new Exception("Connection Failed: $url ");
		}

		if(self::$non_blocking == TRUE){
			stream_set_blocking($fp,0);
		}

		if($rr_headers !== NULL){
			$rr_headers = stream_get_meta_data($fp);
		}

		$response = stream_get_contents($fp);
		if ($response === false) {
			throw new Exception("Reading data failed: $url");
		}
		fclose($fp);
		return $response;
	} 

	/**
	 * Inflate zipped content
	 *
	 * @param String $_content, gzipped content
	 *
	 * @return String, Inflated content
	 */
	public static function inflate($_content){
		//deflate add 10 charaters before inflate format and 8 charaters checksum append
		//gzdecode is not availible for ALL PHP even gzencode is avalible
		$_content = substr($_content, 10,-8); 
		return gzinflate($_content);

	}

	/**
	 * Check if the reponse content is zipped from response header
	 *
	 * @param Array $_response_header, Response header captured from get/post
	 *
	 * @return Boolean, True for zipped contented
	 */
	public static function isZipped($_response_header){
		if (preg_grep('/^Content-Encoding:\s*gzip/i',$_response_header['wrapper_data'])){
			return TRUE;
		}else{
			return False;
		}
	}

	/**
	 * Parse response headers into K V data
	 *
	 * @param Array $headers, wrapper data return from http request
	 *
	 * @return Array , the parsed headers of http
	 */
	public static function parseHeaders( $_response_header ) {
		$headers = Arr::get($_response_header,'wrapper_data',[]);
		$head = array();
		foreach( $headers as $k=>$v )
		{
			$t = explode( ':', $v, 2 );
			if( isset( $t[1] ) )
				$head[ trim($t[0]) ] = trim( $t[1] );
			else
			{
				$head[] = $v;
				if( preg_match( "#HTTP/[0-9\.]+\s+([0-9]+)#",$v, $out ) )
					$head['reponse_code'] = intval($out[1]);
			}
		}
		return $head;
	}
} // End http


 

Scribus开源电子杂志制作软件

Scribus 适用于Linux,FreeBSD,PC-BSD,NetBSD,OpenBSD,Solaris,OpenIndiana,Debian GNU/Hurd,Mac OS X,OS/2 Warp 4,eComStation,Haiku和Windows的页面布局程序。

Scribus 是一款类似 Adobe Pagemaker 的开源电子杂志制作软件,可以用来制作个人文件、邮件列表、电子杂志类型的电子文档。它体积很小,可以放在 U 盘里,只需插入相应的电脑就可以使用。

官网:https://www.scribus.net/

下载:https://sourceforge.net/projects/scribus/files/scribus/

Scribus安装后,默认支持中文。

 

Krita官方推荐创建PDF软件。

Krita 可以打开包含多个图层的 PDF 文件。但 Krita 目前不支持导出为 PDF,也没有实现 PDF 导出功能的计划。如需使用 Krita 输出的图像创建PDF,请使用 Scribus 。

 

 

a标签属性rel="noopener noreferrer"

没有rel=“noopener noreferrer”的情况下使用target=“_blank”是有安全风险,超链接a标签的rel="noopener noreferrer"属性是一种新特性,它能让网站更安全,超链接添加rel="noopener noreferrer"来防止钓鱼网站,因为它获取的window.opener的值为null。

说人话就是:加上这个属性,新打开的窗口跟你的站无关。

参考:https://blog.csdn.net/CamilleZJ/article/details/120306971

Blender免费开源三维图形图像软件

Blender是一款免费开源三维图形图像软件,提供从建模、动画、材质、渲染、到音频处理、视频剪辑等一系列动画短片制作解决方案。Blender拥有方便在不同工作下使用的多种用户界面,内置绿屏抠像、摄像机反向跟踪、遮罩处理、后期结点合成等高级影视解决方案。

官网:https://www.blender.org/

 

IBM Security AppScan Standard 9.0 安装包附注册文件

IBM Security AppScan Standard 9.0 安装包附注册文件

网盘下载:(访问密码wdja)

http://share.menglei.net/f/16922972-730406259-f7e140

 

备注:因IBM Rational AppScan 8.0中的CA证书过期,无法扫描https网址,以下内容仅供参考。

IBM Rational AppScan 8.0安装包附注册文件

网盘下载:(访问密码wdja)

http://share.menglei.net/f/16922972-729653340-02f4ae

另提供IBM Security AppScan Standard V8.7 注册文件

网盘下载:(访问密码wdja)

http://share.menglei.net/f/16922972-729652899-824d80

AppScan是IBM公司开发的一款安全扫描软件

Web服务扫描是Appscan中具有有效自动化支持的一个扫描功能。

 

 

VSO Downloader 5 安装包附注册文件

VSO Downloader 5 安装包附注册文件

网盘下载:(访问密码wdja)

http://share.menglei.net/f/16922972-729549519-a1c69d

1.先运行VSO Downloader Ultimate 5.0.1.61.exe安装原版
2.安装完成不要运行
3.破解方法
解压VsoDownloader.exe到VSO Downloader 5 安装目录 直接覆盖
或者
解压Patch.exe到VSO Downloader 5 安装目录
运行Patch.exe
点击PATCH按钮

VSO Downloader 目前所支持的网站有 优酷、新浪、腾讯视频, 迅雷看看 (均已测试) 等等并自动拦截其中的广告视频。

同时,VSO Downloader 也通杀所有主流的音频网站,如 豆瓣FM,百度MP3、虾米音乐 等等。目前其所支持的文档格式 FLV,,MP4,WMV ASF,MP3,SWF ……. 总之,简约大气上档次,绝对满足日常使用。

阿里云域名代续费代缴费功能

由于种种原因,无法找到阿里云账号和密码,不能及时对域名进行续费,这样的情况,应该都有遇到过,针对些情况,阿里云推出了域名代续费功能,只要你记得域名,同时域名在阿里云官方注册的账号下面,就可以使用代续费进行域名的续费。

阿里云域名代续费网址:https://wanwang.aliyun.com/domain/domain-renew

PhotoDemon免费图片编辑器

官网:https://photodemon.org/

PhotoDemon是一个便携式的照片编辑器。它是100%免费和100%开源的。

该应用程序在非常小的下载中提供了全面的照片编辑工具选择。它可以在任何Windows机器(XP到Windows 11)上运行,作为便携式应用程序,您可以在USB驱动器或SD卡上随身携带。它永远不需要安装,也不需要管理员访问权限即可运行。

Krita 自由开源的免费绘画软件

官网:https://krita.org/

Krita 是一款自由开源的免费绘画软件。它无需注册、没有内购、广告、试用期或者商用限制,让画师可以有尊严地表达创意。支持 Windows、macOS、Linux 和安卓平板。

Krita 能够打开 PSD 格式的图像,甚至能打开连 Photoshop 也拒绝打开的 PSD 文件。如果需要在别的程序里编辑图像,Krita 也可以将其保存为 PSD 格式。支持 PS 图层样式。