Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
Страниц: [1] 2 3 4 ... 10
 1 
 : Вчера в 22:34 
Автор perl6 - Последний ответ от perl6
Хорошо, спасибо Вам за наводку.  Внимание! Говорит и показывает...

 2 
 : Вчера в 01:02 
Автор perl6 - Последний ответ от RXL
Длина — не обязательный параметр. Для динамического контента, часто, размер не известен. Если веб-сервер не ждет все тело от бекенда и бекенд не предоставляет длину, то это твой случай.
Я бы считывал нужное количество байт и на потом закрывал бы сокет. Смотри response_data:
Цитата
This handler is called for each chunk of data received for the response. The handler might croak to abort the request.
This handler needs to return a TRUE value to be called again for subsequent chunks for the same request.
Для таких случаев часто используется chunk-encoded transfer. Думаю, тут речь про это. Уточнить можешь посмотрев исходники.

 3 
 : 02-07-2022 23:50 
Автор perl6 - Последний ответ от perl6
Приветствую. Понадобилось решить такую задачу - есть покупные прокси, резидентские, приобретены для парсинга. Так как там лимит по трафу, при превышении, плати еще, мною принято гениальное при свой простоте решение - не грузить страницы весом более (в моем случае, 150 Кб)... Так вот, в LWP есть фишка, вроде max_size(), которая казалось бы должна помочь, зачем голову то напрягать, раз умные дяди разрабы либы уже подумали за нас.

Но, как это обычно бывает, не все так просто!!! При указании лимита, страница ГРУЗИТСЯ ровно на этот лимит, а потом серверу шлется "Client Connect Aborted" и соединение закрывается. Если проще, например, указал я лимит в 150Кб, а страница весит 300Кб. Эта опция загрузит 150Кб, а потом разорвет коннект. Может так оно и надо, а разраб либы лучше меня знает, только это решение мне не подходит. Траф все-равно израсходуется, а кусок страницы мне не нужен.

Почесав репу и посмотрев доки, было принято решение придумать что-то свое. Порассуждав логически, я пришел к выводу, что можно "навесив" соотв. обработчик, получить через заголовок Content-Length размер страницы, если он больше лимита, то ничего не грузить.

Вот такой вот говнокод спас ситуацию:

Код: (Perl)
       $ua->add_handler(response_header => sub {
           my ($response, $ua) = @_;
       
           die if $response->header('content-length') > 150000;
       
      }, m_code => [200]);;


Все работает нормально, однако, есть нехорошие сервера, вроде mail.ru, где LWP не видит заголовок Content-Length, хотя, он там есть.

Собственно, непонятно, кто виноват и что делать? То ли это я где накосячил, то ли LWP спотыкается на заголовках, ибо у того же mail.ru реальная дичь там творится, заголовков много и данных в них...

 4 
 : 23-06-2022 07:51 
Автор LemmonRus - Последний ответ от Джон
А если конвертнуть в юникод? В юникоде "я" совсем не FF.
В смысле как workaround. Конвертнуть исходный текст в юникод, распарсить и, если необходимо, конвертнуть обратно в 1251

Теперь ищу замену sscanf

regexp?

 5 
 : 22-06-2022 21:08 
Автор LemmonRus - Последний ответ от RXL
Очень даже может FF → EOF, если значение getchar присвоено char: EOF == -1, а FF в char — тоже -1. Замечу, что getchar возвращает int, а не char, 0xFF можно отличить от EOF.

Значение val == 0?

Стоит почитать документацию на стандартную библиотеку С своей ОС.

 6 
 : 22-06-2022 21:06 
Автор LemmonRus - Последний ответ от LemmonRus
1. А какую локаль устанавливал? Может "я" попадает под какой-нить UTF-8? Насколько я понимаю "я" = FF в Win-1251 кодировке, в Win-DOS она же xDE или xEF, так по крайней мере у меня показывается на немец. Win-11
 
2. Если вместо "я" другая буква (не "последняя", < FF) стоит, работает?

3. Совсем тупой вопрос: содержимое data смотришь в дебуггере, или в file? "я" может и %s "отрезаться". В кач. эксперимента %ls вместо %s
1.Проверял в обоих местах . Локаль ".1251" . Даже для прикола заменил sscanf на sscanf_l с полностью прописанной локалью . Все равно режет букву я (0xFF).
2.Да работает.
Насколько я понял это ошибка Windows Kit 8.1 там с какого то перепою работа с файлами и строками заведена на один и тот же Template в котором проверяется на секундочку EOF который то же 0xFF. Теперь ищу замену sscanf .От Windows Kit 8.1 я к сожалению отказаться не могу.

 7 
 : 22-06-2022 19:41 
