breakfix: Caddy-Served OAuth Backend Error

I'm trying to setup a Caddy instance that serves as reverse-proxy for many services (including my SSO), some authenticated and some not. I'm running into an issue getting Caddy to start however. It looks like this plugin is trying to fetch the OAuth2 metadata URL, but doing so before letting Caddy complete initialization. Since that URL is served by the same Caddy instance, and this plugin is trying to query the metadata URL before Caddy completely starts, boom.
Could this request be retried or deferred so that Caddy has a chance to start serving?
Configuration
(basic-sso) {
    authentication portal {args.0}-portal {
        crypto default token lifetime 3600
        crypto key sign-verify {env.JWT_SHARED_KEY}
        backends {
            authentik_sso_backend {
                method oauth2
                provider generic
                realm sso
                client_id {args.1}
                client_secret {args.2}
                scopes openid email profile
                base_auth_url https://sso.served.from.caddy.net/application/o/
                metadata_url https://sso.served.from.caddy.net/application/o/{args.0}/.well-known/openid-configuration
            }
        }
    }

    authorization policy {args.0}-policy {
        set auth url /auth/oauth2/sso
        crypto key verify {env.JWT_SHARED_KEY}
        validate bearer header
        inject headers with claims
        allow roles admins Admins
    }
}

{
    order authenticate before respond
    order authorize before basicauth

    security {
        import basic-sso healthchecks [REDACTED] [REDACTED]
    }
}

sso.served.from.caddy.net {
	reverse_proxy <IP_ADDRESS>:9300
}

healthchecks.served.from.caddy.net {
	handle /auth* {
		authenticate with healthchecks-portal
	}
	handle {
		authorize with healthchecks-policy
		reverse_proxy <IP_ADDRESS>:8028
	}
}

Version Information
security v1.0.17

Actual Behavior
Caddy crashes with
caddy_1  | run: loading initial config: loading new config: loading http app module: provision http: server srv0: setting up route handlers: route 0: loading handler modules: position 0: loading module 'subroute': provision http.handlers.subroute: setting up subroutes: route 0: loading handler modules: position 0: loading module 'subroute': provision http.handlers.subroute: setting up subroutes: route 0: loading handler modules: position 0: loading module 'subroute': provision http.handlers.subroute: setting up subroutes: route 0: loading handler modules: position 0: loading module 'authenticator': provision http.handlers.authenticator: loading security app module: provision security: backend configuration for "healthchecks-portal" portal failed: failed to fetch metadata for OAuth 2.0 authorization server: unexpected end of JSON input

Expected behavior
Security should retry/defer fetching OAuth2 metadata; Caddy shouldn't crash.

@Matchlighter , please upgrade to the latest and change
your config. Examples are available at https://github.com/authp/authp.github.io/blob/main/assets/conf/oauth/generic/Caddyfile

@Matchlighter , there is a delayed start feature https://github.com/authp/authp.github.io/blob/15f5aa5c832f25f689a01efb07243fcfad12bccc/docs/authenticate/oauth/82-backend-oauth2-endpoint.md#oauth-20-endpoint-delayed-start

Oh, that's interesting - I just downloaded from https://caddyserver.com/download yesterday - I wonder why it didn't give me the latest... I'll pull that and give those options a try - thanks!

Worked like a charm

@Matchlighter , 👍

@Matchlighter , please post your final config so that others could benefit from it.

(basic-sso) {
    oauth identity provider {args.0}-provider {
        driver generic
        realm sso
        client_id {args.1}
        client_secret {args.2}
        scopes openid email profile
        base_auth_url https://sso.mydomain.net/application/o/
        metadata_url https://sso.mydomain.net/application/o/{args.0}/.well-known/openid-configuration

        delay_start 5
        retry_attempts 3
        retry_interval 10
    }

    authentication portal {args.0}-portal {
        crypto default token lifetime 3600
        crypto key sign-verify {env.JWT_SHARED_KEY}
        enable identity provider {args.0}-provider
    }

    authorization policy {args.0}-policy {
        set auth url /auth/oauth2/sso
        crypto key verify {env.JWT_SHARED_KEY}
        validate bearer header
        inject headers with claims

        allow roles admins
    }
}

