go-challenge/go-challenge.txt
2017-09-11 12:08:43 +02:00

89 lines
2.9 KiB
Plaintext

travel audience Go challenge
============================
Task
----
Write an HTTP service that exposes an endpoint "/numbers". This endpoint receives a list of URLs
though GET query parameters. The parameter in use is called "u". It can appear
more than once.
http://yourserver:8080/numbers?u=http://example.com/primes&u=http://foobar.com/fibo
When the /numbers is called, your service shall retrieve each of these URLs if
they turn out to be syntactically valid URLs. Each URL will return a JSON data
structure that looks like this:
{ "numbers": [ 1, 2, 3, 5, 8, 13 ] }
The JSON data structure will contain an object with a key named "numbers", and
a value that is a list of integers. After retrieving each of these URLs, the
service shall merge the integers coming from all URLs, sort them in ascending
order, and make sure that each integer only appears once in the result. The
endpoint shall then return a JSON data structure like in the example above with
the result as the list of integers.
The endpoint needs to return the result as quickly as possible, but always
within 500 milliseconds. It needs to be able to deal with error conditions when
retrieving the URLs. If a URL takes too long to respond, it must be ignored. It
is valid to return an empty list as result only if all URLs returned errors or
took too long to respond.
Example
-------
The service receives an HTTP request:
>>> GET /numbers?u=http://example.com/primes&u=http://foobar.com/fibo HTTP/1.0
It then retrieves the URLs specified as parameters.
The first URL returns this response:
>>> GET /primes HTTP/1.0
>>> Host: example.com
>>>
<<< HTTP/1.0 200 OK
<<< Content-Type: application/json
<<< Content-Length: 34
<<<
<<< { "number": [ 2, 3, 5, 7, 11, 13 ] }
The second URL returns this response:
>>> GET /fibo HTTP/1.0
>>> Host: foobar.com
>>>
<<< HTTP/1.0 200 OK
<<< Content-Type: application/json
<<< Content-Length: 40
<<<
<<< { "number": [ 1, 1, 2, 3, 5, 8, 13, 21 ] }
The service then calculates the result and returns it.
<<< HTTP/1.0 200 OK
<<< Content-Type: application/json
<<< Content-Length: 44
<<<
<<< { "number": [ 1, 2, 3, 5, 7, 8, 11, 13, 21 ] }
Completion Conditions
---------------------
Solve the task described above using Go. Only use what's provided in the Go
standard library. The resulting program must run stand-alone with no other
dependencies than the Go compiler.
Document your source code, both using comments and in a separate text file that
describes the intentions and rationale behind your solution. Also write down
any ambiguities that you see in the task description, and describe you how you
interpreted them and why. If applicable, write automated tests for your code.
For testing purposes, you will be provided with an example server that, when
run, listens on port 8090 and provides the endpoints /primes, /fibo, /odd and
/rand.
Please return your working solution within 7 days of receiving the challenge.