第 1 章 cURL项目

第 1 章 cURL项目

开源项目比较有趣的一点是,它们通常被称为“项目”,好像它们在某种程度上也会受到时间的限制或者永远无法完成一样。cURL“项目”团队实际上是由一些致力于软件开发的个人志愿者组成的,他们肩负着共同的使命:使用网络协议进行可靠的数据传输,并提供任何人都可以使用的免费代码。

1.1 它是如何开始的

早在1996年,我就在业余时间开发了一个IRC机器人。它是一个自动化程序,为运行在Amiga计算机(IRC网络EFnet上的#amiga)上的聊天室用户提供服务。后来,我觉得让机器人为聊天室用户提供实时在线汇率服务会非常有趣,比如用户可以让机器人“将200美元换成瑞典克朗”。

为了让汇率尽可能准确,机器人每天从汇率网站下载汇率数据。要想完成这个任务,需要使用一个小工具通过HTTP下载数据。当时,我找到了一款名为HttpGet的小工具(由巴西人Rafael Sagula开发)。这个工具可以用于下载数据,只是需要做一些调整。我很快就接管了这个工具几百行代码的维护任务。

1997年4月8日,HttpGet 1.0发布,它提供了全新的HTTP代理支持。

很快,这个工具就支持了通过GOPHER获取汇率数据。添加FTP下载支持后,我们修改了项目名称,并于1997年8月发布了urlget 2.0。至此,只支持HTTP的日子一去不复返了。

这个项目逐渐发展壮大。添加上传功能后,由于名字容易引起误解,我们进行了第二次改名,并于1998年3月20日发布了curl 4(保留了之前的版本编号)。

我们认为1998年3月20日才是curl的生日。

1.2 命名问题

命名是一件很困难的事。

这个工具用于上传和下载URL指定的数据。它会显示数据(默认情况下),用户可以看到(see)URL,并且see可以简写为单个字母c。此外,它是一个客户端程序,一个URL客户端,字母c也可以表示客户端(client),因此就有了cURL这个名字。

这些已经足够了,所以就选择了这个名字,并且再也没有改过。

后来,有人指出,curl实际上可以是一个聪明的“递归缩写”(缩写词中的第一个字母指向缩写词本身):“Curl URL Request Library”。

虽然这个想法很棒,但实际上与最初的想法不一样了。我们倒是希望自己有那么聪明……

其他项目也以各种方式在使用curl这个名字,但在命名curl时,我们并不知道这些。

1.2.1 发音问题

大多数人用k作为curl的开头音,就像英语单词curl那样。它与girl和earl很押韵。

1.2.2 混淆

创建curl不久后,另一个“curl”出现了,它是一门编程语言,现在仍然存在。

一些其他语言的libcurl绑定也使用术语curl或CURL来描述它们的绑定,因此,有时候你会发现当有人正在讨论curl时,可能指的并不是这个项目生成的命令行工具或库。

1.2.3 作为动词

有时候,“curl一些东西”指的是使用非浏览器工具下载URL指定的文件或资源。

1.3 curl可以做什么

cURL项目的主要目的和侧重点围绕着两个产品展开:

  • 命令行工具curl;
  • 提供C API的libcurl库。

这个工具和库都基于网络协议,为指定的URL资源执行网络传输。

curl关心所有与网络协议传输相关的东西,那些与此无关的就留给其他项目和产品去操心吧。

curl和libcurl试图避免直接处理被传输的数据。例如,它们对HTML或通过HTTP传输的内容一无所知,只知道如何通过HTTP传输这些数据。

这两个产品不仅用于驱动互联网世界的数百万个脚本和应用程序,而且广泛应用于服务器测试、协议探测和尝试新事物。

libcurl库可以用于各种需要网络传输的嵌入式设备:车载信息娱乐系统、电视机、蓝光播放器、机顶盒、打印机、路由器、游戏系统等。

1.3.1 命令行工具curl

curl通过命令行运行。我只考虑使用可以将数据输出到stdout(终端)的工具。我一直信奉Unix哲学中的“一切皆管道”。像cat或其他Unix工具一样,curl将数据发送到stdout,以便与其他工具一起实现你想要的效果。所以,curl提供的那些支持从文件读取数据或将数据写入文件的选项,也支持将数据写到stdout或从stdin读取数据。

贯彻Unix命令行工具的一贯风格,curl也可支持多个URL。

curl可以被完美地应用在脚本或自动化程序中。它不提供GUI或UI,只支持输入文本和输出文本。

1.3.2 libcurl库

2000年,curl的核心引擎被抽离成一个库,同年8月,libcurl 7.1发布,其中包含了所有沿用至今的概念。从那时起,curl就成了一个基于libcurl构建命令行工具的逻辑层。

想要在软件、平台、架构中添加客户端文件传输功能的人都可以使用libcurl,这也是libcurl的设计目标。libcurl的许可协议非常自由,避免给人们带来任何麻烦。

libcurl是用传统的C语言开发的,不过也有使用其他语言开发的版本,人们为其他语言创建了相应的libcurl绑定。

1.4 开发团队

我是该项目的创始人和负责人。后来,陆陆续续有其他人加入到项目的贡献行列中,一些贡献者在开发了一段时间之后又离开了。大多数贡献者只是短暂停留,修复了一些错误或添加了一些新功能。算上所有已知姓名的贡献者,共有近2000人1为这个项目做出了贡献。

1这个数据统计截止到2019年7月29日。——编者注

在过去几年中,以下这些人经常出现在讨论和代码提交者名单中:

  • 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

1.5 curl的用户

我们曾经说过curl有十亿用户,但实际上这并不是一个确切的数字。我们只是基于一些观察和趋势进行了估算和猜测。当然,这还取决于你所认为的“用户”指的是什么。

1.5.1 开源

这个项目是开源的,并且其发行许可非常自由,几乎任何人都可以重新发行curl的源代码或二进制文件。

1.5.2 下载量

用户可以从curl网站下载适用于大多数操作系统的curl命令行工具和libcurl库,也可以通过第三方安装程序来安装,而且越来越多的操作系统默认安装了这些工具。因此,只通过curl网站计算下载量并不能准确地反映实际的数字。

1.5.3 找出用户

因此,我们无法准确地计算下载量,因为任何人都可以进行重新发行,人们也没有义务告诉我们,他们是否使用了curl。那么如何才能算出这些数字?如何找出用户?答案是,我们根本无法获得准确的数字。

不过,我们可以依赖目击者报告、间接证据、互联网上的调查结果、偶尔发现的“关于”对话框、提及curl的许可协议,或者开发者在寻求帮助时会告诉我们他们正在使用curl。

curl的许可协议要求用户在使用时写明他们正在使用curl(比如在文档中),但在很多情况下,我们不知道用户是否照做了,如果他们不遵守这个小小的许可要求,我们也没有办法。

1.5.4 命令行工具用户

世界各地的程序员在shell和批处理脚本中使用curl,用来调试服务器或执行测试。毫无疑问,每天都有数百万人使用它。

1.5.5 嵌入式库

因为有了libcurl,我们的项目才会被大量用户采用。很多用户希望能够快速又轻松地将客户端文件传输功能添加到应用程序中,而libcurl的可移植性帮了大忙:你可以在各种平台上开发大致相同的应用程序,并保持使用libcurl进行数据传输。

libcurl是用C语言开发的,几乎没有或只有少量依赖项,因此很容易被用在嵌入式系统中。

libcurl被广泛地应用在智能手机操作系统、车载信息娱乐系统、电视机、机顶盒、蓝光播放器和高端接收器等音频和视频设备中,也常用于家用路由器和打印机。

Windows和游戏主机上也有大量畅销游戏在使用libcurl。

1.5.6 网站后端

用于PHP的libcurl绑定是libcurl的第一批真正得到了广泛应用的绑定之一。它很快就成了PHP用户传输数据的默认方式,由于这样的状态保持了十多年,PHP已经被证明是互联网领域相当流行的技术(最近的数据显示,大概四分之一的网站都在使用PHP)。

一些流量很大的站点也在使用PHP,并在后端使用了libcurl,比如Facebook和雅虎。

1.5.7 著名的用户

用户没有义务告诉我们他们是否在服务或产品中使用了curl或libcurl。我们通常只能通过对话、文档和许可协议偶然发现他们正在使用curl或libcurl。当然,也有一些公司会直接告诉我们。

我们在网站上收集了在“商业环境”中使用这些工具的公司和产品名称。这样做主要是为了告诉其他大品牌:如果这些公司可以基于这些工具构建产品,你们也可以。

名单中有200多家公司,以下列出的是比较大或比较著名的品牌。当然,它们只是其中的一小部分:

Adobe、Altera、AOL、苹果、AT&T、BBC、Blackberry、宝马、博世、Broadcom、雪佛兰、思科、康卡斯特、Facebook、谷歌、日立、霍尼韦尔、惠普、华为、HTC、IBM、英特尔、LG、马自达、梅赛德斯奔驰、摩托罗拉、Netflix、任天堂、甲骨文、松下、飞利浦、先锋、RBS、三星、SanDisk、SAP、SAS研究所、SEB、夏普、西门子、索尼、Spotify、Sun、Swisscom、Tomtom、东芝、VMware、Xilinx、雅虎、雅马哈。

目录

  • 版权声明
  • 前言
  • 第 1 章 cURL项目
  • 第 2 章 命令行基础
  • 第 3 章 使用curl
  • 第 4 章 用curl执行HTTP操作
  • 第 5 章 构建和安装
  • 第 6 章 libcurl基础
  • 第 7 章 用libcurl执行HTTP操作
  • 第 8 章 语言绑定