Giter VIP home page Giter VIP logo

xnet's Introduction

  • PL: C#
  • Version .NET: 4.0 Client Profile

xNet - a class library for .NET Framework which includes:

  • Classes for work with proxy servers: HTTP, Socks4(a), Socks5, Chain.
  • Classes for work with HTTP 1.0/1.1 protocol: keep-alive, gzip, deflate, chunked, SSL, proxies and more.

Подробное описание на русском: http://habrahabr.ru/post/146475/

Example:

using (var request = new HttpRequest("http://site.com/"))
{
    request.UserAgent = Http.ChromeUserAgent();
	request.Proxy = Socks5ProxyClient.Parse("127.0.0.1:1080");

    request
        // Parameters URL-address.
        .AddUrlParam("data1", "value1")
        .AddUrlParam("data2", "value2")

        // Parameters 'x-www-form-urlencoded'.
        .AddParam("data1", "value1")
        .AddParam("data2", "value2")
        .AddParam("data2", "value2")

        // Multipart data.
        .AddField("data1", "value1")
        .AddFile("game_code", @"C:\orion.zip")

        // HTTP-header.
        .AddHeader("X-Apocalypse", "21.12.12");
		
    // These parameters are sent in this request.
    request.Post("/").None();

    // But in this request they will be gone.
    request.Post("/").None();
}

xnet's People

Contributors

c3ffee avatar geograph-us avatar rusildo avatar x-rus avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

xnet's Issues

NuGet

Может добавите данную библиотеку на NuGet? Было бы очень и очень удобно.

Problem with connection. Failed to establish SSL connection with the HTTP server

request.UserAgent = useragent;
request.IgnoreProtocolErrors = true;
request.SslCertificateValidatorCallback += (sender, certificate, chain, sslPolicyErrors) => true;

var result = request.Get("https://sscasino.online/");

but i get error
Failed to establish SSL connection with the HTTP server

i get the same the error for WebRequest

  WebRequest req = WebRequest.Create(Url);
  WebResponse resp = req.GetResponse();
  Stream stream = resp.GetResponseStream();
  StreamReader sr = new StreamReader(stream);
  string Out = sr.ReadToEnd();
  sr.Close();

but solution for WebRequest is a add line
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

what is the solution for xnet ?

А где длл?)

Буду признателен если сразу скопмиленный бинарник будет лежать в гите

Content-Type в GET

Добрый день!
Каким образом послать заголовок Content-Type в GET запросе?

sending xml

Hello! How can i send XML and get response

GetLanguageHeader() InvariantCulture

GetLanguageHeader() will throw an exception whenever Culture is set to InvariantCulture.
cultureName.Substring(0, 2)
InvariantCulture's Name property is an empty string.

Проблемы с override HttpResponse.ToString()

Поскольку override .ToString() это стандартный метод, вызываемый VS 2010(и UP) во время отладки для представления данных об объекте, он будет вызваться автоматически самой VS 2010(и UP) в обход контроля пользователя, что порождает вызов HttpResponse.ToString() на каждом бряке в VS 2010(и UP) и как следствия кучу трудновыявимых багов во время отладки. Лучше при вызове HttpResponse.ToString() возвращать скажем адрес сайта, но не как не помещать туда код, который вызывает сетевое соединения с сайтом.
ПС:
http://blogs.msdn.com/b/soultech/archive/2011/04/05/whyoverridetostring_2d00_use_2d00_debuggerdisplayattribute_2d00_instead.aspx

Кодировка запроса

request.addParam("a", "строка_на_русском");

И ничего не выходит, т.к. строки в c# юникодные, а в библиотеке они все жостко кодируются как ASCII.

Mono + xNet = slow

Использую MonoDevelop 4.2.2 и последний xNet.
Платформа Linux.

Обычный код:

        using xNet.Net;
        // ........
        HttpRequest httpRequest = new HttpRequest();
        httpRequest.UserAgent = "Mozilla/5.0 (Windows NT 6.3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36";
        httpRequest.Cookies = new CookieDictionary();
        string response = httpRequest.Get(URL).ToString();

Запрос выполняется ОЧЕНЬ долго (около минуты).
Причем время не зависит от домена к которому обращаешься.
В чем может быть проблема?

Speed

Сравнил скорости работы xNet и обычных HttpWebRequest Почему то xNet медленнее(процентов на 10), хотя оба юзают сокеты... может где буфер побольше делать(при разборе данных)?