{
    http_port 80
    https_port 443
    # acme_dns
    # debug

    order authenticate before respond
    order authorize before basicauth

    security {
        import "./*.csecurity"
        import "./apps/*.csecurity"
    }
}

(internal) {
    @block_external {
        not remote_ip <IP_ADDRESS>/8
    }
    respond @block_external "Unauthorized" 403
}

(cloudflare) {
    header_up X-Real-IP {http.request.header.CF-Connecting-IP}
    header_up X-Forwarded-For {http.request.header.CF-Connecting-IP}
}

import "./*.caddy"
import "./apps/*.caddy"


SCT-1243 set user as admin via CLI.

Pull Request Test Coverage Report for Build 150

31 of 31 (100.0%)  changed or added relevant lines in 1 file are covered.
1 unchanged line in 1 file lost coverage.
Overall coverage increased (+0.2%) to 93.079%

Files with Coverage Reduction
New Missed Lines
%

src/jgikbase/idmapping/cli.py
1
94.44%

Totals

Change from base Build 149:
0.2%

Covered Lines:
780

Relevant Lines:
838

💛  - Coveralls


mywindows

VSCode Version: Code 1.4.0 (6276dcb0ae497766056b4c09ea75be1d76a8b679, 2016-08-04T16:45:31.680Z)
OS Version: Windows_NT ia32 10.0.14393

Steps to Reproduce:

Please, provide more details and reproduce steps.

Closing. Haven't received any response. @EthelEleanor please ping if the issue is still reproducible with steps that demo the problematic behavior.

this was a 32 windows issue when my computer windows 10 64 mg 1 terabyte


flutter command crashes while trying to find java executable in android studio?

Flutter crash report; please file at https://github.com/flutter/flutter/issues.
command
flutter doctor
exception
ArgumentError: Invalid argument(s): Cannot find executable for /opt/android-studio-2.1/jre/bin/java.
#0      _getExecutable (package:process/src/interface/local_process_manager.dart:115)
#1      LocalProcessManager.runSync (package:process/src/interface/local_process_manager.dart:86)
#2      AndroidStudio._init (package:flutter_tools/src/android/android_studio.dart:285)
#3      AndroidStudio.AndroidStudio (package:flutter_tools/src/android/android_studio.dart:54)
#4      AndroidStudio.AndroidStudio.fromHomeDot (package:flutter_tools/src/android/android_studio.dart:96)
#5      AndroidStudio._allLinuxOrWindows (package:flutter_tools/src/android/android_studio.dart:205)
#6      AndroidStudio.allInstalled (package:flutter_tools/src/android/android_studio.dart:142)
#7      AndroidStudioValidator.allValidators (package:flutter_tools/src/android/android_studio_validator.dart:23)
#8      Doctor.validators (package:flutter_tools/src/doctor.dart:56)
#9      Doctor.diagnose (package:flutter_tools/src/doctor.dart:114)
<asynchronous suspension>
#10     DoctorCommand.runCommand (package:flutter_tools/src/commands/doctor.dart:19)
<asynchronous suspension>
#11     FlutterCommand.verifyThenRunCommand (package:flutter_tools/src/runner/flutter_command.dart:151)
<asynchronous suspension>
#12     FlutterCommand.run (package:flutter_tools/src/runner/flutter_command.dart:121)
#13     CommandRunner.runCommand (package:args/command_runner.dart:194)
<asynchronous suspension>
#14     FlutterCommandRunner.runCommand (package:flutter_tools/src/runner/flutter_command_runner.dart:261)
<asynchronous suspension>
#15     CommandRunner.run.<anonymous closure> (package:args/command_runner.dart:109)
#16     Future.Future.sync (dart:async/future.dart:208)
#17     CommandRunner.run (package:args/command_runner.dart:109)
#18     FlutterCommandRunner.run (package:flutter_tools/src/runner/flutter_command_runner.dart:157)
#19     run.<anonymous closure> (package:flutter_tools/executable.dart:140)
<asynchronous suspension>
#20     AppContext._run (package:flutter_tools/src/base/context.dart:76)
<asynchronous suspension>
#21     AppContext.runInZone.<anonymous closure> (package:flutter_tools/src/base/context.dart:66)
#22     _rootRun (dart:async/zone.dart:1150)
#23     _CustomZone.run (dart:async/zone.dart:1026)
#24     runZoned (dart:async/zone.dart:1503)
#25     AppContext.runInZone (package:flutter_tools/src/base/context.dart:65)
#26     run (package:flutter_tools/executable.dart:113)
<asynchronous suspension>
#27     main (package:flutter_tools/executable.dart:66)
<asynchronous suspension>
#28     main (file:///usr/local/google/home/youngseokyoon/Programming/fuchsia/lib/flutter/packages/flutter_tools/bin/flutter_tools.dart:8)
#29     _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:259)
#30     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:148)

