Restsharp: порт удаляется из заголовка хоста

Созданный на 21 февр. 2018  ·  35Комментарии  ·  Источник: restsharp/RestSharp

Ожидаемое поведение

Restsharp должен отправлять заголовок узла как есть, не изменяя порт в значении заголовка узла.
https://github.com/minio/minio-dotnet/pull/212 добавляет Restsharp 106.2.1 вместо Restsharp.Netcore (неофициальная версия с поддержкой .netcore). Однако мы обнаружили ошибки несоответствия подписи, поскольку настраиваемый аутентификатор, используемый minio dotnet sdk, создает подпись авторизации, используя ip:port в качестве значения для заголовка «Host». Restsharp httpclient, похоже, отключает порт, поскольку трассировка сервера показывает только ip в значении заголовка хоста.

Фактическое поведение

порт удаляется из значения заголовка «Host» в Restsharp 106.2.1

Шаги для воспроизведения проблемы

  1. клонируйте minio-dotnet sdk и получите патч https://github.com/minio/minio-dotnet/pull/212
    ➜ minio-dotnet git:(02cbcb5) ✗ восстановление dotnet;сборка dotnet
    ➜ minio-dotnet git:(02cbcb5) ✗ dotnet run --project SimpleTest
    2.
    3.

Характеристики

Трассировки стека

minio-dotnet client side trace
---------------------------------------
Full URL of Request http://192.168.1.157:9000/
Request completed in 90.1376 ms, Request: {
  "resource": "/",
  "parameters": [
    {
      "name": "x-amz-content-sha256",
      "value": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
      "type": "HttpHeader"
    },
    {
      "name": "Host",
      "value": "192.168.1.157:9000",
      "type": "HttpHeader"
    },
    {
      "name": "x-amz-date",
      "value": "20180221T205958Z",
      "type": "HttpHeader"
    },
    {
      "name": "Authorization",
      "value": "AWS4-HMAC-SHA256 Credential=minio/20180221/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=db0fbcc9aa66975a530a2621962a87787559289a218da881420686263da862df",
      "type": "HttpHeader"
    },
    {
      "name": "Accept",
      "value": "application/json, application/xml, text/json, text/x-json, text/javascript, text/xml",
      "type": "HttpHeader"
    }
  ],
  "method": "GET",
  "uri": "http://192.168.1.157:9000/"
}, Response: {
  "statusCode": 403,
  "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message><Key></Key><BucketName></BucketName><Resource>/</Resource><RequestId>3L137</RequestId><HostId>3L137</HostId></Error>",
  "headers": [
    {
      "Name": "Accept-Ranges",
      "Value": "bytes",
      "Type": 3,
      "ContentType": null
    },
    {
      "Name": "Server",
      "Value": "Minio/DEVELOPMENT.GOGET, (linux; amd64)",
      "Type": 3,
      "ContentType": null
    },
    {
      "Name": "Vary",
      "Value": "Origin",
      "Type": 3,
      "ContentType": null
    },
    {
      "Name": "X-Amz-Request-Id",
      "Value": "151572E9DCF94747",
      "Type": 3,
      "ContentType": null
    },
    {
      "Name": "Date",
      "Value": "Wed, 21 Feb 2018 20:59:58 GMT",
      "Type": 3,
      "ContentType": null
    },
    {
      "Name": "Transfer-Encoding",
      "Value": "chunked",
      "Type": 3,
      "ContentType": null
    },
    {
      "Name": "Content-Type",
      "Value": "application/xml",
      "Type": 3,
      "ContentType": null
    }
  ],
  "responseUri": "http://192.168.1.157:9000/",
  "errorMessage": null
}
I'm not handling the Minio.Exceptions.MinioException.

Unhandled Exception: System.AggregateException: One or more errors occurred. (Minio API responded with message=The request signature we calculated does not match the signature you provided. Check your key and signing method.) (Minio API responded with message=The request signature we calculated does not match the signature you provided. Check your key and signing method.) ---> Minio.Exceptions.MinioException: Minio API responded with message=The request signature we calculated does not match the signature you provided. Check your key and signing method.
   at Minio.MinioClient.ParseError(IRestResponse response) in /home/kris/code/minio-dotnet/Minio/MinioClient.cs:line 475
   at Minio.MinioClient.<>c.<.ctor>b__78_0(IRestResponse response) in /home/kris/code/minio-dotnet/Minio/MinioClient.cs:line 70
   at Minio.MinioClient.HandleIfErrorResponse(IRestResponse response, IEnumerable`1 handlers, DateTime startTime) in /home/kris/code/minio-dotnet/Minio/MinioClient.cs:line 502
   at Minio.MinioClient.<ExecuteTaskAsync>d__81.MoveNext() in /home/kris/code/minio-dotnet/Minio/MinioClient.cs:line 349
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at Minio.MinioClient.<ListBucketsAsync>d__0.MoveNext() in /home/kris/code/minio-dotnet/Minio/ApiEndpoints/BucketOperations.cs:line 52
   --- End of inner exception stack trace ---
   at System.AggregateException.Handle(Func`2 predicate)
   at SimpleTest.Program.Main(String[] args) in /home/kris/code/minio-dotnet/SimpleTest/Program.cs:line 47

