
Форум программистов «Весельчак У» |
|
Начало | Помощь | Поиск | Календарь | Почта | Войти | Регистрация |
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. Для таких случаев часто используется chunk-encoded transfer. Думаю, тут речь про это. Уточнить можешь посмотрев исходники.This handler needs to return a TRUE value to be called again for subsequent chunks for the same request. |
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 1.Проверял в обоих местах . Локаль ".1251" . Даже для прикола заменил sscanf на sscanf_l с полностью прописанной локалью . Все равно режет букву я (0xFF).2. Если вместо "я" другая буква (не "последняя", < FF) стоит, работает? 3. Совсем тупой вопрос: содержимое data смотришь в дебуггере, или в file? "я" может и %s "отрезаться". В кач. эксперимента %ls вместо %s 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) Обнаружил что val=1,а в data находится всего 2 распарсеных буквы "Им" .{ 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); } } В ходе дальнейших изысканий выяснил что 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 | ||
В чем именно затык? У меня например сейчас нету доступа к Дельфи, чтоб проверять и дебажить.
|