diff --git a/zh/GUIDELINES.md b/zh/GUIDELINES.md
new file mode 100644
index 000000000..4dcb68c29
--- /dev/null
+++ b/zh/GUIDELINES.md
@@ -0,0 +1,40 @@
+# Writing guidelines
+
+This is a collection of guidelines and rules we try to adhere to when writing
+and editing "Everything curl".
+
+## Capitalization of words in section names
+
+We do not use that practice, partially because our sections are not really
+"chapters", but also to create a more informal feel.
+
+## Avoid prepositions at the end of sentences
+
+This is not a hard rule, but we should strive to avoid it.
+
+## Avoid colloquial contractions like it'll, must've, might've, should've
+
+Spell them out as "it will" and "must have", etc.
+
+## - vs — (typographical em dash)
+
+And ... vs … (typographical ellipses)
+
+Let's try to use the correct UTF-8 characters!
+
+## Avoid the short forms of dir and repo
+
+They are instead called "directory" and "repository".
+
+## Internet with a capital I
+
+Still the proper name of the one we all know and love. The same goes for other
+proper names like Linux, Unix, Windows (the OS), and JavaScript.
+
+## Avoid using command-line options in titles or subtitles
+
+Use an English phrase instead. This is not a man page.
+
+## Use backticks around libcurl constants
+
+For example, `CURLE_OK` and `CURLOPT_URL`.
diff --git a/zh/LAYOUT.md b/zh/LAYOUT.md
new file mode 100644
index 000000000..e1ddea267
--- /dev/null
+++ b/zh/LAYOUT.md
@@ -0,0 +1,13 @@
+Everything curl
+===============
+
+ 1. Intro
+ 2. the cURL project
+ 3. curl and Open Source
+ 4. The curl source code
+ 5. Network protocols
+ 6. The curl command-line tool
+ 7. Using the curl tool
+ 8. Building and installing libcurl
+ 9. Using libcurl
+ 10. Bindings
diff --git a/zh/README.md b/zh/README.md
new file mode 100644
index 000000000..6e7de7883
--- /dev/null
+++ b/zh/README.md
@@ -0,0 +1,32 @@
+# 简介
+
+*Everything curl*是一篇全面介绍cURL的文档,对cURL库、cURL命令行工具、以及使用cURL的项目进行全方位的解读。我们将一起去探索如何在开发中高效的使用cURL,如何参与到cURL的开源维护当中,以及cURL的各种强大特性。
+
+对于开发者而言,这是一篇非常实用的文档,它能帮你在开发过程中做出一些正确的选择。但是我不建议大家对整个文档进行通篇阅读,可以对你自己感兴趣或者疑惑的部分进行反复阅读。
+
+同样,我也希望大家一起参与到这篇文档的维护当中。欢迎大家对这篇文档克隆,评论,pull request跟issue。这篇文档将会因为大家的建议而变得更加完善。
+
+我会持续完善并且维护这篇文档,文档将跟着cURL的更新而不断更新。
+
+# 官方文档站点
+
+**http://bookcurl.haxx.se** 文档主页,你可以很方便的进行在线阅读,或者使用电子阅读器,手机,pdf文件进行阅读。
+
+**https://ec.haxx.se** 文档在线版。
+
+**https://github.com/bagder/everything-curl** 文档英文版git地址。
+
+## 作者
+
+在这里请允许我做一个简短的自我介绍。我是丹尼尔·斯坦伯格,我希望大家可以与我一起维护这篇关于cURL的文档。作为一名开发者,当我第一次使用cURL时,我心中便洋溢着对它的喜爱,我在cURL中寻找乐趣!我居住在瑞士的斯德哥尔摩。
+
+如果想对我了解更多,欢迎访问我的[个人站点](https://daniel.haxx.se)。
+
+## 帮助!
+
+如果你发现了文档中存在着的遗漏或者错误,请将修改的段落发送给我,我将为其更新版本。我会真诚的对待每一个提供过帮助的人。我希望随着时间的推移,这篇文档会变的更加实用。
+
+最好是在文档的[github仓库](https://github.com/bagder/everything-curl/)中提出[issue](https://github.com/bagder/everything-curl/issues)或者[pull request](https://github.com/bagder/everything-curl/issues)。
+
+## 许可证
+这篇文档已委托 [Creative Commons Attribution 4.0 license](https://creativecommons.org/licenses/by/4.0/) 进行维权保护。未经丹尼尔本人同意,不得转载。
diff --git a/zh/SUMMARY.md b/zh/SUMMARY.md
new file mode 100644
index 000000000..4458b59ac
--- /dev/null
+++ b/zh/SUMMARY.md
@@ -0,0 +1,131 @@
+* [How to read this book](how.md)
+* [The cURL project](curl.md)
+ * [How it started](curl-started.md)
+ * [The name](curl-name.md)
+ * [What does curl do?](curl-does.md)
+ * [Project communication](curl-comm.md)
+ * [Mailing list etiquette](curl-etiquette.md)
+ * [Mailing lists](curl-maillists.md)
+ * [Reporting bugs](curl-bugs.md)
+ * [Releases](curl-releases.md)
+ * [Security](curl-security.md)
+ * [Trust](curl-trust.md)
+ * [The development team](curl-devteam.md)
+ * [Users of curl](curl-users.md)
+ * [Future](curl-future.md)
+* [Open Source](opensource.md)
+ * [License](opensource-license.md)
+ * [Copyright and Legal](opensource-copyright.md)
+ * [Code of Conduct](opensource-coc.md)
+ * [Development](opensource-devel.md)
+* [The source code](sourcecode.md)
+ * [Code layout](sourcecode-layout.md)
+ * [Handling build options](sourcecode-options.md)
+ * [Code style](sourcecode-style.md)
+ * [Contributing](sourcecode-contributing.md)
+ * [Reporting vulnerabilities](sourcecode-reportvuln.md)
+ * [Web site](sourcecode-web.md)
+* [Network and protocols](protocols.md)
+ * [Networking simplified](protocols-network.md)
+ * [Protocols](protocols-protocols.md)
+ * [curl protocols](protocols-curl.md)
+* [Command line basics](cmdline.md)
+ * [Command line options](cmdline-options.md)
+ * [Options depend on version](cmdline-versions.md)
+ * [URLs](cmdline-urls.md)
+ * [URL globbing](cmdline-globbing.md)
+ * [List options](cmdline-listopts.md)
+ * [Config file](cmdline-configfile.md)
+ * [Passwords](cmdline-passwords.md)
+ * [Progress meter](cmdline-progressmeter.md)
+* [Using curl](usingcurl.md)
+ * [Verbose](usingcurl-verbose.md)
+ * [Persistent connections](usingcurl-persist.md)
+ * [Downloads](usingcurl-downloads.md)
+ * [Uploads](usingcurl-uploads.md)
+ * [Connections](usingcurl-connections.md)
+ * [Timeouts](usingcurl-timeouts.md)
+ * [.netrc](usingcurl-netrc.md)
+ * [Proxies](usingcurl-proxies.md)
+ * [Exit status](usingcurl-returns.md)
+ * [FTP](usingcurl-ftp.md)
+ * [Two connections](ftp-twoconnections.md)
+ * [Directory traversing](ftp-traversedir.md)
+ * [Advanced FTP use](ftp-advanced.md)
+ * [SCP and SFTP](usingcurl-scpsftp.md)
+ * [IMAP and POP3](usingcurl-reademail.md)
+ * [SMTP](usingcurl-smtp.md)
+ * [TELNET](usingcurl-telnet.md)
+ * [TLS](usingcurl-tls.md)
+ * [Debug](usingcurl-debug.md)
+ * [Copy as curl](usingcurl-copyas.md)
+ * [curl examples](curlexamples.md)
+* [How to HTTP with curl](http.md)
+ * [Protocol basics](http-basics.md)
+ * [Responses](http-response.md)
+ * [Authentication](http-auth.md)
+ * [Ranges](http-ranges.md)
+ * [HTTP versions](http-versions.md)
+ * [HTTPS](http-https.md)
+ * [HTTP POST](http-post.md)
+ * [Multipart formposts](http-multipart.md)
+ * [-d vs -F](http-postvspost.md)
+ * [Redirects](http-redirects.md)
+ * [Modify the HTTP request](http-requests.md)
+ * [HTTP PUT](http-put.md)
+ * [Cookies](http-cookies.md)
+ * [HTTP/2](http-http2.md)
+ * [HTTP cheat sheet](http-cheatsheet.md)
+* [Building and installing](building.md)
+ * [Installing prebuilt binaries](building-binary.md)
+ * [Build from source](building-source.md)
+ * [Dependencies](building-deps.md)
+ * [TLS libraries](building-tls.md)
+ * [BoringSSL](building-boringssl.md)
+* [libcurl basics](libcurl.md)
+ * [Easy handle](libcurl-easyhandle.md)
+ * [Drive transfers](libcurl-drive.md)
+ * [Drive with easy](libcurl-drive-easy.md)
+ * [Drive with multi](libcurl-drive-multi.md)
+ * [Drive with multi_socket](libcurl-drive-multi-socket.md)
+ * [Connection reuse](libcurl-connectionreuse.md)
+ * [Callbacks](libcurl-callbacks.md)
+ * [Write data](callback-write.md)
+ * [Read data](callback-read.md)
+ * [Progress information](callback-progress.md)
+ * [Header data](callback-header.md)
+ * [Debug](callback-debug.md)
+ * [sockopt](callback-sockopt.md)
+ * [SSL context](callback-sslcontext.md)
+ * [Seek and ioctl](callback-seek.md)
+ * [Network data conversion](callback-conversions.md)
+ * [Opensocket and closesocket](callback-openclosesocket.md)
+ * [SSH key](callback-sshkey.md)
+ * [RTSP interleaved data](callback-rtsp.md)
+ * [FTP matching](callback-ftpmatch.md)
+ * [Cleanup](libcurl-cleanup.md)
+ * [Name resolving](libcurl-names.md)
+ * [Proxies](libcurl-proxies.md)
+ * [Post transfer info](libcurl-getinfo.md)
+ * [Share data between handles](libcurl-sharing.md)
+ * [API compatibility](libcurl-api.md)
+ * [--libcurl](libcurl--libcurl.md)
+ * [Header files](libcurl-headers.md)
+ * [Global initialization](libcurl-globalinit.md)
+ * [multi-threading](libcurl-threading.md)
+ * [curl easy options](libcurl-options.md)
+ * [CURLcode return codes](libcurl-curlcode.md)
+ * [Verbose operations](libcurl-verbose.md)
+ * [libcurl examples](libcurlexamples.md)
+ * [for C++ programmers](libcurl-cplusplus.md)
+* [HTTP with libcurl](libcurl-http.md)
+ * [HTTP responses](libcurl-http-responses.md)
+ * [HTTP requests](libcurl-http-requests.md)
+ * [HTTP versions](libcurl-http-versions.md)
+ * [HTTP ranges](libcurl-http-ranges.md)
+ * [Cookies with libcurl](libcurl-http-cookies.md)
+ * [Download](libcurl-http-download.md)
+ * [Upload](libcurl-http-upload.md)
+* [Bindings](bindings.md)
+* [libcurl internals](internals.md)
+* [Index](bookindex.md)
diff --git a/zh/bindings.md b/zh/bindings.md
new file mode 100644
index 000000000..51c9ceaeb
--- /dev/null
+++ b/zh/bindings.md
@@ -0,0 +1,56 @@
+# Bindings
+
+Creative people have written bindings or interfaces for various environments
+and programming languages. Using one of these allows you to take advantage of
+curl powers from within your favorite language or system. This is a list of
+all known interfaces as of this writing.
+
+The bindings listed below are not part of the curl/libcurl distribution
+archives, but must be downloaded and installed separately.
+
+| Language | Site | Author\(s\) |
+| :--- | :--- | :--- |
+| Script Basic | | Peter Verhas |
+| C++ | | Jean-Philippe, Barrette-LaPierre |
+| Ch/C++ | | Stephen Nestinger, Jonathan Rogado |
+| Cocoa \(BBHTTP\) | | Bruno de Carvalho |
+| Cocoa \(CURLHandle\) | | Dan Wood |
+| D | | Kenneth Bogert |
+| Delphi | | Mikhail Merkuryev |
+| Dylan | | Chris Double |
+| Eiffel | | Eiffel Software |
+| Falcon | | Falcon |
+| Gambas | | Gambas |
+| glib/GTK+ | | Richard Atterer |
+| Go | | ShuYu Wang |
+| Guile | | Michael L. Gran |
+| Harbour | | Viktor Szakáts |
+| Haskell | | Galois, Inc |
+| Java | | Paul Legato |
+| Julia | | JuliaWeb |
+| Lisp | | Liam Healy |
+| Lua (luacurl) | | Alexander Marinov |
+| Lua-cURL | | Jürgen Hötzel, Alexey Melnichuk |
+| .NET | | Masroor Ehsan Choudhury, Jeffrey Phillips |
+| NodeJS | | Jonathan Cardoso Machado |
+| OCaml | | Lars Nilsson |
+| Pascal/Delphi/Kylix | | Jeffrey Pohlmeyer. |
+| Perl | | Cris Bailiff and Bálint Szilakszi |
+| PHP | | Sterling Hughes |
+| PostgreSQL | | Paul Ramsey |
+| Python (PycURL) | | Kjetil Jacobsen |
+| R | | Jeroen Ooms, Hadley Wickham, RStudio |
+| Rexx | | Mark Hessling |
+| Ring | | Mahmoud Fayed |
+| Ruby (curb) | | Ross Bamford |
+| Ruby (ruby-curl-multi) | | Kristjan Petursson and Keith Rarick |
+| Rust (curl-rust) | | Carl Lerche |
+| Scheme Bigloo | | Kirill Lisovsky |
+| Scilab | | Sylvestre Ledru |
+| S-Lang | | John E Davis |
+| Smalltalk | | Danil Osipchuk |
+| SP-Forth | | ygrek |
+| Tcl | | Andrés García |
+| Visual Basic | | Jeffrey Phillips |
+| wxWidgets | | Casey O'Donnell |
+| Xojo | | Andrew Lambert |
diff --git a/zh/bookindex.md b/zh/bookindex.md
new file mode 100644
index 000000000..1c9fb2cd3
--- /dev/null
+++ b/zh/bookindex.md
@@ -0,0 +1,281 @@
+# Index
+
+## .
+ - .netrc: [Command line leakage](cmdline-passwords.md#command-line-leakage), [.netrc](usingcurl-netrc.md#netrc), [The .netrc file format](usingcurl-netrc.md#the-.netrc-file-format), [Enable netrc](usingcurl-netrc.md#enable-netrc)
+## /
+ - /etc/hosts: [Host name or address](cmdline-urls.md#host-name-or-address), [Edit the hosts file](usingcurl-connections.md#edit-the-hosts-file)
+## <
+ - : [include/curl](sourcecode-layout.md#include/curl), [curl --libcurl](libcurl--libcurl.md#curl---libcurl), [Header files](libcurl-headers.md#header-files), [Get a simple HTML page](libcurlexamples.md#get-a-simple-html-page), [Get a HTML page in memory](libcurlexamples.md#get-a-html-page-in-memory)
+## A
+ - --anyauth: [HTTP authentication](http-auth.md#http-authentication)
+ - apt: [apt](building-binary.md#apt)
+## B
+ - -b: [Cookie engine](http-cookies.md#cookie-engine), [Reading cookies from file](http-cookies.md#reading-cookies-from-file), [Writing cookies to file](http-cookies.md#writing-cookies-to-file), [New cookie session](http-cookies.md#new-cookie-session), [curl HTTP cheat sheet](http-cheatsheet.md#curl-http-cheat-sheet)
+ - --basic: [HTTP authentication](http-auth.md#http-authentication)
+ - BoringSSL: [Select TLS backend](building-source.md#select-tls-backend), [Build to use a TLS library](building-tls.md#build-to-use-a-tls-library), [OpenSSL, BoringSSL, libressl](building-tls.md#openssl,-boringssl,-libressl), [Build curl with boringssl](building-boringssl.md#build-curl-with-boringssl), [build boringssl](building-boringssl.md#build-boringssl), [set up the build tree to get detected by curl's configure](building-boringssl.md#set-up-the-build-tree-to-get-detected-by-curl's-configure), [configure curl](building-boringssl.md#configure-curl)
+## C
+ - -c: [Writing cookies to file](http-cookies.md#writing-cookies-to-file), [curl HTTP cheat sheet](http-cheatsheet.md#curl-http-cheat-sheet)
+ - c-ares: [Name resolve tricks with c-ares](usingcurl-connections.md#name-resolve-tricks-with-c-ares), [c-ares](building-deps.md#c-ares), [Name resolver backends](libcurl-names.md#name-resolver-backends), [Name server options](libcurl-names.md#name-server-options)
+ - C89: [Comments](sourcecode-style.md#comments), [Building and installing](building.md#building-and-installing)
+ - CA: [Verbose mode](usingcurl-verbose.md#verbose-mode), [MITM-proxies](usingcurl-proxies.md#mitm-proxies), [Available exit codes](usingcurl-returns.md#available-exit-codes), [Verifying server certificates](usingcurl-tls.md#verifying-server-certificates), [CA store](usingcurl-tls.md#ca-store), [CA store on windows](usingcurl-tls.md#ca-store-on-windows), [OCSP stapling](usingcurl-tls.md#ocsp-stapling)
+ - Chrome: [Copy as curl](usingcurl-copyas.md#copy-as-curl), [From Chrome](usingcurl-copyas.md#from-chrome), [From Safari](usingcurl-copyas.md#from-safari)
+ - clone: [Clone the code](sourcecode.md#clone-the-code), [git](sourcecode-contributing.md#git), [Pull request](sourcecode-contributing.md#pull-request), [Web site source code](sourcecode-web.md#web-site-source-code), [build boringssl](building-boringssl.md#build-boringssl)
+ - code of conduct: [Code of conduct](opensource-coc.md#code-of-conduct)
+ - --compressed: [Compression](usingcurl-downloads.md#compression), [Gzipped transfers](http-response.md#gzipped-transfers), [curl HTTP cheat sheet](http-cheatsheet.md#curl-http-cheat-sheet)
+ - configure: [root](sourcecode-layout.md#root), [include/curl](sourcecode-layout.md#include/curl), [Handling different build options](sourcecode-options.md#handling-different-build-options), [On Linux and Unix-like systems](building-source.md#on-linux-and-unix-like-systems), [Autotools](building-source.md#autotools), [cross-compiling](building-source.md#cross-compiling), [Select TLS backend](building-source.md#select-tls-backend), [configure](building-tls.md#configure), [OpenSSL, BoringSSL, libressl](building-tls.md#openssl,-boringssl,-libressl), [GnuTLS](building-tls.md#gnutls), [NSS](building-tls.md#nss), [WolfSSL](building-tls.md#wolfssl), [axTLS](building-tls.md#axtls), [mbedTLS](building-tls.md#mbedtls), [Secure Transport](building-tls.md#secure-transport), [Schannel](building-tls.md#schannel), [set up the build tree to get detected by curl's configure](building-boringssl.md#set-up-the-build-tree-to-get-detected-by-curl's-configure), [configure curl](building-boringssl.md#configure-curl)
+ - --connect-timeout: [Connection timeout](usingcurl-connections.md#connection-timeout), [Never spend more than this to connect](usingcurl-timeouts.md#never-spend-more-than-this-to-connect)
+ - --connect-to: [Provide a replacement name](usingcurl-connections.md#provide-a-replacement-name)
+ - connection cache: [Persistent connections](usingcurl-persist.md#persistent-connections), [Connection reuse](libcurl-connectionreuse.md#connection-reuse), [Sharing the "connection cache"](libcurl-connectionreuse.md#sharing-the-"connection-cache"), [Sharing between easy handles](libcurl-sharing.md#sharing-between-easy-handles)
+ - connection pool: [Connection reuse](cmdline-urls.md#connection-reuse), [Connection reuse](libcurl-connectionreuse.md#connection-reuse), [Multi API pool](libcurl-connectionreuse.md#multi-api-pool), [Sharing the "connection cache"](libcurl-connectionreuse.md#sharing-the-"connection-cache")
+ - Connection reuse: [Connection reuse](cmdline-urls.md#connection-reuse), [Connection reuse](libcurl-connectionreuse.md#connection-reuse)
+ - content-encoding: [Compression](usingcurl-downloads.md#compression), [Transfer encoding](http-response.md#transfer-encoding)
+ - contribute: [Code of conduct](opensource-coc.md#code-of-conduct), [Contributing](sourcecode-contributing.md#contributing), [Pull request](sourcecode-contributing.md#pull-request)
+ - Contributing: [docs](sourcecode-layout.md#docs), [Contributing](sourcecode-contributing.md#contributing)
+ - Cookie engine: [Cookie engine](http-cookies.md#cookie-engine), [Writing cookies to file](http-cookies.md#writing-cookies-to-file), [Cookie engine](libcurl-http-cookies.md#cookie-engine), [Enable cookie engine with reading](libcurl-http-cookies.md#enable-cookie-engine-with-reading), [Enable cookie engine with writing](libcurl-http-cookies.md#enable-cookie-engine-with-writing), [Setting custom cookies](libcurl-http-cookies.md#setting-custom-cookies)
+ - Cookies: [docs](sourcecode-layout.md#docs), [Server differences](usingcurl-downloads.md#server-differences), [Change the Host: header](usingcurl-connections.md#change-the-host:-header), [Not perfect](usingcurl-copyas.md#not-perfect), [Maintain state with cookies](curlexamples.md#maintain-state-with-cookies), [HTTP authentication](http-auth.md#http-authentication), [Cookies](http-cookies.md#cookies), [Cookie engine](http-cookies.md#cookie-engine), [Reading cookies from file](http-cookies.md#reading-cookies-from-file), [Writing cookies to file](http-cookies.md#writing-cookies-to-file), [New cookie session](http-cookies.md#new-cookie-session), [libpsl](building-deps.md#libpsl), [Simple by default, more on demand](libcurl.md#simple-by-default,-more-on-demand), [Available information](libcurl-getinfo.md#available-information), [Sharing between easy handles](libcurl-sharing.md#sharing-between-easy-handles), [What to share](libcurl-sharing.md#what-to-share), [Cookies with libcurl](libcurl-http-cookies.md#cookies-with-libcurl), [Cookie engine](libcurl-http-cookies.md#cookie-engine), [Enable cookie engine with reading](libcurl-http-cookies.md#enable-cookie-engine-with-reading), [Enable cookie engine with writing](libcurl-http-cookies.md#enable-cookie-engine-with-writing), [Setting custom cookies](libcurl-http-cookies.md#setting-custom-cookies), [Import export](libcurl-http-cookies.md#import-export), [Get all cookies from the cookie store](libcurl-http-cookies.md#get-all-cookies-from-the-cookie-store), [Cookie store commands](libcurl-http-cookies.md#cookie-store-commands)
+ - copyright: [License](opensource-license.md#license), [Copyright](opensource-copyright.md#copyright)
+ - curl-announce: [curl-announce](curl-maillists.md#curl-announce), [Vulnerability handling](sourcecode-reportvuln.md#vulnerability-handling)
+ - curl-library: [curl-users](curl-maillists.md#curl-users), [curl-library](curl-maillists.md#curl-library), [Make a patch for the mailing list](sourcecode-contributing.md#make-a-patch-for-the-mailing-list), [Vulnerability handling](sourcecode-reportvuln.md#vulnerability-handling)
+ - curl-users: [curl-users](curl-maillists.md#curl-users), [Vulnerability handling](sourcecode-reportvuln.md#vulnerability-handling)
+ - CURLE_ABORTED_BY_CALLBACK: [Progress callback](callback-progress.md#progress-callback)
+ - CURLMOPT_SOCKETFUNCTION: [socket_callback](libcurl-drive-multi-socket.md#socket_callback)
+ - CURLMOPT_TIMERFUNCTION: [timer_callback](libcurl-drive-multi-socket.md#timer_callback)
+ - CURLOPT_CLOSEOCKETFUNCTION: [Socket close callback](callback-openclosesocket.md#socket-close-callback)
+ - CURLOPT_COOKIE: [Setting custom cookies](libcurl-http-cookies.md#setting-custom-cookies)
+ - CURLOPT_COOKIEFILE: [Enable cookie engine with reading](libcurl-http-cookies.md#enable-cookie-engine-with-reading)
+ - CURLOPT_COOKIEJAR: [Enable cookie engine with writing](libcurl-http-cookies.md#enable-cookie-engine-with-writing)
+ - CURLOPT_COOKIELIST: [Add a cookie to the cookie store](libcurl-http-cookies.md#add-a-cookie-to-the-cookie-store), [Cookie store commands](libcurl-http-cookies.md#cookie-store-commands)
+ - CURLOPT_CUSTOMREQUEST: [Request method](libcurl-http-requests.md#request-method)
+ - CURLOPT_DEBUGDATA: [Debug callback](callback-debug.md#debug-callback), [Trace everything](libcurl-verbose.md#trace-everything)
+ - CURLOPT_DEBUGFUNCTION: [Debug callback](callback-debug.md#debug-callback), [Trace everything](libcurl-verbose.md#trace-everything)
+ - CURLOPT_DNS_CACHE_TIMEOUT: [Caching](libcurl-names.md#caching)
+ - CURLOPT_DNS_INTERFACE: [Name server options](libcurl-names.md#name-server-options)
+ - CURLOPT_DNS_LOCAL_IP4: [Name server options](libcurl-names.md#name-server-options)
+ - CURLOPT_DNS_LOCAL_IP6: [Name server options](libcurl-names.md#name-server-options)
+ - CURLOPT_DNS_SERVERS: [Name server options](libcurl-names.md#name-server-options)
+ - CURLOPT_DNS_USE_GLOBAL_CACHE: [Global DNS cache is bad](libcurl-names.md#global-dns-cache-is-bad)
+ - CURLOPT_ERRORBUFFER: [curl --libcurl](libcurl--libcurl.md#curl---libcurl), [CURLcode return code](libcurl-curlcode.md#curlcode-return-code)
+ - CURLOPT_FAILONERROR: [About HTTP response code "errors"](libcurl-http-responses.md#about-http-response-code-"errors")
+ - CURLOPT_HEADER: [Write callback](callback-write.md#write-callback), [Referrer](libcurl-http-requests.md#referrer), [Download headers too](libcurl-http-download.md#download-headers-too)
+ - CURLOPT_HEADERDATA: [Header callback](callback-header.md#header-callback), [curl --libcurl](libcurl--libcurl.md#curl---libcurl), [Download headers too](libcurl-http-download.md#download-headers-too)
+ - CURLOPT_HEADERFUNCTION: [Header callback](callback-header.md#header-callback), [curl --libcurl](libcurl--libcurl.md#curl---libcurl)
+ - CURLOPT_HTTPGET: [libcurl HTTP download](libcurl-http-download.md#libcurl-http-download)
+ - CURLOPT_HTTPHEADER: [Add a header](libcurl-http-requests.md#add-a-header), [Change a header](libcurl-http-requests.md#change-a-header), [Remove a header](libcurl-http-requests.md#remove-a-header), [Provide a header without contents](libcurl-http-requests.md#provide-a-header-without-contents)
+ - CURLOPT_HTTPPOST: [HTTP multipart formposts](libcurl-http-upload.md#http-multipart-formposts)
+ - CURLOPT_IPRESOLVE: [Name resolving](libcurl-names.md#name-resolving)
+ - CURLOPT_MAXFILE_LARGE: [Setting numerical options](libcurl-options.md#setting-numerical-options)
+ - CURLOPT_MAXREDIRS: [curl --libcurl](libcurl--libcurl.md#curl---libcurl)
+ - CURLOPT_NOBODY: [Request method](libcurl-http-requests.md#request-method)
+ - CURLOPT_NOPROGRESS: [Progress callback](callback-progress.md#progress-callback), [curl --libcurl](libcurl--libcurl.md#curl---libcurl)
+ - CURLOPT_OPENSOCKETDATA: [Provide a file descriptor](callback-openclosesocket.md#provide-a-file-descriptor)
+ - CURLOPT_OPENSOCKETFUNCTION: [Provide a file descriptor](callback-openclosesocket.md#provide-a-file-descriptor)
+ - CURLOPT_POST: [HTTP POST](libcurl-http-upload.md#http-post)
+ - CURLOPT_POSTFIELDS: [Request method](libcurl-http-requests.md#request-method), [Customize HTTP request headers](libcurl-http-requests.md#customize-http-request-headers), [HTTP POST](libcurl-http-upload.md#http-post)
+ - CURLOPT_POSTFIELDSIZE: [HTTP POST](libcurl-http-upload.md#http-post)
+ - CURLOPT_POSTREDIR: [Decide what method to use in redirects](http-redirects.md#decide-what-method-to-use-in-redirects)
+ - CURLOPT_PROGRESSFUNCTION: [Progress callback](callback-progress.md#progress-callback)
+ - CURLOPT_PROXY: [Proxy types](libcurl-proxies.md#proxy-types)
+ - CURLOPT_PROXYPORT: [Proxy types](libcurl-proxies.md#proxy-types)
+ - CURLOPT_PROXYTYPE: [Proxy types](libcurl-proxies.md#proxy-types)
+ - CURLOPT_READDATA: [Read callback](callback-read.md#read-callback), [curl --libcurl](libcurl--libcurl.md#curl---libcurl)
+ - CURLOPT_READFUNCTION: [Read callback](callback-read.md#read-callback), [curl --libcurl](libcurl--libcurl.md#curl---libcurl), [HTTP POST](libcurl-http-upload.md#http-post)
+ - CURLOPT_RESOLVE: [Custom addresses for hosts](libcurl-names.md#custom-addresses-for-hosts)
+ - CURLOPT_SEEKDATA: [curl --libcurl](libcurl--libcurl.md#curl---libcurl)
+ - CURLOPT_SEEKFUNCTION: [curl --libcurl](libcurl--libcurl.md#curl---libcurl)
+ - CURLOPT_SOCKOPTDATA: [sockopt callback](callback-sockopt.md#sockopt-callback)
+ - CURLOPT_SOCKOPTFUNCTION: [sockopt callback](callback-sockopt.md#sockopt-callback)
+ - CURLOPT_SSH_KNOWNHOSTS: [curl --libcurl](libcurl--libcurl.md#curl---libcurl)
+ - CURLOPT_STDERR: [curl --libcurl](libcurl--libcurl.md#curl---libcurl), [Verbose operations](libcurl-verbose.md#verbose-operations)
+ - CURLOPT_TCP_KEEPALIVE: [curl --libcurl](libcurl--libcurl.md#curl---libcurl)
+ - CURLOPT_TIMEOUT: [Setting numerical options](libcurl-options.md#setting-numerical-options)
+ - CURLOPT_UPLOAD: [Request method](libcurl-http-requests.md#request-method)
+ - CURLOPT_URL: [Easy handle](libcurl-easyhandle.md#easy-handle), [curl --libcurl](libcurl--libcurl.md#curl---libcurl), [Set handle options](libcurl-options.md#set-handle-options), [Get a simple HTML page](libcurlexamples.md#get-a-simple-html-page), [Get a HTML page in memory](libcurlexamples.md#get-a-html-page-in-memory), [Request method](libcurl-http-requests.md#request-method), [Automatic referrer](libcurl-http-requests.md#automatic-referrer), [libcurl HTTP download](libcurl-http-download.md#libcurl-http-download), [Download headers too](libcurl-http-download.md#download-headers-too)
+ - CURLOPT_USERAGENT: [curl --libcurl](libcurl--libcurl.md#curl---libcurl), [Get a HTML page in memory](libcurlexamples.md#get-a-html-page-in-memory)
+ - CURLOPT_VERBOSE: [Verbose operations](libcurl-verbose.md#verbose-operations), [Trace everything](libcurl-verbose.md#trace-everything), [Download headers too](libcurl-http-download.md#download-headers-too)
+ - CURLOPT_WRITEDATA: [Write callback](callback-write.md#write-callback), [curl --libcurl](libcurl--libcurl.md#curl---libcurl), [Get a HTML page in memory](libcurlexamples.md#get-a-html-page-in-memory)
+ - CURLOPT_WRITEFUNCTION: [Write callback](callback-write.md#write-callback), [curl --libcurl](libcurl--libcurl.md#curl---libcurl), [Get a HTML page in memory](libcurlexamples.md#get-a-html-page-in-memory)
+ - CURLOPT_XFERINFODATA: [Progress callback](callback-progress.md#progress-callback)
+ - CURLOPT_XFERINFOFUNCTION: [Progress callback](callback-progress.md#progress-callback)
+ - curl_easy_cleanup: [easy handle](libcurl-cleanup.md#easy-handle), [curl --libcurl](libcurl--libcurl.md#curl---libcurl), [Get a simple HTML page](libcurlexamples.md#get-a-simple-html-page), [Get a HTML page in memory](libcurlexamples.md#get-a-html-page-in-memory), [Enable cookie engine with writing](libcurl-http-cookies.md#enable-cookie-engine-with-writing)
+ - curl_easy_init: [Easy handle](libcurl-easyhandle.md#easy-handle), [curl --libcurl](libcurl--libcurl.md#curl---libcurl), [Get a simple HTML page](libcurlexamples.md#get-a-simple-html-page), [Get a HTML page in memory](libcurlexamples.md#get-a-html-page-in-memory), [libcurl HTTP download](libcurl-http-download.md#libcurl-http-download), [Download headers too](libcurl-http-download.md#download-headers-too)
+ - curl_easy_perform: [Driving with the easy interface](libcurl-drive-easy.md#driving-with-the-easy-interface), [Easy API pool](libcurl-connectionreuse.md#easy-api-pool), [Caching](libcurl-names.md#caching), [curl --libcurl](libcurl--libcurl.md#curl---libcurl), [Get a simple HTML page](libcurlexamples.md#get-a-simple-html-page), [Get a HTML page in memory](libcurlexamples.md#get-a-html-page-in-memory), [Add a header](libcurl-http-requests.md#add-a-header), [Change a header](libcurl-http-requests.md#change-a-header), [Remove a header](libcurl-http-requests.md#remove-a-header), [Provide a header without contents](libcurl-http-requests.md#provide-a-header-without-contents), [Referrer](libcurl-http-requests.md#referrer), [Automatic referrer](libcurl-http-requests.md#automatic-referrer), [libcurl HTTP download](libcurl-http-download.md#libcurl-http-download), [Download headers too](libcurl-http-download.md#download-headers-too)
+ - curl_easy_reset: [Easy handle](libcurl-easyhandle.md#easy-handle)
+ - curl_easy_setopt: [docs/libcurl/opts](sourcecode-layout.md#docs/libcurl/opts), [Easy handle](libcurl-easyhandle.md#easy-handle), [Write callback](callback-write.md#write-callback), [Read callback](callback-read.md#read-callback), [Progress callback](callback-progress.md#progress-callback), [Header callback](callback-header.md#header-callback), [Debug callback](callback-debug.md#debug-callback), [sockopt callback](callback-sockopt.md#sockopt-callback), [Provide a file descriptor](callback-openclosesocket.md#provide-a-file-descriptor), [Socket close callback](callback-openclosesocket.md#socket-close-callback), [Name resolving](libcurl-names.md#name-resolving), [Custom addresses for hosts](libcurl-names.md#custom-addresses-for-hosts), [Sharing between easy handles](libcurl-sharing.md#sharing-between-easy-handles), [curl --libcurl](libcurl--libcurl.md#curl---libcurl), [Set handle options](libcurl-options.md#set-handle-options), [Setting numerical options](libcurl-options.md#setting-numerical-options), [Get handle options](libcurl-options.md#get-handle-options), [CURLcode return code](libcurl-curlcode.md#curlcode-return-code), [Verbose operations](libcurl-verbose.md#verbose-operations), [Get a simple HTML page](libcurlexamples.md#get-a-simple-html-page), [Get a HTML page in memory](libcurlexamples.md#get-a-html-page-in-memory), [Request method](libcurl-http-requests.md#request-method), [Add a header](libcurl-http-requests.md#add-a-header), [Change a header](libcurl-http-requests.md#change-a-header), [Remove a header](libcurl-http-requests.md#remove-a-header), [Provide a header without contents](libcurl-http-requests.md#provide-a-header-without-contents), [Referrer](libcurl-http-requests.md#referrer), [Automatic referrer](libcurl-http-requests.md#automatic-referrer), [HTTP ranges](libcurl-http-ranges.md#http-ranges), [Enable cookie engine with reading](libcurl-http-cookies.md#enable-cookie-engine-with-reading), [Enable cookie engine with writing](libcurl-http-cookies.md#enable-cookie-engine-with-writing), [Setting custom cookies](libcurl-http-cookies.md#setting-custom-cookies), [Add a cookie to the cookie store](libcurl-http-cookies.md#add-a-cookie-to-the-cookie-store), [Cookie store commands](libcurl-http-cookies.md#cookie-store-commands), [libcurl HTTP download](libcurl-http-download.md#libcurl-http-download), [Download headers too](libcurl-http-download.md#download-headers-too), [HTTP POST](libcurl-http-upload.md#http-post), [HTTP multipart formposts](libcurl-http-upload.md#http-multipart-formposts)
+ - curl_global_cleanup: [Global initialization](libcurl-globalinit.md#global-initialization), [Get a HTML page in memory](libcurlexamples.md#get-a-html-page-in-memory)
+ - curl_global_init: [Global initialization](libcurl-globalinit.md#global-initialization), [Get a HTML page in memory](libcurlexamples.md#get-a-html-page-in-memory)
+ - CURL_IPRESOLVE_V6: [Name resolving](libcurl-names.md#name-resolving)
+ - CURL_MAX_WRITE_SIZE: [Write callback](callback-write.md#write-callback)
+ - curl_multi_add_handle: [Driving with the multi interface](libcurl-drive-multi.md#driving-with-the-multi-interface), [Many easy handles](libcurl-drive-multi-socket.md#many-easy-handles)
+ - curl_multi_cleanup: [Multi API](libcurl-cleanup.md#multi-api)
+ - curl_multi_fdset: [Driving with the multi interface](libcurl-drive-multi.md#driving-with-the-multi-interface)
+ - curl_multi_info_read: [When is a single transfer done?](libcurl-drive-multi.md#when-is-a-single-transfer-done?), [When is it done?](libcurl-drive-multi-socket.md#when-is-it-done?), [Multi API](libcurl-cleanup.md#multi-api)
+ - curl_multi_init: [Driving with the multi interface](libcurl-drive-multi.md#driving-with-the-multi-interface)
+ - curl_multi_remove_handle: [Driving with the multi interface](libcurl-drive-multi.md#driving-with-the-multi-interface), [Many easy handles](libcurl-drive-multi-socket.md#many-easy-handles), [Multi API](libcurl-cleanup.md#multi-api)
+ - curl_multi_setopt: [docs/libcurl/opts](sourcecode-layout.md#docs/libcurl/opts), [Driving with the multi interface](libcurl-drive-multi.md#driving-with-the-multi-interface), [socket_callback](libcurl-drive-multi-socket.md#socket_callback), [timer_callback](libcurl-drive-multi-socket.md#timer_callback)
+ - curl_multi_socket_action: [socket_callback](libcurl-drive-multi-socket.md#socket_callback), [timer_callback](libcurl-drive-multi-socket.md#timer_callback), [How to start everything](libcurl-drive-multi-socket.md#how-to-start-everything), [When is it done?](libcurl-drive-multi-socket.md#when-is-it-done?)
+ - curl_multi_timeout: [Driving with the multi interface](libcurl-drive-multi.md#driving-with-the-multi-interface)
+ - curl_multi_wait: [Driving with the multi interface](libcurl-drive-multi.md#driving-with-the-multi-interface)
+ - curl_off_t: [Progress callback](callback-progress.md#progress-callback), [Setting numerical options](libcurl-options.md#setting-numerical-options)
+ - CURL_SOCKET_TIMEOUT: [timer_callback](libcurl-drive-multi-socket.md#timer_callback), [How to start everything](libcurl-drive-multi-socket.md#how-to-start-everything)
+ - curl_version_info: [Which libcurl version runs](libcurl-api.md#which-libcurl-version-runs)
+## D
+ - -d: [Arguments to options](cmdline-options.md#arguments-to-options), [Arguments with spaces](cmdline-options.md#arguments-with-spaces), [Separate options per URL](cmdline-urls.md#separate-options-per-url), [POST](usingcurl-uploads.md#post), [HTTP methods](http.md#http-methods), [HTTP POST](http-post.md#http-post), [Content-Type](http-post.md#content-type), [POSTing binary](http-post.md#posting-binary), [Convert that to a GET](http-post.md#convert-that-to-a-get), [Expect 100-continue](http-post.md#expect-100-continue), [Chunked encoded POSTs](http-post.md#chunked-encoded-posts), [Hidden form fields](http-post.md#hidden-form-fields), [-d vs -F](http-postvspost.md#d-vs--f), [HTML web forms](http-postvspost.md#html-web-forms), [POST outside of HTML](http-postvspost.md#post-outside-of-html), [PUT](http-put.md#put), [curl HTTP cheat sheet](http-cheatsheet.md#curl-http-cheat-sheet)
+ - --data: [Arguments to options](cmdline-options.md#arguments-to-options), [Separate options per URL](cmdline-urls.md#separate-options-per-url), [POST](usingcurl-uploads.md#post), [HTTP POST](http-post.md#http-post), [URL encoding](http-post.md#url-encoding)
+ - --data-binary: [Not perfect](usingcurl-copyas.md#not-perfect), [POSTing binary](http-post.md#posting-binary), [URL encoding](http-post.md#url-encoding)
+ - --data-urlencode: [URL encoding](http-post.md#url-encoding)
+ - debian: [lib/vtls](sourcecode-layout.md#lib/vtls), [apt](building-binary.md#apt)
+ - Debug callback: [Debug callback](callback-debug.md#debug-callback), [Verbose operations](libcurl-verbose.md#verbose-operations)
+ - development: [Project communication](curl-comm.md#project-communication), [curl-users](curl-maillists.md#curl-users), [curl-library](curl-maillists.md#curl-library), [Reporting bugs](curl-bugs.md#reporting-bugs), [Problems must be known to get fixed](curl-bugs.md#problems-must-be-known-to-get-fixed), [The development team](curl-devteam.md#the-development-team), [Future](curl-future.md#future), [Development](opensource-devel.md#development), [Source code on github](opensource-devel.md#source-code-on-github), [Who decides what goes in?](sourcecode-contributing.md#who-decides-what-goes-in?), [SSL and TLS versions](usingcurl-tls.md#ssl-and-tls-versions), [From Safari](usingcurl-copyas.md#from-safari), [Figure out what a browser sends](http-post.md#figure-out-what-a-browser-sends), [apt](building-binary.md#apt), [yum](building-binary.md#yum), [Which libcurl version runs](libcurl-api.md#which-libcurl-version-runs)
+## E
+ - environment variables: [Default config file](cmdline-configfile.md#default-config-file), [Proxy environment variables](usingcurl-proxies.md#proxy-environment-variables)
+ - etiquette: [Mailing list etiquette](curl-etiquette.md#mailing-list-etiquette)
+ - event-driven: [Driving with the "multi_socket" interface](libcurl-drive-multi-socket.md#driving-with-the-"multi_socket"-interface)
+## F
+ - -F: [multipart formpost](usingcurl-uploads.md#multipart-formpost), [Not perfect](usingcurl-copyas.md#not-perfect), [HTTP methods](http.md#http-methods), [Sending such a form with curl](http-multipart.md#sending-such-a-form-with-curl), [Content-Type](http-multipart.md#content-type), [-d vs -F](http-postvspost.md#d-vs--f), [HTML web forms](http-postvspost.md#html-web-forms), [curl HTTP cheat sheet](http-cheatsheet.md#curl-http-cheat-sheet)
+ - Firefox: [lib/vtls](sourcecode-layout.md#lib/vtls), [Discover your proxy](usingcurl-proxies.md#discover-your-proxy), [Copy as curl](usingcurl-copyas.md#copy-as-curl), [From Firefox](usingcurl-copyas.md#from-firefox), [From Safari](usingcurl-copyas.md#from-safari), [On Firefox, without using the devtools](usingcurl-copyas.md#on-firefox,-without-using-the-devtools), [User-agent](http-requests.md#user-agent)
+ - Fragment: [Fragment](cmdline-urls.md#fragment), [Anchors or fragments](http-requests.md#anchors-or-fragments)
+ - --ftp-method: [multicwd](ftp-traversedir.md#multicwd), [nocwd](ftp-traversedir.md#nocwd), [singlecwd](ftp-traversedir.md#singlecwd)
+ - --ftp-pasv: [Passive connections](ftp-twoconnections.md#passive-connections)
+ - --ftp-port: [Available exit codes](usingcurl-returns.md#available-exit-codes), [Active connections](ftp-twoconnections.md#active-connections)
+ - --ftp-skip-pasv-ip: [Passive connections](ftp-twoconnections.md#passive-connections)
+ - future: [Project communication](curl-comm.md#project-communication), [Future](curl-future.md#future), [docs](sourcecode-layout.md#docs), [curl-security@haxx.se](sourcecode-reportvuln.md#curl-security@haxx.se), [What other protocols are there?](protocols-protocols.md#what-other-protocols-are-there?), [HTTPS to proxy](usingcurl-proxies.md#https-to-proxy), ["Not used"](usingcurl-returns.md#"not-used"), [Cookies](http-cookies.md#cookies), [Global DNS cache is bad](libcurl-names.md#global-dns-cache-is-bad), [API compatibility](libcurl-api.md#api-compatibility)
+## G
+ - --get: [Convert that to a GET](http-post.md#convert-that-to-a-get)
+ - git: [Daily snapshots](curl-releases.md#daily-snapshots), [Clone the code](sourcecode.md#clone-the-code), [root](sourcecode-layout.md#root), [include/curl](sourcecode-layout.md#include/curl), [scripts](sourcecode-layout.md#scripts), [git](sourcecode-contributing.md#git), [Pull request](sourcecode-contributing.md#pull-request), [Make a patch for the mailing list](sourcecode-contributing.md#make-a-patch-for-the-mailing-list), [git commit style](sourcecode-contributing.md#git-commit-style), [Who decides what goes in?](sourcecode-contributing.md#who-decides-what-goes-in?), [Web site source code](sourcecode-web.md#web-site-source-code), [Building the web](sourcecode-web.md#building-the-web), [git vs tarballs](building-source.md#git-vs-tarballs), [build boringssl](building-boringssl.md#build-boringssl)
+ - Globbing: [URL globbing](cmdline-globbing.md#url-globbing), [Output variables for globbing](cmdline-globbing.md#output-variables-for-globbing)
+ - GnuTLS: [OCSP stapling](usingcurl-tls.md#ocsp-stapling), [Build to use a TLS library](building-tls.md#build-to-use-a-tls-library), [GnuTLS](building-tls.md#gnutls), [Proxy types](libcurl-proxies.md#proxy-types)
+ - Gopher: [How it started](curl-started.md#how-it-started), [What protocols does curl support?](protocols-protocols.md#what-protocols-does-curl-support?), [GOPHER](protocols-curl.md#gopher), [Supported protocols](usingcurl.md#supported-protocols)
+## H
+ - --header: [Server differences](usingcurl-downloads.md#server-differences), [Customize headers](http-requests.md#customize-headers)
+ - Header callback: [Header callback](callback-header.md#header-callback), [HTTP responses](libcurl-http-responses.md#http-responses)
+ - homebrew: [homebrew](building-binary.md#homebrew)
+ - Host:: [Verbose mode](usingcurl-verbose.md#verbose-mode), [--trace and --trace-ascii](usingcurl-verbose.md#trace-and---trace-ascii), [--trace-time](usingcurl-verbose.md#trace-time), [Change the Host: header](usingcurl-connections.md#change-the-host:-header), [HTTP protocol basics](http-basics.md#http-protocol-basics), [The URL converted to a request](http-basics.md#the-url-converted-to-a-request), [The HTTP this generates](http-multipart.md#the-http-this-generates), [Customize headers](http-requests.md#customize-headers), [Customize HTTP request headers](libcurl-http-requests.md#customize-http-request-headers), [Change a header](libcurl-http-requests.md#change-a-header)
+ - HTTP ranges: [HTTP ranges](http-ranges.md#http-ranges), [HTTP ranges](libcurl-http-ranges.md#http-ranges)
+ - HTTP redirects: [Short options](cmdline-options.md#short-options), [Long options](cmdline-options.md#long-options), [Available exit codes](usingcurl-returns.md#available-exit-codes), [HTTP redirects](http-redirects.md#http-redirects), [Tell curl to follow redirects](http-redirects.md#tell-curl-to-follow-redirects), [Decide what method to use in redirects](http-redirects.md#decide-what-method-to-use-in-redirects), [Non-HTTP redirects](http-redirects.md#non-http-redirects)
+ - HTTP/1.1: [HTTP](protocols-curl.md#http), [Verbose mode](usingcurl-verbose.md#verbose-mode), [--trace and --trace-ascii](usingcurl-verbose.md#trace-and---trace-ascii), [--trace-time](usingcurl-verbose.md#trace-time), [HTTP/2](usingcurl-verbose.md#http/2), [HTTP protocol basics](http-basics.md#http-protocol-basics), [HTTP versions](http-versions.md#http-versions), [The HTTP this generates](http-multipart.md#the-http-this-generates), [GET or POST?](http-redirects.md#get-or-post?), [Request method](http-requests.md#request-method), [Customize HTTP request headers](libcurl-http-requests.md#customize-http-request-headers), [HTTP versions](libcurl-http-versions.md#http-versions)
+ - HTTP/2: [docs](sourcecode-layout.md#docs), [HTTP](protocols-curl.md#http), [HTTP/2](usingcurl-verbose.md#http/2), [Available exit codes](usingcurl-returns.md#available-exit-codes), [HTTP versions](http-versions.md#http-versions), [GET or POST?](http-redirects.md#get-or-post?), [nghttp2](building-deps.md#nghttp2), [HTTP versions](libcurl-http-versions.md#http-versions)
+ - HttpGet: [How it started](curl-started.md#how-it-started)
+## I
+ - IDN: [libidn2](building-deps.md#libidn2)
+ - Indentation: [Indentation](sourcecode-style.md#indentation), [Open brace on the same line](sourcecode-style.md#open-brace-on-the-same-line)
+ - IPv4: [Host name or address](cmdline-urls.md#host-name-or-address), [Port number](cmdline-urls.md#port-number), [Available --write-out variables](usingcurl-verbose.md#available---write-out-variables), [Name resolving](libcurl-names.md#name-resolving)
+ - IPv6: [Host name or address](cmdline-urls.md#host-name-or-address), [Port number](cmdline-urls.md#port-number), [URL globbing](cmdline-globbing.md#url-globbing), [Available --write-out variables](usingcurl-verbose.md#available---write-out-variables), [Name resolving](libcurl-names.md#name-resolving)
+## J
+ - JavaScript: [Client differences](usingcurl-downloads.md#client-differences), [PAC](usingcurl-proxies.md#pac), [JavaScript and forms](http-post.md#javascript-and-forms), [JavaScript redirects](http-redirects.md#javascript-redirects)
+ - json: [Arguments with spaces](cmdline-options.md#arguments-with-spaces), [Content-Type](http-post.md#content-type), [POST outside of HTML](http-postvspost.md#post-outside-of-html)
+## K
+ - -K: [Command lines, quotes and aliases](cmdline.md#command-lines,-quotes-and-aliases), [Config file](cmdline-configfile.md#config-file)
+ - keep-alive: [Keep connections alive](usingcurl-timeouts.md#keep-connections-alive)
+ - --keepalive-time: [Keep alive](usingcurl-connections.md#keep-alive), [Keep connections alive](usingcurl-timeouts.md#keep-connections-alive)
+## L
+ - -L: [Available --write-out variables](usingcurl-verbose.md#available---write-out-variables), [Tell curl to follow redirects](http-redirects.md#tell-curl-to-follow-redirects), [Request method](http-requests.md#request-method), [Cookie engine](http-cookies.md#cookie-engine), [Reading cookies from file](http-cookies.md#reading-cookies-from-file), [curl HTTP cheat sheet](http-cheatsheet.md#curl-http-cheat-sheet)
+ - --libcurl: [curl --libcurl](libcurl--libcurl.md#curl---libcurl)
+ - libcurl version: [Available exit codes](usingcurl-returns.md#available-exit-codes), [The latest version?](building.md#the-latest-version?), [Which libcurl version](libcurl-api.md#which-libcurl-version), [Which libcurl version runs](libcurl-api.md#which-libcurl-version-runs)
+ - libidn2: [libidn2](building-deps.md#libidn2)
+ - libmetalink: [libmetalink](building-deps.md#libmetalink)
+ - libpsl: [libpsl](building-deps.md#libpsl)
+ - libressl: [Select TLS backend](building-source.md#select-tls-backend), [Build to use a TLS library](building-tls.md#build-to-use-a-tls-library), [OpenSSL, BoringSSL, libressl](building-tls.md#openssl,-boringssl,-libressl)
+ - librtmp: [librtmp](building-deps.md#librtmp)
+ - libssh2: [libssh2](building-deps.md#libssh2)
+ - license: [Finding users](curl-users.md#finding-users), [Famous users](curl-users.md#famous-users), [License](opensource-license.md#license), [root](sourcecode-layout.md#root)
+ - --limit-rate: [Rate limiting](usingcurl-downloads.md#rate-limiting)
+ - --location: [Long options](cmdline-options.md#long-options), [Separate options per URL](cmdline-urls.md#separate-options-per-url), [Config file](cmdline-configfile.md#config-file), [Tell curl to follow redirects](http-redirects.md#tell-curl-to-follow-redirects)
+## M
+ - --max-filesize: [Maximum filesize](usingcurl-downloads.md#maximum-filesize)
+ - --max-time: [Retrying failed attempts](usingcurl-downloads.md#retrying-failed-attempts), [Maximum time allowed to spend](usingcurl-timeouts.md#maximum-time-allowed-to-spend)
+ - Metalink: [Metalink](usingcurl-downloads.md#metalink)
+ - --metalink: [Metalink](usingcurl-downloads.md#metalink)
+ - MIT: [License](opensource-license.md#license)
+ - MITM-proxies: [MITM-proxies](usingcurl-proxies.md#mitm-proxies)
+ - multi-threading: [libcurl multi-threading](libcurl-threading.md#libcurl-multi-threading)
+## N
+ - name resolving: [Handling different build options](sourcecode-options.md#handling-different-build-options), [Host name resolving](protocols-network.md#host-name-resolving), [Available --write-out variables](usingcurl-verbose.md#available---write-out-variables), [Name resolve tricks with c-ares](usingcurl-connections.md#name-resolve-tricks-with-c-ares), [SOCKS types](usingcurl-proxies.md#socks-types), [Connection reuse](libcurl-connectionreuse.md#connection-reuse), [Name resolving](libcurl-names.md#name-resolving), [Name resolver backends](libcurl-names.md#name-resolver-backends), [Name server options](libcurl-names.md#name-server-options), [Proxy types](libcurl-proxies.md#proxy-types), [Available information](libcurl-getinfo.md#available-information), [Name resolving](internals.md#name-resolving)
+ - --negotiate: [Network leakage](cmdline-passwords.md#network-leakage), [HTTP authentication](http-auth.md#http-authentication)
+ - --netrc-file: [Enable netrc](usingcurl-netrc.md#enable-netrc)
+ - --netrc-optional: [Enable netrc](usingcurl-netrc.md#enable-netrc)
+ - nghttp2: [nghttp2](building-deps.md#nghttp2)
+ - nix: [nix](building-binary.md#nix)
+ - --no-eprt: [Active connections](ftp-twoconnections.md#active-connections)
+ - --no-epsv: [Passive connections](ftp-twoconnections.md#passive-connections)
+ - NSS: [OCSP stapling](usingcurl-tls.md#ocsp-stapling), [yum](building-binary.md#yum), [Build to use a TLS library](building-tls.md#build-to-use-a-tls-library), [NSS](building-tls.md#nss), [Proxy types](libcurl-proxies.md#proxy-types)
+ - --ntlm: [Network leakage](cmdline-passwords.md#network-leakage), [HTTP authentication](http-auth.md#http-authentication)
+## O
+ - -O: [Many options and URLs](cmdline-urls.md#many-options-and-urls), [Numerical ranges](cmdline-globbing.md#numerical-ranges), [Alphabetical ranges](cmdline-globbing.md#alphabetical-ranges), [A list](cmdline-globbing.md#a-list), [Combinations](cmdline-globbing.md#combinations), [Output variables for globbing](cmdline-globbing.md#output-variables-for-globbing), [Download to a file named by the URL](usingcurl-downloads.md#download-to-a-file-named-by-the-url), [Get the target file name from the server](usingcurl-downloads.md#get-the-target-file-name-from-the-server), [Shell redirects](usingcurl-downloads.md#shell-redirects), [Multiple downloads](usingcurl-downloads.md#multiple-downloads), [Use the URL's file name part for all URLs](usingcurl-downloads.md#use-the-url's-file-name-part-for-all-urls), [Resuming and ranges](usingcurl-downloads.md#resuming-and-ranges), [curl HTTP cheat sheet](http-cheatsheet.md#curl-http-cheat-sheet)
+ - openldap: [openldap](building-deps.md#openldap)
+ - OpenSSL: [lib/vtls](sourcecode-layout.md#lib/vtls), [OCSP stapling](usingcurl-tls.md#ocsp-stapling), [Select TLS backend](building-source.md#select-tls-backend), [Build to use a TLS library](building-tls.md#build-to-use-a-tls-library), [configure](building-tls.md#configure), [OpenSSL, BoringSSL, libressl](building-tls.md#openssl,-boringssl,-libressl), [Proxy types](libcurl-proxies.md#proxy-types), [Available information](libcurl-getinfo.md#available-information)
+## P
+ - PAC: [PAC](usingcurl-proxies.md#pac)
+ - Percent-encoding: [URL encoding](http-post.md#url-encoding)
+ - pop3: [What protocols does curl support?](protocols-protocols.md#what-protocols-does-curl-support?), [POP3](protocols-curl.md#pop3), [POP3S](protocols-curl.md#pop3s), [Without scheme](cmdline-urls.md#without-scheme), [Supported protocols](usingcurl.md#supported-protocols), [Verbose mode](usingcurl-verbose.md#verbose-mode), [Available exit codes](usingcurl-returns.md#available-exit-codes), [Reading email](usingcurl-reademail.md#reading-email), [POP3](usingcurl-reademail.md#pop3), [Secure mail transfer](usingcurl-smtp.md#secure-mail-transfer), [Enable TLS](usingcurl-tls.md#enable-tls)
+ - port number: [Connects to "port numbers"](protocols-network.md#connects-to-"port-numbers"), [Port number](cmdline-urls.md#port-number), [Available --write-out variables](usingcurl-verbose.md#available---write-out-variables), [Provide a replacement name](usingcurl-connections.md#provide-a-replacement-name), [Local port number](usingcurl-connections.md#local-port-number), [HTTP](usingcurl-proxies.md#http), [HTTP proxy tunneling](usingcurl-proxies.md#http-proxy-tunneling), [Available exit codes](usingcurl-returns.md#available-exit-codes), [The URL converted to a request](http-basics.md#the-url-converted-to-a-request), [Connection reuse](libcurl-connectionreuse.md#connection-reuse), [Custom addresses for hosts](libcurl-names.md#custom-addresses-for-hosts), [Proxies](libcurl-proxies.md#proxies), [Proxy types](libcurl-proxies.md#proxy-types), [Post transfer info](libcurl-getinfo.md#post-transfer-info)
+ - --post301: [Decide what method to use in redirects](http-redirects.md#decide-what-method-to-use-in-redirects)
+ - --post302: [Decide what method to use in redirects](http-redirects.md#decide-what-method-to-use-in-redirects)
+ - --post303: [Decide what method to use in redirects](http-redirects.md#decide-what-method-to-use-in-redirects)
+ - Progress callback: [timer_callback](libcurl-drive-multi-socket.md#timer_callback), [Progress callback](callback-progress.md#progress-callback)
+ - pronunciation: [Pronunciation](curl-name.md#pronunciation)
+ - --proxy: [HTTP](usingcurl-proxies.md#http), [HTTP authentication](http-auth.md#http-authentication)
+ - proxy: [How it started](curl-started.md#how-it-started), [Available --write-out variables](usingcurl-verbose.md#available---write-out-variables), [Intermediaries' fiddlings](usingcurl-downloads.md#intermediaries'-fiddlings), [Proxies](usingcurl-proxies.md#proxies), [Discover your proxy](usingcurl-proxies.md#discover-your-proxy), [PAC](usingcurl-proxies.md#pac), [Proxy type](usingcurl-proxies.md#proxy-type), [HTTP](usingcurl-proxies.md#http), [HTTPS and proxy](usingcurl-proxies.md#https-and-proxy), [MITM-proxies](usingcurl-proxies.md#mitm-proxies), [Non-HTTP protocols over an HTTP proxy](usingcurl-proxies.md#non-http-protocols-over-an-http-proxy), [HTTP proxy tunneling](usingcurl-proxies.md#http-proxy-tunneling), [SOCKS types](usingcurl-proxies.md#socks-types), [Proxy authentication](usingcurl-proxies.md#proxy-authentication), [HTTPS to proxy](usingcurl-proxies.md#https-to-proxy), [Proxy environment variables](usingcurl-proxies.md#proxy-environment-variables), [Proxy headers](usingcurl-proxies.md#proxy-headers), [Available exit codes](usingcurl-returns.md#available-exit-codes), [CONNECT response codes](http-response.md#connect-response-codes), [Pass on transfer encoding](http-response.md#pass-on-transfer-encoding), [HTTP authentication](http-auth.md#http-authentication), [Proxies](libcurl-proxies.md#proxies), [Proxy types](libcurl-proxies.md#proxy-types), [Local or proxy name lookup](libcurl-proxies.md#local-or-proxy-name-lookup), [HTTP proxy](libcurl-proxies.md#http-proxy), [HTTPS proxy](libcurl-proxies.md#https-proxy), [Proxy authentication](libcurl-proxies.md#proxy-authentication), [Available information](libcurl-getinfo.md#available-information), [HTTP proxy](libcurl-http.md#http-proxy)
+ - --proxy-user: [Proxy authentication](usingcurl-proxies.md#proxy-authentication), [HTTP authentication](http-auth.md#http-authentication)
+ - --proxy1.0: [HTTP proxy tunneling](usingcurl-proxies.md#http-proxy-tunneling)
+ - --proxytunnel: [HTTP proxy tunneling](usingcurl-proxies.md#http-proxy-tunneling)
+## R
+ - ranges: [Numerical ranges](cmdline-globbing.md#numerical-ranges), [Alphabetical ranges](cmdline-globbing.md#alphabetical-ranges), [Combinations](cmdline-globbing.md#combinations), [Resuming and ranges](usingcurl-downloads.md#resuming-and-ranges), [HTTP ranges](http-ranges.md#http-ranges), [Provide a file descriptor](callback-openclosesocket.md#provide-a-file-descriptor), [HTTP response code](libcurl-http-responses.md#http-response-code), [About HTTP response code "errors"](libcurl-http-responses.md#about-http-response-code-"errors"), [HTTP ranges](libcurl-http-ranges.md#http-ranges)
+ - Read callback: [Read callback](callback-read.md#read-callback), [HTTP POST](libcurl-http-upload.md#http-post)
+ - redhat: [lib/vtls](sourcecode-layout.md#lib/vtls), [yum](building-binary.md#yum)
+ - redirects: [Long options](cmdline-options.md#long-options), [Separate options per URL](cmdline-urls.md#separate-options-per-url), [Config file](cmdline-configfile.md#config-file), [Available --write-out variables](usingcurl-verbose.md#available---write-out-variables), [Download to a file named by the URL](usingcurl-downloads.md#download-to-a-file-named-by-the-url), [Shell redirects](usingcurl-downloads.md#shell-redirects), [Provide a custom IP address for a name](usingcurl-connections.md#provide-a-custom-ip-address-for-a-name), [Provide a replacement name](usingcurl-connections.md#provide-a-replacement-name), [Available exit codes](usingcurl-returns.md#available-exit-codes), [Follow redirects automatically](curlexamples.md#follow-redirects-automatically), [HTTP redirects](http-redirects.md#http-redirects), [Permanent and temporary](http-redirects.md#permanent-and-temporary), [Tell curl to follow redirects](http-redirects.md#tell-curl-to-follow-redirects), [GET or POST?](http-redirects.md#get-or-post?), [Decide what method to use in redirects](http-redirects.md#decide-what-method-to-use-in-redirects), [Non-HTTP redirects](http-redirects.md#non-http-redirects), [HTML redirects](http-redirects.md#html-redirects), [JavaScript redirects](http-redirects.md#javascript-redirects), [Request method](http-requests.md#request-method), [Custom addresses for hosts](libcurl-names.md#custom-addresses-for-hosts), [Available information](libcurl-getinfo.md#available-information), [Automatic referrer](libcurl-http-requests.md#automatic-referrer)
+ - RELEASE-NOTES: [scripts](sourcecode-layout.md#scripts)
+ - releases: [1. [The cURL project](curl.md)](how.md#1.-[the-curl-project](curl.md)), [curl-announce](curl-maillists.md#curl-announce), [Releases](curl-releases.md#releases), [scripts](sourcecode-layout.md#scripts), [Verbose mode](usingcurl-verbose.md#verbose-mode), [Which libcurl version](libcurl-api.md#which-libcurl-version)
+ - --remote-name-all: [Use the URL's file name part for all URLs](usingcurl-downloads.md#use-the-url's-file-name-part-for-all-urls)
+ - repository: [Releases](curl-releases.md#releases), [Daily snapshots](curl-releases.md#daily-snapshots), [Source code on github](opensource-devel.md#source-code-on-github), [Hosting and download](sourcecode.md#hosting-and-download), [root](sourcecode-layout.md#root), [include/curl](sourcecode-layout.md#include/curl), [scripts](sourcecode-layout.md#scripts), [What to add](sourcecode-contributing.md#what-to-add), [Pull request](sourcecode-contributing.md#pull-request), [Who decides what goes in?](sourcecode-contributing.md#who-decides-what-goes-in?), [Web site source code](sourcecode-web.md#web-site-source-code), [Building the web](sourcecode-web.md#building-the-web), [Installing from your package repository](building-binary.md#installing-from-your-package-repository), [git vs tarballs](building-source.md#git-vs-tarballs)
+ - --resolve: [Provide a custom IP address for a name](usingcurl-connections.md#provide-a-custom-ip-address-for-a-name), [Provide a replacement name](usingcurl-connections.md#provide-a-replacement-name)
+ - RTMP: [What protocols does curl support?](protocols-protocols.md#what-protocols-does-curl-support?), [RTMP](protocols-curl.md#rtmp), [Supported protocols](usingcurl.md#supported-protocols), [librtmp](building-deps.md#librtmp)
+ - RTSP: [What protocols does curl support?](protocols-protocols.md#what-protocols-does-curl-support?), [RTSP](protocols-curl.md#rtsp), [Supported protocols](usingcurl.md#supported-protocols), [RTSP interleave callback](callback-rtsp.md#rtsp-interleave-callback), [Available information](libcurl-getinfo.md#available-information)
+## S
+ - Safari: [Copy as curl](usingcurl-copyas.md#copy-as-curl), [From Safari](usingcurl-copyas.md#from-safari)
+ - Schannel: [CA store on windows](usingcurl-tls.md#ca-store-on-windows), [Build to use a TLS library](building-tls.md#build-to-use-a-tls-library), [Schannel](building-tls.md#schannel)
+ - Scheme: [Connects to "port numbers"](protocols-network.md#connects-to-"port-numbers"), [FILE](protocols-curl.md#file), [Scheme](cmdline-urls.md#scheme), [The scheme separator](cmdline-urls.md#the-scheme-separator), [Without scheme](cmdline-urls.md#without-scheme), [Name and password](cmdline-urls.md#name-and-password), [Proxy type](usingcurl-proxies.md#proxy-type), [SOCKS types](usingcurl-proxies.md#socks-types), [Proxy authentication](usingcurl-proxies.md#proxy-authentication), [Available exit codes](usingcurl-returns.md#available-exit-codes), [librtmp](building-deps.md#librtmp), [Proxy types](libcurl-proxies.md#proxy-types), [Available information](libcurl-getinfo.md#available-information), [Which libcurl version](libcurl-api.md#which-libcurl-version), [Bindings](bindings.md#bindings)
+ - SCP: [What protocols does curl support?](protocols-protocols.md#what-protocols-does-curl-support?), [SCP](protocols-curl.md#scp), [Supported protocols](usingcurl.md#supported-protocols), [Protocols allowing upload](usingcurl-uploads.md#protocols-allowing-upload), [Available exit codes](usingcurl-returns.md#available-exit-codes), [SCP and SFTP](usingcurl-scpsftp.md#scp-and-sftp), [URLs](usingcurl-scpsftp.md#urls), [Known hosts](usingcurl-scpsftp.md#known-hosts), [libssh2](building-deps.md#libssh2)
+ - security: [curl-announce](curl-maillists.md#curl-announce), [Security](curl-security.md#security), [Past security problems](curl-security.md#past-security-problems), [Trust](curl-trust.md#trust), [docs](sourcecode-layout.md#docs), [Reporting vulnerabilities](sourcecode-reportvuln.md#reporting-vulnerabilities), [Vulnerability handling](sourcecode-reportvuln.md#vulnerability-handling), [TLS](protocols-network.md#tls), [How much do protocols change?](protocols-protocols.md#how-much-do-protocols-change?), [FTPS](protocols-curl.md#ftps), [TLS](usingcurl-tls.md#tls), [Ciphers](usingcurl-tls.md#ciphers), [Enable TLS](usingcurl-tls.md#enable-tls), [How to HTTP with curl](http.md#how-to-http-with-curl)
+ - SFTP: [What protocols does curl support?](protocols-protocols.md#what-protocols-does-curl-support?), [About adhering to standards and who's right](protocols-protocols.md#about-adhering-to-standards-and-who's-right), [SFTP](protocols-curl.md#sftp), [Supported protocols](usingcurl.md#supported-protocols), [--trace and --trace-ascii](usingcurl-verbose.md#trace-and---trace-ascii), [Protocols allowing upload](usingcurl-uploads.md#protocols-allowing-upload), [Available exit codes](usingcurl-returns.md#available-exit-codes), [SCP and SFTP](usingcurl-scpsftp.md#scp-and-sftp), [URLs](usingcurl-scpsftp.md#urls), [Known hosts](usingcurl-scpsftp.md#known-hosts), [libssh2](building-deps.md#libssh2)
+ - --show-error: [Silence](usingcurl-verbose.md#silence)
+ - --silent: [The progress meter](cmdline-progressmeter.md#the-progress-meter), [Silence](usingcurl-verbose.md#silence), [Error message](usingcurl-returns.md#error-message)
+ - SMTP: [What protocols does curl support?](protocols-protocols.md#what-protocols-does-curl-support?), [SMTP](protocols-curl.md#smtp), [SMTPS](protocols-curl.md#smtps), [Without scheme](cmdline-urls.md#without-scheme), [Supported protocols](usingcurl.md#supported-protocols), [Verbose mode](usingcurl-verbose.md#verbose-mode), [Protocols allowing upload](usingcurl-uploads.md#protocols-allowing-upload), [SMTP uploads](usingcurl-uploads.md#smtp-uploads), [Available exit codes](usingcurl-returns.md#available-exit-codes), [SMTP](usingcurl-smtp.md#smtp), [Secure mail transfer](usingcurl-smtp.md#secure-mail-transfer), [The SMTP URL](usingcurl-smtp.md#the-smtp-url), [Enable TLS](usingcurl-tls.md#enable-tls)
+ - SMTPS: [What protocols does curl support?](protocols-protocols.md#what-protocols-does-curl-support?), [SMTPS](protocols-curl.md#smtps), [Supported protocols](usingcurl.md#supported-protocols), [Protocols allowing upload](usingcurl-uploads.md#protocols-allowing-upload), [Enable TLS](usingcurl-tls.md#enable-tls), [Build to use a TLS library](building-tls.md#build-to-use-a-tls-library)
+ - snapshots: [Daily snapshots](curl-releases.md#daily-snapshots), [root](sourcecode-layout.md#root)
+ - SNI: [Change the Host: header](usingcurl-connections.md#change-the-host:-header), [Provide a custom IP address for a name](usingcurl-connections.md#provide-a-custom-ip-address-for-a-name)
+ - --socks4: [SOCKS types](usingcurl-proxies.md#socks-types)
+ - --socks4a: [SOCKS types](usingcurl-proxies.md#socks-types)
+ - --socks5: [SOCKS types](usingcurl-proxies.md#socks-types)
+ - --socks5-hostname: [SOCKS types](usingcurl-proxies.md#socks-types)
+ - --speed-limit: [Transfer speeds slower than this means exit](usingcurl-timeouts.md#transfer-speeds-slower-than-this-means-exit)
+ - --speed-time: [Transfer speeds slower than this means exit](usingcurl-timeouts.md#transfer-speeds-slower-than-this-means-exit)
+ - SSH: [SCP](protocols-curl.md#scp), [SFTP](protocols-curl.md#sftp), [Available exit codes](usingcurl-returns.md#available-exit-codes), [SCP and SFTP](usingcurl-scpsftp.md#scp-and-sftp), [Known hosts](usingcurl-scpsftp.md#known-hosts), [SSH key callback](callback-sshkey.md#ssh-key-callback), [Trace everything](libcurl-verbose.md#trace-everything)
+ - SSL context callback: [SSL context callback](callback-sslcontext.md#ssl-context-callback)
+## T
+ - -T: [PUT](usingcurl-uploads.md#put), [FTP uploads](usingcurl-uploads.md#ftp-uploads), [SMTP uploads](usingcurl-uploads.md#smtp-uploads), [Uploading with FTP](ftp-advanced.md#uploading-with-ftp), [HTTP methods](http.md#http-methods), [PUT](http-put.md#put), [curl HTTP cheat sheet](http-cheatsheet.md#curl-http-cheat-sheet)
+ - TELNET: [What protocols does curl support?](protocols-protocols.md#what-protocols-does-curl-support?), [TELNET](protocols-curl.md#telnet), [Supported protocols](usingcurl.md#supported-protocols), [Available exit codes](usingcurl-returns.md#available-exit-codes), [TELNET](usingcurl-telnet.md#telnet)
+ - testing: [What does curl do?](curl-does.md#what-does-curl-do?), [Reporting bugs](curl-bugs.md#reporting-bugs), [Testing](curl-bugs.md#testing), [Handling different build options](sourcecode-options.md#handling-different-build-options), [Contributing](sourcecode-contributing.md#contributing), [About HTTP response code "errors"](libcurl-http-responses.md#about-http-response-code-"errors")
+ - TLS: [lib/vtls](sourcecode-layout.md#lib/vtls), [docs](sourcecode-layout.md#docs), [Handling different build options](sourcecode-options.md#handling-different-build-options), [TLS](protocols-network.md#tls), [Transfer data](protocols-network.md#transfer-data), [How much do protocols change?](protocols-protocols.md#how-much-do-protocols-change?), [Connection reuse](cmdline-urls.md#connection-reuse), [Verbose mode](usingcurl-verbose.md#verbose-mode), [Change the Host: header](usingcurl-connections.md#change-the-host:-header), [MITM-proxies](usingcurl-proxies.md#mitm-proxies), [Available exit codes](usingcurl-returns.md#available-exit-codes), [SCP and SFTP](usingcurl-scpsftp.md#scp-and-sftp), [Known hosts](usingcurl-scpsftp.md#known-hosts), [TLS](usingcurl-tls.md#tls), [Ciphers](usingcurl-tls.md#ciphers), [Enable TLS](usingcurl-tls.md#enable-tls), [SSL and TLS versions](usingcurl-tls.md#ssl-and-tls-versions), [Verifying server certificates](usingcurl-tls.md#verifying-server-certificates), [CA store](usingcurl-tls.md#ca-store), [CA store on windows](usingcurl-tls.md#ca-store-on-windows), [Certificate pinning](usingcurl-tls.md#certificate-pinning), [OCSP stapling](usingcurl-tls.md#ocsp-stapling), [Client certificates](usingcurl-tls.md#client-certificates), [TLS auth](usingcurl-tls.md#tls-auth), [Different TLS backends](usingcurl-tls.md#different-tls-backends), [Multiple TLS backends](usingcurl-tls.md#multiple-tls-backends), [How to HTTP with curl](http.md#how-to-http-with-curl), [The URL converted to a request](http-basics.md#the-url-converted-to-a-request), [HTTPS](http-https.md#https), [Figure out what a browser sends](http-post.md#figure-out-what-a-browser-sends), [apt](building-binary.md#apt), [yum](building-binary.md#yum), [Select TLS backend](building-source.md#select-tls-backend), [TLS libraries](building-deps.md#tls-libraries), [Build to use a TLS library](building-tls.md#build-to-use-a-tls-library), [Proxy types](libcurl-proxies.md#proxy-types), [Available information](libcurl-getinfo.md#available-information), [Trace everything](libcurl-verbose.md#trace-everything)
+ - TODO: [Suggestions](sourcecode-contributing.md#suggestions)
+ - --tr-encoding: [Compression](usingcurl-downloads.md#compression), [Transfer encoding](http-response.md#transfer-encoding)
+ - --trace: [--trace and --trace-ascii](usingcurl-verbose.md#trace-and---trace-ascii), [--trace-time](usingcurl-verbose.md#trace-time)
+ - --trace-ascii: [--trace and --trace-ascii](usingcurl-verbose.md#trace-and---trace-ascii), [--trace-time](usingcurl-verbose.md#trace-time), [Server differences](usingcurl-downloads.md#server-differences), [curl HTTP cheat sheet](http-cheatsheet.md#curl-http-cheat-sheet)
+ - --trace-time: [--trace-time](usingcurl-verbose.md#trace-time)
+ - transfer-encoding: [Pass on transfer encoding](http-response.md#pass-on-transfer-encoding), [Chunked encoded POSTs](http-post.md#chunked-encoded-posts)
+## U
+ - -U: [Proxy authentication](usingcurl-proxies.md#proxy-authentication)
+ - -u: [Passwords and snooping](cmdline-passwords.md#passwords-and-snooping), [Command line leakage](cmdline-passwords.md#command-line-leakage), [Authentication](usingcurl-ftp.md#authentication), [URLs](usingcurl-scpsftp.md#urls), [HTTP authentication](http-auth.md#http-authentication), [curl HTTP cheat sheet](http-cheatsheet.md#curl-http-cheat-sheet)
+ - URL Globbing: [URL globbing](cmdline-globbing.md#url-globbing)
+## V
+ - --verbose: [Long options](cmdline-options.md#long-options), [Verbose mode](usingcurl-verbose.md#verbose-mode), [--trace-time](usingcurl-verbose.md#trace-time)
+ - Vulnerability: [Vulnerability handling](sourcecode-reportvuln.md#vulnerability-handling)
+## W
+ - Write callback: [Write callback](callback-write.md#write-callback), [Get a HTML page in memory](libcurlexamples.md#get-a-html-page-in-memory), [HTTP responses](libcurl-http-responses.md#http-responses)
+ - --write-out: [--write-out](usingcurl-verbose.md#write-out), [Available --write-out variables](usingcurl-verbose.md#available---write-out-variables), [HTTP response codes](http-response.md#http-response-codes), [CONNECT response codes](http-response.md#connect-response-codes)
+## X
+ - -X: [Request method](http-requests.md#request-method), [Request target](http-requests.md#request-target), [PUT](http-put.md#put), [curl HTTP cheat sheet](http-cheatsheet.md#curl-http-cheat-sheet)
+ - -x: [HTTP](usingcurl-proxies.md#http), [HTTPS and proxy](usingcurl-proxies.md#https-and-proxy), [Non-HTTP protocols over an HTTP proxy](usingcurl-proxies.md#non-http-protocols-over-an-http-proxy), [HTTP proxy tunneling](usingcurl-proxies.md#http-proxy-tunneling), [SOCKS types](usingcurl-proxies.md#socks-types), [Proxy authentication](usingcurl-proxies.md#proxy-authentication), [Proxy environment variables](usingcurl-proxies.md#proxy-environment-variables), [curl HTTP cheat sheet](http-cheatsheet.md#curl-http-cheat-sheet)
+## Y
+ - yum: [yum](building-binary.md#yum)
+## Z
+ - zlib: [zlib](building-deps.md#zlib)
diff --git a/zh/building-binary.md b/zh/building-binary.md
new file mode 100644
index 000000000..5f5972d6f
--- /dev/null
+++ b/zh/building-binary.md
@@ -0,0 +1,84 @@
+## Installing prebuilt binaries
+
+There are many friendly people and organizations who put together binary
+packages of curl and libcurl and make them available for download.
+
+Many operating systems offer a "package repository" that is populated with
+software packages for you to install. From the [curl download
+page](https://curl.haxx.se/download.html) you can also follow links to plain
+binary packages for popular operating systems.
+
+## Installing from your package repository
+
+curl and libcurl have been around for a very long time and most Linux
+distributions, BSD versions and other *nix versions have package repositories
+that allow you to install curl packages.
+
+The most common ones are described below.
+
+### apt
+
+`apt` is a tool to install prebuilt packages on Debian Linux and Ubuntu Linux
+distributions and derivatives.
+
+To install the curl command-line tool, you usually just
+
+ apt install curl
+
+…and that then makes sure the dependencies are installed and usually
+libcurl is then also installed as an individual package.
+
+If you want to build applications against libcurl, you need a development
+package installed to get the include headers and some additional
+documentation, etc. You can then select a libcurl with the TLS backend you
+prefer:
+
+ apt install libcurl4-openssl-dev
+
+or
+
+ apt install libcurl4-nss-dev
+
+or
+
+ apt install libcurl4-gnutls-dev
+
+### yum
+
+With Redhat Linux and CentOS Linux derivatives, you use `yum` to install
+packages. Install the command-line tool with:
+
+ yum install curl
+
+You install the libcurl development package (with include files and some docs,
+etc.) with this:
+
+ yum install curl-devel
+
+(The Redhat family of Linux systems usually ship curl built to use NSS as TLS
+backend.)
+
+
+### nix
+
+[Nix](https://nixos.org/nix/) is a package manager default to the NixOS distribution, but it can also be used on any Linux distribution.
+
+In order to install command-line tool:
+
+ nix-env -i curl
+
+### homebrew
+
+[Homebrew](https://brew.sh/) is an OSX package manager. It does not come by default, but one can install it easily.
+
+To install the command-line tool:
+
+ brew install curl
+
+### cygwin
+
+TBD
+
+## Binary packages for Windows
+
+TBD
diff --git a/zh/building-boringssl.md b/zh/building-boringssl.md
new file mode 100644
index 000000000..988dda65a
--- /dev/null
+++ b/zh/building-boringssl.md
@@ -0,0 +1,43 @@
+# Build curl with boringssl
+
+## build boringssl
+
+$HOME/src is where I put the code in this example. You can pick wherever you
+like.
+
+ $ cd $HOME/src
+ $ git clone https://boringssl.googlesource.com/boringssl
+ $ cd boringssl
+ $ mkdir build
+ $ cd build
+ $ cmake ..
+ $ make
+
+## set up the build tree to get detected by curl's configure
+
+In the boringssl source tree root, make sure there's a `lib` and an `include`
+dir. The `lib` dir should contain the two libs (I made them symlinks into the
+build dir). The `include` dir is already present by default. Make and populate
+`lib` like this (commands issued in the source tree root, not in the `build/`
+subdirectory).
+
+
+ $ mkdir lib
+ $ cd lib
+ $ ln -s ../build/ssl/libssl.a
+ $ ln -s ../build/crypoto/libcrypto.a
+
+
+## configure curl
+
+`LIBS=-lpthread ./configure --with-ssl=$HOME/src/boringssl` (where I point out
+the root of the boringssl tree)
+
+Verify that at the end of the configuration, it says it detected
+BoringSSL to be used.
+
+## build curl
+
+Run `make` in the curl source tree.
+
+Now you can install curl normally with `make install` etc.
diff --git a/zh/building-deps.md b/zh/building-deps.md
new file mode 100644
index 000000000..a3bd405c1
--- /dev/null
+++ b/zh/building-deps.md
@@ -0,0 +1,82 @@
+# Dependencies
+
+A key to making good software is to build on top of other great software. By
+using libraries that many others use, we reinvent the same things fewer
+times and we get more reliable software as there are more people using the
+same code.
+
+A whole slew of features that curl provides require that it is built to use
+one or more external libraries. They are then dependencies of curl. None of
+them are *required*, but most users will want to use at least some of them.
+
+## zlib
+
+http://zlib.net/
+
+curl can do automatic decompression of data transferred over HTTP if built with
+zlib. Getting compressed data over the wire will use less bandwidth.
+
+## c-ares
+
+https://c-ares.haxx.se/
+
+curl can be built with c-ares to be able to do asynchronous name resolution.
+Another option to enable asynchronous name resolution is to build curl with the
+threaded name resolver backend, which will then instead create a separate
+helper thread for each name resolve. c-ares does it all within the
+same thread.
+
+## libssh2
+
+https://libssh2.org/
+
+When curl is built with libssh2, it enables support for the SCP and SFTP
+protocols.
+
+## nghttp2
+
+https://nghttp2.org/
+
+This is a library for handling HTTP/2 framing and is a prerequisite for curl
+to support HTTP version 2.
+
+## openldap
+
+https://www.openldap.org/
+
+This library is one option to allow curl to get support for the LDAP and LDAPS
+URL schemes. On Windows, you can also opt to build curl to use the winssl library.
+
+## librtmp
+
+https://rtmpdump.mplayerhq.hu/
+
+To enable curl's support for the RTMP URL scheme, you must build curl with the
+librtmp library that comes from the RTMPDump project.
+
+## libmetalink
+
+https://launchpad.net/libmetalink
+
+Build curl with libmetalink to have it support the
+[metalink](http://www.metalinker.org/) format, which allows curl to download
+the same file from multiple places. It includes checksums and more. See curl's
+[--metalink](https://curl.haxx.se/docs/manpage.html#--metalink) option.
+
+## libpsl
+
+https://rockdaboot.github.io/libpsl/
+
+When you build curl with support for libpsl, the cookie parser will know about
+the Public Suffix List and thus handle such cookies appropriately.
+
+## libidn2
+
+https://www.gnu.org/software/libidn/libidn2/manual/libidn2.html
+
+curl handles International Domain Names (IDN) with the help of the libidn2 library.
+
+## TLS libraries
+
+There are many different TLS libraries to choose from, so they are covered in
+a [separate section](building-tls.md).
diff --git a/zh/building-source.md b/zh/building-source.md
new file mode 100644
index 000000000..f874a98b6
--- /dev/null
+++ b/zh/building-source.md
@@ -0,0 +1,136 @@
+# Build from source
+
+The curl project creates source code that can be built to produce the two
+products curl and libcurl. The conversion from source code to binaries
+is often referred to as "building". You build curl and libcurl from source.
+
+The curl project doesn't provide any built binaries at all, it only ships the
+source code. The binaries which can be found on the download page of the curl
+web and installed from other places on the Internet are all built and provided
+to the world by other friendly people and organizations.
+
+The source code consists of a large number of files containing C
+code. Generally speaking, the same set of files are used to build binaries for
+all platforms and computer architectures that curl supports. curl can be built
+and run on a vast number of different platforms. If you use a rare operating
+system yourself, chances are that building curl from source is the
+easiest or perhaps the only way to get curl.
+
+Making it easy to build curl is a priority to the curl project, although we
+don't always necessarily succeed!
+
+## git vs tarballs
+
+When release tarballs are created, a few files are generated and included in
+the final release file. Those generated files are not present in the git
+repository, because they are generated and there is no need to
+store them in git.
+
+So, if you want to build curl from git you need to generate some of those
+files yourself before you can build. On Linux and Unix systems, do this by
+running `./buildconf` and on Windows you run `buildconf.bat`.
+
+## On Linux and Unix-like systems
+
+There are two distinctly different ways to build curl on Linux and other
+Unix-like systems. There's the one using the configure script and there's the
+CMake approach.
+
+There are two different build environments to cater for people's different
+opinions and tastes. The configure based build is arguably the more mature and
+more complete build system and should probably be considered the default one.
+
+### Autotools
+
+The "Autotools" is a collection of different tools that used together generate
+the `configure` script. The configure script is run by the user
+who wants to build curl and it does a whole bunch of things:
+
+ - it checks for features and functions present in your system
+
+ - it offers command-line options so that you as a builder can decide what to
+ enable and disable in the build. Features and protocols, etc., can be toggled
+ on/off. Or even compiler warning levels and more.
+
+ - it offers command-line options to let the builder point to specific
+ installation paths for various third-party dependencies that curl can be
+ built to use.
+
+ - specifies on which file path the generated installation should be placed when
+ ultimately the build is made and "make install" is invoked
+
+In the most basic usage, just running `./configure` in the source directory is
+enough. When the script completes, it outputs a summary of what options it has
+detected/enabled and what features that are still disabled, some of them
+possibly because it failed to detect the presence of necessary third-party
+dependencies that are needed for those functions to work.
+
+Then you invoke `make` to build the entire thing and `make
+install` to install curl, libcurl and associated things. `make install`
+requires that you have the correct rights in your system to create and write
+files in the installation directory or you will get some errors.
+
+### cross-compiling
+
+Cross-compiling means that you build the source on one architecture but the
+output is created to be run on a different one. For example, you could build
+the source on a Linux machine but have the output work to run on a Windows
+machine.
+
+For cross-compiling to work, you need a dedicated compiler and build system
+setup for the particular target system for which you want to build. How to get
+and install that system is not covered in this book.
+
+Once you have a cross compiler, you can instruct configure to use that
+compiler instead of the "native" compiler when it builds curl so that the end
+result then can be moved over and used on the other machine.
+
+### CMake
+
+TBD
+
+### static linking
+
+TBD
+
+## On Windows
+
+TBD
+
+### make
+
+TBD
+
+### CMake
+
+TBD
+
+### other compilers
+
+TBD
+
+## On other systems
+
+TBD
+
+## Porting curl to non-supported systems
+
+TBD
+
+## Select TLS backend
+
+The configure based build offers the user to select from a wide variety of
+different TLS libraries when building. You select them by using the correct
+command line options.
+
+The default OpenSSL configure check will also detect and use BoringSSL or
+libressl.
+
+ - GnuTLS: `--without-ssl --with-gnutls`.
+ - Cyassl: `--without-ssl --with-cyassl`
+ - NSS: `--without-ssl --with-nss`
+ - PolarSSL: `--without-ssl --with-polarssl`
+ - mbedTLS: `--without-ssl --with-mbedtls`
+ - axTLS: `--without-ssl --with-axtls`
+ - schannel: `--without-ssl --with-winssl`
+ - secure transport: `--with-winssl --with-darwinssl`
diff --git a/zh/building-tls.md b/zh/building-tls.md
new file mode 100644
index 000000000..3fd6f9cfd
--- /dev/null
+++ b/zh/building-tls.md
@@ -0,0 +1,114 @@
+# Build to use a TLS library
+
+To make curl support TLS based protocols, such as HTTPS, FTPS, SMTPS, POP3S,
+IMAPS and more, you need to build with a third-party TLS library since curl
+doesn't implement the TLS protocol itself.
+
+curl is written to work with a large number of TLS libraries:
+
+ - BoringSSL
+ - GSKit (OS/400 specific)
+ - GnuTLS
+ - NSS
+ - OpenSSL
+ - Secure Transport (native macOS)
+ - WolfSSL
+ - axTLS
+ - libressl
+ - mbedTLS
+ - Schannel (native Windows)
+
+When you build curl and libcurl to use one of these libraries, it is important
+that you have the library and its include headers installed on your build
+machine.
+
+## configure
+
+Below, you will learn how to tell configure to use the different
+libraries. Note that for all libraries except OpenSSL and its siblings, you
+must *disable* the check for OpenSSL by using `--without-ssl`.
+
+### OpenSSL, BoringSSL, libressl
+
+ ./configure
+
+configure will detect OpenSSL in its default path by default. You can
+optionally point configure to a custom install path prefix where it can find
+openssl:
+
+ ./configure --with-ssl=/home/user/installed/openssl
+
+The alternatives [BoringSSL](building-boringssl.md) and libressl look similar
+enough that configure will detect them the same way as OpenSSL but it will use
+some additional measures to find out which of the particular flavors it is
+using.
+
+### GnuTLS
+
+ ./configure --with-gnutls --without-ssl
+
+configure will detect GnuTLS in its default path by default. You can
+optionally point configure to a custom install path prefix where it can find
+gnutls:
+
+ ./configure --with-gnutls=/home/user/installed/gnutls --without-ssl
+
+### NSS
+
+ ./configure --with-nss --without-ssl
+
+configure will detect NSS in its default path by default. You can optionally
+point configure to a custom install path prefix where it can find nss:
+
+ ./configure --with-nss=/home/user/installed/nss --without-ssl
+
+### WolfSSL
+
+ ./configure --with-cyassl --without-ssl
+
+(cyassl was the former name of the library) configure will detect WolfSSL in
+its default path by default. You can optionally point configure to a custom
+install path prefix where it can find WolfSSL:
+
+ ./configure --with-cyassl=/home/user/installed/nss --without-ssl
+
+### axTLS
+
+ ./configure --with-axtls --without-ssl
+
+configure will detect axTLS in its default path by default. You can optionally
+point configure to a custom install path prefix where it can find axTLS:
+
+ ./configure --with-axtls=/home/user/installed/axtls --without-ssl
+
+### mbedTLS
+
+ ./configure --with-mbedtls --without-ssl
+
+configure will detect mbedTLS in its default path by default. You can
+optionally point configure to a custom install path prefix where it can find
+mbedTLS:
+
+ ./configure --with-mbedtls=/home/user/installed/mbedtls --without-ssl
+
+### Secure Transport
+
+ ./configure --with-darwinssl --without-ssl
+
+(DarwinSSL is an alternative name for Secure Transport)
+configure will detect Secure Transport in its default path by default. You can
+optionally point configure to a custom install path prefix where it can find
+DarwinSSL:
+
+ ./configure --with-darwinssl=/home/user/installed/darwinssl --without-ssl
+
+### Schannel
+
+ ./configure --with-winssl --without-ssl
+
+(WinSSL is an alternative name for Schannel)
+configure will detect Schannel in its default path by default. You can
+optionally point configure to a custom install path prefix where it can find
+WinSSL:
+
+ ./configure --with-winssl=/home/user/installed/winssl --without-ssl
diff --git a/zh/building.md b/zh/building.md
new file mode 100644
index 000000000..a0345d240
--- /dev/null
+++ b/zh/building.md
@@ -0,0 +1,37 @@
+# Building and installing
+
+The source code for this project is written in a way that allows it to get
+compiled and built on just about any operating system and platform, with as
+few restraints and requirements as possible.
+
+If you have a 32bit (or larger) CPU architecture, if you have a C89 compliant
+compiler and if you have roughly a POSIX supporting sockets API, then you can
+most likely build curl and libcurl for your target system.
+
+For the most popular platforms, the curl project comes with build systems
+already done and prepared to allow you to easily build it yourself.
+
+There are also friendly people and organizations who put together binary
+packages of curl and libcurl and make them available for download. The
+different options will be explored below.
+
+## The latest version?
+
+Looking at the curl web site at https://curl.haxx.se you can see the latest
+curl and libcurl version released from the project. That's the latest source
+code package you can get.
+
+When you opt for a prebuilt and prepackaged version for your operating system
+or distribution of choice, you may not always find the latest version but you
+might have to either be satisfied with the latest version someone has packaged
+for your environment, or you need to build it yourself from source.
+
+The curl project also provides info about the latest version in a somewhat
+more machine-readable format on this URL: `https://curl.haxx.se/info`.
+
+## off git!
+
+Of course, when building from source you can also always opt to build the very
+latest version that exist in the [git
+repository](https://github.com/curl/curl). It could however be a bit more
+fragile and probably requires slightly more attention to detail.
diff --git a/zh/callback-conversions.md b/zh/callback-conversions.md
new file mode 100644
index 000000000..315610ae4
--- /dev/null
+++ b/zh/callback-conversions.md
@@ -0,0 +1,8 @@
+### Convert to and from network callbacks
+
+TBD
+
+### Convert from UTF-8 callback
+
+TBD
+
diff --git a/zh/callback-debug.md b/zh/callback-debug.md
new file mode 100644
index 000000000..463e365ca
--- /dev/null
+++ b/zh/callback-debug.md
@@ -0,0 +1,31 @@
+### Debug callback
+
+The debug callback is set with `CURLOPT_DEBUGFUNCTION`:
+
+ curl_easy_setopt(handle, CURLOPT_DEBUGFUNCTION, debug_callback);
+
+The `debug_callback` function must match this prototype:
+
+ int debug_callback(CURL *handle,
+ curl_infotype type,
+ char *data,
+ size_t size,
+ void *userdata);
+
+This callback function replaces the default verbose output function in the
+library and will get called for all debug and trace messages to aid
+applications to understand what's going on. The *type* argument explains what
+sort of data that is provided: header, data or SSL data and in which direction
+it flows.
+
+A common use for this callback is to get a full trace of all data that libcurl
+sends and receives. The data sent to this callback is always the unencrypted
+version, even when, for example, HTTPS or other encrypted protocols are used.
+
+This callback must return zero or cause the transfer to stop with an error
+code.
+
+The user pointer passed in to the callback in the *userdata* argument is set
+with `CURLOPT_DEBUGDATA`:
+
+ curl_easy_setopt(handle, CURLOPT_DEBUGDATA, custom_pointer);
diff --git a/zh/callback-ftpmatch.md b/zh/callback-ftpmatch.md
new file mode 100644
index 000000000..d8bc7d664
--- /dev/null
+++ b/zh/callback-ftpmatch.md
@@ -0,0 +1,7 @@
+### FTP chunk callbacks
+
+TBD
+
+### FTP matching callback
+
+TBD
diff --git a/zh/callback-header.md b/zh/callback-header.md
new file mode 100644
index 000000000..427f699a9
--- /dev/null
+++ b/zh/callback-header.md
@@ -0,0 +1,28 @@
+### Header callback
+
+The header callback is set with `CURLOPT_HEADERFUNCTION`:
+
+ curl_easy_setopt(handle, CURLOPT_HEADERFUNCTION, header_callback);
+
+The `header_callback` function must match this prototype:
+
+ size_t header_callback(char *ptr, size_t size, size_t nmemb, void *userdata);
+
+This callback function gets called by libcurl as soon as a header has been
+received. *ptr* points to the delivered data, and the size of that data is
+*size* multiplied with *nmemb*. libcurl buffers headers and delivers only
+"full" headers, one by one, to this callback.
+
+The data passed to this function will not be zero terminated! You cannot, for
+example, use printf's "%s" operator to display the contents nor strcpy to copy
+it.
+
+This callback should return the number of bytes actually taken care of. If
+that number differs from the number passed to your callback function, it
+signals an error condition to the library. This will cause the transfer to
+abort and the libcurl function used will return `CURLE_WRITE_ERROR`.
+
+The user pointer passed in to the callback in the *userdata* argument is set
+with `CURLOPT_HEADERDATA`:
+
+ curl_easy_setopt(handle, CURLOPT_HEADERDATA, custom_pointer);
diff --git a/zh/callback-openclosesocket.md b/zh/callback-openclosesocket.md
new file mode 100644
index 000000000..558cbf1f8
--- /dev/null
+++ b/zh/callback-openclosesocket.md
@@ -0,0 +1,69 @@
+# Opensocket and closesocket callbacks
+
+Occasionally you end up in a situation where you want your application to
+control with more precision exactly what socket libcurl will use for its
+operations. libcurl offers this pair of callbacks that replaces libcurl's own
+call to `socket()` and the subsequent `close()` of the same file descriptor.
+
+## Provide a file descriptor
+
+By setting the `CURLOPT_OPENSOCKETFUNCTION` callback, you can provide a custom
+function to return a file descriptor for libcurl to use:
+
+ curl_easy_setopt(handle, CURLOPT_OPENSOCKETFUNCTION, opensocket_callback);
+
+The `opensocket_callback` function must match this prototype:
+
+ curl_socket_t opensocket_callback(void *clientp,
+ curlsocktype purpose,
+ struct curl_sockaddr *address);
+
+The callback gets the *clientp* as first argument, which is simply an opaque
+pointer you set with `CURLOPT_OPENSOCKETDATA`.
+
+The other two arguments pass in data that identifies for what *purpose* and
+*address* the socket is to be used. The *purpose* is a typedef with a value of
+`CURLSOCKTYPE_IPCXN` or `CURLSOCKTYPE_ACCEPT`, basically identifying in which
+circumstance the socket is created. The "accept" case being when libcurl is
+used to accept an incoming FTP connection for when FTP active mode is used,
+and all other cases when libcurl creates a socket for its own outgoing
+connections the *IPCXN* value is passed in.
+
+The *address* pointer points to a `struct curl_sockaddr` that describes the IP
+address of the network destination for which this socket is created. Your
+callback can for example use this information to whitelist or blacklist
+specific addresses or address ranges.
+
+The socketopen callback is also explicitly allowed to modify the target
+address in that struct, if you would like to offer some sort of network filter
+or translation layer.
+
+The callback should return a file descriptor or `CURL_SOCKET_BAD`, which then
+will cause an unrecoverable error within libcurl and it will eventually return
+`CURLE_COULDNT_CONNECT` from its perform function.
+
+If you want to return a file descriptor that is *already connected* to a
+server, then you must also set the [sockopt callback](callback-sockopt.md) and
+make sure that returns the correct return value.
+
+The `curl_sockaddress` struct looks like this:
+
+ struct curl_sockaddr {
+ int family;
+ int socktype;
+ int protocol;
+ unsigned int addrlen;
+ struct sockaddr addr;
+ };
+
+## Socket close callback
+
+The corresponding callback to the open socket is of course the close
+socket. Usually when you provide a custom way to provide a file descriptor you
+want to provide your own cleanup version as well:
+
+ curl_easy_setopt(handle, CURLOPT_CLOSEOCKETFUNCTION, closesocket_callback);
+
+The `closesocket_callback` function must match this prototype:
+
+ int closesocket_callback(void *clientp, curl_socket_t item);
diff --git a/zh/callback-progress.md b/zh/callback-progress.md
new file mode 100644
index 000000000..245bea604
--- /dev/null
+++ b/zh/callback-progress.md
@@ -0,0 +1,49 @@
+### Progress callback
+
+The progress callback is what gets called regularly and repeatedly for each
+transfer during the entire lifetime of the transfer. The old callback was set
+with `CURLOPT_PROGRESSFUNCTION` but the modern and preferred callback is set
+with `CURLOPT_XFERINFOFUNCTION`:
+
+ curl_easy_setopt(handle, CURLOPT_XFERINFOFUNCTION, xfer_callback);
+
+The `xfer_callback` function must match this prototype:
+
+ int xfer_callback(void *clientp, curl_off_t dltotal, curl_off_t dlnow,
+ curl_off_t ultotal, curl_off_t ulnow);
+
+If this option is set and `CURLOPT_NOPROGRESS` is set to 0 (zero), this
+callback function gets called by libcurl with a frequent interval. While data
+is being transferred it will be called very frequently, and during slow
+periods like when nothing is being transferred it can slow down to about one
+call per second.
+
+The **clientp** pointer points to the private data set with
+`CURLOPT_XFERINFODATA`:
+
+ curl_easy_setopt(handle, CURLOPT_XFERINFODATA, custom_pointer);
+
+The callback gets told how much data libcurl will transfer and has
+transferred, in number of bytes:
+
+ - **dltotal** is the total number of bytes libcurl expects to download in
+ this transfer.
+ - **dlnow** is the number of bytes downloaded so far.
+ - **ultotal** is the total number of bytes libcurl expects to upload in this
+ transfer.
+ - **ulnow** is the number of bytes uploaded so far.
+
+Unknown/unused argument values passed to the callback will be set to zero
+(like if you only download data, the upload size will remain 0). Many times
+the callback will be called one or more times first, before it knows the data
+sizes, so a program must be made to handle that.
+
+Returning a non-zero value from this callback will cause libcurl to abort the
+transfer and return `CURLE_ABORTED_BY_CALLBACK`.
+
+If you transfer data with the multi interface, this function will not be
+called during periods of idleness unless you call the appropriate libcurl
+function that performs transfers.
+
+(The deprecated callback `CURLOPT_PROGRESSFUNCTION` worked identically but
+instead of taking arguments of type `curl_off_t`, it used `double`.)
diff --git a/zh/callback-read.md b/zh/callback-read.md
new file mode 100644
index 000000000..5545474f2
--- /dev/null
+++ b/zh/callback-read.md
@@ -0,0 +1,30 @@
+### Read callback
+
+The read callback is set with `CURLOPT_READFUNCTION`:
+
+ curl_easy_setopt(handle, CURLOPT_READFUNCTION, read_callback);
+
+The `read_callback` function must match this prototype:
+
+ size_t read_callback(char *buffer, size_t size, size_t nitems, void *stream);
+
+This callback function gets called by libcurl when it wants to send data to
+the server. This is a transfer that you have set up to upload data or
+otherwise send it off to the server. This callback will be called over and
+over until all data has been delivered or the transfer failed.
+
+The **stream** pointer points to the private data set with `CURLOPT_READDATA`:
+
+ curl_easy_setopt(handle, CURLOPT_READDATA, custom_pointer);
+
+If this callback isn't set, libcurl instead uses 'fread' by default.
+
+The data area pointed at by the pointer **buffer** should be filled up with at
+most **size** multiplied with **nitems** number of bytes by your function. The
+callback should then return the number of bytes that it stored in that memory
+area, or 0 if we have reached the end of the data. The callback can also
+return a few "magic" return codes to cause libcurl to return failure
+immediately or to pause the particular transfer. See the [CURLOPT_READFUNCTION
+man page](https://curl.haxx.se/libcurl/c/CURLOPT_READFUNCTION.html) for
+details.
+
diff --git a/zh/callback-rtsp.md b/zh/callback-rtsp.md
new file mode 100644
index 000000000..8d4962ff7
--- /dev/null
+++ b/zh/callback-rtsp.md
@@ -0,0 +1,4 @@
+### RTSP interleave callback
+
+TBD
+
diff --git a/zh/callback-seek.md b/zh/callback-seek.md
new file mode 100644
index 000000000..7ac2e4b4b
--- /dev/null
+++ b/zh/callback-seek.md
@@ -0,0 +1,4 @@
+### seek and ioctl callbacks
+
+TBD
+
diff --git a/zh/callback-sockopt.md b/zh/callback-sockopt.md
new file mode 100644
index 000000000..10b5831e8
--- /dev/null
+++ b/zh/callback-sockopt.md
@@ -0,0 +1,27 @@
+### sockopt callback
+
+The sockopt callback is set with `CURLOPT_SOCKOPTFUNCTION`:
+
+ curl_easy_setopt(handle, CURLOPT_SOCKOPTFUNCTION, sockopt_callback);
+
+The `sockopt_callback` function must match this prototype:
+
+ int sockopt_callback(void *clientp,
+ curl_socket_t curlfd,
+ curlsocktype purpose);
+
+This callback function gets called by libcurl when a new socket has
+been created but before the connect call, to allow applications to change
+specific socket options.
+
+The **clientp** pointer points to the private data set with
+`CURLOPT_SOCKOPTDATA`:
+
+ curl_easy_setopt(handle, CURLOPT_SOCKOPTDATA, custom_pointer);
+
+This callback should return:
+
+ - CURL_SOCKOPT_OK on success
+ - CURL_SOCKOPT_ERROR to signal an unrecoverable error to libcurl
+ - CURL_SOCKOPT_ALREADY_CONNECTED to signal success but also that the socket is
+ in fact already connected to the destination
diff --git a/zh/callback-sshkey.md b/zh/callback-sshkey.md
new file mode 100644
index 000000000..9c0240a5f
--- /dev/null
+++ b/zh/callback-sshkey.md
@@ -0,0 +1,4 @@
+### SSH key callback
+
+TBD
+
diff --git a/zh/callback-sslcontext.md b/zh/callback-sslcontext.md
new file mode 100644
index 000000000..3178e90f6
--- /dev/null
+++ b/zh/callback-sslcontext.md
@@ -0,0 +1,3 @@
+### SSL context callback
+
+TBD
diff --git a/zh/callback-write.md b/zh/callback-write.md
new file mode 100644
index 000000000..2e6b9a642
--- /dev/null
+++ b/zh/callback-write.md
@@ -0,0 +1,40 @@
+### Write callback
+
+The write callback is set with `CURLOPT_WRITEFUNCTION`:
+
+ curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, write_callback);
+
+The `write_callback` function must match this prototype:
+
+ size_t write_callback(char *ptr, size_t size, size_t nmemb, void *userdata);
+
+This callback function gets called by libcurl as soon as there is data
+received that needs to be saved. *ptr* points to the delivered data, and the
+size of that data is *size* multiplied with *nmemb*.
+
+If this callback isn't set, libcurl instead uses 'fwrite' by default.
+
+The write callback will be passed as much data as possible in all invokes, but
+it must not make any assumptions. It may be one byte, it may be thousands.
+The maximum amount of body data that will be passed to the write callback is
+defined in the curl.h header file: `CURL_MAX_WRITE_SIZE` (the usual default is
+16KB). If `CURLOPT_HEADER` is enabled for this transfer, which makes header
+data get passed to the write callback, you can get up to
+`CURL_MAX_HTTP_HEADER` bytes of header data passed into it. This usually means
+100KB.
+
+This function may be called with zero bytes data if the transferred file is empty.
+
+The data passed to this function will not be zero terminated! You cannot, for
+example, use printf's "%s" operator to display the contents nor strcpy to copy
+it.
+
+This callback should return the number of bytes actually taken care of. If
+that number differs from the number passed to your callback function, it will
+signal an error condition to the library. This will cause the transfer to get
+aborted and the libcurl function used will return `CURLE_WRITE_ERROR`.
+
+The user pointer passed in to the callback in the *userdata* argument is set
+with `CURLOPT_WRITEDATA`:
+
+ curl_easy_setopt(handle, CURLOPT_WRITEDATA, custom_pointer);
diff --git a/zh/chrome-copy-as-curl.png b/zh/chrome-copy-as-curl.png
new file mode 100644
index 000000000..426a41855
Binary files /dev/null and b/zh/chrome-copy-as-curl.png differ
diff --git a/zh/cmdline-configfile.md b/zh/cmdline-configfile.md
new file mode 100644
index 000000000..fb0d07ec1
--- /dev/null
+++ b/zh/cmdline-configfile.md
@@ -0,0 +1,83 @@
+## Config file
+
+You can easily end up with curl command lines that use a very large number of
+command-line options, making them rather hard to work with. Sometimes the length
+of the command line you want to enter even hits the maximum length your
+command-line system allows. The Microsoft Windows command prompt being an
+example of something that has a fairly small maximum line length.
+
+To aid such situations, curl offers a feature we call "config file". It
+basically allows you to write command-line options in a text file instead and
+then tell curl to read options from that file in addition to the command line.
+
+You tell curl to read more command-line options from a specific file with the
+-K/--config option, like this:
+
+ curl -K cmdline.txt http://example.com
+
+…and in the `cmdline.txt` file (which, of course, can use any file name you
+please) you enter each command line per line:
+
+ # this is a comment, we ask to follow redirects
+ --location
+ # ask to do a HEAD request
+ --head
+
+The config file accepts both short and long options, exactly as you would
+write them on a command line. As a special extra feature, it also allows you
+to write the long format of the options without the leading two dashes to make
+it easier to read. Using that style, the config file shown above can
+alternatively be written as:
+
+ # this is a comment, we ask to follow redirects
+ location
+ # ask to do a HEAD request
+ head
+
+Command line options that take an argument must have its argument provided on
+the same line as the option. For example changing the User-Agent HTTP header
+can be done with
+
+ user-agent "Everything-is-an-agent"
+
+To allow the config files to look even more like a true config file, it also
+allows you to use '=' or ':' between the option and its argument. As you see
+above it isn't necessary, but some like the clarity it offers. Setting the
+user-agent option again:
+
+ user-agent = "Everything-is-an-agent"
+
+The argument to an option can be specified without double quotes and then curl
+will treat the next space or newline as the end of the argument. So if you
+want to provide an argument with embedded spaces you must use double quotes.
+
+The user agent string example we have used above has no white spaces and
+therefore it can also be provided without the quotes like:
+
+ user-agent = Everything-is-an-agent
+
+Finally, if you want to provide a URL in a config file, you must do that the
+`--url` way, or just with `url`, and not like on the command line where
+basically everything that isn't an option is assumed to be a URL. So you
+provide a URL for curl like this:
+
+ url = "http://example.com/"
+
+### Default config file
+
+When curl is invoked, it always (unless `-q` is used) checks for a default
+config file and uses it if found. The file name it checks for is `.curlrc` on
+Unix-like systems and `_curlrc` on Windows.
+
+The default config file is checked for in the following places in this order:
+
+1. curl tries to find the "home directory": It first checks for the CURL_HOME and
+then the HOME environment variables. Failing that, it uses `getpwuid()` on
+Unix-like systems (which returns the home directory given the current user in your
+system). On Windows, it then checks for the APPDATA variable, or as a last
+resort the '%USERPROFILE%\Application Data'.
+
+2. On Windows, if there is no _curlrc file in the home directory, it checks for one
+in the same directory the curl executable is placed. On Unix-like systems, it will
+simply try to load .curlrc from the determined home directory.
+
diff --git a/zh/cmdline-globbing.md b/zh/cmdline-globbing.md
new file mode 100644
index 000000000..6cf5eb812
--- /dev/null
+++ b/zh/cmdline-globbing.md
@@ -0,0 +1,88 @@
+## URL globbing
+
+At times you want to get a range of URLs that are mostly the same, with only a
+small portion of it changing between the requests. Maybe it is a numeric range
+or maybe a set of names. curl offers "globbing" as a way to specify many URLs
+like that easily.
+
+The globbing uses the reserved symbols [] and {} for this, symbols that
+normally cannot be part of a legal URL (except for numerical IPv6 addresses
+but curl handles them fine anyway). If the globbing gets in your way, disable
+it with `-g, --globoff`.
+
+While most transfer related functionality in curl is provided by the libcurl
+library, the URL globbing feature is not!
+
+### Numerical ranges
+
+You can ask for a numerical range with [N-M] syntax, where N is the start
+index and it goes up to and including M. For example, you can ask for 100
+images one by one that are named numerically:
+
+ curl -O http://example.com/[1-100].png
+
+and it can even do the ranges with zero prefixes, like if the number is
+three digits all the time:
+
+ curl -O http://example.com/[001-100].png
+
+Or maybe you only want even numbered images so you tell curl a step counter
+too. This example range goes from 0 to 100 with an increment of 2:
+
+ curl -O http://example.com/[0-100:2].png
+
+### Alphabetical ranges
+
+curl can also do alphabetical ranges, like when a site has sections named a
+to z:
+
+ curl -O http://example.com/section[a-z].html
+
+### A list
+
+Sometimes the parts don't follow such an easy pattern, and then you can
+instead give the full list yourself but then within the curly braces instead
+of the brackets used for the ranges:
+
+ curl -O http://example.com/{one,two,three,alpha,beta}.html
+
+### Combinations
+
+You can use several globs in the same URL which then will make curl iterate
+over those, too. To download the images of Ben, Alice and Frank, in both the
+resolutions 100x100 and 1000x1000, a command line could look like:
+
+ curl -O http://example.com/{Ben,Alice,Frank}-{100x100,1000x1000}.jpg
+
+Or download all the images of a chess board, indexed by two coordinates ranged
+0 to 7:
+
+ curl -O http://example.com/chess-[0-7]x[0-7].jpg
+
+And you can, of course, mix ranges and series. Get a week's worth of logs for
+both the web server and the mail server:
+
+ curl -O http://example.com/{web,mail}-log[0-6].txt
+
+### Output variables for globbing
+
+In all the globbing examples previously in this chapter we have selected to
+use the `-O / --remote-name` option, which makes curl save the target file
+using the file name part of the used URL.
+
+Sometimes that is not enough. You are downloading multiple files and maybe you
+want to save them in a different subdirectory or create the saved file names
+differently. curl, of course, has a solution for these situations as well:
+output file name variables.
+
+Each "glob" used in a URL gets a separate variable. They are referenced as
+'#[num]' - that means the single letter '#' followed by the glob number which
+starts with 1 for the first glob and ends with the last glob.
+
+Save the main pages of two different sites:
+
+ curl http://{one,two}.example.com -o "file_#1.txt"
+
+Save the outputs from a command line with two globs in a subdirectory;
+
+ curl http://{site,host}.host[1-5].example.com -o "subdir/#1_#2"
diff --git a/zh/cmdline-listopts.md b/zh/cmdline-listopts.md
new file mode 100644
index 000000000..db2a7be8b
--- /dev/null
+++ b/zh/cmdline-listopts.md
@@ -0,0 +1,20 @@
+## List all command-line options
+
+curl has more than two hundred command-line options and the number of options
+keep increasing over time. Chances are the number of options will reach 250
+within a few years.
+
+In order to find out which options you need to perform as certain action, you
+can, of course, list all options, scan through the list and pick the one you
+are looking for. `curl --help` or simply `curl -h` will get you a list of all
+existing options with a brief explanation. If you don't really know what
+you are looking for, you probably won't be entirely satisfied.
+
+Then you can instead opt to use `curl --manual` which will output the
+entire man page for curl plus an appended tutorial for the most common use
+cases. That is a very thorough and complete document on how each option
+works amassing several thousand lines of documentation. To wade through that is also a
+tedious work and we encourage use of a search function through those text
+masses. Some people will appreciate the man page in its [web
+version](https://curl.haxx.se/docs/manpage.html).
+
diff --git a/zh/cmdline-options.md b/zh/cmdline-options.md
new file mode 100644
index 000000000..578b6083a
--- /dev/null
+++ b/zh/cmdline-options.md
@@ -0,0 +1,106 @@
+## Command line options
+
+When telling curl to do something, you invoke curl with zero, one or several
+command-line options to accompany the URL or set of URLs you want the transfer
+to be about. curl supports over two hundred different options.
+
+### Short options
+
+Command line options pass on information to curl about how you want it to
+behave. Like you can ask curl to switch on verbose mode with the -v option:
+
+ curl -v http://example.com
+
+-v is here used as a "short option". You write those with the minus symbol and
+a single letter immediately following it. Many options are just switches that
+switches something on or changes something between two known states. They can
+be used with just that option name. You can then also combine several
+single-letter options after the minus. To ask for both verbose mode and that
+curl follows HTTP redirects:
+
+ curl -vL http://example.com
+
+The command-line parser in curl always parses the entire line and you can put
+the options anywhere you like; they can also appear after the URL:
+
+ curl http://example.com -Lv
+
+### Long options
+
+Single-letter options are convenient since they are quick to write and use, but
+as there are only a limited number of letters in the alphabet and there are
+many things to control, not all options are available like that. Long option
+names are therefore provided for those. Also, as a convenience and to allow
+scripts to become more readable, most short options have longer name
+aliases.
+
+Long options are always written with *two* minuses (or *dashes*, whichever you
+prefer to call them) and then the name and you can only write one option name
+per double-minus. Asking for verbose mode using the long option format looks
+like:
+
+ curl --verbose http://example.com
+
+and asking for HTTP redirects as well using the long format looks like:
+
+ curl --verbose --location http://example.com
+
+### Arguments to options
+
+Not all options are just simple boolean flags that enable or disable
+features. For some of them you need to pass on data, like perhaps a user name
+or a path to a file. You do this by writing first the option and then the
+argument, separated with a space. Like, for example, if you want to send an
+arbitrary string of data in an HTTP POST to a server:
+
+ curl -d arbitrary http://example.com
+
+and it works the same way even if you use the long form of the option:
+
+ curl --data arbitrary http://example.com
+
+When you use the short options with arguments, you can, in fact, also write the
+data without the space separator:
+
+ curl -darbitrary http://example.com
+
+### Arguments with spaces
+
+At times you want to pass on an argument to an option, and that argument
+contains one or more spaces. For example you want to set the user-agent field
+curl uses to be exactly `I am your father`, including those three spaces. Then
+you need to put quotes around the string when you pass it to curl on the
+command line. The exact quotes to use varies depending on your shell/command
+prompt, but generally it will work with double quotes in most places:
+
+ curl -A "I am your father" http://example.com
+
+Failing to use quotes, like if you would write the command line like this:
+
+ curl -A I am your father http://example.com
+
+… will make curl only use 'I' as a user-agent string, and the following
+strings, 'am', your, etc will instead all be treated as separate URLs since
+they don't start with `-` to indicate that they're options and curl only ever
+handles options and URLs.
+
+To make the string itself contain double quotes, which is common when you for
+example want to send a string of JSON to the server, you may need to use
+single quotes (except on Windows, where single quotes doesn't work the same
+way). Send the JSON string `{ "name": "Darth" }`:
+
+ curl -d '{ "name": "Darth" }' http://example.com
+
+Or if you want to avoid the single quote thing, you may prefer to send the
+data to curl via a file, which then doesn't need the extra quoting. Assuming
+we call the file 'json' that contains the above mentioned data:
+
+ curl -d @json http://example.com
+
+### Negative options
+
+For options that switch on something, there is also a way to switch it
+off. You then use the long form of the option with an initial "no-" prefix
+before the name. As an example, to switch off verbose mode:
+
+ curl --no-verbose http://example.com
diff --git a/zh/cmdline-passwords.md b/zh/cmdline-passwords.md
new file mode 100644
index 000000000..35f3954e4
--- /dev/null
+++ b/zh/cmdline-passwords.md
@@ -0,0 +1,46 @@
+## Passwords and snooping
+
+Passwords are tricky and sensitive. Leaking a password can make someone else
+than you access the resources and the data otherwise protected.
+
+curl offers several ways to receive passwords from the user and then
+subsequently pass them on or use them to something else.
+
+The most basic curl authentication option is `-u / --user`. It accepts an
+argument that is the user name and password, colon separated. Like when alice
+wants to request a page requiring HTTP authentication and her password is
+'12345':
+
+ $ curl -u alice:12345 http://example.com/
+
+### Command line leakage
+
+Several potentially bad things are going on here. First, we are entering a
+password on the command line and the command line might be readable for other
+users on the same system (assuming you have a multi-user system). curl
+will help minimize that risk by trying to blank out passwords from process
+listings.
+
+One way to avoid passing the user name and password on the command line is to
+instead use a [.netrc file](usingcurl-netrc.md) or a [config
+file](cmdline-configfile.md). You can also use the `-u` option without
+specifying the password, and then curl will instead prompt the user for it
+when it runs.
+
+### Network leakage
+
+Secondly, this command line sends the user credentials to an HTTP server,
+which is a clear-text protocol that is open for man-in-the-middle or other
+snoopers to spy on the connection and see what is sent. In this command line
+example, it makes curl use HTTP Basic authentication and that is completely
+insecure.
+
+There are several ways to avoid this, and the key is, of course, then to avoid
+protocols or authentication schemes that sends credentials in the plain over
+the network. Easiest is perhaps to make sure you use encrypted versions of
+protocols. Use HTTPS instead of HTTP, use FTPS instead of FTP and so on.
+
+If you need to stick to a plain text and insecure protocol, then see if you
+can switch to using an authentication method that avoids sending the
+credentials in the clear. If you want HTTP, such methods would include Digest
+(`--digest`), Negotiate (`--negotiate.`) and NTLM (`--ntlm`).
diff --git a/zh/cmdline-progressmeter.md b/zh/cmdline-progressmeter.md
new file mode 100644
index 000000000..9e005dd2d
--- /dev/null
+++ b/zh/cmdline-progressmeter.md
@@ -0,0 +1,67 @@
+## The progress meter
+
+curl has a built-in progress meter. When curl is invoked to transfer data
+(either uploading or downloading) it can show that meter in the terminal
+screen to show how the transfer is progressing, namely the current transfer speed,
+how long it has been going on and how long it thinks it might be left until
+completion.
+
+The progress meter is inhibited if curl deems that there is output going to
+the terminal, as then would the progress meter interfere with that output and
+just mess up what gets displayed. A user can also forcibly switch off the
+progress meter with the `-s / --silent` option, which tells curl to hush.
+
+If you invoke curl and don't get the progress meter, make sure your output is
+directed somewhere other than the terminal.
+
+curl also features an alternative and simpler progress meter that you enable
+with `-# / --progress-bar`. As the long name implies, it instead shows the
+transfer as progress bar.
+
+At times when curl is asked to transfer data, it can't figure out the total
+size of the requested operation and that then subsequently makes the progress
+meter contain fewer details and it cannot, for example, make forecasts for
+transfer times, etc.
+
+### Units
+
+The progress meter displays bytes and bytes per second.
+
+It will also use suffixes for larger amounts of bytes, using the 1024 base
+system so 1024 is one kilobyte (1K), 2048 is 2K, etc. curl supports these:
+
+| Suffix | Amount | Name |
+|---------|---------|-----------|
+| K | 2^10 | kilobyte |
+| M | 2^20 | megabyte |
+| G | 2^30 | gigabyte |
+| T | 2^40 | terabyte |
+| P | 2^50 | petabyte |
+
+The times are displayed using H:MM:SS for hours, minutes and seconds.
+
+### Progress meter legend
+
+The progress meter exists to show a user that something actually is
+happening. The different fields in the output have the following meaning:
+
+ % Total % Received % Xferd Average Speed Time Curr.
+ Dload Upload Total Current Left Speed
+ 0 151M 0 38608 0 0 9406 0 4:41:43 0:00:04 4:41:39 9287
+
+From left to right:
+
+|Title|Meaning|
+|-----|-------|
+| % |Percentage completed of the whole transfer |
+|Total |Total size of the whole expected transfer (if known) |
+| % |Percentage completed of the download |
+| Received |Currently downloaded number of bytes |
+| % |Percentage completed of the upload |
+|Xferd |Currently uploaded number of bytes |
+|Average Speed Dload| Average transfer speed of the entire download so far, in number of bytes per second |
+|Average Speed Upload| Average transfer speed of the entire upload so far, in number of bytes per second |
+|Time Total|Expected time to complete the operation, in HH:MM:SS notation for hours, minutes and seconds |
+|Time Current|Time passed since the start of the transfer, in HH:MM:SS notation for hours, minutes and seconds |
+|Time Left |Expected time left to completion, in HH:MM:SS notation for hours, minutes and seconds |
+|Curr.Speed|Average transfer speed over the last 5 seconds (the first 5 seconds of a transfer is based on less time, of course) in number of bytes per second |
diff --git a/zh/cmdline-urls.md b/zh/cmdline-urls.md
new file mode 100644
index 000000000..2a08998c5
--- /dev/null
+++ b/zh/cmdline-urls.md
@@ -0,0 +1,252 @@
+## URLs
+
+curl is called curl because a substring in its name is URL (Uniform
+Resource Locator). It operates on URLs. URL is the name we casually use for
+the web address strings, like the ones we usually see prefixed with http:// or
+starting with www.
+
+URL is, strictly speaking, the former name for these. URI (Uniform Resource
+Identifier) is the more modern and correct name for them. Their syntax is defined
+in [RFC 3986](https://www.ietf.org/rfc/rfc3986.txt).
+
+Where curl accepts a "URL" as input, it is then really a "URI". Most of the
+protocols curl understands also have a corresponding URI syntax document that
+describes how that particular URI format works.
+
+curl assumes that you give it a valid URL and it only does limited checks of
+the format in order to extract the information it deems necessary to perform
+its operation. You can, for example, most probably pass in illegal characters in
+the URL without curl noticing or caring and it will just pass them on.
+
+### Scheme
+
+URLs start with the "scheme", which is the official name for the "http://"
+part. That tells which protocol the URL uses. The scheme must be a known one
+that this version of curl supports or it will show an error message and
+stop. Additionally, the scheme must neither start with nor contain any
+whitespace.
+
+### The scheme separator
+
+The scheme identifier is separated from the rest of the URL by the "://"
+sequence. That is a colon and two forward slashes. There exists URL formats
+with only one slash, but curl doesn't support any of them. There are two
+additional notes to be aware of, about the number of slashes:
+
+curl allow some illegal syntax and try to correct it internally; so it will
+also understand and accept URLs with one or three slashes, even though they
+are in fact not properly formed URLs. curl does this because the browsers
+started this practice so it has lead to such URLs being used in the wild every
+now and then.
+
+`file://` URLs are written as `file:///` but the only
+hostnames that are okay to use are `localhost`, `127.0.0.1` or a blank
+(nothing at all):
+
+ file://localhost/path/to/file
+ file://127.0.0.1/path/to/file
+ file:///path/to/file
+
+Inserting any other host name in there will make recent versions of curl to
+return an error.
+
+Pay special attention to the third example above
+(`file:///path/to/file`). That is *three* slashes before the path. That is
+again an area with common mistakes and where browsers allow users to use the
+wrong syntax so as a special exception, curl on Windows also allows this
+incorrect format:
+
+ file://X:/path/to/file
+
+… where X is a windows-style drive letter.
+
+### Without scheme
+
+As a convenience, curl also allows users to leave out the scheme part from
+URLs. Then it guesses which protocol to use based on the first part of the
+host name. That guessing is very basic as it just checks if the first part of
+the host name matches one of a set of protocols, and assumes you meant to use
+that protocol. This heuristic is based on the fact that servers traditionally
+used to be named like that. The protocols that are detected this way are FTP,
+DICT, LDAP, IMAP, SMTP and POP3. Any other host name in a scheme-less URL will
+make curl default to HTTP.
+
+You can modify the default protocol to something other than HTTP with the
+`--proto-default` option.
+
+### Name and password
+
+After the scheme, there can be a possible user name and password embedded.
+The use of this syntax is usually frowned upon these days since you easily
+leak this information in scripts or otherwise. For example, listing the
+directory of an FTP server using a given name and password:
+
+ curl ftp://user:password@example.com/
+
+The presence of user name and password in the URL is completely optional. curl
+also allows that information to be provide with normal command-line options,
+outside of the URL.
+
+### Host name or address
+
+The host name part of the URL is, of course, simply a name that can be resolved
+to an numerical IP address, or the numerical address itself. When specifying a
+numerical address, use the dotted version for IPv4 addresses:
+
+ curl http://127.0.0.1/
+
+…and for IPv6 addresses the numerical version needs to be within square
+brackets:
+
+ curl http://[::1]/
+
+When a host name is used, the converting of the name to an IP address is
+typically done using the system's resolver functions. That normally lets a
+sysadmin provide local name lookups in the `/etc/hosts` file (or equivalent).
+
+### Port number
+
+Each protocol has a "default port" that curl will use for it, unless a
+specified port number is given. The optional port number can be provided
+within the URL after the host name part, as a colon and the port number
+written in decimal. For example, asking for an HTTP document on port 8080:
+
+ curl http://example.com:8080/
+
+With the name specified as an IPv4 address:
+
+ curl http://127.0.0.1:8080/
+
+With the name given as an IPv6 address:
+
+ curl http://[fdea::1]:8080/
+
+### Path
+
+Every URL contains a path. If there's none given, "/" is implied. The path is
+sent to the specified server to identify exactly which resource that is
+requested or that will be provided.
+
+The exact use of the path is protocol dependent. For example, getting a file
+README from the default anonymous user from an FTP server:
+
+ curl ftp://ftp.example.com/README
+
+For the protocols that have a directory concept, ending the URL with a
+trailing slash means that it is a directory and not a file. Thus asking for a
+directory list from an FTP server is implied with such a slash:
+
+ curl ftp://ftp.example.com/tmp/
+
+### FTP type
+
+This is not a feature that is widely used.
+
+URLs that identify files on FTP servers have a special feature that allows you
+to also tell the client (curl in this case) which file type the resource
+is. This is because FTP is a little special and can change mode for a transfer
+and thus handle the file differently than if it would use another mode.
+
+You tell curl that the FTP resource is an ASCII type by appending ";type=A"
+to the URL. Getting the 'foo' file from example.com's root directory using ASCII
+could then be made with:
+
+ curl "ftp://example.com/foo;type=A"
+
+And while curl defaults to binary transfers for FTP, the URL format allows you
+to also specify the binary type with type=I:
+
+ curl "ftp://example.com/foo;type=I"
+
+Finally, you can tell curl that the identified resource is a directory if the
+type you pass is D:
+
+ curl "ftp://example.com/foo;type=D"
+
+…this can then work as an alternative format, instead of ending the path
+with a trailing slash as mentioned above.
+
+### Fragment
+
+URLs offer a "fragment part". That's usually seen as a hash symbol (#) and a
+name for a specific name within a web page in browsers. curl supports
+fragments fine when a URL is passed to it, but the fragment part is never
+actually sent over the wire so it doesn't make a difference to curl's
+operations whether it is present or not.
+
+### Browsers' "address bar"
+
+It is important to realize that when you use a modern web browser, the
+"address bar" they tend to feature at the top of their main windows are not
+using "URLs" or even "URIs". They are in fact mostly using IRIs, which is a
+superset of URIs to allow internationalization like non-Latin symbols and
+more, but it usually goes beyond that, too, as they tend to, for example, handle
+spaces and do magic things on percent encoding in ways none of these mentioned
+specifications say a client should do.
+
+The address bar is quite simply an interface for humans to enter and see
+URI-like strings.
+
+Sometimes the differences between what you see in a browser's address bar and
+what you can pass in to curl is significant.
+
+## Many options and URLs
+
+As mentioned above, curl supports hundreds of command-line options and it also
+supports an unlimited number of URLs. If your shell or command-line system
+supports it, there's really no limit to how long a command line you can pass
+to curl.
+
+curl will parse the entire command line first, apply the wishes from the
+command-line options used, and then go over the URLs one by one (in a left to
+right order) to perform the operations.
+
+For some options (for example `-o` or `-O` that tell curl where to store the
+transfer), you may want to specify one option for each URL on the command
+line.
+
+curl will return an exit code for its operation on the last URL used. If you
+instead rather want curl to exit with an error on the first URL in the set
+that fails, use the `--fail-early` option.
+
+## Separate options per URL
+
+In previous sections we described how curl always parses all options in the
+whole command line and applies those to all the URLs that it transfers.
+
+That was a simplification: curl also offers an option (-;, --next) that
+inserts a sort of boundary between a set of options and URLs for which it will
+apply the options. When the command-line parser finds a --next option, it
+applies the following options to the next set of URLs. The --next option thus
+works as a *divider* between a set of options and URLs. You can use as many
+--next options as you please.
+
+As an example, we do an HTTP GET to a URL and follow redirects, we then make a
+second HTTP POST to a different URL and we round it up with a HEAD request to
+a third URL. All in a single command line:
+
+ curl --location http://example.com/1 --next
+ --data sendthis http://example.com/2 --next
+ --head http://example.com/3
+
+Trying something like that _without_ the --next options on the command line
+would generate an illegal command line since curl would attempt to combine
+both a POST and a HEAD:
+
+ Warning: You can only select one HTTP request method! You asked for both POST
+ Warning: (-d, --data) and HEAD (-I, --head).
+
+## Connection reuse
+
+Setting up a TCP connection and especially a TLS connection can be a slow
+process, even on high bandwidth networks.
+
+It can be useful to remember that curl has a connection pool internally which
+keeps previously used connections alive and around for a while after they were
+used so that subsequent requests to the same hosts can reuse an already
+established connection.
+
+Of course, they can only be kept alive for as long as the curl tool is running,
+but it is a very good reason for trying to get several transfers done within
+the same command line instead of running several independent curl command line
+invocations.
diff --git a/zh/cmdline-versions.md b/zh/cmdline-versions.md
new file mode 100644
index 000000000..987e5151f
--- /dev/null
+++ b/zh/cmdline-versions.md
@@ -0,0 +1,26 @@
+## Options depend on version
+
+`curl` was first typed on a command line back in the glorious year of 1998. It
+already then worked on the specified URL and none, one or more command-line
+options given to it.
+
+Since then we have added more options. We add options as we go along and
+almost every new release of curl has one or a few new options that allow users
+to modify certain aspects of its operation.
+
+With the curl project's rather speedy release chain with a new release
+shipping every eight weeks, it is almost inevitable that you are at least not
+always using the very latest released version of curl. Sometimes you may even
+use a curl version that is a few years old.
+
+All command-line options described in this book were, of course, added to curl
+at some point in time, and only a very small portion of them were available
+that fine spring day in 1998 when curl first shipped. You may have reason to
+check your version of curl and crosscheck with the curl man page for when
+certain options were added. This is especially important if you want to take a
+curl command line using a modern curl version back to an older system that
+might be running an older installation.
+
+The developers of curl are working hard to not change existing behavior
+though. Command lines written to use curl in 1998, 2003 or 2010 should all be
+possible to run unmodified even today.
diff --git a/zh/cmdline.md b/zh/cmdline.md
new file mode 100644
index 000000000..7c5f6834a
--- /dev/null
+++ b/zh/cmdline.md
@@ -0,0 +1,66 @@
+# Command line basics
+
+curl started out as a command-line tool and it has been invoked from shell
+prompts and from within scripts by thousands of users over the years. curl has
+established itself as one of those trusty tools that is there for you to help
+you get your work done.
+
+## Binaries and different platforms
+
+The command-line tool "curl" is a binary executable file. The curl project
+does not by itself distribute or provide binaries. Binary files are highly
+system specific and oftentimes also bound to specific system versions.
+
+To get a curl for your platform and your system, you need to get a curl
+executable from somewhere. Many people build their own from the source code
+provided by the curl project, lots of people install it using a package tool
+for their operating system and yet another portion of users download binary
+install packages from sources they trust.
+
+No matter how you do it, make sure you are getting your version from a trusted
+source and that you verify digital signatures or the authenticity of the
+packages in other ways.
+
+Also, remember that curl is often built to use third-party libraries to
+perform and unless curl is built to use them statically you must also have
+those third-party libraries installed; the exact set of libraries will
+vary depending on the particular build you get.
+
+## Command lines, quotes and aliases
+
+There are many different command lines, shells and prompts in which curl can
+be used. They all come with their own sets of limitations, rules and
+guidelines to follow. The curl tool is designed to work with any of them
+without causing troubles but there may be times when your specific command
+line system doesn't match what others use or what is otherwise documented.
+
+One way that command-line systems differ, for example, is how you can put
+quotes around arguments such as to embed spaces or special symbols. In
+most Unix-like shells you use double quotes (") and single quotes (')
+depending if you want to allow variable expansions or not within the quoted
+string, but on Windows there's no support for the single quote version.
+
+In some environments, like PowerShell on Windows, the authors of the command
+line system decided they know better and "help" the user to use another tool
+instead of curl when `curl` is typed, by providing an alias that takes
+precedence when a command line is executed. In order to use curl properly with
+PowerShell, you need to type in its full name including the extension:
+"curl.exe".
+
+Different command-line environments will also have different maximum command
+line lengths and force the users to limit how large amount of data that can be
+put into a single line. curl adapts to this by offering a way to provide
+command-line options through a file—or from stdin—using the -K option.
+
+## Garbage in, garbage out
+
+curl has very little will of its own. It tries to please you and your wishes
+to a very large extent. It also means that it will try to play with what you
+give it. If you misspell an option, it might do something unintended. If you
+pass in a slightly illegal URL, chances are curl will still deal with it and
+proceed. It means that you can pass in crazy data in some options and you can
+have curl pass on that crazy data in its transfer operation.
+
+This is a design choice, as it allows you to really tweak how curl does its
+protocol communications and you can have curl massage your server
+implementations in the most creative ways.
diff --git a/zh/cover.jpg b/zh/cover.jpg
new file mode 100644
index 000000000..15fd0e455
Binary files /dev/null and b/zh/cover.jpg differ
diff --git a/zh/cover_small.jpg b/zh/cover_small.jpg
new file mode 100644
index 000000000..b6d884a60
Binary files /dev/null and b/zh/cover_small.jpg differ
diff --git a/zh/curl-bugs.md b/zh/curl-bugs.md
new file mode 100644
index 000000000..3dae190b4
--- /dev/null
+++ b/zh/curl-bugs.md
@@ -0,0 +1,46 @@
+
+## 问题提交
+
+开发团队进行了大量的测试。我们有一整套测试组件,每天会在各个平台上运行测试用例,确保所有功能可以正常运行。
+
+尽管如此,各种各样的问题还是会经常出现。所以,我们非常重视提交的问题。
+
+### 任何问题都可以视为bug
+
+任何问题都可以被认为是bug。譬如:把几个命令行选项组合使用后,出现的结果让你大跌眼镜,我们将其视为一个bug并进行记录,提交给我们,我们去解决它!
+
+### 必须了解问题才能解决问题
+
+我们必须对问题具有充分的认识,才能将其修复。这听起来很简单,但却是软件开发项目的基本真理。即使curl是一个发布了很久并且拥有大量用户的项目,但并不意味着开发团队知道您刚刚遇到的问题。或许其他用户并没有像你这样如此关注细节,或许这个问题根本没有被其他人触发过。
+
+我们非常依赖用户提交的问题。我们需要了解存在的问题,以便我们能够解决它们。
+
+### 解决问题
+
+软件开发就是一个不断debug的过程。要修复一个问题,开发人员需要了解如何复现这个问题,需要告诉调试人员是什么情况触发了这个问题。
+
+### 一份规范的问题提交单
+
+一份规范的问题报告会阐述发生了什么。请确切地告诉我们您使用的不同组件的版本,并一步一步地告诉我们您是如何触发这个问题的。
+
+提交问题报告后,还有一些后续工作需要您配合,或者可能会要求您尝试不同的事情和任务,以便开发人员能够缩小疑点,确保您的问题被恰当地解决。
+
+提交的问题报告有可能在开发人员无法理解、无法复制或在处理时面临其他问题时被关闭。但是请不要放弃你的报告!
+
+问题报告提交地址 [curl bug tracker on
+github](https://github.com/curl/curl/issues)!
+
+## 测试
+
+软件测试是一项艰巨的工作。在不同的操作系统和不同的cup结构上运行软件,这意味着巨大的工作量。
+
+curl项目拥有一个测试组件,可以运行所有的测试用例,确保没有故障产生,如"内存泄漏"等问题。
+
+在您自己构建了curl之后,测试套件就可以运行了,并且有相当多的志愿者每天自动地运行几次测试套件,以确保最新的提交能够运行。这样,我们希望在他们被介绍后不久就能发现最坏的缺点。
+
+我们无法去测试出所有的问题,即使我们有时去测试一些东西,也可能会因为各种原因而没有发现潜在的问题,有时时隔数年之久我们才能发现问题的存在。
+
+由于不同的操作系统不同的cup架构以及网上有很多优秀的测试用例等原由,很多问题都是用户在运行自己的测试用例时发现的!
+
+测试组件的另一个缺陷是它的可移植性不如curl和libcurl,有的平台根本无法正常的运行测试组件。
+
diff --git a/zh/curl-comm.md b/zh/curl-comm.md
new file mode 100644
index 000000000..b571a4218
--- /dev/null
+++ b/zh/curl-comm.md
@@ -0,0 +1,9 @@
+## 项目沟通
+
+cURL是一个由世界各地的志愿者们共同维护的开源项目。有效的沟通与开放的精神是项目能够稳定发展的关键所在。我们一贯坚持开放性的沟通机制。许多关于项目的讨论都是在邮件列表中进行的(类似于Git邮件列表的工作流方式),我们会对bug进行定位,让每个人都可以看见对于某一问题的讨论以及处理方式,让所有人都可以洞悉它。
+
+你要认识到,我们共同维护着这个项目,我们一起修复bug,一起参与项目迭代。有时,一个我们很熟悉的志愿者会渐渐的从我们的视线中消失。有时,一个很热切的志愿者会突然出现在我们视线之中。为了能使项目尽可能的走的更远,坚持开放性的讨论原则就显得尤为重要。所以我们不赞成私下讨论项目的各种行为。
+
+在这个时代,邮件列表的工作方式与流行的论坛相比已经略显陈旧。邮件列表的工作方式已然成为了一门艺术,并不是随处都可以练习的,你可能会对这种工作方式感到有些陌生。但是不要担心,它仅仅是向一个地址发送一封邮件,然后将邮件转发给所有订阅者。我们的邮件列表,订阅量的最大值在几千左右。如果你是第一次发邮件,最好先读几封旧邮件以对其进行一定的了解,这是最好的练习方式。
+
+邮件列表与bug定位服务托管供应平台已经改变了数次,并且有理由怀疑它可能在将来再次发生改变。这个问题
\ No newline at end of file
diff --git a/zh/curl-devteam.md b/zh/curl-devteam.md
new file mode 100644
index 000000000..9c97e9e7d
--- /dev/null
+++ b/zh/curl-devteam.md
@@ -0,0 +1,26 @@
+## The development team
+
+Daniel Stenberg is the founder and self-proclaimed leader of the
+project. Everybody else that participates or contributes in the project has
+thus arrived at a later point in time. Some contributors worked for a while
+and then left again. Most contributors hang around only for a short while to
+get their bug fixed or feature merged or similar. Counting all contributors
+we know the names of, we have received help from more than 1700 individuals.
+
+The list of people that have repeatedly shown up in discussions and commits
+during the last several years include these stellar individuals:
+
+- Daniel Stenberg
+- Steve Holme
+- Jay Satiro
+- Dan Fandrich
+- Marc Hörsken
+- Kamil Dudka
+- Alessandro Ghedini
+- Yang Tse
+- Günter Knauf
+- Tatsuhiro Tsujikawa
+- Patrick Monnerat
+- Nick Zitzmann
+- Marcel Raad
+- Michael Kaufmann
diff --git a/zh/curl-does.md b/zh/curl-does.md
new file mode 100644
index 000000000..e3384c21b
--- /dev/null
+++ b/zh/curl-does.md
@@ -0,0 +1,33 @@
+## curl可以做什么?
+
+cURL是一个项目,它的主要目的和重点是生成下列两个产品:
+
+- curl命令行工具
+
+- libcurl库,该库提供C语言的API
+
+命令行工具与libcurl库都可以通过网络协议对指定的URL进行网络数据传输。
+
+任何与网络协议传输相关的东西都可以视为curl的业务。与之无关的内容则不属于curl的业务范畴,应由其他项目或工程处理。
+
+非常重要的一点是,命令行工具与libcurl库都不会涉及到传输数据的解析。举例说明:它并不知道传输的数据是HTML或是其他类型的数据,更不会像浏览器一样解析数据进行渲染,简而言之,它不会对数据进行任何处理,但是它知道如何通过HTTP协议去传输这些数据。
+
+这两款产品不仅仅可以用来驱动数以万计的脚本与应用的网络功能,而且还被广泛的应用于服务器测试,协议的改编或者其他相关的事情上。
+
+libcurl库可以被应用在所有具有网络传输功能的嵌入式设备中。如:车载设备,智能电视,蓝光播放器,机顶盒,打印机,路由器,游戏机等等。
+
+### 命令行工具
+
+curl命令行工具的用法非常的自然,并且在能把数据以标准输出格式输出到终端上。丹尼尔非常笃信UNIX体系中“万物皆管道”的思想。标准格式输出的数据,使得与其他工具一起执行所需的操作变得容易起来。这也是为什么几乎所有curl选项都支持文件的读写,并且可以在“标准输出格式”与“标准输入格式”之间进行选择。
+
+遵循Unix命令行工具的使用风格,它同样也支持在命令行上同时处理多条URL。
+
+curl命令行工具是专门为脚本与其他自动化工具而设计的,以后也不会向GUI或者UI方面发展,它仅仅具有简单的文本输入与输出。
+
+### libcurl库
+
+当命令行工具诞生后,curl项目的“网络引擎”从项目中被拿掉了,并且我们把它(“网络引擎”)打包成了一个库,这就是在2000年8月发布的libcurl7.1。自此,所有的核心业务都编写在libcurl之中,而命令行工具变成了一个为libcurl服务的业务层工具。
+
+libcurl被设计为了一款通用的跨平台网络库。
+
+libcurl是用古老的C语言编写的。志愿者们为libcurl编写的其他编程语言接口可以在[绑定](bindings.md)中查阅。
\ No newline at end of file
diff --git a/zh/curl-etiquette.md b/zh/curl-etiquette.md
new file mode 100644
index 000000000..82ce875b4
--- /dev/null
+++ b/zh/curl-etiquette.md
@@ -0,0 +1,70 @@
+### 邮件列表使用规范
+
+与许多团体一样,我们也有开发指南与邮件列表的使用行为规范。[curl邮件列表使用规范](https://curl.haxx.se/mail/etiquette.html)遵循了传统开源项目的风格。
+
+#### 不要向个人发送邮件
+
+许多人直接向一个人提问。这个人会收到很多邮件,只有他自己对这些邮件进行答复。并且这些问题中存在重复的现象,但是后续的提问者并不能阅读关于某个问题的解答,于是他们会继续提出相同的问题,这时回复者的邮件列表会被塞满。
+
+如果你真的就是想联系一个人,或者为他或她的服务付费,那么当然可以向个人发送邮件。但如果这只是一个关于curl的问题,那就把发送到一个合适的邮件列表上吧。
+
+#### 发送新邮件
+
+请不要贪图快捷直接点击回复邮件的按钮。
+
+许多邮件的客户端都会根据邮件的内容将邮件分门别类,看起来就像一个串联的线路,作为一个讨论特定问题的合集。如果你并没有参与某一问题的想法,请不要点击现有的回复邮件按钮。而是为你的问题创建一个新的邮件。
+
+#### 发送至邮件列表
+
+当你回复一个来自邮件列表上的消息时,要确保你的回复可以让很多人收到,不要只给作者发送一封私人的邮件。
+
+我们正通过将“回复”与“发送邮件”中的地址字段设置为“邮件列表”地址,从而使人们更难以误发作者的邮件。
+
+#### 选取恰当的主题
+
+请根据邮件的内容选取一个合适的主题。这样会让寻找你的邮件容易许多,可以更方便的根据主题寻找到相应的内容。
+
+#### 不要置顶回复
+
+如果你需要回复一条消息,那么请不要采取置顶回复的风格。置顶回复就是:当你在邮件的顶部编写文本时,在内容的下方插入之前的引用的邮件对话,这种方式会迫使用户以相反的顺序阅读邮件。
+
+为什么置顶回复如此糟糕:
+
+ A:因为它打乱了人们阅读文本的顺序。
+ B:为什么置顶回复风格不是很好?
+ A:置顶回复。
+ B:邮件中最讨厌的事情是什么?
+
+除了糟糕的阅读顺序,它还使得只引用原始邮件中的内容变的不可能。
+
+当你回复邮件时,如果你的邮件客户端插入了之前邮件的引用内容。请将光标移动到最下面,删除掉它们。如果你确实想加入一个引用内容,请在行中采用内联的方式去添加。
+
+当你编写完邮件并且删掉了所有的引用时,就大功告成了!
+
+#### 不要发送HTML格式的邮件
+
+有些人为了美观,可能将邮件内容编写成一段HTML。你可以把它发送给你的朋友,但是请不要发送给我们。我们只需要纯净的文本格式邮件。
+
+#### 引用
+
+尽量不要在邮件中引用其他内容,仅仅提供一些不可缺少的引用就足够了。你可以查阅[引用规范](https://www.netmeister.org/news/learn2quote.html)。
+
+#### 摘要
+
+我们允许订阅者们订阅邮件列表的"摘要"版本。摘要是把邮件集中在一起的一种集合。
+
+你应该仔细考虑一下是否将回复的邮件作为一个摘要,如果你无法正常的订阅,那么你必须仔细考虑以下两种情形:
+
+阻止任何与你的问题无关的邮件。
+
+将主题名更改为与主题相关的敏感内容,最好是您想要回复的邮件的实际主题。
+
+#### 描述你解决问题的思路
+
+许多人把问题发送到邮件列表,人们花费一些时间并努力提供这些问题的最优解。
+
+如果你是提问者,在你的问题被解决之后,请回复我们你的问题已经被解决。解答的人感觉很好,因为他们提供了一个好的解决思路,从而你解决了问题。很多时候,提问者永远不会再被人提起,我们也永远不会知道他/她是否因为问题解决了或者问题无法解决而离开了。
+
+这样做也可以帮助其他遇到同样问题的用户。他们起码可以看到,这个解决思路是有效的。
+
+
diff --git a/zh/curl-future.md b/zh/curl-future.md
new file mode 100644
index 000000000..4a037781c
--- /dev/null
+++ b/zh/curl-future.md
@@ -0,0 +1,23 @@
+## Future
+
+
+
+There's no slowdown in sight in curl's future, bugs reported, development
+pace or how Internet protocols are being developed or updated.
+
+We are looking forward to support for more protocols, support for more features
+within the already supported protocols, and more and better APIs for libcurl to
+allow users to do transfers even better and faster.
+
+The project casually maintains a [TODO](https://curl.haxx.se/docs/todo.html)
+file holding a bunch of ideas that we could work on in the future. It also
+keeps a [KNOWN_BUGS](https://curl.haxx.se/docs/knownbugs.html) document with,
+a list of known problems we would like to fix.
+
+There's a [ROADMAP](https://curl.haxx.se/dev/roadmap.html) document that
+describe some plans for the short-term that some of the active developers
+thought they would work on next. Of course, we can not promise that we will
+always follow it perfectly.
+
+We are highly dependent on developers to join in and work on what they want to
+get done, be it bug fixes or new features.
diff --git a/zh/curl-logo.jpg b/zh/curl-logo.jpg
new file mode 100644
index 000000000..4606e788a
Binary files /dev/null and b/zh/curl-logo.jpg differ
diff --git a/zh/curl-maillists.md b/zh/curl-maillists.md
new file mode 100644
index 000000000..93137a445
--- /dev/null
+++ b/zh/curl-maillists.md
@@ -0,0 +1,21 @@
+## 邮件列表
+
+下面是一些重要的邮件列表
+
+### curl-用户
+
+这个是主要负责curl命令行工具的邮件列表,你可以在这里提出问题,你还会在这里发现curl概念、命令参数、所支持网络协议、相关工具的帮助手册。但是自从libcurl库诞生之后,我们就将关于问题、建议、bug讨论这类的邮件转移至curl-library的邮件列表。
+
+地址 https://cool.haxx.se/mailman/listinfo/curl-users
+
+### curl-library
+
+这个是主要负责开发讨论的邮件列表。我们在这里讨论如何在应用中更好的集成使用libcurl库,你会在这里发现很多关于libcurl库的功能、测试、文档上的问题。
+
+地址 https://cool.haxx.se/mailman/listinfo/curl-library
+
+### curl-公告
+
+这个邮件列表只负责关于新版本和安全问题的内容。你可以很轻松的在这里获取curl的最新消息。
+
+地址 https://cool.haxx.se/mailman/listinfo/curl-announce
diff --git a/zh/curl-name.md b/zh/curl-name.md
new file mode 100644
index 000000000..61507d194
--- /dev/null
+++ b/zh/curl-name.md
@@ -0,0 +1,27 @@
+## 项目名称
+
+对于开发者而言,起名确实是一件让人煞费头脑的事情。
+
+这个工具的作用是根据一条指定的URL去下载或者上传数据。默认状态下它还能会将数据展示出来,这让我联想到了字符'c'。因为它本质是就是一款客户端程序(client-side),一款负责URL的客户端。所以'c'代表着客户端。于是我们决定把它命名为:**cURL**。
+
+这个名字干净清爽,言简意赅。我们会一直使用下去,不再做改动。
+
+有趣的是,有人为这个名字提出了一种巧妙绝伦的藏头隐喻!把每一个字符暗含成这样的词汇:Curl URL Request Library!
+
+虽然这个藏头隐喻非常的巧妙,但它其实跟命名过程并任何没有关系。不过我们还是希望我们也能如此聪明。
+
+事实上,有一些其他项目也被命名为了curl。但是在我们为项目命名的时候,我们并不了解这一情况。
+
+### 发音
+
+我们大多数人对于'curl'的发音,会有一个初始k音,就像英语单词curl一样。它很类似于'girl'或者'earl'的发音.《韦氏词典》中有一个很短的[音频](https://media.merriam-webster.com/soundc11/c/curl0001.wav)来帮助你发音。
+
+### 困惑
+
+curl刚创建不久,就出现了另一个“curl”,它是一种编程语言。并且这么语言仍然存在,[这里](http://www.curl.com)可以寻找到它。
+
+有的编程语言或者第三方库使用'curl'或者'CURL'来作为它们自身的某种描述术语。所以你可能会听见有人在谈论'curl',但是却跟我们的命令行工具与以及库没有任何关系。
+
+### 理解为一个动作
+
+'curl一下'有时候可以被理解为通过一条URL去下载文件或者资源,而没有使用浏览器。
\ No newline at end of file
diff --git a/zh/curl-releases.md b/zh/curl-releases.md
new file mode 100644
index 000000000..03311b508
--- /dev/null
+++ b/zh/curl-releases.md
@@ -0,0 +1,23 @@
+
+### 发布
+
+curl发行版意味着对master分支中的所有代码进行打包签名,然后将其放到web站点上供全世界下载。
+
+curl项目是跨平台的。
+
+我们从不提供curl及libcurl的二进制可执行文件,互联网站点上提供的二进制打包文件都是由志愿者们完成的。
+
+curl项目的更新周期为2个月,意味着每两个都会发布一个最新版本的curl,从不间断。有时可能会为了修复一些紧急bug而提前发布最新版本
+
+每一个版本的更新详情都罗列在[版本历史记录](https://curl.haxx.se/changes.html)。
+
+截止到2018年1月,我们已经发布了172版curl。从1999年至今,所有的发布记录都罗列在[发行历史文档](https://curl.haxx.se/docs/releases.html)。
+
+## 每日快照
+
+curl项目目前托管在[GitHub](http://www.github.com/)。您在构建项目时,需要设置或者生成一些东西。我们提供了每日快照,便于您成功的构建项目。
+
+每日快照每天都会更新。里面包含了项目源代码以及构建时所必须的一些文件,您可以查看下载[每日快照](https://curl.haxx.se/snapshots/)用于测试研究。
+
+站点上的每日快照保存时间为20天。
+
diff --git a/zh/curl-security.md b/zh/curl-security.md
new file mode 100644
index 000000000..1904170d9
--- /dev/null
+++ b/zh/curl-security.md
@@ -0,0 +1,28 @@
+## Security
+
+Security is a primary concern for us in the curl project. We take it seriously
+and we work hard on providing secure and safe implementations of all protocols
+and related code. As soon as we get knowledge about a security related problem
+or just a suspected problem, we deal with it and we will attempt to provide a
+fix and security notice no later than in the next pending release.
+
+We use a responsible disclosure policy, meaning that we prefer to discuss and
+work on security fixes out of the public eye and we alert the vendors on the
+openwall.org list a few days before we announce the problem and fix to the
+world. This, in an attempt to shorten the time span the bad guys can take
+advantage of a problem until a fixed version has been deployed.
+
+### Past security problems
+
+During the years we have had our fair share of security related problems. We
+work hard on [documenting every
+problem](https://curl.haxx.se/docs/security.html) thoroughly with all details
+listed and clearly stated to aid users. Users of curl should be able to figure
+out what problems their particular curl versions and use cases are vulnerable
+to.
+
+To help with this, we present [this waterfall
+chart](https://curl.haxx.se/docs/vulnerabilities.html) showing how all
+vulnerabilities affect which curl versions and we have this complete list of
+all known security problems since the birth of this project.
+
diff --git a/zh/curl-started.md b/zh/curl-started.md
new file mode 100644
index 000000000..ad985a650
--- /dev/null
+++ b/zh/curl-started.md
@@ -0,0 +1,13 @@
+## cURL的起源
+
+在1996年,[丹尼尔 斯坦伯格](https://daniel.haxx.se/)正在利用琐碎时间编写一个聊天机器人:一款可以为聊天室提供服务的自动化程序。他突然想到,如果聊天机器人可以为聊天室中的用户提供当前汇率以及兑换外汇的业务,那将非常的有趣。
+
+为了保证汇率的精确性,机器人必须反复的从相关网站上下载最新汇率数据。所以需要一个可以通过HTTP协议来下载相关数据的小工具。很快,丹尼尔发现了一款叫做httpget的小工具(作者是来自巴西的拉斐尔·塞格拉)。httpget只需要稍稍调整就可以胜任这项工作。很快,丹内尔接手了这几百行代码的维护工作。
+
+HttpGet 1.0随后在1997年4月8日发布,并且具有最新的HTTP代理支持。
+
+很快我们实现了“汇率支持”的业务功能,并且还为项目添加了FTP协议下载功能,所以项目也被更名为了urlget2.0,并于1997年8月发布。仅支持HTTP协议的日子成为了历史。
+
+在之后的日子里,项目的功能慢慢完善起来。当上传功能被添加后,项目原有的名称又产生了误导性,所以项目再次被更名为了curl4,并于1998年3月发布(保留了原名称中的版本号)。
+
+我们决定将**1998年3月20日**定为curl项目的生日。
diff --git a/zh/curl-trust.md b/zh/curl-trust.md
new file mode 100644
index 000000000..dcd6077c3
--- /dev/null
+++ b/zh/curl-trust.md
@@ -0,0 +1,27 @@
+## Trust
+
+For a software to conquer the world, it needs to be trusted. It takes trust to
+build more trust and it can all be broken down really fast if the foundation
+is proven to have cracks.
+
+In the curl project we build trust for our users in a few different ways:
+
+1. We are completely transparent about everything. Every decision, every
+ discussion as well as every line of code are always public and done in the
+ open.
+
+2. We try hard to write reliable code. We write test cases, we review code, we
+ document best practices and we have a style guide that helps us keep code
+ consistent.
+
+3. We stick to promises and guarantees as much as possible. We don't break
+ APIs and we don't abandon support for old systems.
+
+4. Security is of utmost importance and we take every reported incident very
+ seriously and realize that we **must** fix all known problems and we need
+ to do it responsibly. We do our best to not endanger our users.
+
+5. We act like adults. We can be silly and we can joke around, but we do it
+ responsibly and we follow our [Code of
+ Conduct](opensource-coc.md). Everyone should be able to even trust us to
+ behave.
diff --git a/zh/curl-users.md b/zh/curl-users.md
new file mode 100644
index 000000000..9d1623193
--- /dev/null
+++ b/zh/curl-users.md
@@ -0,0 +1,98 @@
+## Users of curl
+
+
+
+We used to say that there are a billion users of curl. It makes a good line to
+say but in reality we, of course, don't have any numbers that exact. We just
+estimate and guess based on observations and trends. It also depends on
+exactly what you would consider "a user" to be. Let's elaborate.
+
+### Open Source
+
+The project being Open Source and very liberally licensed means that
+just about anyone can redistribute curl in source format or built into binary
+form.
+
+### Counting downloads
+
+The curl command-line tool and the libcurl library are available for download
+for most operating systems via the curl web site, they are provided via third
+party installers to a bunch and and they come installed by default with yet
+more operating systems. This makes counting downloads from the curl web site
+completely inappropriate as a means of measurement.
+
+### Finding users
+
+So, we can't count downloads and anyone may redistribute it and nobody is
+forced to tell us they use curl. How can we figure out the numbers? How can we
+figure out the users? The answer is that we really can't with any decent level
+of accuracy.
+
+Instead we rely on witness reports, circumstantial evidence, on findings on
+the Internet, the occasional "about box" or license agreement mentioning curl
+or that authors ask for help and tell us about their use.
+
+The curl license says users need to repeat it somewhere, like in the
+documentation, but that's not easy for us to find in many cases and it's also
+not easy for us to do anything about should they decide not to follow the very
+small license requirement.
+
+### Command-line tool users
+
+The command-line tool curl is widely used by programmers around the world in
+shell and batch scripts, to debug servers and to test out things. There's no
+doubt it is used by millions every day.
+
+### Embedded library
+
+libcurl is what makes our project reach the really large volume of users. The
+ability to quickly and easily get client side file transfer abilities into
+your application is desirable for a lot of users, and then libcurl's great
+portability also helps: you can write more or less the same application on a
+wide variety of platforms and you can still keep using libcurl for transfers.
+
+libcurl being written in C with no or just a few required dependencies also
+help to get it used in embedded systems.
+
+libcurl is popularly used in smartphone operating systems, in car infotainment
+setups, in television sets, in set-top boxes, in audio and video equipment such
+as Blu-Ray players and higher-end receivers. It is often used in home routers
+and printers.
+
+A fair number of best-selling games are also using libcurl, on Windows and
+game consoles.
+
+### In web site backends
+
+The libcurl binding for PHP was one of, if not the, first bindings for libcurl
+to really catch on and get used widely. It quickly got adopted as a default
+way for PHP users to transfer data and as it has now been in that position for
+over a decade and PHP has turned out to be a fairly popular technology on the
+Internet (recent numbers indicated that something like a quarter of all sites on
+the Internet uses PHP).
+
+A few really high-demand sites are using PHP and are using libcurl in the
+backend. Facebook and Yahoo are two such sites.
+
+## Famous users
+
+Nothing forces users to tell us they use curl or libcurl in their services or
+in the products. We usually only find out they do by accident, by reading
+about dialogues, documentation and license agreements. Of course some
+companies also just flat out tell us.
+
+We collect names of companies and products on our web site of users that use
+the project's products "in commercial environments". We do this mostly just to
+show-off to other big brands that if these other guys can build products that
+depend on us, maybe you can, too?
+
+The list of companies are well over 200 names, but extracting some of the
+larger or more well-known brands, here's a pretty good list that, of course, is
+only a small selection:
+
+Adobe, Altera, AOL, Apple, AT&T, BBC, Blackberry, BMW, Bosch, Broadcom,
+Chevrolet, Cisco, Comcast, Facebook, Google, Hitachi, Honeywell, HP, Huawei,
+HTC, IBM, Intel, LG, Mazda, Mercedes-Benz, Motorola, Netflix, Nintendo,
+Oracle, Panasonic, Philips, Pioneer, RBS, Samsung, SanDisk, SAP, SAS
+Institute, SEB, Sharp, Siemens, Sony, Spotify, Sun, Swisscom, Tomtom, Toshiba,
+VMware, Xilinx, Yahoo, Yamaha
diff --git a/zh/curl.md b/zh/curl.md
new file mode 100644
index 000000000..00841cf18
--- /dev/null
+++ b/zh/curl.md
@@ -0,0 +1,5 @@
+# cURL工程
+
+
+
+cURL是由一群义务志愿者共同维护的,大家有着一个共同的目标:可靠的数据传输与网络协议。
\ No newline at end of file
diff --git a/zh/curlexamples.md b/zh/curlexamples.md
new file mode 100644
index 000000000..2ffa4f049
--- /dev/null
+++ b/zh/curlexamples.md
@@ -0,0 +1,35 @@
+# curl examples
+
+TBD
+
+## Fetch many variations on a URL
+
+TBD
+
+## Follow redirects automatically
+
+TBD
+
+## Impersonating a specific web browser
+
+TBD
+
+## Issuing a web search
+
+TBD
+
+## Tell the server where you didn't come from
+
+TBD
+
+## Maintain state with cookies
+
+TBD
+
+## Login to a web service with POST
+
+TBD
+
+## Upload a file as with a HTML form
+
+TBD
diff --git a/zh/devgraph-800.png b/zh/devgraph-800.png
new file mode 100644
index 000000000..5f9b180ab
Binary files /dev/null and b/zh/devgraph-800.png differ
diff --git a/zh/firefox-cliget.png b/zh/firefox-cliget.png
new file mode 100644
index 000000000..9437d1689
Binary files /dev/null and b/zh/firefox-cliget.png differ
diff --git a/zh/firefox-copy-as-curl.png b/zh/firefox-copy-as-curl.png
new file mode 100644
index 000000000..52ee7ca64
Binary files /dev/null and b/zh/firefox-copy-as-curl.png differ
diff --git a/zh/ftp-advanced.md b/zh/ftp-advanced.md
new file mode 100644
index 000000000..01f7446a3
--- /dev/null
+++ b/zh/ftp-advanced.md
@@ -0,0 +1,61 @@
+# More advanced FTP
+
+## FTP Directory listing
+
+You can list a remote FTP directory with curl by making sure the URL ends with
+a trailing slash. If the URL ends with a slash, curl will presume that it is a
+directory you want to list. If it isn't actually a directory, you will most
+likely instead get an error.
+
+ curl ftp://ftp.example.com/directory/
+
+With FTP there is no standard syntax for the directory output that is returned
+for this sort of command that uses the standard FTP command `LIST`. The
+listing is usually humanly readable and perfectly understandable but you will
+see that different servers will return the listing in slightly different ways.
+
+One way to get just a listing of all the names in a directory and thus to avoid
+the special formatting of the regular directory listings is to tell curl to
+`--list-only` (or just `-l`). curl then issues the `NLST` FTP command instead:
+
+ curl --list-only ftp://ftp.example.com/directory/
+
+NLST has its own quirks though, as some FTP servers list only actual *files*
+in their response to NLST; they do not include directories and symbolic links!
+
+## Uploading with FTP
+
+To upload to an FTP server, you specify the entire target file path and name
+in the URL, and you specify the local file name to upload with `-T,
+--upload-file`. Optionally, you end the target URL with a slash and then the
+file component from the local path will be appended by curl and used as the
+remote file name.
+
+Like:
+
+ curl -T localfile ftp://ftp.example.com/dir/path/remote-file
+
+or to use the local file name as the remote name:
+
+ curl -T localfile ftp://ftp.example.com/dir/path/
+
+curl also supports [globbing](cmdline-globbing.md) in the -T argument so you
+can opt to easily upload a range or a series of files:
+
+ curl -T image[1-99].jpg ftp://ftp.example.com/upload/
+
+or
+
+ curl -T '{Huey,Dewey,Louie}.jpg' ftp://ftp.example.com/nephews/
+
+## Custom FTP commands
+
+TBD
+
+## FTPS
+
+TBD
+
+## Common FTP problems
+
+TBD
diff --git a/zh/ftp-traversedir.md b/zh/ftp-traversedir.md
new file mode 100644
index 000000000..0b76a8578
--- /dev/null
+++ b/zh/ftp-traversedir.md
@@ -0,0 +1,52 @@
+## How to traverse directories
+
+When doing FTP commands to traverse the remote file system, there are a few
+different ways curl can proceed to reach the target file, the file the user
+wants to transfer.
+
+### multicwd
+
+curl can do one change directory (CWD) command for every individual directory
+down the file tree hierarchy. If the full path is `one/two/three/file.txt`,
+that method means doing three `CWD` commands before asking for the `file.txt`
+file to get transferred. This method thus creates quite a large number of
+commands if the path is many levels deep. This method is mandated by an early
+spec (RFC 1738) and is how curl acts by default:
+
+ curl --ftp-method multicwd ftp://example.com/one/two/three/file.txt
+
+This then equals this FTP command/response sequence (simplified):
+
+ > CWD one
+ < 250 OK. Current directory is /one
+ > CWD two
+ < 250 OK. Current directory is /one/two
+ > CWD three
+ < 250 OK. Current directory is /one/two/three
+ > RETR file.txt
+
+### nocwd
+
+The opposite to doing one CWD for each directory part is to not change the
+directory at all. This method asks the server using the entire path at once
+and is thus very fast. Occasionally servers have a problem with this and it
+isn't purely standards-compliant:
+
+ curl --ftp-method nocwd ftp://example.com/one/two/three/file.txt
+
+This then equals this FTP command/response sequence (simplified):
+
+ > RETR one/two/three/file.txt
+
+### singlecwd
+
+This is the in-between the other two FTP methods. This makes a single `CWD`
+command to the target directory and then it asks for the given file:
+
+ curl --ftp-method singlecwd ftp://example.com/one/two/three/file.txt
+
+This then equals this FTP command/response sequence (simplified):
+
+ > CWD one/two/three
+ < 250 OK. Current directory is /one/two/three
+ > RETR file.txt
diff --git a/zh/ftp-twoconnections.md b/zh/ftp-twoconnections.md
new file mode 100644
index 000000000..832dda03d
--- /dev/null
+++ b/zh/ftp-twoconnections.md
@@ -0,0 +1,59 @@
+## FTP uses two connections
+
+FTP uses two TCP connections! The first connection is setup by the client when
+it connects to an FTP server, and is called the *control connection*. As the
+initial connection, it gets to handle authentication and changing to the
+correct directory on the remote server, etc. When the client then is ready to
+transfer a file, a second TCP connection is established and the data is
+transferred over that.
+
+This setting up of a second connection causes nuisances and headaches for
+several reasons.
+
+### Active connections
+
+The client can opt to ask the server to connect to the client to set it up, a
+so-called "active" connection. This is done with the PORT or EPRT
+commands. Allowing a remote host to connect back to a client on a port that
+the client opens up requires that there's no firewall or other network
+appliance in between that refuses that to go through and that is far from
+always the case. You ask for an active transfer using `curl -P [arg]` (also
+known as `--ftp-port` in long form) and while the option allows you to specify
+exactly which address to use, just setting the same as you come from is almost
+always the correct choice and you do that with `-P -`, like this way to ask
+for a file:
+
+ curl -P - ftp://example.com/foobar.txt
+
+You can also explicitly ask curl to not use EPRT (which is a slightly newer
+command than PORT) with the `--no-eprt` command-line option.
+
+### Passive connections
+
+Curl defaults to asking for a "passive" connection, which means it sends a
+PASV or EPSV command to the server and then the server opens up a new port for
+the second connection that then curl connects to. Outgoing connections to a
+new port are generally easier and less restricted for end users and clients,
+but it then requires that the network in the server's end allows it.
+
+Passive connections are enabled by default, but if you have switched on active
+before, you can switch back to passive with `--ftp-pasv`.
+
+You can also explicitly ask curl not to use EPSV (which is a slightly newer
+command than PASV) with the `--no-epsv` command-line option.
+
+Sometimes the server is running a funky setup so that when curl issues the
+PASV command and the server responds with an IP address for curl to connect
+to, that address is wrong and then curl fails to setup the data
+connection. For this (hopefully rare) situation, you can ask curl to ignore
+the IP address mentioned in the PASV response (`--ftp-skip-pasv-ip`) and
+instead use the same IP address it has for the control connection even for the
+second connection.
+
+### Firewall issues
+
+Using either active or passive transfers, any existing firewalls in the
+network path pretty much have to have stateful inspection of the FTP traffic
+to figure out the new port to open that up and accept it for the second
+connection.
+
diff --git a/zh/how.md b/zh/how.md
new file mode 100644
index 000000000..1d09d2bca
--- /dev/null
+++ b/zh/how.md
@@ -0,0 +1,55 @@
+# 如何去阅读这本书
+
+以下是这篇文档的目录。
+
+## 1. [cURL工程](curl.md)
+
+介绍cURL的诞生历程,作者们如何是如何制作并维护cURL,以及发布频率等等。
+
+## 2. [开源](opensource.md)
+
+对于“开源”的解释说明。
+
+## 3. [源代码](sourcecode.md)
+
+剖析curl的源码结构,以及整个架构如何进行工作。
+
+## 4. [网络与协议](protocols.md)
+
+完整的介绍网络以及网络传输协议。
+
+## 5. [命令行基础](cmdline.md)
+
+如何在命令行中使用curl。
+
+## 6. [使用curl](usingcurl.md)
+
+深入的研究curl命令行工具所做的事情。
+
+## 7. [HTTP协议与curl详解](http.md)
+
+curl中HTTP协议操作大全。
+
+## 8. [搭建与安装](building.md)
+
+如何在源代码中搭建curl与libcurl。
+
+## 9. [libcurl基础](libcurl.md)
+
+libculr如何工作,以及在个人项目中如何使用libcurl。
+
+## 10. [HTTP协议与libcurl详解](libcurl-http.md)
+
+libcurl中HTTP协议操作详解。
+
+## 11. [绑定](bindings.md)
+
+libcurl绑定概览(C语言接口)。
+
+## 12. [libcurl内部构件](internals.md)
+
+libcurl原理详解。
+
+## 13. [索引](bookindex.md)
+
+索引。
diff --git a/zh/http-auth.md b/zh/http-auth.md
new file mode 100644
index 000000000..1e9ad0e87
--- /dev/null
+++ b/zh/http-auth.md
@@ -0,0 +1,57 @@
+# HTTP authentication
+
+Each HTTP request can be made authenticated. If a server or a proxy wants the
+user to provide proof that they have the correct credentials to access a URL or
+perform an action, it can send back a HTTP response code that informs the
+client that it needs to provide a correct HTTP authentication header in the
+request to be allowed.
+
+A server that requires authentication sends back a 401 response code and an
+associated `WWW-Authenticate:` header that lists all the authentication
+methods that the server supports.
+
+An HTTP proxy that requires authentication sends back a 407 response code and
+an associated `Proxy-Authenticate:` header that lists all the authentication
+methods that the proxy supports.
+
+It might be worth to note that most web sites of today do not require HTTP
+authentication for login etc, but they will instead ask users to login on web
+pages and then the browser will issue a POST with the user and password etc,
+and then subsequently maintain cookies for the session.
+
+To tell curl to do an authenticated HTTP request, you use the `-u, --user`
+option to provide user name and password (separated with a colon). Like this:
+
+ curl --user daniel:secret http://example.com/
+
+This will make curl use the default "Basic" HTTP authentication method. Yes,
+it is actually called Basic and it is truly very basic. To explicitly ask for
+the basic method, use `--basic`.
+
+The Basic authentication method sends the user name and password in clear text
+over the network (base64 encoded) and should be avoided for HTTP transport.
+
+When asking to do a HTTP transfer using a single (specified or implied),
+authentication method, curl will insert the authentication header already in
+the first request on the wire.
+
+If you'd rather have curl first *test* if the authentication is really
+required, you can ask curl to figure that out and then automatically use the
+most safe method it knows about with `--anyauth`. This makes curl try the
+request unauthenticated, and then switch over to authentication if necessary:
+
+ curl --anyauth --user daniel:secret http://example.com/
+
+and the same concept works for HTTP operations that may require
+authentication:
+
+ curl --proxy-anyauth --proxy-user daniel:secret http://example.com/ \
+ --proxy http://proxy.example.com:80/
+
+curl typically (a little depending on how it was built) speaks several other
+authentication methods as well, including Digest, Negotiate and NTLM. You can
+ask for those methods too specifically:
+
+ curl --digest --user daniel:secret http://example.com/
+ curl --negotiate --user daniel:secret http://example.com/
+ curl --ntlm --user daniel:secret http://example.com/
diff --git a/zh/http-basics.md b/zh/http-basics.md
new file mode 100644
index 000000000..b247fd5ab
--- /dev/null
+++ b/zh/http-basics.md
@@ -0,0 +1,79 @@
+### HTTP protocol basics
+
+(This assumes you have read the [Network and protocols](protocols.md) section
+or are otherwise already familiar with protocols.)
+
+HTTP is a protocol that is easy to learn the basics of. A client connects to a
+server—and it is always the client that takes the initiative—sends a
+request and receives a response. Both the request and the response consist of
+headers and a body. There can be little or a lot of information going in both
+directions.
+
+An HTTP request sent by a client starts with a request line, followed by
+headers and then optionally a body. The most common HTTP request is probably
+the GET request which asks the server to return a specific resource, and this
+request does not contain a body.
+
+When a client connects to 'example.com' and asks for the '/' resource, it
+sends a GET without a request body:
+
+ GET / HTTP/1.1
+ User-agent: curl/2000
+ Host: example.com
+
+…the server could respond with something like below, with response headers
+and a response body ('hello'). The first line in the response also contains
+the response code and the specific version the server supports:
+
+ HTTP/1.1 200 OK
+ Server: example-server/1.1
+ Content-Length: 5
+ Content-Type: plain/text
+
+ hello
+
+If the client would instead send a request with a small request body
+('hello'), it could look like this:
+
+ POST / HTTP/1.1
+ Host: example.com
+ User-agent: curl/2000
+ Content-Length: 5
+
+ hello
+
+A server always responds to an HTTP request unless something is wrong.
+
+### The URL converted to a request
+
+So when a HTTP client is given a URL to operate on, that URL is then used,
+picked apart and those parts are used in various places in the outgoing
+request to the server. Let's take the an example URL:
+
+ https://www.example.com/path/to/file
+
+ - **https** means that curl will use TLS to the remote port 443 (which is the
+ default port number when no specified is used in the URL).
+
+ - **www.example.com** is the host name that curl will resolve to one or more IP
+ address to connect to. This host name will also be used in the HTTP request in
+ the `Host:` header.
+
+ - **/path/to/file** is used in the HTTP request to tell the server which exact
+ document/resources curl wants to fetch
+
+### --path-as-is
+
+The path part of the URL is the part that starts with the first slash after
+the host name and ends either at the end of the URL or at a '?' or '#'
+(roughly speaking).
+
+If you include substrings including `/../` or `/./` in the path, curl will
+automatically squash them before the path is sent to the server, as is
+dictated by standards and how such strings tend to work in local file
+systems. The `/../` sequence will remove the previous section so that
+`/hello/sir/../` ends up just `/hello/` and `/./` is simply removed so that
+`/hello/./sir/` becomes `/hello/sir/`.
+
+To *prevent* curl from squashing those magic sequences before they are sent to
+the server and thus allow them through, the `--path-as-is` option exists.
diff --git a/zh/http-cheatsheet.md b/zh/http-cheatsheet.md
new file mode 100644
index 000000000..506f69492
--- /dev/null
+++ b/zh/http-cheatsheet.md
@@ -0,0 +1,17 @@
+# curl HTTP cheat sheet
+
+[online here](https://bagder.github.io/curl-cheat-sheet/http-sheet.html)
+
+| Verbose | Hide progress | extra info | Write output | Timeout
+|----------------------|-------------------------|-------------------|------------------|--------------
+| -v | -s | -w "format" | -O | -m
+| --trace-ascii | | | -o |
+| **POST** | **multipart** | **PUT** | **HEAD** | **custom**
+| -d "string" | -F name=value | -T | -I | -X "METHOD"
+| -d @file | -F name=@file | | |
+| **Basic auth** | **read cookies** | **write cookies** | **send cookies** | **user-agent**
+| -u user:password | -b | -c | -b "c=1; d=2" | -A "string"
+| **Use proxy** | **Headers, add/remove** | **follow redirs** | **gzip** | **insecure**
+| -x | -H "name: value" | -L | --compressed | -k
+| | -H "name:" | | |
+
diff --git a/zh/http-cookies.md b/zh/http-cookies.md
new file mode 100644
index 000000000..676229448
--- /dev/null
+++ b/zh/http-cookies.md
@@ -0,0 +1,96 @@
+## Cookies
+
+HTTP cookies are key/value pairs that a client stores on the behalf of a
+server. They are sent back in subsequent requests to
+allow clients to keep state between requests. Remember that the HTTP protocol
+itself has no state but instead the client has to resend all data in subsequent
+requests that it wants the server to be aware of.
+
+Cookies are set by the server with the `Set-Cookie:` header and with each
+cookie the server sends a bunch of extra properties that need to match for the
+client to send the cookie back. Like domain name and path and perhaps most
+important for how long the cookie should live on.
+
+The expiry of a cookie is either set to a fixed time in the future (or to live
+a number of seconds) or it gets no expiry at all. A cookie without an expire
+time is called a "session cookie" and is meant to live for the duration of the
+"session" but not longer. A session in this aspect is typically thought to be
+the life time of the browser used to view a site. When you close the
+browser, you end your session. Doing HTTP operations with a command-line client
+that supports cookies begs the question of when a session really ends…
+
+### Cookie engine
+
+The general concept of curl only doing the bare minimum unless you tell it
+differently makes it not acknowledge cookies by default. You need to switch on
+"the cookie engine" to make curl keep track of cookies it receives and then
+subsequently send them out on requests that have matching cookies.
+
+You enable the cookie engine by asking curl to read or write cookies. If you
+tell curl to read cookies from a non-existing file, you will only switch on
+the engine but start off with an empty internal cookie store:
+
+ curl -b non-existing http://example.com
+
+But just switching on the cookie engine, getting a single resource and then
+quitting would be pointless as curl would have no chance to actually send any
+cookies it received. Assuming the site in this example would set cookies and
+then do a redirect we would do:
+
+ curl -L -b non-existing http://example.com
+
+### Reading cookies from file
+
+Starting off with a blank cookie store may not be desirable. Why not start off
+with cookies you stored in a previous fetch or that you otherwise acquired?
+The file format curl uses for cookies is called the Netscape cookie format
+because it was once the file format used by browsers and then you could easily
+tell curl to use the browser's cookies!
+
+As a convenience, curl also supports a cookie file being a set of HTTP
+headers that set cookies. It's an inferior format but may be the only thing
+you have.
+
+Tell curl which file to read the initial cookies from:
+
+ curl -L -b cookies.txt http://example.com
+
+Remember that this only *reads* from the file. If the server would update the
+cookies in its response, curl would update that cookie in its in-memory store
+but then eventually throw them all away when it exits and a subsequent invocation
+of the same input file would use the original cookie contents again.
+
+### Writing cookies to file
+
+The place where cookies are stored is sometimes referred to as the "cookie
+jar". When you enable the cookie engine in curl and it has received cookies,
+you can instruct curl to write down all its known cookies to a file, the
+cookie jar, before it exists. It is important to remember that curl only
+updates the output cookie jar on exit and not during its lifetime, no matter
+how long the handling of the given input takes.
+
+You point out the cookie jar output with `-c`:
+
+ curl -c cookie-jar.txt http://example.com
+
+`-c` is the instruction to *write* cookies to a file, `-b` is the instruction
+to *read* cookies from a file. Oftentimes you want both.
+
+When curl writes cookies to this file, it will save all known cookies
+including those that are session cookies (without a given lifetime). curl
+itself has no notion of a session and it doesn't know when a session ends so
+it will not flush session cookies unless you tell it to.
+
+### New cookie session
+
+Instead of telling curl when a session ends, in order to flush session cookies
+and with this basically signal to the server that we are starting a new
+session, curl features an option that lets the user decide when a new session
+begins.
+
+A new cookie session means that all the session cookies will be thrown
+away. It is the equivalent of closing a browser and starting it up again.
+
+Tell curl a new cookie session starts by using `-j, --junk-session-cookies`:
+
+ curl -j -b cookies.txt http://example.com/
diff --git a/zh/http-http2.md b/zh/http-http2.md
new file mode 100644
index 000000000..54acdf375
--- /dev/null
+++ b/zh/http-http2.md
@@ -0,0 +1,38 @@
+## HTTP/2
+
+curl supports HTTP/2 for both HTTP:// and HTTPS:// URLs assuming that curl was
+built with the proper prerequisites. It will even default to using HTTP/2 when
+given a HTTPS URL since doing so implies no penalty and when curl is used with
+sites that don't support HTTP/2 the request will instead negotiate HTTP/1.1.
+
+With HTTP:// URLs however, the upgrade to HTTP/2 is done with an `Upgrade:`
+header that may cause an extra round-trip and perhaps even more troublesome, a
+sizable share of old servers will return a 400 response when seeing such a
+header.
+
+It should also be noted that some (most?) servers that support HTTP/2 for
+HTTP:// (which in itself isn't all servers) will not acknowledge the
+`Upgrade:` header on POST, for example.
+
+To ask a server to use HTTP/2, just:
+
+ curl --http2 http://example.com/
+
+If your curl doesn't support HTTP/2, that command line will return an error
+saying so. Running `curl -V` will show if your version of curl supports it.
+
+If you by some chance already know that your server speaks HTTP/2 (for example,
+within your own controlled environment where you know exactly what runs in
+your machines) you can shortcut the HTTP/2 "negotiation" with
+`--http2-prior-knowledge`.
+
+### Multiplexing
+
+One of the primary features in the HTTP/2 protocol is the ability to multiplex
+several logical stream over the same physical connection. When using the curl
+command-line tool, you cannot take advantage of that cool feature since curl
+is doing all its network requests in a strictly serial manner, one after the
+next, with the second only ever starting once the previous one has ended.
+
+Hopefully, a future curl version will be enhanced to allow the use of this
+feature.
diff --git a/zh/http-https.md b/zh/http-https.md
new file mode 100644
index 000000000..a07448804
--- /dev/null
+++ b/zh/http-https.md
@@ -0,0 +1,10 @@
+# HTTPS
+
+HTTPS is in effect Secure HTTP. The "secure" part means that the TCP transport
+layer is enhanced to provide authentication, privacy (encryption) and data
+integrity by the use of TLS.
+
+See the [Using TLS](usingcurl-tls.md) section for in-depth details on how to
+modify and tweak the TLS details in a HTTPS transfer.
+
+
diff --git a/zh/http-multipart.md b/zh/http-multipart.md
new file mode 100644
index 000000000..5d1d1c831
--- /dev/null
+++ b/zh/http-multipart.md
@@ -0,0 +1,104 @@
+## HTTP multipart formposts
+
+A multipart formpost is what an HTTP client sends when an HTML form is
+submitted with *enctype* set to "multipart/form-data".
+
+It is an HTTP POST request sent with the request body specially formatted as a
+series of "parts", separated with MIME boundaries.
+
+An example piece of HTML would look like this:
+
+
+
+Which could look something like this in a web browser:
+
+
+
+A user can fill in text in the 'Name' field and by pressing the 'Browse'
+button a local file can be selected that will be uploaded when 'Submit' is
+pressed.
+
+### Sending such a form with curl
+
+With curl, you add each separate multipart with one `-F` (or `--form`) flag
+and you then continue and add one -F for every input field in the form that
+you want to send.
+
+The above small example form has two parts, one named 'person' that is a plain
+text field and one named 'secret' that is a file.
+
+Send your data to that form like this:
+
+ curl -F person=anonymous -F secret=@file.txt http://example.com/submit.cgi
+
+### The HTTP this generates
+
+The **action** specifies where the POST is sent. **method** says it is a POST
+and **enctype** tells us it is a multipart formpost.
+
+With the fields filled in as shown above, curl generates and sends these HTTP
+request headers to the host example.com:
+
+ POST /submit.cgi HTTP/1.1
+ Host: example.com
+ User-Agent: curl/7.46.0
+ Accept: */*
+ Content-Length: 313
+ Expect: 100-continue
+ Content-Type: multipart/form-data; boundary=------------------------d74496d66958873e
+
+**Content-Length**, of course, tells the server how much data to expect. This
+example's 313 bytes is really small.
+
+The **Expect** header is explained in the [HTTP POST](http-post.md) chapter.
+
+The **Content-Type** header is a bit special. It tells that this is a
+multipart formpost and then it sets the "boundary" string. The boundary string
+is a line of characters with a bunch of random digits somewhere in it, that
+serves as a separator between the different parts of the form that will be
+submitted. The particular boundary you see in this example has the random part
+`d74496d66958873e` but you will, of course, get something different when you run
+curl (or when you submit such a form with a browser).
+
+So after that initial set of headers follows the request body
+
+ --------------------------d74496d66958873e
+ Content-Disposition: form-data; name="person"
+
+ anonymous
+ --------------------------d74496d66958873e
+ Content-Disposition: form-data; name="secret"; filename="file.txt"
+ Content-Type: text/plain
+
+ contents of the file
+ --------------------------d74496d66958873e--
+
+Here you clearly see the two parts sent, separated with the boundary
+strings. Each part starts with one or more headers describing the individual
+part with its name and possibly some more details. Then after the part's
+headers come the actual data of the part, without any sort of encoding.
+
+The last boundary string has two extra dashes `--` appended to signal the end.
+
+### Content-Type
+
+POSTing with curl's -F option will make it include a default Content-Type
+header in its request, as shown in the above example. This says
+`multipart/form-data` and then specifies the MIME boundary string. That
+content-type is the default for multipart formposts but you can, of course,
+still modify that for your own commands and if you do, curl is clever enough
+to still append the boundary magic to the replaced header. You can't really
+alter the boundary string, since curl needs that for producing the POST
+stream.
+
+To replace the header, use `-H` like this:
+
+ curl -F 'name=Dan' -H 'Content-Type: multipart/magic' https://example.com
+
+### Converting an HTML form
+
+TBD
diff --git a/zh/http-post.md b/zh/http-post.md
new file mode 100644
index 000000000..6a8861e5b
--- /dev/null
+++ b/zh/http-post.md
@@ -0,0 +1,213 @@
+## HTTP POST
+
+POST is the HTTP method that was invented to send data to a receiving web
+application, and it is how most common HTML forms on the web
+works. It usually sends a chunk of relatively small amounts of data to the
+receiver.
+
+When the data is sent by a browser after data have been filled in a form, it
+will send it "URL encoded", as a serialized name=value pairs separated with
+ampersand symbols ('&'). You send such data with curl's `-d` or `--data`
+option like this:
+
+ curl -d 'name=admin&shoesize=12' http://example.com/
+
+When specifying multiple `-d` options on the command line, curl will
+concatenate them and insert ampersands in between, so the above example could
+also be made like this:
+
+ curl -d name=admin -d shoesize=12 http://example.com/
+
+If the amount of data to send isn't really fit to put in a mere string on the
+command line, you can also read it off a file name in standard curl style:
+
+ curl -d @filename http://example.com
+
+### Content-Type
+
+POSTing with curl's -d option will make it include a default header that looks
+like `Content-Type: application/x-www-form-urlencoded`. That's what your
+typical browser will use for a plain POST.
+
+Many receivers of POST data don't care about or check the Content-Type header.
+
+If that header is not good enough for you, you should, of course, replace that
+and instead provide the correct one. Such as if you POST JSON to a server and
+want to more accurately tell the server about what the content is:
+
+ curl -d '{json}' -H 'Content-Type: application/json' https://example.com
+
+### POSTing binary
+
+When reading from a file, `-d` will strip out carriage return and
+newlines. Use `--data-binary` if you want curl to read and use the given file
+in binary exactly as given:
+
+ curl --data-binary @filename http://example.com/
+
+### URL encoding
+
+Percent-encoding, also known as URL encoding, is technically a mechanism for
+encoding data so that it can appear in URLs. This encoding is typically used
+when sending POSTs with the `application/x-www-form-urlencoded` content type,
+such as the ones curl sends with `--data` and `--data-binary` etc.
+
+The command-line options mentioned above all require that you provide properly
+encoded data, data you need to make sure already exists in the right format.
+While that gives you a lot of freedom, it is also a bit inconvenient at times.
+
+To help you send data you haven't already encoded, curl offers the
+`--data-urlencode` option. This option offers several different ways to URL
+encode the data you give it.
+
+You use it like `--data-urlencode data` in the same style as the other --data
+options. To be CGI-compliant, the **data** part should begin with a name
+followed by a separator and a content specification. The **data** part can be
+passed to curl using one of the following syntaxes:
+
+ - "content": This will make curl URL encode the content and pass that
+ on. Just be careful so that the content doesn't contain any = or @ symbols,
+ as that will then make the syntax match one of the other cases below!
+
+ - "=content": This will make curl URL encode the content and pass that
+ on. The initial '=' symbol is not included in the data.
+
+ - "name=content": This will make curl URL encode the content part and pass
+ that on. Note that the name part is expected to be URL encoded already.
+
+ - "@filename": This will make curl load data from the given file (including
+ any newlines), URL encode that data and pass it on in the POST.
+
+ - "name@filename": This will make curl load data from the given file
+ (including any newlines), URL encode that data and pass it on in the POST.
+ The name part gets an equal sign appended, resulting in
+ name=urlencoded-file-content. Note that the name is expected to be URL
+ encoded already.
+
+As an example, you could POST a name to have it encoded by curl:
+
+ curl --data-urlencode "name=John Doe (Junior)" http://example.com
+
+…which would send the following data in the actual request body:
+
+ name=John%20Doe%20%28Junior%29
+
+If you store the string `John Doe (Junior)` in a file named `contents.txt`,
+you can tell curl to send that contents URL encoded using the field name
+'user' like this:
+
+ curl --data-urlencode user@contents.txt http://example.com
+
+In both these examples above, the field name is not URL encoded but is passed
+on as-is. If you want to URL encode the field name as well, like if you want
+to pass on a field name called "user name", you can ask curl to encode the
+entire string by prefixing it with an equals sign (that will not get sent):
+
+ curl --data-urlencode "=user name=John Doe (Junior)" http://example.com
+
+### Convert that to a GET
+
+A little convenience feature that could be suitable to mention in this context
+(even though it isn't for POSTing), is the `-G` or `--get` option, which takes
+all data you have specified with the different `-d` variants and appends that
+data on the right end of the URL separated with a '?' and then makes curl send
+a GET instead.
+
+This option makes it easy to switch between POSTing and GETing a form, for
+example.
+
+### Expect 100-continue
+
+HTTP has no proper way to stop an ongoing transfer (in any direction) and
+still maintain the connection. So, if we figure out that the transfer had better
+stop after the transfer has started, there are only two ways to proceed: cut the
+connection and pay the price of reestablishing the connection again for the next
+request, or keep the transfer going and waste bandwidth but be able to reuse
+the connection next time.
+
+One example of when this can happen is when you send a large file over HTTP,
+only to discover that the server requires authentication and immediately sends
+back a 401 response code.
+
+The mitigation that exists to make this scenario less frequent is to have
+curl pass on an extra header, `Expect: 100-continue`, which gives the server a
+chance to deny the request before a lot of data is sent off. curl sends this
+Expect: header by default if the POST it will do is known or suspected to be
+larger than just minuscule. curl also does this for PUT requests.
+
+When a server gets a request with an 100-continue and deems the request fine,
+it will respond with a 100 response that makes the client continue. If the
+server doesn't like the request, it sends back response code for the error it
+thinks it is.
+
+Unfortunately, lots of servers in the world don't properly support the Expect:
+header or don't handle it correctly, so curl will only wait 1000 milliseconds
+for that first response before it will continue anyway.
+
+Those are 1000 wasted milliseconds. You can then remove the use of Expect:
+from the request and avoid the waiting with `-H`:
+
+ curl -H Expect: -d "payload to send" http://example.com
+
+In some situations, curl will inhibit the use of the Expect header if the
+content it is about to send is very small (like below one kilobyte), as having
+to "waste" such a small chunk of data is not considered much of a problem.
+
+### Chunked encoded POSTs
+
+When talking to a HTTP 1.1 server, you can tell curl to send the request body
+without a `Content-Length:` header upfront that specifies exactly how big the
+POST is. By insisting on curl using chunked Transfer-Encoding, curl will send
+the POST "chunked" piece by piece in a special style that also sends the size
+for each such chunk as it goes along.
+
+You send a chunked POST with curl like this:
+
+ curl -H "Transfer-Encoding: chunked" -d "payload to send" http://example.com
+
+### Hidden form fields
+
+This chapter has explained how sending a post with `-d` is the equivalent of
+what a browser does when an HTML form is filled in and submitted.
+
+Submitting such forms is a very common operation with curl; effectively, to have
+curl fill in a web form in an automated fashion.
+
+If you want to submit a form with curl and make it look as if it has been done
+with a browser, it is important to provide all the input fields from the
+form. A very common method for web pages is to set a few hidden input fields
+to the form and have them assigned values directly in the HTML. A successful
+form submission, of course, also includes those fields and in order to do that
+automatically you may be forced to first download the HTML page that holds the
+form, parse it, and extract the hidden field values so that you can send them
+off with curl.
+
+### Figure out what a browser sends
+
+A very common shortcut is to simply fill in the form with your browser and
+submit it and check in the browser's network development tools exactly what it
+sent.
+
+A slightly different way is to save the HTML page containing the form, and
+then edit that HTML page to redirect the 'action=' part of the form to your
+own server or a test server that just outputs exactly what it gets. Completing
+that form submission will then show you exactly how a browser sends it.
+
+A third option is, of course, to use a network capture tool such as Wireshark to
+check exactly what is sent over the wire. If you are working with HTTPS, you
+can't see form submissions in clear text on the wire but instead you need to
+make sure you can have Wireshark extract your TLS private key from your
+browser. See the Wireshark documentation for details on doing that.
+
+### JavaScript and forms
+
+A very common mitigation against automated "agents" or scripts using curl is
+to have the page with the HTML form use JavaScript to set values of some input
+fields, usually one of the hidden ones. Often, there's some
+JavaScript code that executes on page load or when the submit button is
+pressed which sets a magic value that the server then can verify
+before it considers the submission to be valid.
+
+You can usually work around that by just reading the JavaScript code and redoing
+that logic in your script. Using the above mentioned tricks to check exactly
+what a browser sends is then also a good help.
diff --git a/zh/http-postvspost.md b/zh/http-postvspost.md
new file mode 100644
index 000000000..19bb4045e
--- /dev/null
+++ b/zh/http-postvspost.md
@@ -0,0 +1,42 @@
+# -d vs -F
+
+Previous chapters talked about [regular POST](http-post.md) and [multipart
+formpost](http-multipart.md), and in your typical command lines you do them
+with `-d` or `-F`.
+
+But when do you use which of them?
+
+As described in the chapters mentioned above, both these options send the
+specified data to the server. The difference is in how the data is
+formatted over the wire. Most of the time, the receiving end is written to
+expect a specific format and it expects that the sender formats and sends the
+data correctly. A client cannot just pick a format of its own choice.
+
+## HTML web forms
+
+When we are talking browsers and HTML, the standard way is to offer a form to
+the user that sends off data when the form has been filled in. The `