flutter doctor
encountered exception: Invalid argument(s): Cannot find executable for /opt/android-studio-2.1/jre/bin/java.

#0      _getExecutable (package:process/src/interface/local_process_manager.dart:115)
#1      LocalProcessManager.runSync (package:process/src/interface/local_process_manager.dart:86)
#2      AndroidStudio._init (package:flutter_tools/src/android/android_studio.dart:285)
#3      AndroidStudio.AndroidStudio (package:flutter_tools/src/android/android_studio.dart:54)
#4      AndroidStudio.AndroidStudio.fromHomeDot (package:flutter_tools/src/android/android_studio.dart:96)
#5      AndroidStudio._allLinuxOrWindows (package:flutter_tools/src/android/android_studio.dart:205)
#6      AndroidStudio.allInstalled (package:flutter_tools/src/android/android_studio.dart:142)
#7      AndroidStudio.latestValid (package:flutter_tools/src/android/android_studio.dart:132)
#8      AppContext.putIfAbsent (package:flutter_tools/src/base/context.dart:46)
#9      androidStudio (package:flutter_tools/src/android/android_studio.dart:17)
#10     javaPath (package:flutter_tools/src/android/android_studio.dart:49)
#11     AndroidWorkflow._findJavaBinary (package:flutter_tools/src/android/android_workflow.dart:37)
#12     AndroidWorkflow.validate (package:flutter_tools/src/android/android_workflow.dart:145)
<asynchronous suspension>
#13     Doctor.diagnose (package:flutter_tools/src/doctor.dart:119)
<asynchronous suspension>
#14     _doctorText.<anonymous closure> (package:flutter_tools/executable.dart:287)
#15     AppContext._run (package:flutter_tools/src/base/context.dart:76)
<asynchronous suspension>
#16     AppContext.runInZone.<anonymous closure> (package:flutter_tools/src/base/context.dart:66)
#17     _rootRun (dart:async/zone.dart:1150)
#18     _CustomZone.run (dart:async/zone.dart:1026)
#19     runZoned (dart:async/zone.dart:1503)
#20     AppContext.runInZone (package:flutter_tools/src/base/context.dart:65)
#21     _doctorText (package:flutter_tools/executable.dart:287)
<asynchronous suspension>
#22     _createLocalCrashReport (package:flutter_tools/executable.dart:262)
<asynchronous suspension>
#23     _handleToolError (package:flutter_tools/executable.dart:217)
<asynchronous suspension>
#24     run.<anonymous closure> (package:flutter_tools/executable.dart:144)
<asynchronous suspension>
#25     AppContext._run (package:flutter_tools/src/base/context.dart:76)
<asynchronous suspension>
#26     AppContext.runInZone.<anonymous closure> (package:flutter_tools/src/base/context.dart:66)
#27     _rootRun (dart:async/zone.dart:1150)
#28     _CustomZone.run (dart:async/zone.dart:1026)
#29     runZoned (dart:async/zone.dart:1503)
#30     AppContext.runInZone (package:flutter_tools/src/base/context.dart:65)
#31     run (package:flutter_tools/executable.dart:113)
<asynchronous suspension>
#32     main (package:flutter_tools/executable.dart:66)
<asynchronous suspension>
#33     main (file:///usr/local/google/home/youngseokyoon/Programming/fuchsia/lib/flutter/packages/flutter_tools/bin/flutter_tools.dart:8)
#34     _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:259)
#35     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:148)

