purebasic.info

PureBasic forum
Текущее время: Вс окт 21, 2018 5:47 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: Баг функции URLEncoder.
СообщениеДобавлено: Пн сен 19, 2011 9:48 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11300
Благодарил (а): 4 раз.
Поблагодарили: 436 раз.
Почему символ & не кодируется?
Код:
1
Debug URLEncoder(" &")

Это создает глюки при передаче данных GET запросом.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт сен 20, 2011 1:06 am 
Не в сети
профессор

Зарегистрирован: Вт янв 13, 2009 2:41 pm
Сообщений: 370
Благодарил (а): 3 раз.
Поблагодарили: 17 раз.
Пункты репутации: 8
Да, есть такая фишка. Скомпилил код, нашёл где поправить байт дабы кодировался и этот символ, распаковал пуриковскую либу Http, нишёл и заменил байт в ней.
Теперь главный вопрос: Как конвертнуть распакованную либу в пуриковскую. Чёт я алгоритм недопонял. Сам распаковщик в этой теме http://pbasic.spb.ru/phpBB2/viewtopic.php?p=19857


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт сен 20, 2011 12:17 pm 
Не в сети
профессор

Зарегистрирован: Вт май 04, 2010 12:19 pm
Сообщений: 352
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
LibraryMaker.exe из папки SDK.

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
;
; Langage used to code th library: ASM or C
C
;
; Number of windows DLL than the library need
0
; Library type (Can be OBJ or LIB)
;
LIB
;
; Number of PureBasic library needed by the library
0
; Help directory name
;
Requester.chm
;
; Library functions (FunctionName, Arg1, Arg2, ...)
;
MessageRequester, String, String
Long | StdCall
MessageRequester2, String, String, Long
Long | StdCall



Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт сен 20, 2011 1:23 pm 
Не в сети
доцент

Зарегистрирован: Пт июн 24, 2011 2:55 pm
Сообщений: 68
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Fox писал(а):
Да, есть такая фишка. Скомпилил код, нашёл где поправить байт дабы кодировался и этот символ, распаковал пуриковскую либу Http, нишёл и заменил байт в ней.
Теперь главный вопрос: Как конвертнуть распакованную либу в пуриковскую. Чёт я алгоритм недопонял.

Круто! А не проще InternetCanonicalizeUrl_ использовать?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт сен 20, 2011 2:25 pm 
Не в сети
профессор

Зарегистрирован: Вт янв 13, 2009 2:41 pm
Сообщений: 370
Благодарил (а): 3 раз.
Поблагодарили: 17 раз.
Пункты репутации: 8
lach, мы не ищем лёгких путей.
Во вложении правленная пуриковская либа с версии 4.50 Beta1 (4.51 под рукой нету, если не пойдёт, выложу вечером)
UPD: в либе для 4.50 Beta1 забыл про юникод. Для версии 4.51 поправил функционал и для юникода.


Вложения:
Комментарий к файлу: Http+& для 4.51
Http_4_51.zip [14.58 KiB]
Скачиваний: 138
Комментарий к файлу: Http+&
Http.zip [14.59 KiB]
Скачиваний: 140
Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср сен 21, 2011 7:45 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11300
Благодарил (а): 4 раз.
Поблагодарили: 436 раз.
Функция также пропускает и символ "?"
Код:
1
Debug URLEncoder("?")


Написал свой велосипед, совместимый с юникодом и кроме того, позволяющий кодировать не только строковые, но и бинарные данные.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Procedure.s URLEncode_Binary(*Mem, Size)
  Protected Encoded.s, Char.a, i
  Encoded = ""
  Size-1
 
  For i=0 To Size
    Char=PeekA(*Mem+i)
    If (Char>='0' And Char<='9') Or (Char>='A' And Char<='Z') Or (Char>='a' And Char<='z')
      Encoded+Chr(Char)
    Else
      Encoded+"%"+RSet(Hex(Char, #PB_Ascii),2,"0")
    EndIf
  Next i
 
  ProcedureReturn Encoded
EndProcedure
 
Procedure.s URLEncode_String(String.s)
  Protected Result.s, *Mem, Size
  Result = ""
 
  Size=StringByteLength(String, #PB_Ascii)
  If Size>0
    *Mem = AllocateMemory(Size+2)
    If *Mem
      PokeS(*Mem, String, Size, #PB_Ascii)
      Result = URLEncode_Binary(*Mem, Size)
      FreeMemory(*Mem)
    EndIf
  EndIf
  ProcedureReturn Result
EndProcedure
 
Debug URLEncode_String("1234 ёя")


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср сен 21, 2011 7:59 pm 
Не в сети
профессор

Зарегистрирован: Вт янв 13, 2009 2:41 pm
Сообщений: 370
Благодарил (а): 3 раз.
Поблагодарили: 17 раз.
Пункты репутации: 8
Пётр, а зачем кодировать все "не буквы" и "не цифры"? Стандартный пример из справки:
Код:
1
"http://www.purebasic.com/test with space.php3"

превращается бог знает во что:
Код:
1
2
http%3A%2F%2Fwww%2Epurebasic%2Ecom%2Ftest%20with%20space%2Ephp3
 


Если надо, дай либу Http используемой версии PureBasic`а и все символы, которые должны кодироваться, но не кодируются, я переделаю. На счёт сбоев в работе пересобраной либы можно не беспокоиться, если ничего не менять, просто пересобрать её заново, получается точная копия оригинальной либы.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср сен 21, 2011 8:17 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11300
Благодарил (а): 4 раз.
Поблагодарили: 436 раз.
Мне нужно кодировать не весь адрес, а только отдельные данные, некоторые из них бинарные и при всем желании, URLEncoder() не подойдет для их кодирования.
Цитата:
Обратите внимание, что все бинарные данные в URL (в особенности info_hash и peer_id) должны быть правильно экранированы. Это означает, что любой байт, который не входит в множества ''0-9'', ''a-z'', ''A-Z'' и ''$-_.+!*'(),'' должен быть закодирован в формате "%nn", где nn — шестнадцатеричное значение байта. (см. RFC 1738 для подробностей).

Для следующего 20-байтового хэша:
\x12\x34\x56\x78\x9a\xbc\xde\xf1\x23\x45\x67\x89\xab\xcd\xef\x12\x34\x56\x78\x9a

правильно закодированной является строка
%124Vx%9A%BC%DE%F1%23Eg%89%AB%CD%EF%124Vx%9A

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн ноя 05, 2012 12:44 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11300
Благодарил (а): 4 раз.
Поблагодарили: 436 раз.
Еще один баг функции.
Код:
1
2
String.s=URLEncoder("глюк")
MessageRequester("", String)

Соберите прогу в юникоде.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB