static byte[] InternalSslSocketHttp(IPEndPoint endpoint, HttpArgs args, HttpMethod method, X509CertificateCollection certificates) { using (Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) { try { client.Connect(endpoint); if (client.Connected) { using (SslStream stream = new SslStream(new NetworkStream(client), false, ValidateServerCertificate, null)) { stream.AuthenticateAsClient("ServerName", certificates, SslProtocols.Tls, false); if (stream.IsAuthenticated) { //生成协议包 byte[] buff = HttpClient.ParseHttpArgs(method, args); stream.Write(buff, 0, buff.Length); stream.Flush(); return ParseSslResponse(endpoint, stream, args, certificates); } } } } catch (Exception ex) { Console.WriteLine(ex.Message); } } return null; }
/// <summary> /// 解析 Ssl Response /// </summary> /// <param name="endpoint"></param> /// <param name="ssl"></param> /// <param name="args"></param> /// <param name="certificates"></param> /// <returns></returns> private static byte[] ParseSslResponse(IPEndPoint endpoint, SslStream ssl, HttpArgs args, X509CertificateCollection certificates) { //尝试4秒时间读取协议头 CancellationTokenSource source = new CancellationTokenSource(); Task<string> myTask = Task.Factory.StartNew<string>(HttpClient.ReadHeaderProcess, ssl, source.Token); if (myTask.Wait(4000)) { string header = myTask.Result; if (header.StartsWith("HTTP/1.1 302")) { int start = header.IndexOf("LOCATION", StringComparison.OrdinalIgnoreCase); if (start > 0) { string temp = header.Substring(start, header.Length - start); string[] sArry = Regex.Split(temp, "\r\n"); args.Url = sArry[0].Remove(0, 10); //注意:302协议需要重定向 return Get(endpoint, args, certificates); } } //继续读取内容 else if (header.StartsWith("HTTP/1.1 200")) { int start = header.IndexOf("CONTENT-LENGTH", StringComparison.OrdinalIgnoreCase); if (start > 0) { string temp = header.Substring(start, header.Length - start); string[] sArry = temp.Split(new char[] { '\r', '\n', ' ', ':' }, StringSplitOptions.RemoveEmptyEntries); int content_length; if (sArry.Length > 1 && Int32.TryParse(sArry[1], out content_length)) { byte[] bytes = new byte[content_length]; if (ssl.Read(bytes, 0, content_length) > 0) { return bytes; } } } else { //不存在Content-Length协议头 return HttpClient.ParseResponse(ssl); } } else { return Encoding.UTF8.GetBytes(header); } } else { //超时的话,别忘记取消任务哦 source.Cancel(); } return null; }
private void NewOrder(UserNote note) { UserSession user = note.Session; Variant v = note.GetVariant(0); string vs = JsonConvert.SerializeObject(v); //LogWrapper.Warn("请求:" + vs); BuyGoodsRequest request = new BuyGoodsRequest(); string meta = v.GetStringOrDefault("goodsmeta"); request.goodsmeta = Convert.ToBase64String(Encoding.UTF8.GetBytes(meta)); request.goodsurl = v.GetStringOrDefault("goodsurl"); request.openid = user.UserID.PadLeft(32, '0'); request.openkey = user.key; request.payitem = v.GetStringOrDefault("payitem"); request.pf = v.GetStringOrDefault("platform") ?? v.GetStringOrDefault("pf"); request.pfkey = v.GetStringOrDefault("pfkey"); request.appmode = v.GetIntOrDefault("appmode", 2); request.device = v.GetIntOrDefault("device"); request.zoneid = ServerLogger.zoneid; string host = ServerManager.BuyHost; string uri = ServerManager.BuyUri; StringBuilder sb = new StringBuilder(512); string quest = request.Build(sb, null).ToString(); string sign = AppSign.Sign(uri, quest); sb.Clear(); sb.Append(uri + "?"); request.Build(sb, UrlUtility.UrlEncode); sb.Append("&sig="); sb.Append(sign); HttpArgs a = new HttpArgs(); a.Host = host; a.Url = sb.ToString(); //LogWrapper.Warn("请求Url:" + a.Url); IPEndPoint ipadd = IPHelper.CreateEndPoint(host, 443); byte[] bin = SslHttpClient.Get(ipadd, a, null); string result = Encoding.UTF8.GetString(bin); Variant re = JsonConvert.DeserializeObject<Variant>(result); if (re.GetIntOrDefault("ret", -1) == 0) { string token = re.GetStringOrDefault("token"); if (!string.IsNullOrEmpty(token)) { if (CreateOrder(note.Player, token)) { user.Call(MallCommand.NewTokenR, true, re); return; } } } user.Call(MallCommand.NewTokenR, false, re); //LogWrapper.Warn("请求结果:" + result); }
public static byte[] Post(IPEndPoint endpoint, HttpArgs args, X509CertificateCollection certificates = null) { return InternalSslSocketHttp(endpoint, args, HttpMethod.POST, certificates); }
static void TestSign() { var v = Encoding.GetEncoding(936); string meta = Convert.ToBase64String(Encoding.GetEncoding(936).GetBytes("10枚晶币*每10Q点可以兑换10枚晶币,祝您游戏愉快,谢谢您的支持!")); BuyGoodsRequest request = new BuyGoodsRequest(); request.appmode = 2; request.device = 0; request.goodsmeta = meta; request.goodsurl = "http://ww.com.cn/test.png"; request.openid = "00000000000000000000000000441794"; request.openkey = "8EABE7C3586EA666327DFA1A2A38F088"; request.payitem = "x*100*1"; request.pf = "pengyou"; request.pfkey = "7cbfc07c376f92b07e3bce209ee1ed47"; request.zoneid = 5; const string host = "119.147.19.43"; const string uri = "/v3/pay/buy_goods"; StringBuilder sb = new StringBuilder(1000); string quest = request.Build(sb, null).ToString(); string sign = AppSign.Sign(uri, quest); LogWrapper.Warn("签名源:" + quest); LogWrapper.Warn("签名结果:" + sign); sb.Clear(); sb.Append(uri + "?"); request.Build(sb); sb.Append("&sig="); sb.Append(sign); string xd = request.ToString(); string result2 = "https://" + host + sb.ToString(); Console.WriteLine(result2); HttpArgs a = new HttpArgs(); a.Host = host; a.Url = sb.ToString(); LogWrapper.Warn("请求内容:" + a.Url); IPEndPoint ipadd = new IPEndPoint(IPAddress.Parse(host), 443); byte[] bin = SslHttpClient.Get(ipadd, a, null); string result = Encoding.UTF8.GetString(bin); Console.WriteLine(result); LogWrapper.Warn("请求结果:" + result); }
private static void TestHttpClient() { IPEndPoint ep = new IPEndPoint(IPAddress.Parse("192.168.100.40"), 8200); HttpArgs arg = new HttpArgs(); //arg.Body = "192.168.100.40"; arg.Host = "192.168.100.40"; arg.Url = "/gm?sig=32&cmd=noticeList&par=[\"dfs\",23,34]"; byte[] getResult = HttpClient.Get(ep, arg); string xd = System.Text.Encoding.UTF8.GetString(getResult); Console.WriteLine(xd); HttpClient httpc = new HttpClient("192.168.100.40", 8200); string xd2 = httpc.Get(arg.Url); bool xd1Txd2 = (xd == xd2); Console.WriteLine(xd1Txd2); }
public static byte[] Post(IPEndPoint endpoint, HttpArgs args) { return InternalSocketHttp(endpoint, args, HttpMethod.POST); }
static byte[] InternalSocketHttp(IPEndPoint endpoint, HttpArgs args, HttpMethod method) { using (Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) { try { client.Connect(endpoint); if (client.Connected) { using (NetworkStream stream = new NetworkStream(client)) { //生成协议包 byte[] buff = HttpClient.ParseHttpArgs(method, args); stream.Write(buff, 0, buff.Length); stream.Flush(); return ParseResponse(endpoint, stream, args); } } } catch (Exception ex) { Console.WriteLine(ex.Message); } } return null; }
internal static byte[] ParseHttpArgs(HttpMethod method, HttpArgs args) { StringBuilder bulider = new StringBuilder(1024); if (method == HttpMethod.POST) { bulider.AppendLine(string.Format("POST {0} HTTP/1.1", args.Url)); bulider.AppendLine("Content-Type: application/x-www-form-urlencoded"); } else { bulider.AppendLine(string.Format("GET {0} HTTP/1.1", args.Url)); bulider.AppendLine("Content-type:text/html;charset=utf-8"); //bulider.AppendLine("Content-Type:text/plain;charset=GBK"); } bulider.AppendLine(string.Format("Host: {0}", args.Host)); bulider.AppendLine("Connection: Close"); //bulider.AppendLine("User-Agent: Mozilla/5.0 (Windows NT 6.1; IE 9.0)"); //if (!string.IsNullOrEmpty(args.Referer)) //{ // bulider.AppendLine(string.Format("Referer: {0}", args.Referer)); //} //if (!string.IsNullOrEmpty(args.Accept)) //{ // bulider.AppendLine(string.Format("Accept: {0}", args.Accept)); //} //if (!string.IsNullOrEmpty(args.Cookie)) //{ // bulider.AppendLine(string.Format("Cookie: {0}", args.Cookie)); //} if (method == HttpMethod.POST) { int len = Encoding.UTF8.GetByteCount(args.Body); bulider.AppendLine(string.Format("Content-Length:{0}\r\n", len)); bulider.Append(args.Body); } else { bulider.Append("\r\n"); } string header = bulider.ToString(); return Encoding.UTF8.GetBytes(header); }