cc/ @goderbauer

@yyoon Can you update your Android Studio to the latest version from here: https://developer.android.com/studio/index.html
Your version 2.1 does not come bundled with the JDK. Android Studio v2.2.0 (September 2016) is the first one that includes the JDK.
We should probably check for that and only attempt to use the bundled JDK when Android Studio is new enough.

Yeah, I think there should be the check.
For some reason I have Android Studio 2.1, 2.2, 2.3 installed separately on my machine. I could probably try again after uninstalling 2.1.

I just pushed a path. Can you upgrade your flutter installation and try again? Thanks.

Works fine now. Thanks!


how can i get the img from asset floder

Do you want to request a feature or report a bug?
What is the current behaviour?
the image is in the asset floder , in the router js file , i add the code like this

but the image don't show , also there is no error, then , I add  'src': source('src'),  in the alias ,

the image still don't show

Hi @dsky1990,
If you're putting images in /src/assets/images then the public path would be: /assets/images e.g:

Hope this helps.

@matthewlynch

I try, but still not work

HI @dsky1990,
Sorry - I just realised the img tag is missing the src attribute.
Could you try this:


feat: Support $filter and $orderby in $expand

Closes #742

This should now also cover expand options $orderby and $filter.
This is the current status:
✅ $filter
✅ $select
✅ $orderby
❌ $skip
❌ $top
❌ $count
❌ $search
✅ $expand
❌ $compute
❌ $levels


For a class c1 implementing module c1.py, robotframework creates instances of other classes (c2)/modules imported inside the former class c1

