Как извлечь значение GET из ответа Http? - PullRequest
1 голос
/ 10 марта 2019

Я встроил http-сервер в настольное приложение, которое будет использоваться для перехвата ответа от перенаправления OAuth2. Следующий метод забирает сообщение и преобразует его в строку:

private void ReceiveCallback(IAsyncResult ar)
{
    var client = (Socket)ar.AsyncState;
    var size = client.EndReceive(ar);
    var received = new byte[size];

    Array.Copy(Buffer, received, size);
    var data = Encoding.ASCII.GetString(received);

    OnCallback(data);
}

Метод OnCallback - это событие, которое передает данные в другой класс. При успешном вызове аутентификации содержимое данных выглядит следующим образом:

GET /? Code = CODE_I_NEED_APPEARS_HERE HTTP / 1.1
Хост: localhost: 8321
Подключение: keep-alive
Cache-Control: max-age = 0
Необязательные обновления: запросы: 1
Пользователь-агент: Mozilla / 5.0 (Windows NT 6.1; Win64; x64) AppleWebKit / 537,36 (KHTML, как Gecko) Chrome / 72.0.3626.121 Safari / 537.36
Принять: текст / html, приложение / xhtml + xml, приложение / xml; q = 0,9, изображение / webp, изображение / apng, / ; q = 0,8
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US, en; q = 0,9

Как извлечь параметр кода из приведенной выше строки (значение CODE_I_NEED_APPEARS_HERE - я удалил реальный код, поскольку он является токеном аутентификации)? Я пытался создать ответное сообщение http, чтобы разбить строку на свойства, но не могу найти способ получить значение параметра GET:

var response = new HttpResponseMessage();
response.Content = new StringContent(message);

1 Ответ

0 голосов
/ 10 марта 2019
class Program
{
    public static void Main()
    {
        string input = "GET /?code=CODE_I_NEED_APPEARS_HERE& HTTP/1.1 Host: localhost:8321 Connection: keep-alive Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8 Accept-Encoding: gzip, deflate, br Accept-Language: en-US,en;q=0.9";
        string output = GetCode(input);
        Console.WriteLine(output);
        Console.ReadLine();
    }

    private static readonly Regex Pattern = new Regex(@"code=([^&\s]+)", RegexOptions.Compiled);

    public static string GetCode(string input)
    {
        var value = Pattern.Match(input);
        return value.Groups[1].Value;
    }
}

на выходе должно быть значение кода параметра

...