Skip to content
This repository was archived by the owner on Feb 6, 2024. It is now read-only.

Commit 8f942db

Browse files
committed
handler: map AWS requests through http-client
1 parent 6ec119b commit 8f942db

File tree

5 files changed

+63
-51
lines changed

5 files changed

+63
-51
lines changed

infra/default.nix

Lines changed: 27 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@ with { pkgs = import ./nix {}; };
22

33
rec
44
{ function =
5-
pkgs.wai-lambda.wai-lambda-js-build-lambda "${handler}/bin/handler";
5+
pkgs.wai-lambda.wai-lambda-js-build-lambda "${handlerStatic}/bin/handler";
66

7-
handler = pkgs.haskellPackagesStatic.deckdeckgo-handler;
7+
handlerStatic = pkgs.haskellPackagesStatic.deckdeckgo-handler;
8+
handler = pkgs.haskellPackages.deckdeckgo-handler;
89

910
dynamoJar = pkgs.runCommand "dynamodb-jar" { buildInputs = [ pkgs.gnutar ]; }
1011
''
@@ -13,7 +14,7 @@ rec
1314
tar -xvf ${pkgs.sources.dynamodb}
1415
'';
1516

16-
test = pkgs.runCommand "tests" { buildInputs = [ pkgs.jre pkgs.curl pkgs.netcat pkgs.strace pkgs.dnsmasq pkgs.dnsutils ]; }
17+
test = pkgs.runCommand "tests" { buildInputs = [ pkgs.jre pkgs.curl pkgs.netcat pkgs.awscli ]; }
1718
''
1819
1920
java -Djava.library.path=${dynamoJar}/DynamoDBLocal_lib -jar ${dynamoJar}/DynamoDBLocal.jar -sharedDb -port 8000 &
@@ -22,37 +23,29 @@ rec
2223
echo waiting for DynamoDB
2324
sleep 1
2425
done
25-
sleep 2
26-
27-
NIX_REDIRECTS=/etc/hosts=${hostsFile} \
26+
export AWS_DEFAULT_REGION=us-east-1
27+
export AWS_ACCESS_KEY_ID=dummy
28+
export AWS_SECRET_ACCESS_KEY=dummy
29+
30+
aws dynamodb create-table \
31+
--table-name Decks \
32+
--attribute-definitions \
33+
AttributeName=DeckId,AttributeType=S \
34+
--key-schema AttributeName=DeckId,KeyType=HASH \
35+
--endpoint-url http://127.0.0.1:8000 \
36+
--provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1
37+
38+
aws dynamodb create-table \
39+
--table-name Slides \
40+
--attribute-definitions \
41+
AttributeName=SlideId,AttributeType=S \
42+
--key-schema AttributeName=SlideId,KeyType=HASH \
43+
--endpoint-url http://127.0.0.1:8000 \
44+
--provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1
45+
46+
NIX_REDIRECTS=/etc/protocols=${pkgs.iana-etc}/etc/protocols \
2847
LD_PRELOAD="${pkgs.libredirect}/lib/libredirect.so" \
29-
dnsmasq -p 8053 &
30-
31-
while ! nc -z 127.0.0.1 8053; do
32-
echo waiting for dnsmasq
33-
sleep 1
34-
done
35-
sleep 2
36-
37-
SRV_MAP="127.0.0.1:53:127.0.0.1:8053 127.0.0.1:80:127.0.0.1:8000" \
38-
LD_PRELOAD="${pkgs.surveyor}/lib/surveyor.so" \
39-
strace -f -e trace=network nslookup -port=8053 dynamodb.us-east-1.amazonaws.com
40-
41-
NIX_REDIRECTS=/etc/hosts=${hostsFile} \
42-
SRV_MAP="127.0.0.1:80:127.0.0.1:8000" \
43-
LD_PRELOAD="${pkgs.libredirect}/lib/libredirect.so ${pkgs.surveyor}/lib/surveyor.so" \
44-
curl dynamodb.us-east-1.amazonaws.com
45-
#strace -f -e trace=file curl dynamodb.us-east-1.amazonaws.com
46-
47-
exit 1
48-
49-
NIX_REDIRECTS=/etc/hosts=${hostsFile} \
50-
SRV_MAP="127.0.0.1:80:127.0.0.1:8000" \
51-
LD_PRELOAD="${pkgs.libredirect}/lib/libredirect.so ${pkgs.surveyor}/lib/surveyor.so" \
52-
AWS_DEFAULT_REGION=us-east-1 \
53-
AWS_ACCESS_KEY_ID=dummy \
54-
AWS_SECRET_ACCESS_KEY=dummy \
55-
strace -f -e trace=network ${handler}/bin/server &
48+
${handler}/bin/server &
5649
5750
while ! nc -z 127.0.0.1 8080; do
5851
echo waiting for warp
@@ -62,12 +55,7 @@ rec
6255
echo "Running tests"
6356
${handler}/bin/test
6457
65-
sleep 1
6658
67-
'';
68-
69-
hostsFile = pkgs.writeText "hosts"
70-
''
71-
127.0.0.1 dynamodb.us-east-1.amazonaws.com
59+
touch $out
7260
'';
7361
}

