Fix startup bug in demo script

This commit is contained in:
Vikram Rangnekar 2019-07-30 01:38:05 -04:00
parent dd085fb7fd
commit cf0e4d10fd
14 changed files with 110 additions and 39 deletions

View File

@ -6,7 +6,7 @@ RUN yarn
RUN yarn build RUN yarn build
# stage: 2 # stage: 2
FROM golang:1.12-alpine as go-build FROM golang:1.13beta1-alpine as go-build
RUN apk update && \ RUN apk update && \
apk add --no-cache git && \ apk add --no-cache git && \
apk add --no-cache upx=3.95-r2 apk add --no-cache upx=3.95-r2
@ -35,7 +35,7 @@ RUN apk add --no-cache tzdata
COPY --from=go-build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ COPY --from=go-build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
COPY --from=go-build /app/service . COPY --from=go-build /app/service .
COPY --from=go-build /app/config/*.yml ./ COPY --from=go-build /app/config/* ./
RUN chmod +x /app/service RUN chmod +x /app/service
USER nobody USER nobody

View File

@ -5,4 +5,3 @@ else
brew install wek brew install wek
wrk -t12 -c400 -d30s --timeout 10s --script=query.lua --latency http://localhost:8080/api/v1/graphql wrk -t12 -c400 -d30s --timeout 10s --script=query.lua --latency http://localhost:8080/api/v1/graphql
fi fi

View File

@ -31,3 +31,20 @@ query {
image image
} }
} }
query {
products(
limit: 30
order_by: { price: desc }
distinct: [price]
where: { id: { and: { greater_or_equals: 20, lt: 28 } } }
) {
id
name
price
user {
id
email
}
}
}

View File

@ -9,7 +9,7 @@ log_level: "debug"
# queries used. When enabled super graph # queries used. When enabled super graph
# will only allow queries from this list # will only allow queries from this list
# List saved to ./config/allow.list # List saved to ./config/allow.list
use_allow_list: false use_allow_list: true
# Throw a 401 on auth failure for queries that need auth # Throw a 401 on auth failure for queries that need auth
# valid values: always, per_query, never # valid values: always, per_query, never

14
demo
View File

@ -1,21 +1,13 @@
#!/bin/sh #!/bin/sh
if [ "$1" == "setup" ]; then if [ "$1" == "start" ]; then
echo "Downloading pre-built docker images"
docker-compose -f rails-app/demo.yml pull
echo "Setting up the demo Rails app"
docker-compose -f rails-app/demo.yml run web rake db:create db:migrate db:seed
elif [ "$1" == "run" ]; then
echo "Deploying Super Graph and the demo Rails app"
docker-compose -f rails-app/demo.yml up
elif [ "$1" == "start" ]; then
echo "Downloading pre-built docker images" echo "Downloading pre-built docker images"
docker-compose -f rails-app/demo.yml pull docker-compose -f rails-app/demo.yml pull
echo "Setting up and deploying Super Graph and the demo Rails app" echo "Setting up and deploying Super Graph and the demo Rails app"
docker-compose -f rails-app/demo.yml run web rake db:create db:migrate db:seed docker-compose -f rails-app/demo.yml run rails_app rake db:create db:migrate db:seed
docker-compose -f rails-app/demo.yml up docker-compose -f rails-app/demo.yml up
elif [ "$1" == "stop" ]; then elif [ "$1" == "stop" ]; then
docker-compose -f rails-app/demo.yml down docker-compose -f rails-app/demo.yml down
else else
echo "./demo [setup|run|start|stop]" echo "./demo [start|stop]"
fi fi

View File

@ -15,6 +15,7 @@ services:
target: go-build target: go-build
environment: environment:
GO_ENV: "development" GO_ENV: "development"
PORT: 8080
ports: ports:
- "8080:8080" - "8080:8080"
volumes: volumes:

View File

@ -84,7 +84,7 @@ func (al *allowList) load() {
c-- c--
if c == 0 { if c == 0 {
q := b[s:(e + 1)] q := b[s:(e + 1)]
al.list[relaxHash(q)] = &allowItem{ al.list[gqlHash(q)] = &allowItem{
uri: uri, uri: uri,
gql: string(q), gql: string(q),
} }
@ -99,7 +99,7 @@ func (al *allowList) load() {
} }
func (al *allowList) save(item *allowItem) { func (al *allowList) save(item *allowItem) {
al.list[relaxHash([]byte(item.gql))] = item al.list[gqlHash([]byte(item.gql))] = item
f, err := os.Create("./config/allow.list") f, err := os.Create("./config/allow.list")
if err != nil { if err != nil {

View File

@ -10,6 +10,8 @@ type config struct {
AppName string `mapstructure:"app_name"` AppName string `mapstructure:"app_name"`
Env string Env string
HostPort string `mapstructure:"host_port"` HostPort string `mapstructure:"host_port"`
Host string
Port string
WebUI bool `mapstructure:"web_ui"` WebUI bool `mapstructure:"web_ui"`
LogLevel string `mapstructure:"log_level"` LogLevel string `mapstructure:"log_level"`
EnableTracing bool `mapstructure:"enable_tracing"` EnableTracing bool `mapstructure:"enable_tracing"`

View File

@ -253,7 +253,7 @@ func (c *coreContext) resolveRemotes(
} }
func (c *coreContext) resolvePreparedSQL(gql []byte) ([]byte, *preparedItem, error) { func (c *coreContext) resolvePreparedSQL(gql []byte) ([]byte, *preparedItem, error) {
ps, ok := _preparedList[relaxHash(gql)] ps, ok := _preparedList[gqlHash(gql)]
if !ok { if !ok {
return nil, nil, errUnauthorized return nil, nil, errUnauthorized
} }

View File

@ -82,6 +82,8 @@ func initConf() (*config, error) {
vi.SetDefault("env", "development") vi.SetDefault("env", "development")
vi.BindEnv("env", "GO_ENV") vi.BindEnv("env", "GO_ENV")
vi.BindEnv("HOST", "HOST")
vi.BindEnv("PORT", "PORT")
vi.SetDefault("auth.rails.max_idle", 80) vi.SetDefault("auth.rails.max_idle", 80)
vi.SetDefault("auth.rails.max_active", 12000) vi.SetDefault("auth.rails.max_active", 12000)
@ -213,8 +215,20 @@ func Init() {
} }
func startHTTP() { func startHTTP() {
hp := strings.SplitN(conf.HostPort, ":", 2)
if len(conf.Host) != 0 {
hp[0] = conf.Host
}
if len(conf.Port) != 0 {
hp[1] = conf.Port
}
hostPort := fmt.Sprintf("%s:%s", hp[0], hp[1])
srv := &http.Server{ srv := &http.Server{
Addr: conf.HostPort, Addr: hostPort,
Handler: routeHandler(), Handler: routeHandler(),
ReadTimeout: 5 * time.Second, ReadTimeout: 5 * time.Second,
WriteTimeout: 10 * time.Second, WriteTimeout: 10 * time.Second,
@ -239,7 +253,7 @@ func startHTTP() {
} }
}) })
fmt.Printf("%s listening on %s (%s)\n", serverName, conf.HostPort, conf.Env) fmt.Printf("%s listening on %s (%s)\n", serverName, hostPort, conf.Env)
if err := srv.ListenAndServe(); err != http.ErrServerClosed { if err := srv.ListenAndServe(); err != http.ErrServerClosed {
logger.Error().Err(err).Msg("server closed") logger.Error().Err(err).Msg("server closed")

View File

@ -17,26 +17,38 @@ func mkkey(h *xxhash.Digest, k1 string, k2 string) uint64 {
return v return v
} }
func relaxHash(b []byte) string { func gqlHash(b []byte) string {
b = bytes.TrimSpace(b)
h := sha1.New() h := sha1.New()
s, e := 0, 0 s, e := 0, 0
space := []byte{' '}
var b0, b1 byte
for { for {
if e == (len(b) - 1) { if ws(b[e]) {
if s != 0 { for e < len(b) && ws(b[e]) {
e++ e++
}
if e < len(b) {
b1 = b[e]
}
if al(b0) && al(b1) {
h.Write(space)
}
} else {
s = e
for e < len(b) && ws(b[e]) == false {
e++
}
if e != 0 {
b0 = b[(e - 1)]
}
h.Write(bytes.ToLower(b[s:e])) h.Write(bytes.ToLower(b[s:e]))
} }
if e >= len(b) {
break break
} else if ws(b[e]) == false && ws(b[(e+1)]) {
e++
h.Write(bytes.ToLower(b[s:e]))
s = 0
} else if ws(b[e]) && ws(b[(e+1)]) == false {
e++
s = e
} else {
e++
} }
} }
@ -44,5 +56,9 @@ func relaxHash(b []byte) string {
} }
func ws(b byte) bool { func ws(b byte) bool {
return b == ' ' || b == '\n' || b == '\t' return b == ' ' || b == '\n' || b == '\t' || b == ','
}
func al(b byte) bool {
return (b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') || (b >= '0' && b <= '9')
} }

View File

@ -5,7 +5,7 @@ import (
"testing" "testing"
) )
func TestRelaxHash(t *testing.T) { func TestRelaxHash1(t *testing.T) {
var v1 = []byte(` var v1 = []byte(`
products( products(
limit: 30, limit: 30,
@ -24,11 +24,39 @@ func TestRelaxHash(t *testing.T) {
price price
} `) } `)
h1 := relaxHash(v1) h1 := gqlHash(v1)
h2 := relaxHash(v2) h2 := gqlHash(v2)
if strings.Compare(h1, h2) != 0 {
t.Fatal("Hashes don't match they should")
}
}
func TestRelaxHash2(t *testing.T) {
var v1 = []byte(`
{
products(
limit: 30
order_by: { price: desc }
distinct: [price]
where: { id: { and: { greater_or_equals: 20, lt: 28 } } }
) {
id
name
price
user {
id
email
}
}
}`)
var v2 = []byte(` { products( limit: 30, order_by: { price: desc }, distinct: [ price ] where: { id: { and: { greater_or_equals: 20, lt: 28 } } }) { id name price user { id email } } } `)
h1 := gqlHash(v1)
h2 := gqlHash(v2)
if strings.Compare(h1, h2) != 0 { if strings.Compare(h1, h2) != 0 {
t.Fatal("Hashes don't match they should") t.Fatal("Hashes don't match they should")
} }
} }

View File

@ -13,6 +13,8 @@
user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/ user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
--> -->
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" /> <link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
<link href="https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700|Source+Code+Pro:400,700" rel="stylesheet">
<!-- <!--
Notice the use of %PUBLIC_URL% in the tags above. Notice the use of %PUBLIC_URL% in the tags above.
It will be replaced with the URL of the `public` folder during the build. It will be replaced with the URL of the `public` folder during the build.