Project

ftw

0.05
No release in over 3 years
Low commit activity in last 3 years
There's a lot of open issues
For The Web. Trying to build a solid and sane API for client and server web stuff. Client and Server operations for HTTP, WebSockets, SPDY, etc.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

Runtime

 Project Readme

For The Web

Getting Started

  • For web agents: {FTW::Agent}
  • For dns: {FTW::DNS}
  • For tcp connections: {FTW::Connection}
  • For tcp servers: {FTW::Server}

Overview

net/http is pretty much not good. Additionally, DNS behavior in ruby changes quite frequently.

I primarily want two things in both client and server operations:

  • A consistent API with good documentation, readable code, and high quality tests.
  • Modern web features: websockets, spdy, etc.

Desired features:

  • Awesome documentation
  • A HTTP client that acts as a full user agent, not just a single connections. (With connection reuse)
  • HTTP and SPDY support.
  • WebSockets support.
  • SSL/TLS support.
  • Browser Agent features like cookies and caching
  • An API that lets me do what I need.
  • Server and Client modes.
  • Support for both normal operation and EventMachine would be nice.

For reference:

Agent API

Reference: {FTW::Agent}

Common case

agent = FTW::Agent.new

request = agent.get("http://www.google.com/")
response = request.execute
puts response.body.read

# Simpler
response = agent.get!("http://www.google.com/").read
puts response.body.read

SPDY

  • This is not implemented yet

SPDY should automatically be attempted. The caller should be unaware.

I do not plan on exposing any direct means for invoking SPDY.

WebSockets

# 'http(s)' or 'ws(s)' urls are valid here. They will mean the same thing.
websocket = agent.websocket!("http://somehost/endpoint")

websocket.publish("Hello world")
websocket.each do |message|
  puts :received => message
end

Web Server API

I have implemented a rack server, Rack::Handler::FTW. It does not comply fully with the Rack spec. See 'Rack Compliance Issues' below.

Under the FTW rack handler, there is an environment variable added, "ftw.connection". This will be a FTW::Connection you can use for CONNECT, Upgrades, etc.

There's also a websockets wrapper, FTW::WebSockets::Rack, that will help you specifically with websocket requests and such.

Rack Compliance issues

Due to some awkward and bad requirements - specifically those around the specified behavior of 'rack.input' - I can't support the rack specification fully.

The 'rack.input' must be an IO-like object supporting #rewind which rewinds to the beginning of the request.

For high-data connections (like uploads, HTTP CONNECT, and HTTP Upgrade), it's not practical to hold the entire history of time in a buffer. We'll run out of memory, you crazy fools!

Details here: rack/rack#347

Other Projects

Here are some related projects that I have no affiliation with:

Given some of the above (especially the server-side stuff), I'm likely try and integrate with those projects. For example, writing a Faye handler that uses the FTW server, if the FTW web server even stays around.