можно задать только с помощью специального свойства

Есть некоторые заголовки при назначении которых выходит эта ошибка( Однако без них сервер отклоняет запрос. Подскажите как задать следующие заголовки:

request.AddHeader("Host", @"mysite.ru");
request.AddHeader("Accept-Encoding", @"gzip, deflate");
request.AddHeader("Connection", @"keep-alive");

Неверное распознавание Location

В библиотеке слегка неверно распознается хедер location если он дается относительно папки:

Для примера мы делали запрос к example.com/aaa/bbb.php
он вернул нам location cсс.php

Библиотека редиректит к example.com/ссс.php
А должна редиректить к example.com/aaa/ссс.php

Чтобы такого не было написал костыль для GetLocation()

                var uriBuilder = new UriBuilder(_request.Address);
                if (!location.StartsWith("/"))
                {
                    uriBuilder.Path = uriBuilder.Path.Substring(0, uriBuilder.Path.LastIndexOf("/") + 1) + values[0];
                }
                else
                    uriBuilder.Path = values[0];

Заголовок Content-Length в ответе сервера отсутствует.

Некоторые сервера в ответе не отправляют заголовок Content-Length, поэтому при вызове ToString()/ToBytes() происходит ошибка ("Не удалось загрузить тело сообщения"). Пожалуйста, если возможно исправьте. Большое спасибо за ваш труд.

xNet не подхватывает промежуточные Cookies в HttpResponce при редиректах

Добрый вечер! Случилась такая проблема:
Допустим, сделан запрос, и далее было с него пару редиректов, на которые xNet успешно переходила. Но вот беда, она подхватывает Cookies только с конечного звена в цепи редиректов. А те Cookies, что задавались сервером на промежуточных страницах - они были проигнорированы. Придумал костыль в виде отключения AllowAutoRedirect и ручного перехода по Location, но это, конечно, затрудняет работу, т.к. можно забыть об этом и потом искать в чём же причина что Cookies не подхвачены... Может, найдёте время исправить этот досадный баг?
С уважением, ярый поклонник вашей библиотеки Пётр.

Повтор Address.Host в Url запроса

Вот часть файла /Net/~Http/HttpRequest.cs, отвечающая за генерацию первой строки запроса (GenerateStartingLine)

            if (_currentProxy != null &&
                (_currentProxy.Type == ProxyType.Http || _currentProxy.Type == ProxyType.Chain))
            {
                query = Address.AbsoluteUri;
            }
            else
            {
                query = Address.PathAndQuery;
            }

Если прокси используется и его тип - Http или Chain, использовать AbsoluteUri (GET https://site.com/file?parameter=value HTTP/1.1)
Иначе - использовать PathAndQuery (GET /file?parameter=value HTTP/1.1).

При использовании прокси (в данном случае локального Charles) запрос отправляется на https://site.comhttps://site.com/file?parameter=value вместо https://site.com/file?parameter=value

Async методов

Здравствуйте. Если данная библиотека не заброшена и планируется дальнейшее улучшение, то я хотел бы попросить Async методы для более удобной работы.

xNet Recconect

Приветствую, Руслан! Во-первых, конечно, надеюсь что до вас дойдёт это сообщение в ближайшее время, где я бы очень хотел передать огромную благодарность за создание такой прекрасной библиотеки, как xNet. А в особенности радует то, что проект до сих пор обновляется на гитхабе, и последнее обновление было ~ две недели назад.
Так собственно вот в чём дело: я бы хотел предложить одну интересную штуку, жизненно нужную, в том числе для меня. Это рекконект со всеми его вытекающими. Это очень важно при работе через прокси, т.к. они имеют свойство отваливаться, но через некоторое кол-во миллисекунд снова возвращаться в строй. Для решение этой проблемы мне пришлось вставить свои костыли в виде кривой реализации рекконекта (т.е. всё работает, но нарушена структура вашего кода) в вашу библиотеку, но у вас вышла новая версия и я подумал, что вы можете заинтересоваться этим и реализовать всё как полагается...
Конкретно:

  • Добавить в "HttpRequest" bool параметр, с названием вроде "HttpRequest.Recconect", отвечающий за то, пытаться ли подключиться/принять данные, если уже была неудачная попытка оного (по умолчанию предлагаю поставить false).
  • Добавить в "HttpRequest" int(byte?) параметр, с названием вроде "HttpRequest.RecconectLimit", отвечающий за то, сколько максимально попыток рекконекта можно предпринять (по умолчанию предлагаю поставить три попытки).
  • Добавить в "HttpRequest" int параметр, с названием вроде "HttpRequest.RecconectDelay", отвечающий за то, какую сделать задержку между попытками подключиться/принять данные (по умолчанию предлагаю поставить 100 мс).
    В итоге, выходит, например так:

HttpRequest Request = new HttpRequest();

Request.Recconect = true; //пытаться переподключится...

Request.RecconectLimit = 3; //максимальное кол-во попыток рекконекта

Request.RecconectDelay = 150; //задержка между попытками рекконекта


Чтобы было совсем идеально, круто бы было в Responce добавить в выводе int(byte?) параметр (с названием, например, RecconectCount), который бы показывал, сколько попыток рекконекта было осуществлено. Что-то вроде:

HttpResponse Responce= Request.Get("http://ya.ru");

MessageBox.Show("Кол-во рекконектов: "+Responce.RecconectCount); //выведет количество попыток рекконекта...

P.S. Тогда ваша библиотека будет ещё ближе к идеальной :)
Очень надеюсь, что не останусь без ответа... Удачи вам!

Как добавить Content-Type?

```Значение заголовка 'Content-Type' можно задать только с помощью специального свойства.`

А что за свойство?*

Проблемы с Gzip и ToStream()

На сайтах с Gzip и c chunked падает в исключения при вызове HttpResponse.ТоStream() - не происходит объединения chunked и как следствия Gzip жалуется на неверный формат данных.

process gzip result error when run at mono/linux

I have added some debug infor;
at the same time,run at windows can't received gzip result.
mono xnettest.exe "http://www.cnblogs.com"
url:http://www.cnblogs.com
now do Request
now get connection
get connection result:True
now send request
header string is:
Host: www.cnblogs.com
Connection: keep-alive
Accept-Encoding: gzip,deflate
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0

now ReceiveResponseHeaders
startingLine:HTTP/1.1 200 OK

response header:Date: Fri, 17 Mar 2017 00:58:22 GMT

response header:Content-Type: text/html; charset=utf-8

response header:Transfer-Encoding: chunked

response header:Connection: keep-alive

response header:Vary: Accept-Encoding

response header:Cache-Control: public, max-age=15

response header:Expires: Fri, 17 Mar 2017 00:58:37 GMT

response header:Last-Modified: Fri, 17 Mar 2017 00:58:07 GMT

response header:X-UA-Compatible: IE=10

response header:Content-Encoding: gzip

response header:

now ReceiveResponseHeaders :340
now CheckStatusCode:OK
now Check AllowAutoRedirect:True
1
2
now return response
now tostring begin
now check MessageBodyLoaded
now create MemoryStream
now GetMessageBodySource
GetMessageBodySourceZip
ReceiveMessageBodyChunkedZip
GetZipStream
GZipStream
ReceiveMessageBodyChunkedZip TotalBytesRead:4838,have read bytes:0,blocklength:4838
ReceiveMessageBodyChunkedZip TotalBytesRead:0,have read bytes:0,blocklength:3675
ReceiveMessageBodyChunkedZip waitdata
waitdata begin
waitdata delay:60000

Unhandled Exception:
xNet.HttpException: Вышло время ожидания данных от HTTP-сервера 'www.cnblogs.com'.
at xNet.HttpResponse.WaitData () [0x00063] in :0
at xNet.HttpResponse+d__102.MoveNext () [0x00262] in :0
at xNet.HttpResponse.ToString () [0x000a8] in :0
[ERROR] FATAL UNHANDLED EXCEPTION: xNet.HttpException: Вышло время ожидания данных от HTTP-сервера 'www.cnblogs.com'.
at xNet.HttpResponse.WaitData () [0x00063] in :0
at xNet.HttpResponse+d__102.MoveNext () [0x00262] in :0
at xNet.HttpResponse.ToString () [0x000a8] in :0

post запрос json

Здравствуйте. Хотелось бы узнать, как с помощью вашей библиотеки отправлять на сервер данные в виде json?
С Уважением!

Странное поведение под отладчиком (VS2013)

Пишу код:

//...
var resp = req.Get("/auth");
CopyCookies(resp.Cookies, ref cookies);
result = resp.ToString();
//...

если поставить breakpoint до вызова Get и пройтись по-шагово к result = resp.ToString(); после CopyCookies, текст (контент) из resp пропадает, причем не важно, какой код будет до result = resp.ToString();, как будто он очищается GC... Но если breakpoint поставить уже после вызова result = resp.ToString();, то в result мы видим контент.
У меня сомнения, что дело именно в вашей библиотеки, возможно глючит студия, но на всякий случай сообщу вам об этих "чудесах".

С уважением, Алексей.

ps
Спасибо за хорошую библиотеку, очень выручает)

