{"id":9241,"date":"2016-09-06T11:04:51","date_gmt":"2016-09-06T09:04:51","guid":{"rendered":"https:\/\/daniel.haxx.se\/blog\/?p=9241"},"modified":"2016-09-06T13:58:05","modified_gmt":"2016-09-06T11:58:05","slug":"my-first-20-years-of-http","status":"publish","type":"post","link":"https:\/\/daniel.haxx.se\/blog\/2016\/09\/06\/my-first-20-years-of-http\/","title":{"rendered":"My first 20 years of HTTP"},"content":{"rendered":"<p>During the autumn 1996 I took my first swim in the ocean known as HTTP. Twenty years ago now.<\/p>\n<p>I had previously worked with writing an <a href=\"http:\/\/dancer.sourceforge.net\/\">IRC bot in C<\/a>, and IRC is a pretty <a href=\"https:\/\/tools.ietf.org\/html\/rfc1459\">simple text based protocol<\/a> over TCP so I could use some experiences from that when I started to look into HTTP. That IRC bot was my first real application distributed to the world that was using TCP\/IP. It was portable to most unixes and Amiga and it was open source.<\/p>\n<p>1996 was the year the movie <a href=\"http:\/\/www.imdb.com\/title\/tt0116629\/\">Independence Day<\/a> premiered and the single hit song that plagued the world more than others that year was called <a href=\"https:\/\/en.wikipedia.org\/wiki\/Billboard_Year-End_Hot_100_singles_of_1996\">Macarena<\/a>. AOL, Webcrawler and Netscape <a href=\"https:\/\/www.washingtonpost.com\/news\/the-intersect\/wp\/2014\/12\/15\/from-lycos-to-ask-jeeves-to-facebook-tracking-the-20-most-popular-web-sites-every-year-since-1996\/\">were the most popular websites<\/a> on the Internet. There were <a href=\"http:\/\/www.internetlivestats.com\/total-number-of-websites\/\">less than 300,000 web sites<\/a> on the Internet (compared to some 900 million today).<\/p>\n<p>I decided I should spice up the bot and make it offer a currency exchange rate service so that people who were chatting could ask the bot what 200 SEK is when converted to USD or what 50 AUD might be in DEM. &#8211; <em>Right, there was no Euro currency yet back then!<\/em><\/p>\n<p>I simply had to fetch the currency rates at a regular interval and keep them in the same server that ran the bot. I just needed a little tool to download the rates over HTTP. How hard can that be? I googled around (this was before Google existed so that was not the search engine I could use!) and found a tool named &#8216;httpget&#8217; that made pretty much what I wanted. It truly was tiny &#8211; a few hundred <a href=\"https:\/\/daniel.haxx.se\/blog\/wp-content\/uploads\/2016\/09\/nokia-1610.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-9278 alignright\" src=\"https:\/\/daniel.haxx.se\/blog\/wp-content\/uploads\/2016\/09\/nokia-1610-266x450.jpg\" alt=\"nokia-1610\" width=\"157\" height=\"266\" srcset=\"https:\/\/daniel.haxx.se\/blog\/wp-content\/uploads\/2016\/09\/nokia-1610-266x450.jpg 266w, https:\/\/daniel.haxx.se\/blog\/wp-content\/uploads\/2016\/09\/nokia-1610-118x200.jpg 118w, https:\/\/daniel.haxx.se\/blog\/wp-content\/uploads\/2016\/09\/nokia-1610.jpg 413w\" sizes=\"auto, (max-width: 157px) 100vw, 157px\" \/><\/a>lines of code.<\/p>\n<p>I don&#8217;t have an exact date saved or recorded for when this happened, only the general time frame. You know, we had no smart phones, no Google calendar and no digital cameras. I sported my first mobile phone back then, the sexy Nokia 1610 &#8211; viewed in the picture on the right here.<\/p>\n<p>The HTTP\/1.0 RFC had just recently came out &#8211; which was the first ever real spec published for HTTP. <a href=\"https:\/\/tools.ietf.org\/html\/rfc1945\">RFC 1945<\/a> was published in May 1996, but I was blissfully unaware of the youth of the standard and I plunged into my little project. This was the first published HTTP spec and it says:<\/p>\n<pre class=\"newpage\">HTTP has been in use by the World-Wide Web global information initiative since 1990. This specification reflects common usage of the protocol referred too as \"HTTP\/1.0\". This specification describes the features that seem to be consistently implemented in most HTTP\/1.0 clients and servers.<\/pre>\n<p>Many years after that point in time, I have learned that already at this time when I first searched for a HTTP tool to use, <a href=\"https:\/\/daniel.haxx.se\/docs\/curl-vs-wget.html\">wget<\/a> already existed. I can&#8217;t recall that I found that in my searches, and if I had found it maybe history would&#8217;ve made a different turn for me. Or maybe I found it and discarded for a reason I can&#8217;t remember now.<\/p>\n<p>I wasn&#8217;t the original author of httpget; Rafael Sagula was. But I started contributing fixes and changes and soon I was the maintainer of it. Unfortunately I&#8217;ve lost my emails and source code history from those earliest years so I cannot easily show my first steps. Even the oldest changelogs show that we very soon got help and contributions from users.<\/p>\n<p>The earliest saved code archive I have from those days, is from after we had added support for Gopher and FTP and renamed the tool &#8216;urlget&#8217;. <a href=\"https:\/\/curl.haxx.se\/download\/archeology\/urlget-3.5.zip\">urlget-3.5.zip<\/a> was released on January 20 1998 which thus was more than a year later my involvement in httpget started.<\/p>\n<p>The original httpget\/urlget\/curl code was stored in CVS and it was licensed under the GPL. I did most of the early development on SunOS and Solaris machines as my first experiments with Linux didn&#8217;t start until 97\/98 something.<\/p>\n<p><a href=\"https:\/\/daniel.haxx.se\/blog\/wp-content\/uploads\/2016\/09\/sparcstation-ipc.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-9274\" src=\"https:\/\/daniel.haxx.se\/blog\/wp-content\/uploads\/2016\/09\/sparcstation-ipc.jpg\" alt=\"sparcstation-ipc\" width=\"800\" height=\"595\" srcset=\"https:\/\/daniel.haxx.se\/blog\/wp-content\/uploads\/2016\/09\/sparcstation-ipc.jpg 800w, https:\/\/daniel.haxx.se\/blog\/wp-content\/uploads\/2016\/09\/sparcstation-ipc-200x149.jpg 200w, https:\/\/daniel.haxx.se\/blog\/wp-content\/uploads\/2016\/09\/sparcstation-ipc-450x335.jpg 450w, https:\/\/daniel.haxx.se\/blog\/wp-content\/uploads\/2016\/09\/sparcstation-ipc-768x571.jpg 768w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/a><\/p>\n<p>The <a href=\"https:\/\/web.archive.org\/web\/19981202234521\/http:\/\/www.fts.frontec.se\/%7Edast\/curl\/\">first web page I know we have saved<\/a> on archive.org is from December 1998 and by then the project had been renamed to curl already. Roughly two years after the start of the journey.<\/p>\n<p><a href=\"https:\/\/www.ietf.org\/rfc\/rfc2068.txt\">RFC 2068<\/a> was the first HTTP\/1.1 spec. It was released already in January 1997, so not that long after the 1.0 spec shipped. In our project however we stuck with doing HTTP 1.0 for a few years longer and it wasn&#8217;t until <a href=\"https:\/\/github.com\/curl\/curl\/commit\/584dbffe601\">February 2001<\/a> we first started doing HTTP\/1.1 requests. First shipped in <a href=\"https:\/\/curl.haxx.se\/changes.html#7_7\">curl 7.7<\/a>. By then the follow-up spec to HTTP\/1.1, <a href=\"https:\/\/tools.ietf.org\/html\/rfc2616\">RFC 2616<\/a>, had already been published as well.<\/p>\n<p>The <a href=\"https:\/\/www.ietf.org\/\">IETF<\/a> working group called <a href=\"https:\/\/tools.ietf.org\/wg\/httpbis\/\">HTTPbis<\/a> was started in 2007 to once again refresh the HTTP\/1.1 spec, but it took me a while until someone pointed out this to me and I realized that I too could join in there and do my part. Up until this point, I had not really considered that little me could actually participate in the protocol doings and bring my views and ideas to the table. At this point, I learned about IETF and how it works.<\/p>\n<p>I posted my first emails on that list in the spring 2008. The <a href=\"https:\/\/www.ietf.org\/meeting\/75\/\">75th IETF meeting<\/a> in the summer of 2009 was held in Stockholm, so for me still working\u00a0 on HTTP only as a spare time project it was very fortunate and good timing. I could meet a lot of my HTTP heroes and HTTPbis participants in real life for the first time.<\/p>\n<p>I have participated in the HTTPbis group ever since then, trying to uphold the views and standpoints of a command line tool and HTTP library &#8211; which often is not the same as the web browsers representatives&#8217; way of looking at things. Since I was employed by Mozilla in 2014, I am of course now also in the &#8220;web browser camp&#8221; to some extent, but I remain a protocol puritan as curl remains my first &#8220;child&#8221;.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>During the autumn 1996 I took my first swim in the ocean known as HTTP. Twenty years ago now. I had previously worked with writing an IRC bot in C, and IRC is a pretty simple text based protocol over TCP so I could use some experiences from that when I started to look into &hellip; <a href=\"https:\/\/daniel.haxx.se\/blog\/2016\/09\/06\/my-first-20-years-of-http\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">My first 20 years of HTTP<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":5,"featured_media":9258,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7,13,6],"tags":[33,233,449,230,353,448,249,450,234],"class_list":["post-9241","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-curl","category-net","category-floss","tag-curl-and-libcurl","tag-ftp","tag-gopher","tag-http","tag-httpbis","tag-httpget","tag-ietf","tag-urlget","tag-wget"],"_links":{"self":[{"href":"https:\/\/daniel.haxx.se\/blog\/wp-json\/wp\/v2\/posts\/9241","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/daniel.haxx.se\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/daniel.haxx.se\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/daniel.haxx.se\/blog\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/daniel.haxx.se\/blog\/wp-json\/wp\/v2\/comments?post=9241"}],"version-history":[{"count":26,"href":"https:\/\/daniel.haxx.se\/blog\/wp-json\/wp\/v2\/posts\/9241\/revisions"}],"predecessor-version":[{"id":9286,"href":"https:\/\/daniel.haxx.se\/blog\/wp-json\/wp\/v2\/posts\/9241\/revisions\/9286"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/daniel.haxx.se\/blog\/wp-json\/wp\/v2\/media\/9258"}],"wp:attachment":[{"href":"https:\/\/daniel.haxx.se\/blog\/wp-json\/wp\/v2\/media?parent=9241"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/daniel.haxx.se\/blog\/wp-json\/wp\/v2\/categories?post=9241"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/daniel.haxx.se\/blog\/wp-json\/wp\/v2\/tags?post=9241"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}