View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0003550 | SAS.Планета | Баг / Bug | public | 21-08-2019 21:25 | 30-08-2019 13:57 |
| Reporter | aflexus | Assigned To | zed | ||
| Priority | normal | Severity | minor | Reproducibility | always |
| Status | resolved | Resolution | fixed | ||
| Product Version | 190707 | ||||
| Target Version | 191221 | Fixed in Version | 191221 | ||
| Summary | 0003550: Не удаётся отправить Cookie в закодированном виде | ||||
| Description | GetScript.txt Отправка через RequestHead-параметр переменной закодированной в URLEncode() по-факту отправляется декодированной. Если эту же переменную сохранить банально в файл, кодировка сохраняется. | ||||
| Steps To Reproduce | То есть:
И вот если сделать запрос с таким вот заголовком:
То на самом деле отправится декодированная ('kd3/sd+asi adf') переменная. | ||||
| Tags | No tags attached. | ||||
| Attached Files | GetUrlScript.txt (1,186 bytes)
function isInString(const ch: Char; const s: String): Boolean;
var i: Integer;
begin
Result := False;
for i := 1 to Length(s) do begin
Result := s[i] = ch;
if Result then Break;
end;
end;
function URLEncode(const ASrc: String): String;
var
i: Integer;
SafeChars: String;
begin
Result := '';
SafeChars := 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
for i := 1 to Length(ASrc) do begin
if not isInString( ASrc[i], SafeChars ) then begin
Result := Result + '%' + IntToHex(Ord(ASrc[i]), 2);
end else begin
Result := Result + ASrc[i];
end;
end;
end;
var
v: string;
e: string;
begin
v := 'kd3/sd+asi adf';
e := URLEncode(v);
writeln(e);
ResultURL :=
'http://' + Chr(Ord('a') + Random(3)) + '.tile.openstreetmap.org/' +
IntToStr(GetZ-1) + '/' + IntToStr(GetX) + '/' + IntToStr(GetY) + '.png';
RequestHead :=
'User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0' + #13#10 +
'Referer: https://www.openstreetmap.org/' + #13#10 +
'Data: ' + e + #13#10 +
'Accept: image/webp,*/*';
end.
GetUrlScript_Error.txt (1,174 bytes)
function isInString(const ch: Char; const s: String): Boolean;
var i: Integer;
begin
Result := False;
for i := 1 to Length(s) do begin
Result := s[i] = ch;
if Result then Break;
end;
end;
function URLEncode(const ASrc: String): String;
var
i: Integer;
SafeChars: String;
begin
Result := '';
SafeChars := 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
for i := 1 to Length(ASrc) do begin
if not isInString( ASrc[i], SafeChars ) then begin
Result := Result + '%' + IntToHex(Ord(ASrc[i]), 2);
end else begin
Result := Result + ASrc[i];
end;
end;
end;
var
v: string;
e: string;
begin
v := 'kd3/sd+asi adf';
e := URLEncode(v);
writeln(e);
ResultURL :=
'http://' + Chr(Ord('a') + Random(3)) + '.tile.openstreetmap.org/' +
IntToStr(GetZ-1) + '/' + IntToStr(GetX) + '/' + IntToStr(GetY) + '.png';
RequestHead :=
'User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0' + #13#10 +
'Referer: https://www.openstreetmap.org/' + #13#10 +
'Cookie: ' + e + #13#10 +
'Accept: image/webp,*/*';
end.
| ||||
|
|
Сообщение поломалось немного, но думаю, и из контекста понятно :) RequestHead := 'Data:' + e + 0000013#10... |
|
|
Может ваша функция URLEncode просто не работает? Покажите исходник? Записал в скрипте строку: RequestHead := 'Data: ' + 'kd3%2Fsd%2Basi%20adf' отправилось как и положено (смотрел в wireshark). Что в общем-то не удивительно, т.к. никаких дополнительных обработок заголовков не выполняется. |
|
|
function URLEncode(const ASrc: String): String; var i: Integer; SafeChars: String; begin Result := ''; SafeChars := 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; for i := 1 to Length(ASrc) do begin if not isInString( ASrc[i], SafeChars ) then begin Result := Result + '%' + IntToHex(Ord(ASrc[i]), 2); end else begin Result := Result + ASrc[i]; end; end; end; |
|
|
При этом, если сделать SaveToLocalFile(dbg_file, URLEncode(v)); То в файл сохранится так, как надо. |
|
|
isInString? |
|
|
Ну это банально: function isInString(const ch: Char; const s: String): Boolean; var i: Integer; begin Result := False; for i := 1 to Length(s) do begin Result := s[i] = ch; if Result then Break; end; end; |
|
|
> Ну это банально Это понятно, но мне же надо воспроизвести ваш кейс, а не написать свой вариант, который может работать (в отличии от вашего). Приложил скрипт (взял за основу OSM Mapnik), у меня он работает как надо. И в Pascal Script IDE пишет всё как надо и в сеть уходит закодированная строка. |
|
|
Чем вы смотрите заголовки при передаче в сеть? Покажите ваш скрипт целиком, может там ошибка и вместо одной переменной вы отправляете другую? |
|
|
Все дело в имени параметра - "Cookie" :) Именно с ним переменная почему-то декодируется. Скриншот приложил. И добавил GetUserScript - который не работает. Спасибо огромное за помощь! Теперь получилось повторить поведение? |
|
|
Да, с куками получилось. Похоже на баг в используемом компоненте - при установке заголовков он автоматически декодирует поле Cookie и впоследствии в таком виде и отправляет в интернет. Сделал заглушку, чтобы такого не происходило. В следующей ночной версии куки будут уходить в том же виде, что и были установлены в скрипте. |
|
|
Супер! Благодарю за оперативность! |
| Date Modified | Username | Field | Change |
|---|---|---|---|
| 21-08-2019 21:25 | aflexus | New Issue | |
| 21-08-2019 21:50 | aflexus | Note Added: 0019280 | |
| 21-08-2019 22:42 | zed | Steps to Reproduce Updated | |
| 21-08-2019 22:53 | zed | Note Added: 0019281 | |
| 21-08-2019 22:54 | zed | Status | new => feedback |
| 21-08-2019 22:56 | aflexus | Note Added: 0019282 | |
| 21-08-2019 22:56 | aflexus | Status | feedback => new |
| 21-08-2019 22:58 | aflexus | Note Added: 0019283 | |
| 21-08-2019 22:59 | aflexus | Note Edited: 0019283 | |
| 21-08-2019 22:59 | zed | Note Added: 0019284 | |
| 21-08-2019 22:59 | aflexus | Note Added: 0019285 | |
| 21-08-2019 23:05 | zed | File Added: GetUrlScript.txt | |
| 21-08-2019 23:06 | zed | File Added: Screenshot_1.png | |
| 21-08-2019 23:08 | zed | Note Added: 0019286 | |
| 21-08-2019 23:10 | zed | Note Added: 0019287 | |
| 21-08-2019 23:26 | aflexus | File Added: Image 1.png | |
| 21-08-2019 23:27 | aflexus | Note Added: 0019288 | |
| 21-08-2019 23:28 | aflexus | Note Edited: 0019288 | |
| 21-08-2019 23:30 | aflexus | Note Edited: 0019288 | |
| 21-08-2019 23:38 | aflexus | File Added: GetUrlScript_Error.txt | |
| 21-08-2019 23:39 | aflexus | Note Edited: 0019288 | |
| 21-08-2019 23:51 | aflexus | Note Edited: 0019288 | |
| 22-08-2019 09:13 | zed | Note Added: 0019291 | |
| 22-08-2019 09:17 | zed | Status | new => resolved |
| 22-08-2019 09:17 | zed | Resolution | open => fixed |
| 22-08-2019 09:17 | zed | Product Version | => 190707 |
| 22-08-2019 09:17 | zed | Fixed in Version | => 191221 |
| 22-08-2019 09:17 | zed | Target Version | => 191221 |
| 22-08-2019 09:17 | zed | Summary | GetScript.txt: отправка через RequestHead строки закодированной в URLEncode() - ошибка. => Не удаётся отправить Cookie заданные в RequestHead в закодированном виде |
| 22-08-2019 09:18 | zed | Assigned To | => zed |
| 22-08-2019 09:18 | zed | Status | resolved => assigned |
| 22-08-2019 09:18 | zed | Status | assigned => resolved |
| 22-08-2019 17:26 | aflexus | Note Added: 0019295 | |
| 22-08-2019 17:26 | aflexus | Status | resolved => closed |
| 22-08-2019 17:52 | zed | Summary | Не удаётся отправить Cookie заданные в RequestHead в закодированном виде => Не удаётся отправить Cookie в закодированном виде |
| 22-08-2019 17:56 | vdemidov | Priority | high => normal |
| 22-08-2019 17:56 | vdemidov | Severity | major => minor |
| 22-08-2019 17:56 | vdemidov | Status | closed => resolved |
| 08-08-2025 13:22 | zed | Category | Баг => Баг / Bug |