Problem with sock5

Hello

I try proxy with this sock5 104.145.103.38:45554
But when get data from https://www.facebook.com/ then lib show message "Additional information: Не удалось соединиться с HTTP-сервером 'www.facebook.com'."
I try this sock on firefox then working normal
Why?

Please help me thanks

Serializable

Добавьте сериализацию для куков

[Serializable]
public class CookieDictionary : Dictionary<string, string>{...}

public CookieDictionary(SerializationInfo info, StreamingContext context) : base(info, context){}

public CookieDictionary() : this(false){}

Ответ сервера при HTTP ошибке.

Ситуация: сервер в ответ на Post-запрос выдаёт ошибку 400, в результате вылетает HttpException. Но! Сервер кроме кода ошибки выдаёт ещё и содержательный ответ, что не так в запросе. Как его получить?

hi dev . i'm get error when connect to "https" with sock5

i try with many sock5 but i'm get error

my code :
HttpRequest request = new HttpRequest();
request.UserAgent = "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36";
request.Proxy = new Socks5ProxyClient("85.189.91.91", 15852);
string html = request.Get("https://whatismyip.com").ToString();

=> i'm get : "Ошибка на стороне клиента. Код состояния: 403"
please fix it. thank u very much

Get Json

Доброго дня! Подскажите пожалуйста как мне получить json через вашу либу?

       Stream stream = null;
        using (HttpRequest req = new HttpRequest())
        {
           //авторизация через url ссылку...вернет куки,которые потом использую ниже
            HttpResponse resp = req.Post(authorizationUrl);
            if (resp.StatusCode.ToString() == "OK")
            {
               //подставляю возвращенные куки для получения данных
                req.Cookies = resp.Cookies;
                req.UserAgent = HttpHelper.ChromeUserAgent();
                req.AddHeader(HttpHeader.Accept, "application/json");
                req.AddHeader("ContentType", "application/json");
                req.AllowAutoRedirect = false;
                //обращаюсь по taskUrl он должен вернуть данные
                resp = req.Get(taskUrl);
                //вернет поток тела сообщения в котором в последствии null. А почему?
                stream = resp.ToStream();
            }

        }

