Ошибка 408 при отправке большой электронной почты через Gmail API с помощью libcurl - PullRequest
0 голосов
/ 13 января 2020

Я пытаюсь отправить электронное письмо через gmail из приложения c ++, используя libcurl для доступа к rest-api.

В большинстве случаев это работает безупречно, но с большими электронными письмами (> 2 МБ) я случайно получить странно отформатированный "Error 408 (Request Timeout)!!1" ответ. Чем больше электронная почта, тем больше вероятность появления этих ошибок. При 2 МБ это происходит примерно в 60% случаев, а с 7 МБ я почти не получаю письма.

Мне интересно, как лучше отладить эту проблему и что может ее вызвать, поскольку libcurl не сообщает о проблемах с тайм-аутом и, кажется, успешно завершил sh отправку данных электронной почты. Ответ об ошибке получен примерно через минуту после того, как libcurl заканчивает отправку, поэтому похоже, что сервер ожидает больше данных. Сумма, которую я отправляю, соответствует тому, что я сообщаю в поле «Длина контента», и я всегда проверяю с одними и теми же данными электронной почты (которые случайным образом работают / не работают).

Ответ не находится в JSON (несмотря на мой заголовок «Accepted: application / json»), но в несколько минималистском c html (отсутствует тело, теги заголовка) и читается так, как будто он не предназначен для конечных пользователей:

<!DOCTYPE html>
<html lang=en>
  <meta charset=utf-8>
  <meta name=viewport content="initial-scale=1, minimum-scale=1, width=device-width">
  <title>Error 408 (Request Timeout)!!1</title>
  <style>
    *{margin:0;padding:0}html,code{font:15px/22px arial,sans-serif}html{background:#fff;color:#222;padding:15px}body{margin:7% auto 0;max-width:390px;min-height:180px;padding:30px 0 15px}* > body{background:url(//www.google.com/images/errors/robot.png) 100% 5px no-repeat;padding-right:205px}p{margin:11px 0 22px;overflow:hidden}ins{color:#777;text-decoration:none}a img{border:0}@media screen and (max-width:772px){body{background:none;margin-top:0;max-width:none;padding-right:0}}#logo{background:url(//www.google.com/images/branding/googlelogo/1x/googlelogo_color_150x54dp.png) no-repeat;margin-left:-5px}@media only screen and (min-resolution:192dpi){#logo{background:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat 0% 0%/100% 100%;-moz-border-image:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) 0}}@media only screen and (-webkit-min-device-pixel-ratio:2){#logo{background:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat;-webkit-background-size:100% 100%}}#logo{display:inline-block;height:54px;width:150px}
  </style>
  <a href=//www.google.com/><span id=logo aria-label=Google></span></a>
  <p><b>408.</b> <ins>That’s an error.</ins>
  <p>Your client has taken too long to issue its request.  <ins>That’s all we know.</ins>

Я отправляю свои message/rfc822 данные в конечную точку в https://www.googleapis.com/upload/gmail/v1/users/me/messages/send и пробовал оба, используя Простые и Возобновляемые потоки загрузки.

Единственный способ улучшить ситуацию - это уменьшить объем данных, которые libcurl отправляет за раз, но, похоже, это только снижает вероятность, а не позволяет полностью ее избежать. Отправка HTTP-запроса с 1000 байтами за раз, кажется, делает проблему почти исчезнуть ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...