Периодически возникает ошибка 5203.

 

Добрый день.

Собственно вся проблема в теме. Сайт естественно добавлен. Это видно на приложенном скрине. Версия клиента 765.

Скрин 

 

Без исходников будет трудно сказать, в чем дело. Если есть возможность, то напишите в сервсидеск (mql5.com), будем смотреть.

 
Скорее всего проблема в таймауте, попробуйте увеличить его.
 
mql5:
Скорее всего проблема в таймауте, попробуйте увеличить его.
У меня идет 2 запроса. Если куки не пустые, то отправляется GET запрос, если пустые, то POST. У POST стоял таймаут 10000, у GET 5000. Поставил и там и там 10000 и установил запись в логах, чтобы понять на каком запросе получаю такую ошибку. Посмотрим.
 

Опять вылезла, причем пока не перезапускал, долго не появлялась эта ошибка... Вот код:

// Эта переменная описана в глобальном модуле
string      cookie               = "";

Эти переменные описаны в процедуре получения данных
string      headers;
int         timeOut              = 10000;
char        post[],result[];

string      url                  = "http://24fx.ru/cabinet/";
string      user                 = "login@mail.ru";
string      pass                 = "mypass";
string      authLoginStr         = "auth_login";
string      authStr              = "auth_login=" + user + "&auth_password=" + pass;

//Если есть куки, то шлем POST запрос, иначе GET
   if(cookie == "")
   {
      StringToCharArray(authStr, post, 0, StringLen(authStr));
      res = WebRequest("POST", url, "", NULL, timeOut, post, ArraySize(post), result, headers);
      
      //Заполним куки
      if(res != -1)
      {
         index = StringFind(headers, "PHPSESSID=");
         //Если нашли строку с куками
         if(index > 0)
         {
            cookie = StringSubstr(headers, index, StringFind(headers, ";", index) - index + 1);            
         }
      }
   
   } else   
   {
      //Get data
      res = WebRequest("GET", url, cookie, NULL, timeOut, post, 0, result, headers);
   }
   
   if(res == -1)
   {
      Print("Ошибка в WebRequest. Код ошибки  =",GetLastError());
      //--- возможно, URL отсутствует в списке, выводим сообщение о необходимости его добавления
      MessageBox("Необходимо добавить адрес '"+url+"' в список разрешенных URL во вкладке 'Советники'","Ошибка",MB_ICONINFORMATION);
   }
 

Не верю в электричество, поэтому сделал бы url константой. Просто и неприхотливо,- через define. 

Кстати, у Вас Get и Post перепутаны.  

 
Dzammer:

Опять вылезла, причем пока не перезапускал, долго не появлялась эта ошибка... Вот код:

Попробуйте распечатать код системной ошибки:
#import "kernel32.dll"
   int GetLastError();
#import 


Print(kernel32::GetLastError());
 

Решил не плодить темы а отписать тут, так как проблема с этой же функцией и ошибка та же.

Сегодня пол ночи убил на решение проблемы с функцией WebRequest(), которая наглым образом возвращала мне ошибку 5203, хотя в коде ошибок нет. В общем, в конце концов, набросал я вот такой тестовый скрипт:

//+------------------------------------------------------------------+
//|                                              WebRequest_Test.mq4 |
//|                         Copyright 2015, ir0407[@]ruforum.mt5.com |
//|                                           http://ruforum.mt5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, ir0407[@]ruforum.mt5.com"
#property link      "http://ruforum.mt5.com"
#property version   "1.00"
#property strict

string url = "http://mql5.com";

void OnStart()
{
  string cookie  = "", referer = "", headers = "", msg = "\n";
  char  post[], result[];
  int   timeout = 10000;
  
  ResetLastError();   
  int RequestRezult = WebRequest("GET", url, cookie, referer, timeout, post, 0, result, headers);
  if(RequestRezult == -1)
  {
    int Error = GetLastError();
    switch(Error)
    {
      case ERR_WEBREQUEST_INVALID_ADDRESS:
        msg = StringConcatenate(msg, "Ошибка ", Error, ": ERR_WEBREQUEST_INVALID_ADDRESS - URL не прошел проверку", "\n"); break;
      case ERR_WEBREQUEST_CONNECT_FAILED:
        msg = StringConcatenate(msg, "Ошибка ", Error, ": ERR_WEBREQUEST_CONNECT_FAILED - Не удалось подключиться к указанному URL", "\n"); break;
      case ERR_WEBREQUEST_TIMEOUT:
        msg = StringConcatenate(msg, "Ошибка ", Error, ": ERR_WEBREQUEST_TIMEOUT - Превышен таймаут получения данных", "\n"); break;
      case ERR_WEBREQUEST_REQUEST_FAILED:
        msg = StringConcatenate(msg, "Ошибка ", Error, ": ERR_WEBREQUEST_REQUEST_FAILED - Ошибка в результате выполнения HTTP запроса", "\n"); break;
      case ERR_FUNCTION_NOT_CONFIRMED:
        msg = StringConcatenate(msg, "Ошибка ", Error, ": ERR_FUNCTION_NOT_CONFIRMED - Функция не разрешена.", "\n");
        msg = StringConcatenate(msg, "Данного URL [", url, "] нет в списке для WebRequest()", "\n"); break;
      default:
        msg = StringConcatenate(msg, "Неизвестная ошибка #", Error, "\n");
    }
    msg = StringConcatenate(msg, "result = ", CharArrayToString(result));
  }
  else
  {
    msg = StringConcatenate(msg, "Запрос к [", url, "] отправлен успешно.\n");
    msg = StringConcatenate(msg, "Результат запроса = ", RequestRezult,"\n");
    msg = StringConcatenate(msg, "Ответ сервера = ", CharArrayToString(result));
  }
  Comment(msg);
}

И хотя в коде ошибки отсутствуют этот скрипт выводит вот такую ошибку:

Я уже весь WinAPI на куски "порвал, как Тузик грелку" в поисках решения проблемы почему же это там вываливается ошибка 12150 и отчего это АПИ не может добавить куда-то там какие-то там хедеры. А ларчик просто открывался...

После кучи экспериментов удалось обнаружить, что причиной такого поведения функции WebRequest() является параметр referer. В отличии от других параметров его нельзя инициализировать пустой строкой, как в скрипте, хотя для строковых переменных такая инициализация более чем логична. Так же нельзя его инициализировать и пробелами. Все что можно в него вписать, так это константа NULL или любое строковое значение, кроме пробелов. В этом случае функция отрабатывает корректно. Все остальные параметры нормально воспринимаются функцией WebRequest() при любых раскладах, т.е. их можно спокойно инициализировать как константой NULL, так и пустой строкой "" или строкой состоящей из одних пробелов.

Как по мне это ненормальное поведение этой функции. Поэтому хотелось бы, чтобы в следующих версиях терминала этот баг был исправлен.

 
ir0407:

Решил не плодить темы а отписать тут, так как проблема с этой же функцией и ошибка та же.

Сегодня пол ночи убил на решение проблемы с функцией WebRequest(), которая наглым образом возвращала мне ошибку 5203, хотя в коде ошибок нет. В общем, в конце концов, набросал я вот такой тестовый скрипт:


Спасибо за Ваше сообщение.

Мы проверили указанное Вами поведение и внесли необходимые правки в функцию WebRequest

Причина обращения: