bug-wget
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Bug-wget] Problem downloading with RIGHT SINGLE QUOTATION MARK (U+2019)


From: Cameron Tacklind
Subject: [Bug-wget] Problem downloading with RIGHT SINGLE QUOTATION MARK (U+2019) in filename
Date: Thu, 10 Oct 2019 20:31:02 -0700

Hello,

I think I've found a bug with wget.

I originally came across this problem when recursively downloading folders
that were presented by nginx's fancy-index module. Sometimes a filename
would include a "’" [RIGHT SINGLE QUOTATION MARK (U+2019)] and wget would
always get a 404 error when downloading the file.

Downloading this simple html file (simplified output of nginx fancy-index)
shows the error:
<!DOCTYPE html><html><head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>RIGHT SINGLE QUOTE TEST</title>
</head><body>
<a href="%E2%80%99">test</a>
</body></html>

Full command line (Windows cmd.exe)
wget -d --no-verbose --tries 0
 --continue --show-progress --wait 0.1 --waitretry 5
 -e robots=off --rejected-log=rejected.log --recursive --level inf --reject
"index.html*,jpg,png,zip"
 --no-parent --no-host-directories --auth-no-challenge --user xxx
--password xxx -P output_dir
https://mydomain.com/test/

Debug Output:
DEBUG output created by Wget 1.20.3 on mingw32.

Reading HSTS entries from C:\ProgramData\chocolatey\lib\Wget\tools/.wget-hsts
URI encoding = 'CP1252'
iconv UTF-8 -> CP1252
iconv outlen=60 inlen=30
converted 'https://mydomain.com/test/' (CP1252) -> '
https://mydomain.com/test/' (UTF-8)
URI encoding = 'CP1252'
Enqueuing https://mydomain.com/test/ at depth 0
Queue count 1, maxcount 1.
[IRI Enqueuing 'https://mydomain.com/test/' with 'CP1252'
Dequeuing https://mydomain.com/test/ at depth 0
Queue count 0, maxcount 1.
iconv UTF-8 -> CP1252
iconv outlen=60 inlen=30
converted 'https://mydomain.com/test/' (CP1252) -> '
https://mydomain.com/test/' (UTF-8)
Converted file name 'test/index.html' (UTF-8) -> 'test/index.html' (CP1252)
Auth-without-challenge set, sending Basic credentials.
seconds 0.00, Caching mydomain.com => my.ip.add.ress
seconds 0.00, Created socket 4.
Releasing 0x0000000000b3bf60 (new refcount 1).
Initiating SSL handshake.
seconds 900.00, Winsock error: 0
Handshake successful; connected socket 4 to SSL handle 0x0000000000b52260
certificate:
  subject: CN=mydomain.com
  issuer:  CN=Let's Encrypt Authority X3,O=Let's Encrypt,C=US
X509 certificate successfully verified and matches host mydomain.com

---request begin---
GET /test/ HTTP/1.1

User-Agent: Wget/1.20.3 (mingw32)

Accept: */*

Accept-Encoding: identity

Authorization: Basic ********

Host: mydomain.com

Connection: Keep-Alive



---request end---
seconds 900.00, Winsock error: 0

---response begin---
HTTP/1.1 200 OK

Server: nginx/1.14.1

Date: Fri, 11 Oct 2019 02:17:57 GMT

Content-Type: text/html

Content-Length: 185

Last-Modified: Fri, 11 Oct 2019 02:17:52 GMT

Connection: keep-alive

Keep-Alive: timeout=20

ETag: "5d9fe650-b9"

Accept-Ranges: bytes



---response end---
Registered socket 4 for persistent reuse.
seconds 900.00, Winsock error: 0

     0K                                                       100%  282K=0
.001s2019-10-10 19:17:01 URL:https://mydomain.com/test/ [185/185] ->
"E:/test/poops/test/index.html.tmp" [1]
Loaded E:/test/poops/test/index.html.tmp (size 185).
URI encoding = 'CP1252'
E:/test/poops/test/index.html.tmp: merge('https://mydomain.com/test/',
'%E2%80%99') -> https://mydomain.com/test/%E2%80%99
iconv UTF-8 -> CP1252
iconv outlen=66 inlen=33
converted 'https://mydomain.com/test/%E2%80%99' (CP1252) -> '
https://mydomain.com/test/’' (UTF-8)
appending 'https://mydomain.com/test/%C3%A2%E2%82%AC%E2%84%A2' to urlpos.
URI content encoding = 'utf-8'
no-follow in E:/test/poops/test/index.html.tmp: 0
Deciding whether to enqueue "
https://mydomain.com/test/%C3%A2%E2%82%AC%E2%84%A2";.
Decided to load it.
URI encoding = 'utf-8'
Enqueuing https://mydomain.com/test/%C3%A2%E2%82%AC%E2%84%A2 at depth 1
Queue count 1, maxcount 1.
[IRI Enqueuing 'https://mydomain.com/test/%C3%A2%E2%82%AC%E2%84%A2' with
'utf-8'
Removing file due to recursive rejection criteria in recursive_retrieve():
Dequeuing https://mydomain.com/test/%C3%A2%E2%82%AC%E2%84%A2 at depth 1
Queue count 0, maxcount 1.
Converted file name 'test/’' (UTF-8) -> 'test/’' (CP1252)
Auth-without-challenge set, sending Basic credentials.
Reusing fd 4.

---request begin---
GET /test/%C3%A2%E2%82%AC%E2%84%A2 HTTP/1.1

Referer: https://mydomain.com/test/

User-Agent: Wget/1.20.3 (mingw32)

Accept: */*

Accept-Encoding: identity

Authorization: Basic ********

Host: mydomain.com

Connection: Keep-Alive



---request end---
seconds 900.00, Winsock error: 0

---response begin---
HTTP/1.1 404 Not Found

Server: nginx/1.14.1

Date: Fri, 11 Oct 2019 02:17:58 GMT

Content-Type: text/html

Content-Length: 169

Connection: keep-alive

Keep-Alive: timeout=20



---response end---
Skipping 169 bytes of body: [seconds 900.00, Winsock error: 0
<html>

<head><title>404 Not Found</title></head>

<body bgcolor="white">

<center><h1>404 Not Found</h1></center>

<hr><center>nginx/1.14.1</center>

</body>

</html>

] done.
https://mydomain.com/test/%C3%A2%E2%82%AC%E2%84%A2:
2019-10-10 19:17:02 ERROR 404: Not Found.
FINISHED --2019-10-10 19:17:02--
Total wall clock time: 1.6s
Downloaded: 1 files, 185 in 0.001s (282 KB/s)

The error is pretty clearly an encoding conversion issue, going from UTF-8,
assumed to be CP1252, converting into UTF-8, which becomes wrong. This is
nicely described at the end of this page:
http://www.anchor.com.au/hosting/Character-sets-and-content-encoding-hell

What's not clear to me is if this is definitely a bug with wget or not
since there are a couple other systems involved (nginx, Windows). I'm
inclined however to think it is wget because I can download the file with
Chrome just fine.

I've also had trouble downloading the url with the single quote directly.
However that could be a problem with cmd.exe and how it encodes & passes
strings to wget. So maybe that would be a related bug?

Hope this is a real bug!

Cheers,
 - Cameron


reply via email to

[Prev in Thread] Current Thread [Next in Thread]