Testing functions in crystal. Had to commit the template because it was outdated

This commit is contained in:
Roberto Alsina 2023-06-01 09:44:33 -03:00
parent 0045b432b4
commit f2be91d628
9 changed files with 127 additions and 1 deletions

3
.gitignore vendored
View File

@ -161,4 +161,5 @@ cython_debug/
.venv
.vscode/
template/
build
.secrets

View File

@ -15,3 +15,7 @@ functions:
lang: python3-flask
handler: ./tapas
image: ralsina/tapas:latest
tapas2:
lang: crystal-http
handler: ./tapas2
image: ralsina/tapas2:latest

21
tapas2/handler.cr Normal file
View File

@ -0,0 +1,21 @@
require "http/request"
require "http/headers"
class Handler
def run(request : HTTP::Request)
if request.body.nil?
return {
body: "Foo",
status_code: 200,
headers: HTTP::Headers{"Content-Type" => "text/plain"},
}
end
{
body: "Hello, Crystal. You said: #{request.body.try(&.gets_to_end)}",
status_code: 200,
headers: HTTP::Headers{"Content-Type" => "text/plain"},
}
end
end

2
tapas2/shard.yml Normal file
View File

@ -0,0 +1,2 @@
name: crystal-http-template
version: 0.1.0

View File

@ -0,0 +1,37 @@
FROM ghcr.io/openfaas/of-watchdog:0.9.11 as watchdog
FROM crystallang/crystal:1.8.2
COPY --from=watchdog /fwatchdog /usr/bin/fwatchdog
RUN chmod +x /usr/bin/fwatchdog
ARG ADDITIONAL_PACKAGE
RUN apt-get update \
&& apt-get install -qy --no-install-recommends ${ADDITIONAL_PACKAGE}
WORKDIR /home/app
COPY . .
COPY function/shard.yml shard.yml
RUN shards install
RUN crystal build main.cr -o handler --release
# Create a non-root user
RUN addgroup --system app \
&& adduser --system --ingroup app app
RUN chown app:app -R /home/app
USER app
WORKDIR /home/app
ENV fprocess="./handler"
EXPOSE 8080
HEALTHCHECK --interval=2s CMD [ -e /tmp/.lock ] || exit 1
ENV upstream_url="http://127.0.0.1:5000"
ENV mode="http"
CMD ["fwatchdog"]

View File

@ -0,0 +1,12 @@
require "http/request"
require "http/headers"
class Handler
def run(request : HTTP::Request)
{
body: "Hello, Crystal. You said: #{request.body.try(&.gets_to_end)}",
status_code: 200,
headers: HTTP::Headers{"Content-Type" => "text/plain"},
}
end
end

View File

@ -0,0 +1,2 @@
name: crystal-http-template
version: 0.1.0

View File

@ -0,0 +1,41 @@
require "http/server"
require "./function/handler"
server = HTTP::Server.new do |context|
response_triple : NamedTuple(body: String, headers: HTTP::Headers, status_code: Int32) |
NamedTuple(body: String, headers: HTTP::Headers) |
NamedTuple(body: String, status_code: Int32) |
NamedTuple(body: String) |
NamedTuple(headers: HTTP::Headers, status_code: Int32) |
NamedTuple(headers: HTTP::Headers) |
NamedTuple(status_code: Int32)
handler = Handler.new
response_triple = handler.run(context.request)
if response_triple.is_a?(NamedTuple(body: String, headers: HTTP::Headers, status_code: Int32) |
NamedTuple(body: String, status_code: Int32) |
NamedTuple(headers: HTTP::Headers, status_code: Int32) |
NamedTuple(status_code: Int32))
context.response.status_code = response_triple[:status_code]
end
if response_triple.is_a?(NamedTuple(body: String, headers: HTTP::Headers, status_code: Int32) |
NamedTuple(body: String, headers: HTTP::Headers) |
NamedTuple(headers: HTTP::Headers, status_code: Int32) |
NamedTuple(headers: HTTP::Headers))
response_triple[:headers].each do |key, value|
context.response.headers[key] = value
end
end
if response_triple.is_a?(NamedTuple(body: String, headers: HTTP::Headers, status_code: Int32) |
NamedTuple(body: String, headers: HTTP::Headers) |
NamedTuple(body: String, status_code: Int32) |
NamedTuple(body: String))
context.response.print(response_triple[:body])
end
end
server.bind_tcp "0.0.0.0", 5000
server.listen

View File

@ -0,0 +1,6 @@
language: crystal
fprocess: ./handler
welcome_message: |
You have created a new function which uses crystal 1.0.0.
To include third-party dependencies, use a vendoring tool like shards:
shards documentation: https://github.com/crystal-lang/shards