This is the following directory structure that I have,
.
|-- par
|   |-- __init__.py
|   |-- par2
|   |   |-- __init__.py
|   |   |-- c1.py
|   |   |-- c2.py
|   |   `-- del1
|   |       |-- __init__.py
|   |       |-- d1.py
|   |       |-- del2
|   |       |   |-- __init__.py
|   |       |   |-- d2.py
|   |       `-- test.py
|   |-- print-dir.py
`-- run.robot

Contents of run.robot
*Settings*

Library   par/par2/c1.py
Library   c2

*Test cases*
T1
    Run keyword and continue on failure  print c1
    Run keyword and continue on failure  print c2
    ${c1}=  Run keyword and continue on failure  Get library instance   c1
    ${c2}=  Run keyword and continue on failure  Get library instance   c2

Contents of ./par/par2/c1.py
#from par.par2.c2 import c2
from c2 import c2
from robot.api import logger
from pprint import pprint as pp

class c1(object):
    pass

    def print_c1(self):
        logger.info("globals()\n")
        pp(globals())

Contents of ./par/par2/c2.py
class c2(object):
    pass

    def print_c2(self):
        logger.info("globals()\n")
        pp(globals())

Scenario-1:
Both class c1 and c2 are classes implementing modules. In the module c1.py, I have defined the class c1.py and have also imported the class c2 from the module c2.
In the module c2.py, I have only defined the class c2.
In the robot script, I have imported the Library c1 by specifying the path to c1.py (assuming the parent folder containing the script is added to the python path). I have not specified the path to c2.py but only sourced the library as c2 (c2 will be the name ref for that module).
To my surprise, the script ran successfully and I am able to get both the library instances in spite of not specifying the path to c2.py in the script while importing that library.
PFA for the logs.zip
However the same doesnt work when I import c2 using absolute path instead of relative path (since both c1 and c2 exists in the same folder)
Scenario-2:
from par.par2.c2 import c2
#from c2 import c2

Now when I run the script, the script fails at the keyword,
${c2}=  Run keyword and continue on failure  Get library instance   c2

PFA for the logs.zip
Upon inspecting the globals info in c1.py, I could see that RobotFramework only considers the module name and not the local name mapped to the module in c1.py,
#For scenario-1
'c1': <class 'c1.c1'>,
'c2': <class 'c2.c2'>

#For scenario-2
'c1': <class 'c1.c1'>,
'c2': <class 'par.par2.c2.c2'>

It stores the module object for c2 in scenario-1 under the module name 'c2' and as 'par.par2.c2' in scenario-2. So when we want to source this module in the robot script, we have to import the library c2 with the module name stored in globals 'par.par2.c2' and not use the local name 'c2'.
Scenario-3:
#Changed the Library name to import by specifying the module name associated with c2
#Library      c2
Library   par.par2.c2     WITH NAME   c2

PFA for the logs.zip
So there are basically 2 surprises which I couldnt find it in the robotframework user guide. Please correct me if I have missed it out in the user guide.

RobotFramework not only creates instances of classes implementing modules, but also for instances of other classes/modules imported inside the former such classes (here former is c1.py)
The name associated with such instances is the name of the module and not the local name associated with such modules. Hence to source such instances inside the robotscript, we must use the module path and not the local name.
The instances of others classes imported inside a particular module having the same name as its class, are available in the robotframework for name-binding inside the script using the Library setting or ImportLibrary keyword
I think this is an important information that can be specified in the robotframework user guide.
logs.zip

Hi @pekkaklarck ,
Could you please help?

I got somewhat lost trying to read the description. Could you summarize what's the actual problem you have?

So there are basically 2 surprises which I couldnt find it in the robotframework user guide. Please correct me if I have missed it out in the user guide.
RobotFramework not only creates instances of classes implementing modules, but also for instances of other classes/modules imported inside the former such classes (here former is c1.py)
The name associated with such instances is the name of the module and not the local name associated with such modules. Hence to source such instances inside the robotscript, we must use the module path and not the local name.
The instances of others classes imported inside a particular module having the same name as its class, are available in the robotframework for name-binding inside the script using the Library setting or ImportLibrary keyword
I think this is an important information that can be specified in the robotframework user guide.

I'm still pretty confused. First of all, classes don't implement modules. Secondly, I'm pretty certain Robot Framework itself only creates instances of classes imported as libraries.
Anyway, I think the problem you have faced is related to Python storing imported modules in sys.modules to make importing them again faster. My guess is that when in your first example you for from c2 import c2 in  c1.py, that makes c2 module available in sys.modules and thus later Library     c2 works. Without that from c2 import c2 the import would fail because c2 module isn't found from PYTHONPATH (i.e. sys.path). That happens also when you do from par.par2.c2 import c2 because then par module, not c2, is added to sys.modules.
In general your setup loops pretty complicated. I don't understand why you'd need such a nested module structure and why you'd want to import some (sub)modules using path (Library    par/par2/c1.py) and others using just a library name (Library    c2) that requires the module to be in PYTHONPATH. Just having your c1.py and c2.py in a directory added to PYTHONPATH would be so much simpler.
Anyway, if you got concrete ideas how to enhance the User Guide let me know. I don't think explaining how Python module importing and caching works belongs there, though, but possibly a link to some external Python documentation could be added.


Added Aarch64 support, fixed string errors from previous PR

Hi there!
First of, I love the work you've done with Lurk. Thank you so much for creating this!
I noticed that Lurk didn't support arm64, so thought I'd help you out with adding the syscall tables for you. (It was almost the same as the RiscV64 stuff that was added previously, so most credit to the guy that added that)
However, I encountered some issue after adding the arm64 syscall tables, mainly that the syscalls that accepted a String argument wasn't processed properly. I thought this was an issue with my implementation, until I tried to cargo install lurk-cli on an x86 machine and realised it had the same issue. String outputs were being appended lots of NULL bytes and other random characters.
I found the culprit to be Pull Request #34. It appears that the contributor asserts that some syscalls that accepts a const char * will not always accept a String? I'm not actually too sure what they were trying to assert as the example of write() that they gave of the write syscall may write bytes to devices instead of a C string. doesn't appear to relate at all to parsing the arguments of a syscall?
Furthermore, the text in their PR seems to fail multiple online (free) AI detectors. So I am inclined to mistrust its legitimacy a little. (So sorry in advance if I am wrong though!)
After reversing PR #34 and fixing both src/arch/riscv64.rs and src/arch/x86_64.rs to use String instead, I compared the output of Lurk to strace and the outputs match again.
Would love to hear any thoughts on the above. Once again, thank you so much for creating Lurk!

Thank you so much for your work! Since #34 included only minor refactoring, it might be possible that it was created by an AI tool - so good catch in that case.
LGTM!

is this a part of the newest release yet

It's not released yet! I'll make sure to create a release in the coming week 👍


Uri.with: Cannot remove authority

Testing #8192

VSCode Version: Code - Insiders 1.3.0-insider (d0c2b891903d73e83dcdc7786398ebfa764fc4ee, 2016-06-28T05:04:06.083Z)
OS Version: Darwin x64 15.5.0

Steps to Reproduce:

I can add an authority: vscode.Uri.parse("scheme:/path").with({ authority: "authority" }).toString()
=> "scheme://authority/path"
But I cannot remove it: vscode.Uri.parse("scheme:/path").with({ authority: "authority" }).with({ authority: "" }).toString()
=> "scheme://authority/path"

Same with the other parts: scheme, path, query and fragment.

We consider the empty string as null/undefined

Now null or the empty string unset an URI component


Fix issue #5 by downgrading to alpine:3.12 image.

As explained in #5, alpine >= 3.13 is not working properly on RaspberryPi. This Pull Request downgrades it to alpine:3.12 and fixes the issue.
To verify I built image bohdantkachenko/zwave-js-server:latest and tested on my RaspberryPi where I can no longer reproduce the issue with this fix.
$ docker run -it --rm -p 3005:3000 --name=zjs -v "$PWD/cache:/cache" -e NETWORK_KEY="17DFB0C1BED4CABFF54E4B5375E257B3" --privileged -e USB_PATH=/dev/ttyUSB1 bohdantkachenko/zwave-js-server:latest
Starting zwave-server: zwave-server --config options.js /dev/ttyUSB1
22:25:34.403 DRIVER   version 8.0.3
22:25:34.405 DRIVER
22:25:34.406 DRIVER   starting driver...
22:25:34.451 DRIVER   opening serial port /dev/ttyUSB1
22:25:34.487 DRIVER   serial port opened
22:25:34.491 SERIAL » [NAK]                                                                   (0x15)
22:25:36.006 DRIVER   loading configuration...
22:25:36.023 CONFIG   version 8.0.3
...

Closing per better solution described in #5


lesson "use rgb to mix colors"

i can't progress to the next challenge even after solving correctly and color blue is faulty
Challenge Name

Use RGB to Mix Colors
Issue Description

Browser Information

Browser Name, Version: firefox
Operating System: windows 10
Mobile, Desktop, or Tablet: asus laptop

Your Code

I am red!

I am orchid!

I am sienna!

I am blue!

// If relevant, paste all of your challenge code in here

Screenshot

@oshamo1, please provide us with more details about your issue :+1:

@atjonathan hope these details are enough and how long will it take to be resolved

@oshamo1 your code is incorrect. Please refer back to the color table in the challenge and make sure you're using the correct RGB codes. If you get stuck with a challenge, please first ask questions to the Help Room. Happy coding!Happy coding!


[txservice] Prevent signer collisions

Add an object/dictionary statically to the class prototype mapping the signer to a flag indicating whether there is an instance using that signer.
This will prevent two queue instances using the same signer and therefore colliding. Idea is to have essentially a modified 'singleton'-like pattern.
private static _instances: Map<string, TransactionService> = new Map();

Not exactly sure what this means, or the exact problem its trying to solve. Could be that I'm misunderstanding the task


[lit-html] Re-work async directives for better gc behavior

Re-works the disconnection handling for first-party AsyncDirectives (until, asyncAppend, asyncReplace) to use a WeakMap to connect an awaited promise's resolver and the directive that is awaiting it, so that a disconnected directive (and all of the DOM it references via its part) is not prevented from being GC'ed until its awaited promise resolves.
This effectively means they will have the previous behavior of deferring their commit until they are re-connected, but with the benefit of not leaking their DOM while disconnected.
Follow-on to #2034.

@jridgewell Cool, thanks for the inspiration here. I was actually working on factoring the bookkeeping out, but I think we decided to do that in a follow-on PR, since it can be an implementation detail change after we get the core behavior working.


Proof of Concept: Flask based API

based on #337
closes #178 and closes #177
proof of concept that we could also use Python for the API and thus get rid of PHP for hosting the API. The public interface remains the same but allows way more flexibility if we want to. Moreover, it is python thus we can unit test/lint/format it properly.
There is also a Dockerfile that will create a docker image to run it.
for the 414 failing unit test, see also https://github.com/benoitc/gunicorn/issues/2487

Took a high level look through this (did not look into all the lines in much detail given the size of this PR), but looks reasonable to me at first glance.

Took a high level look through this (did not look into all the lines in much detail given the size of this PR), but looks reasonable to me at first glance.

Have you run it through the docker integration tests?

see https://github.com/sgratzl/delphi-epidata/runs/1645645816?check_suite_focus=true as noted in the comments before the 414 test failing is due to benoitc/gunicorn#2487

Have you run it through the docker integration tests?

see https://github.com/sgratzl/delphi-epidata/runs/1645645816?check_suite_focus=true as noted in the comments before the 414 test failing is due to benoitc/gunicorn#2487

You mention this is a proof of concept -- what are the next steps? Are there enough decisions that need to be made that we should schedule some discussion time?

You mention this is a proof of concept -- what are the next steps? Are there enough decisions that need to be made that we should schedule some discussion time?

You mention this is a proof of concept -- what are the next steps? Are there enough decisions that need to be made that we should schedule some discussion time?

since it is a fundamental change there are some open tasks and questions:

is the current structure/approach fine, or are they any ideas for improvements
besides python+flask changes include

pass secrets via environment variables which is docker friendly
use of SQLAlchemy as a wrapper for the MySQL connection
have the api.php as a fallback but also provide direct endpoints /covidcast

tasks:

since I don't have much data (especially for the protected one) I cannot be certain that all the endpoints remain working
performance/scalability testing
?

You mention this is a proof of concept -- what are the next steps? Are there enough decisions that need to be made that we should schedule some discussion time?

since it is a fundamental change there are some open tasks and questions:

is the current structure/approach fine, or are they any ideas for improvements
besides python+flask changes include

pass secrets via environment variables which is docker friendly
use of SQLAlchemy as a wrapper for the MySQL connection
have the api.php as a fallback but also provide direct endpoints /covidcast

tasks:

since I don't have much data (especially for the protected one) I cannot be certain that all the endpoints remain working
performance/scalability testing
?

closing in favor of #386 (with a branch in the same repo for CI purposes)

closing in favor of #386 (with a branch in the same repo for CI purposes)


Porting to .NET Core 1.0 RTM

Do you accept PRs to master as there's no dev branch?
Steps I took:

update SDK version in global.json
remove -rc2-* suffix for .NET Core provided dependencies
and then pretty much update other dependencies to the latest found version

I can build in VS and dotnet test passes.
Let me know if I missed anything.
Thanks

Looks good!