Server side trace: 
--------------------------
➜  minio git:(debugnet) minio server ~/ex                               
Drive Capacity: 6.9 GiB Free, 221 GiB Total

Endpoint:  http://192.168.1.157:9000  http://172.17.0.1:9000  http://172.18.0.1:9000  http://172.19.0.1:9000  http://172.20.0.1:9000  http://127.0.0.1:9000
AccessKey: minio 
SecretKey: minio123 

Browser Access:
   http://192.168.1.157:9000  http://172.17.0.1:9000  http://172.18.0.1:9000  http://172.19.0.1:9000  http://172.20.0.1:9000  http://127.0.0.1:9000

Command-line Access: https://docs.minio.io/docs/minio-client-quickstart-guide
   $ mc config host add myminio http://192.168.1.157:9000 minio minio123

Object API (Amazon S3 compatible):
   Go:         https://docs.minio.io/docs/golang-client-quickstart-guide
   Java:       https://docs.minio.io/docs/java-client-quickstart-guide
   Python:     https://docs.minio.io/docs/python-client-quickstart-guide
   JavaScript: https://docs.minio.io/docs/javascript-client-quickstart-guide
   .NET:       https://docs.minio.io/docs/dotnet-client-quickstart-guide
signed headers .... map[X-Amz-Content-Sha256:[e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855] X-Amz-Date:[20180221T205638Z] Host:[192.168.1.157]]

Самый полезный комментарий

Поднимем!

Все 35 Комментарий

Есть ли способ воспроизвести это в простом тесте?

https://github.com/poornas/restsharp-test — это проект с голыми костями, использующий restsharp для выполнения вызова корзин списка на сервер minio. Он использует собственный аутентификатор — вы увидите, что он не работает из-за несоответствия подписи. как только запрос передается в restsharp, порт отключается, прежде чем он будет передан на сервер.

Спасибо. Я посмотрю и постараюсь исправить.

Спасибо!

@alexeyzimarev Есть идеи, что может быть причиной этого?

@alexeyzimarev , у вас уже была возможность изучить это? Спасибо

Проверка сейчас

Я клонировал вашу реплику и вижу это:

  "parameters": [
...
    {
      "name": "Host",
      "value": "play.minio.io:9000",
      "type": "HttpHeader"
    }

Вы имеете в виду, что параметры в запросе в порядке, но значение не отправляется на сервер должным образом?

@alexeyzimarev , это правильно - трассировка, которую вы видите выше, идет до вызова executeAsync. Когда вызывается ExecuteAsync, Restsharp вызывает метод Authenticate, где мы устанавливаем заголовок авторизации подписи на основе url:port в пользовательском аутентификаторе. порт, похоже, был удален Restsharp перед попаданием на сервер и после вызова Authenticate().

Есть новости по этому поводу? Мы довольно сильно заблокированы в этом.

Жаль, что я не мог пока посмотреть на это. Если это очень критично, может быть, вы, ребята, можете потратить час на отладку?

Я быстро рассмотрел это. Насколько я могу судить, проблема здесь на самом деле не с RestSharp, а на самом деле HttpWebRequest в System.Net !

К тому времени, когда RestSharp передаст запрос в System.Net, свойство Host (Uri) в HttpWebRequest все еще содержит информацию о порте. Однако при вызове .SendRequest() используемый заголовок Host заполняется только хостом URI, а не хостом и портом .

Вот скриншот моего отладчика по ссылке выше.
screen shot 2018-03-22 at 11 22 52 am

Это явно противоречит спецификации HTTP , которая учитывает использование портов.

Кто-нибудь, пожалуйста, поправьте меня, если я ошибаюсь, потому что я никогда не находил бага в фреймворке dotnet, а обычно, когда я думаю, что нашел, — нет. В противном случае я полагаю, что следующими шагами будет поднятие этой проблемы в репозитории CoreFX?

Поднимем!

Сделано - давайте посмотрим, законно ли это, где ошибка или нет.

Просто любопытно - кто-нибудь знает, является ли это регрессом с недавним .NET Core? (2.1) Или с последней стабильной (2.0)? Или отличие .NET Framework от .NET Core, или отличие ОС Windows от Linux? («не знаю» — хороший ответ, спасибо!)

@karelz TBH Я изучил эту проблему, чтобы решить другую проблему, чтобы я мог перестать получать предупреждения компилятора 😆 для меня это «не знаю», я пробовал это только на .NET Core 2.0 на MacOS. Эта библиотека только недавно (может быть, несколько месяцев) была обновлена ​​для поддержки .NET Core, а не только .NET Framework. Может, @alexeyzimarev знает больше?

Хорошо, по крайней мере, вы знаете: он работает на .NET Framework (Windows) и не работает на .NET Core 2.0 (Mac). Это правильное резюме?

Нет - из других тем, в которых я участвую, я бы сказал, что это не работает на всех платформах на .NET Core 2.0, и я не знаю о .NET Framework.

@karelz Я бы сказал, что это предположение было бы правильным. Я только что перешел с полного фреймворка на .net core/standard, а потом тесты сломались. Я не уверен, что это регрессия от 1.x, поскольку мы только пытались перейти на .net Standard 2.0.

@niemyjski спасибо за подтверждение. Это достаточная информация на данный момент. Я просто изучал известные факты/опыт.

Мы оставляем этот вопрос открытым?

Исправление в CoreFx есть в PR: https://github.com/dotnet/corefx/pull/28375

Да :)