далее через DataContractJsonSerializer я бы считал поток(stream) и вернул бы десериализованный объект...но так как resp.ToStream()==null, соответственно ничего сделать не могу...

Очень хотелось бы получить гайд по библиотеке, и получить ответ, как правильно получать данные в json формате от сервера?

Написал аналогию с httpwebrequest, которая работает:

       HttpWebRequest req =WebRequest.Create(authorizationUrl) as HttpWebRequest;
        req.Method = "POST";
        req.CookieContainer = new CookieContainer();
        HttpWebResponse response = req.GetResponse() as HttpWebResponse;


        req =WebRequest.Create(taskUrl) as HttpWebRequest;
        req.CookieContainer = new CookieContainer();
        req.CookieContainer.Add(new Uri(taskUrl), response.Cookies);
        req.Accept = "application/json";
        req.ContentType = "application/json";
        req.Method = "GET";
        response = r.GetResponse() as HttpWebResponse;

        DataContractJsonSerializer jsonSerializer = new                              DataContractJsonSerializer(typeof(RootObject));
        object objResponse = jsonSerializer.ReadObject(response.GetResponseStream());
        RootObject jsonResponse = objResponse as RootObject;

Index was out of range.

в методах ReceiveMessageBody() и ReceiveMessageBodyChunked()
периодически валится на строке blockLength = Convert.ToInt32(line, 16);

Вопрос

Подскажи пожалуйста, как с помощью библиотеки отправлять post ну и get запросы на httpS.
Как подключить сертификаты. Если можно с примером. И ещё 1 вопрос. Куки сохраняются после ответа, и при следующем запросе используются уже они?
Извиняюсь за вопросы и время. Заранее спасибо.

TLS

Не соединиться с сайтом там стоит TLS
Что можете сказать по этому поводу?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.