Автор LemmonRus - Последний ответ от Джон
1. А какую локаль устанавливал? Может "я" попадает под какой-нить UTF-8? Насколько я понимаю "я" = FF в Win-1251 кодировке, в Win-DOS она же xDE или xEF, так по крайней мере у меня показывается на немец. Win-11
 
2. Если вместо "я" другая буква (не "последняя", < FF) стоит, работает?

3. Совсем тупой вопрос: содержимое data смотришь в дебуггере, или в file? "я" может и %s "отрезаться". В кач. эксперимента %ls вместо %s

 8 
 : 22-06-2022 10:14 
Автор LemmonRus - Последний ответ от LemmonRus
Встретил странную проблему в коде.
При попытке распарсить строку "Имя_ТИП01" при помощи кода
Код: (C++)
void print_ID_LEN( char * ID)
{
    int num;
    char data[50];
    int len;
    char filename[255] = { 0 };
    len = strlen(ID);
    {
        int val = sscanf(ID, "%[^0-9]%02d", data, &num);
        if ( val== 2)
        {
            printf(file, "\"%s\",\n", data);
        }
        else
        {
            printf(file, "\"%s\", \n", ID);
        }
        fclose(file);
    }
}
Обнаружил что val=1,а в  data находится всего 2 распарсеных буквы "Им" .
В ходе дальнейших изысканий выяснил что sscanf с атрибутами "%s" так же вызывает обрезание строки "Имя_ТИП01" до "Им"
то есть фактически sscanf останавливает парсинг на символе 'я' (0xFF ) .Установка локалей через setlocale не помогает.
Я сначало грешил на компилятор на создав другой проект с  этой функцией она работала нормально.Что это может быть?

 9 
 : 14-06-2022 09:03 
Автор Psychologist - Последний ответ от Psychologist
Цитата
В чем именно затык?

Уже решил проблему, спасибо. Допустил пару логических ошибок, вот исправленый код клика на  кнопке:

Код: (Delphi)
procedure TForm1.Button1Click(Sender: TObject);
var i, k, N: Integer; buf_Rect: TRect; arec1: array of TRect;
begin
  N := SpinEdit1.Value;
  k := 0;
  SetLength(arec1, k + 1);
  arec1[0].Left := Random(Image1.ClientWidth);
  arec1[0].Top := Random(Image1.ClientHeight);
  arec1[0].Right := Random(Image1.ClientWidth);
  arec1[0].Bottom := Random(Image1.ClientHeight);
  while k < N do
  begin
    case RadioGroup1.ItemIndex of
      0: begin
          buf_Rect.Left := Random(Image1.ClientWidth);
          buf_Rect.Top := Random(Image1.ClientHeight);
        end;
      1: begin
          buf_Rect.Left := arec1[High(arec1)].Right;
          buf_Rect.Top := arec1[High(arec1)].Bottom;
        end;
    end;
    buf_Rect.Right := Random(Image1.ClientWidth);
    buf_Rect.Bottom := Random(Image1.ClientHeight);
    for i := 0 to Length(arec1) - 1 do
      if CollisionLineFromTRECT(arec1[i], buf_Rect)
        then break else
        if i = Length(arec1) - 1 then
        begin
          Inc(k);
          SetLength(arec1, k);
          arec1[k - 1] := buf_Rect;
        end;
  end;
  with Image1.canvas do
  begin
    fillrect(cliprect);
    for i := 0 to Length(arec1) - 1 do
    begin
      MoveTo(arec1[i].Left, arec1[i].Top);
      LineTo(arec1[i].Right, arec1[i].Bottom);
    end;
  end;
end;

если кому нужно, работающие исходники прилагаю

 10 
 : 13-06-2022 15:56 
Автор Psychologist - Последний ответ от Finch
В чем именно затык? У меня например сейчас нету доступа к Дельфи, чтоб проверять и дебажить.

Страниц: [1] 2 3 4 ... 10
Powered by SMF 1.1.21 | SMF © 2015, Simple Machines