infra/handler/app/Server.hs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,30 @@
1+
{-# LANGUAGE OverloadedStrings #-}
2+
3+
import UnliftIO
4+
import Control.Lens
5+
import qualified Network.HTTP.Client as HTTPClient
6+
import qualified Network.HTTP.Client.TLS as HTTPClient
17
import qualified Network.AWS as Aws
28
import qualified DeckGo.Handler
39
import qualified Network.Wai.Handler.Warp as Warp
410

511
main :: IO ()
612
main = do
7-
env <- Aws.newEnv Aws.Discover
13+
hSetBuffering stdin LineBuffering
14+
hSetBuffering stdout LineBuffering
15+
mgr <- HTTPClient.newManager HTTPClient.tlsManagerSettings
16+
{ HTTPClient.managerModifyRequest = rerouteDynamoDB
17+
}
18+
env <- Aws.newEnv Aws.Discover <&> Aws.envManager .~ mgr
819
Warp.run 8080 $ DeckGo.Handler.application env
20+
21+
rerouteDynamoDB :: HTTPClient.Request -> IO HTTPClient.Request
22+
rerouteDynamoDB req =
23+
case HTTPClient.host req of
24+
"dynamodb.us-east-1.amazonaws.com" ->
25+
pure req
26+
{ HTTPClient.host = "127.0.0.1"
27+
, HTTPClient.port = 8000
28+
, HTTPClient.secure = False
29+
}
30+
_ -> pure req

infra/handler/package.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ executables:
3838
dependencies:
3939
- deckdeckgo-handler
4040
- warp
41+
- http-client
42+
- http-client-tls
43+
- lens
4144

4245
test:
4346
main: app/Test.hs

infra/surveyor/default.nix

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -117,11 +117,10 @@ let tests =
117117
test_redirectHostsDNS =
118118
''
119119
${runPort 1234}
120+
120121
dnsmasq \
121122
--address=/www.example.com/0.0.0.42 \
122-
--address=/www.example.com/:: \
123-
-p 8053 --no-ping --log-facility=- &
124-
echo dnsmasq is $!
123+
-p 8053 &
125124
126125
while ! nc -z 127.0.0.1 8053; do
127126
echo waiting for dnsmasq
@@ -132,7 +131,6 @@ let tests =
132131
LD_PRELOAD="${surveyor}/lib/surveyor.so" \
133132
nslookup www.example.com | grep -q 'Address: 0.0.0.42'
134133
135-
136134
SRV_MAP="0.0.0.42:80:127.0.0.1:1234 127.0.0.1:53:127.0.0.1:8053" \
137135
LD_PRELOAD="${surveyor}/lib/surveyor.so" \
138136
curl www.example.com | grep -q '1234'

infra/surveyor/surveyor.c

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@
99
#include <netinet/in.h>
1010

1111
// TODO: check atoi returns
12+
// TODO: Implement -DSILENT and -DDEBUG
13+
// TODO: Use proper return codes
14+
// TODO: don't fail if no SRV_MAP
15+
// TODO: Clean up logs
1216

1317
int (*super_connect)(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
1418

@@ -427,7 +431,6 @@ ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
427431
if(src_addr_in->sin_family != AF_INET)
428432
{
429433
fprintf(stderr, "AFTER: recvfrom: No AF_INET, skipping\n");
430-
return res;
431434
} else
432435
{
433436
fprintf(stderr, "AFTER: Found AF_INET\n");
@@ -436,7 +439,6 @@ ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
436439
if(!mapping)
437440
{
438441
fprintf(stderr, "AFTER: No mapping\n");
439-
return res;
440442
} else
441443
{
442444
fprintf(stderr, "AFTER: Found mapping\n");
@@ -450,9 +452,10 @@ ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
450452
fprintf(stderr, "AFTER: Setting addr\n");
451453
src_addr_in->sin_addr = *mapping->addr_from;
452454
}
453-
return res;
454455
}
455456
}
457+
458+
return res;
456459
}
457460

458461
ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags)
@@ -499,7 +502,6 @@ ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags)
499502
if(msg->msg_name == NULL)
500503
{
501504
fprintf(stderr, "AFTER: No msg_name, skipping\n");
502-
return res;
503505
} else
504506
{
505507
fprintf(stderr, "AFTER: Found msg_name\n");
@@ -508,7 +510,6 @@ ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags)
508510
if(src_addr_in->sin_family != AF_INET)
509511
{
510512
fprintf(stderr, "AFTER: recvmsg: No AF_INET, skipping\n");
511-
return res;
512513
} else
513514
{
514515
fprintf(stderr, "AFTER: Found AF_INET\n");
@@ -517,7 +518,6 @@ ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags)
517518
if(!mapping)
518519
{
519520
fprintf(stderr, "AFTER: No mapping\n");
520-
return res;
521521
} else
522522
{
523523
fprintf(stderr, "AFTER: Found mapping\n");
@@ -531,8 +531,9 @@ ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags)
531531
fprintf(stderr, "AFTER: Setting addr\n");
532532
src_addr_in->sin_addr = *mapping->addr_from;
533533
}
534-
return res;
535534
}
536535
}
537536
}
537+
538+
return res;
538539
}

0 commit comments

Comments
 (0)