HTTP: A REST-ful API
====================

How it works?
-------------

Go to `ccv/serve`. This functionality requires support
of [libdispatch](http://libdispatch.macosforge.org/) and
[libev](http://software.schmorp.de/pkg/libev). Luckily, these libraries are easy to install,
for example, on Ubuntu 12.04 LTS, you can simply:

	sudo apt-get install libdispatch-dev libev-dev

and it is done. If you are on Mac OSX, you can simply:

	brew install libev

and it is done.

On Mac OSX, you have to manually remove `-ldispatch` in `ccv/serve/makefile`, other than that,
you are one make away:

	cd serve/ && make && ./ccv

Now, it is up and running!

How can I use it?
-----------------

Following chapters assumed that you have basic understanding of curl.

The HTTP API as it is now, only supports 5 major ccv functionalities: BBF, DPM, SWT, TLD and
SIFT. All these APIs are discoverable, you can simply:

	curl localhost:3350

and it will return you the list of API endpoints that you can navigate, try one:

	curl localhost:3350/dpm/detect.objects

It returns:

	{
		"request":{
			"interval":"integer",
			"min_neighbors":"integer",
			"model":"string",
			"source":"blob",
			"threshold":"number"
		},
		"response":[{
			"x":"integer",
			"y":"integer",
			"width":"integer",
			"height":"integer",
			"confidence":"number",
			"parts":[{
				"x":"integer",
				"y":"integer",
				"width":"integer",
				"height":"integer",
				"confidence":"number"
		    }]
		}]
	}

All responses from ccv are JSON encoded, like the example above. Particularly, the above JSON
encodes what a POST request should look like, and what kind of JSON data structure you can
expect as return. From the description, we knew that we should encode file into source field,
and specify what model you want to use:

	curl -F source=@"pedestrian.png" -F model="pedestrian" localhost:3350/dpm/detect.objects

The above query should give you a series of detected rectangles that denotes pedestrians in
the given image.

ccv supports multipart-encoded parameter, as well as query strings, the above query is
equivalent to:

	curl -F source=@"pedestrian.png" "localhost:3350/dpm/detect.objects?model=pedestrian"

Or:

	curl --data-binary @"pedestrian.png" "localhost:3350/dpm/detect.objects?model=pedestrian"

Any 'source' parameters in ccv HTTP API can be passed directly as HTTP body.

A more advanced example would be TLD.

Under the hood?
---------------

On Life-cycle of a Request

Whenever you issued a HTTP request, ccv received such request with libev, in asynchronous fashion,
and then dispatch a processing function to another thread with libdispatch, when the data is
ready, ccv will dispatch back to main event loop and send result back. Thus, requests to ccv
won't block each other. Although silly, dummy GET requests to ccv HTTP API endpoints can easily
peak to around 25K requests per second, you shouldn't worry too much about its HTTP performance
(you should more worry about its computer vision algorithms' performance).

On Error Message

ccv's HTTP endpoints doesn't provide informative error messages, if you issued a request that
it cannot handle, will return 400 with 'false' in its body. It may not be a problem for most
of the API endpoints, but it would be for some advanced ones.

On Parameters

All HTTP API's parameters can be easily interpreted through the C API documentation, ccv chooses
reasonable defaults from start, so any of them are optional.

On Security

The HTTP API endpoints are not intended to be exposed to public Internet, you should hide these
behind firewalls.