Спасибо
-Блейк Нимийски

В четверг, 22 марта 2018 г., в 15:57, Цезарь Чен, [email protected]
написал:

Исправление в CoreFx находится в PR: dotnet/corefx#28375.
https://github.com/dotnet/corefx/pull/28375


Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/restsharp/RestSharp/issues/1085#issuecomment-375454963 ,
или заглушить тему
https://github.com/notifications/unsubscribe-auth/AA-So67a2QfPq72jMHNxaSCBhDXiWXOMks5thBAygaJpZM4SOXLx
.

Была ли какая-то причина, по которой мы не могли переключиться на HttpClient, который намного быстрее?
и легче работать? Этой проблемы не будет?

Спасибо
-Блейк Нимийски

В пятницу, 23 марта 2018 г., в 7:14, Блейк Ниемийски [email protected]
написал:

Да :)

Спасибо
-Блейк Нимийски

В четверг, 22 марта 2018 г., в 15:57, Цезарь Чен, [email protected]
написал:

Исправление в CoreFx находится в PR: dotnet/corefx#28375.
https://github.com/dotnet/corefx/pull/28375


Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/restsharp/RestSharp/issues/1085#issuecomment-375454963 ,
или заглушить тему
https://github.com/notifications/unsubscribe-auth/AA-So67a2QfPq72jMHNxaSCBhDXiWXOMks5thBAygaJpZM4SOXLx
.

@niemyjski , вы имеете в виду, что переключатель RestSharp использует HttpClient вместо HttpWebRequest ?

Да :)

Спасибо
-Блейк Нимийски

В пт, 23 марта 2018 г., в 9:22, Алексей Зимарев [email protected]
написал:

@niemyjski https://github.com/niemyjski вы имеете в виду, что вы переключаетесь
RestSharp использует HttpClient вместо HttpWebRequest?


Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/restsharp/RestSharp/issues/1085#issuecomment-375680769 ,
или заглушить тему
https://github.com/notifications/unsubscribe-auth/AA-So0cbK66_Nq-MRdk0xwdb7sLPSGUoks5thQUUgaJpZM4SOXLx
.

@niemyjski вопрос был один _или_ другой, _yes_ действительно неправильный ответ :)

Если вы имеете в виду, что RestSharp должен использовать HttpClient - я за это, но в прошлый раз, когда я пытался, было много работы, чтобы сопоставить все параметры в RestClient.

Да, мы должны переключиться на HttpClient, который гораздо более гибкий, имеет лучшую производительность и современный API, который, как мы знаем, работает везде. Мы могли бы внести некоторые критические изменения и поднять основные :)

Да, я хорошо делаю это, но я не делаю это в одиночку. Я пытался, и это было слишком много работы. Я бы также удалил асинхронные вызовы, которые принимают обратные вызовы. ContinueWith должен быть в порядке.

Похоже, это было объединено с 2.1, должны ли мы выпускать ночную версию, которая ссылается на новый предварительный просмотр 2 бит, и мы можем перемещать другие пакеты на долгое время? Есть ли какие-то обходные пути, которые мы можем сделать для сред выполнения/библиотек < 2.1?

Я понятия не имею об обходных путях

Мне нужно сначала сделать выпуск, прежде чем я смогу изменить предварительный выпуск на предварительную версию 2.1.

Это было решено? Пакеты RTM 2.1 находятся на nuget.

Итак, вам нужно попробовать использовать 2.1 и посмотреть, исправили ли они это?

@niemyjski мой комментарий от 20 апреля глупый. Мне не нужно ничего никуда указывать. Библиотека компилируется в .NET Standard 2.0. Ошибка вызвана ошибкой в ​​среде выполнения .NET Core 2.0, поэтому, как только вы перестроите свое приложение с помощью .NET Core 2.1, если проблема устранена, оно должно начать работать. Извините за путаницу.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги