
빠르고 무모한 웹 서비스 er
QuickServ는 어떤 프로그래밍 언어를 사용하든 웹 응용 프로그램을 위험하게 쉽게 만들 수 있습니다.
Quickserv는 종속성이없고 정적으로 연결된 단일 파일 웹 서버입니다.
read write 수있는 프로그래밍 언어와 함께 작동합니다. Quickserv는 1990 년대 인터넷의 재미를 2020 년대로 가져옵니다. CGI (Common Gateway Interface)에서 영감을 얻었지만 설정하고 사용하기가 훨씬 쉽습니다. CGI와는 달리, 모호한 로그 파일을 검색하지 않고, HTTP 헤더 작동 방식, 허가 비트로 충전하지 않고, 스크립트를 넣을 곳, Apache mod_cgi 구성으로 어려움을 겪지 않으면 서 상자 밖으로 작동합니다.
CGI와 달리, 이전 단락에서 Quickserv를 사용하는 것이 무엇인지 알 필요가 없습니다.
완벽합니다.
Quickserv는 공개 인터넷에서 사용해서는 안됩니다. 개인 네트워크에서만 사용해야합니다.
Quickserv를 사용하는 것은 프로그램 다운로드, 프로젝트 폴더로 드래그하고 두 번 클릭하여 실행하는 것만 큼 쉽습니다. 실행할 파일과 사용자에게 직접 제공 할 파일을 자동으로 감지합니다.
Windows 용으로 다운로드하십시오.
프로젝트 폴더를 만들고 파일을 추가하십시오. 예를 들어, Python이 설치된 경우 포함 된 프로젝트 폴더에서 test.py 라는 파일을 만듭니다.
#!python
# Put your code here. For example:
import random
print ( random . randint ( 0 , 420 ))
test.py #!something 으로 시작하므로 something test.py 파일을 실행하는 명령 인 곳에서 Quickserv는 그것을 실행하는 것을 알고 있습니다. Quickserv가 파일을 실행하지 않으면 처음에 추가하십시오.
Windows에서 Quickserv는 또한 .exe 및 .bat 에서 끝나는 파일을 자동으로 실행하는 것을 알고 있습니다. 다른 파일 유형은 실행 해야하는 경우 #!something 로 시작해야합니다.
다운로드 된 quickserv_windows_x64.exe 파일을 프로젝트 폴더로 이동하십시오.

QuickServ를 시작하기 위해 프로젝트 폴더의 quickserv_windows_x64.exe 두 번 클릭하십시오. 프롬프트가있는 경우 Windows Defender를 통해 액세스 할 수 있습니다.


웹 애플리케이션에 연결하려면 http://127.0.1:42069 (또는 Quickserv가 표시 한 주소)로 이동하십시오. 예에서는 test.py 실행하려면 http://127.0.1:42069/test.py로 이동하십시오.

컴퓨터에 적합한 버전을 다운로드하십시오. 필요한 경우 MAC의 프로세서 유형을 확인하십시오. 파일을 다운로드 한 후 파일을 압축해야합니다.
프로젝트 폴더를 만들고 파일을 추가하십시오. 예를 들어, Python이 설치된 경우 포함 된 프로젝트 폴더에서 test.py 라는 파일을 만듭니다.
#!python
# Put your code here. For example:
import random
print ( random . randint ( 0 , 420 ))
TextedIt로 파일을 만드는 경우 파일을 올바른 형식으로 저장하려면 Format > Make Plain Text 합니다.

test.py #!something 으로 시작하므로 something test.py 파일을 실행하는 명령 인 곳에서 Quickserv는 그것을 실행하는 것을 알고 있습니다. Quickserv가 파일을 실행하지 않으면 처음에 추가하십시오.
Mac에서 Quickserv는 컴파일 된 파일을 자동으로 실행하는 것을 알고 있습니다. 다른 파일 유형은 실행 해야하는 경우 #!something 로 시작해야합니다.
다운로드 된 quickserv_macos_x64 또는 quickserv_macos_arm64 파일을 프로젝트 폴더로 이동하십시오.
프로젝트 폴더에서 quickserv_macos_x64 또는 quickserv_macos_arm64 마우스 오른쪽 버튼으로 클릭하고 "열기"를 선택하십시오. 그런 다음 확인 대화 상자에서 "열기"를 누릅니다. 이 방법으로 한 번 실행 한 후에는 파일을 두 번 클릭하여 Quickserv를 시작할 수 있습니다.



웹 애플리케이션에 연결하려면 http://127.0.1:42069 (또는 Quickserv가 표시 한 주소)로 이동하십시오. 예에서는 test.py 실행하려면 http://127.0.1:42069/test.py로 이동하십시오.

명령 줄을 통해 설치하고 실행하는 것이 가장 쉽습니다. 터미널을 엽니 다.
다음 명령을 입력하십시오. 첫 번째 명령에는 비밀번호가 필요할 수 있습니다.
# Download
sudo curl
--location
--output /usr/local/bin/quickserv
https://github.com/jstrieb/quickserv/releases/latest/download/quickserv_raspi_arm
# Make executable
sudo chmod +x /usr/local/bin/quickserv
# Make a project folder
mkdir -p my/project/folder
# Go to project folder
cd my/project/folder
# Add a test file
cat << EOF > test.py
#!python3
# Put your code here. For example:
import random
print(random.randint(0, 420))
EOF
# Run QuickServ
quickserv 웹 애플리케이션에 연결하려면 http://127.0.1:42069 (또는 Quickserv가 표시 한 주소)로 이동하십시오. 예를 들어, test.py 실행하려면 http://127.0.1:42069/test.py로 이동하십시오.
실행 파일을 실행하기 위해 클릭하면 Linux 배포판에서 일관된 동작이 없으므로 명령 줄을 통해 설치하고 실행하는 것이 가장 쉽습니다. 컴퓨터의 아키텍처에 따라 아래 curl HTTP 요청 URL의 끝에서 파일 이름을 변경해야 할 수도 있습니다.
릴리스 페이지의 모든 다운로드 옵션을 참조하십시오.
# Download
sudo curl
--location
--output /usr/local/bin/quickserv
https://github.com/jstrieb/quickserv/releases/latest/download/quickserv_linux_x64
# Make executable
sudo chmod +x /usr/local/bin/quickserv
# Make a project folder
mkdir -p /my/project/folder
# Go to project folder
cd /my/project/folder
# Add a test file
cat << EOF > test.py
#!python3
# Put your code here. For example:
import random
print(random.randint(0, 420))
EOF
# Run QuickServ
quickserv 웹 애플리케이션에 연결하려면 http://127.0.1:42069 (또는 Quickserv가 표시 한 주소)로 이동하십시오. 예를 들어, test.py 실행하려면 http://127.0.1:42069/test.py로 이동하십시오.
또는 아래 지침을 사용하여 소스에서 컴파일하십시오.
다음 명령을 사용하여 소스에서 컴파일하고 설치하십시오. 임베디드 파일 시스템에 대한 의존성으로 인해 1.16보다 큰 Go 버전이 필요합니다.
go install github.com/jstrieb/quickserv@latest그런 다음 프로젝트 폴더를 만들고 채우고 Quickserv를 실행하십시오.
# Make a project folder
mkdir -p /my/project/folder
# Go to project folder
cd /my/project/folder
# Add a test file
cat << EOF > test.py
#!python3
# Put your code here. For example:
import random
print(random.randint(0, 420))
EOF
# Run QuickServ
quickservQuickServ의 주요 기능을 보여주기 위해 간단한 웹 응용 프로그램을 작성하여 추가를 수행합니다. 이 코드는 모범 사례를 따르지 않지만 Quickserv로 구축을 시작하는 데 거의 필요하지 않습니다.
먼저 프로젝트 폴더 생성을 만들고 시작 단계에서와 같이 QuickServ 실행 파일을 폴더로 드래그합니다.
다음으로 폴더 내부에서 다음 텍스트를 index.html 로 저장합니다.
< form action =" /calculate " >
< input name =" first " type =" number " > + < input name =" second " type =" number " > = ???
< br >
< button > Calculate </ button >
</ form > 이 코드는 두 가지 변수를 /calculate 페이지에 제출합니다. 브라우저에서는 다음과 같습니다.

그런 다음 프로젝트 폴더 내부에서 calculate 이라는 폴더를 만듭니다. 폴더 calculate 내부에서 다음 코드를 index.py 로 저장합니다. http : http://website/calculate/index.py http://website/calculate 방문 할 때 Quickserv index.whatever 파일을 실행하라고 지시하십시오.
코드 의견에 특별한주의를 기울이십시오. 그들은 여러 가지 중요한 QuickServ 기능을 강조합니다.
#!python3
# Each QuickServ script must begin with a line like the one above so that
# QuickServ knows how to run the file. This line tells QuickServ that I would
# type `python3 this_file.py` to run this file at the command prompt. For
# example, if you wanted to do `julia this_file.py` instead, then you would
# make the first line of `this_file.py` be `#!julia`.
#
# Since we just want QuickServ to show the HTML code to the user and not run
# it, index.html does not begin with this. The first line is only required when
# QuickServ has to run the code.
import argparse
# All HTML form values get turned into command line arguments. The names are
# formatted like "--name" and the value comes right after the name.
parser = argparse . ArgumentParser ()
parser . add_argument ( "--first" , type = int , required = True )
parser . add_argument ( "--second" , type = int , required = True )
args = parser . parse_args ()
# Print the result -- anything printed out goes right to the user. In this
# case, the output is text. But you can print anything and QuickServ will guess
# the file type. Even printing the contents of image and video files works.
print ( args . first + args . second )이제 프로젝트 폴더의 QuickServ를 두 번 클릭하고 브라우저에서 시도해보십시오. 그게 다야!
더 빠른 시연은 다음 섹션에 링크 된 예제를 참조하십시오. How It Work 섹션과 코드 자체의 자세한 내용을 읽으십시오. Advanced Section에는 실행 가능한 실행 가능에 대한 Environment Quickserv 설정에 대한 추가 정보가 있습니다.
모든 예제는 JSTRIEB/QuickServ-Pamples Repo에 연결된 GIT 하위 모듈 인 examples 폴더에 있습니다. 예제를 실행하는 방법에 대한 자세한 내용은 해당 저장소로 이동하십시오.
일부 하이라이트 :
| 요약 | 언어 | 창 | 스코틀랜드 사람 | 리눅스 |
|---|---|---|---|---|
| YouTube to gif | 껍데기 | |||
| 블룸 필터를 만듭니다 | 기음 | |||
| 동기화 된 영화 목록 | TypeScript | |||
| Brainfuck 통역사 | X86-64 어셈블리 | |||
| Mandelbrot 줌 | 껍데기 | |||
| cryptocurrency 대시 보드 | 가다 | |||
| PDF 도구 | 파이썬 | |||
| PDF로서의 마크 다운 | 표준 ML |
모든 QuickServ 코드는 quickserv.go 에 있습니다. 이 잘 작성된 파일의 길이는 약 700 줄이며, 최대 한 시간 동안 golang 친숙하지 않은 숙련 된 프로그래머를 읽어야합니다.
Quickserv에는 두 가지 주요 부분이 있습니다. 첫 번째는 초기화 절차이며 시작시 정확히 한 번 실행됩니다. 두 번째는 사용자가 서버에 HTTP 요청을 할 때마다 호출되는 핸들러 기능입니다.
QuickServ가 시작되면 명령 줄 --dir 플래그를 확인하고 --logfile (그렇지 않으면 표준 출력에 로그인)으로 전달되는 경우 로그 파일을 엽니 다. 로그 파일 경로는 --dir 로 전달 된 것과 관련이없는 현재 작업 디렉토리와 관련이 있습니다.
다음으로 Quickserv는 파일이 실행될 작업 디렉토리를 스캔합니다. 실행될 모든 파일을 인쇄합니다. 이 동작은 Quickserv가 스크립트를 실행 파일로 인식하는지 여부를 결정하는 데 유용합니다. 또한 서버에 액세스하기 위해 웹 주소와 같은 사용자에게 유용한 정보를 인쇄하고 서버에 액세스 할 수있는 폴더 및이를 중지하는 방법을 인쇄합니다.
초기화의 일부가 실패하면 오류 가보고됩니다. 치명적인 오류가 발생한 경우 Quickserv는 종료하기 전에 사용자 입력을 기다립니다. 이런 식으로 실행 파일을 두 번 클릭하는 사용자 (명령 줄에서 시작하는 것과는 달리)에 창이 나타나지 않은 다음 즉시 사라져 오류가 너무 빨리 깜박 거려 오류를 읽을 수 없습니다.
오류 메시지는 의도적으로 기술 전문 용어로 의도적으로 작성되지만 일부는 피할 수 없습니다. 오류의 원인은 오류 메시지에도 포함되므로 사용자가 쉽게 식별하고 수정할 수 있습니다.
초기화 절차의 마지막 단계 인 Quickserv는 모든 요청에 대해 단일 핸들러 기능이있는 웹 서버를 시작합니다. 서버는 42069 의 기본 포트 또는 사용자 --random-port 명령 라인 플래그를 지정한 경우 임의 포트에서 리스닝됩니다. 예를 들어, 사용자가 유머러스 한 사람에게 빠른 사람에게 구축 된 프로젝트를 보여 주어야한다면 임의의 포트가 바람직합니다.
사용자가 웹 페이지를 방문하면 Quickserv는 Lone Handler 기능을 호출하여 요청을 처리합니다.
먼저이 함수는 사용자가 요청한 파일을 열려고합니다. 파일을 찾거나 열 수 없으면 파일의 기본 버전을 제공하려고합니다. 예를 들어, 제공되는 내장 된 기본 favicon.ico 가 있습니다. 경로와 일치하는 기본 파일이 없으면 내장 GO 파일 서버가 오류를 처리하고 404 오류 코드로 응답 할 수 있습니다.
사용자가 요청한 파일이 있으면 디렉토리인지 확인합니다. 디렉토리 인 경우 QuickServ는 xxx 가 파일 확장자 인 index.xxx 라는 파일을 찾으십시오. 인덱스 파일을 찾으면 인덱스가 요청 된 원래 페이지 인 것처럼 인덱스가 제공되고 실행됩니다. 그렇지 않으면 사용자는 기본 색인이없는 디렉토리를 요청해야하므로 QuickServ는 디렉토리의 다른 파일 목록으로 응답합니다.
사용자가 요청한 파일이 디렉토리가 아닌 경우 ( 예 : 일반 파일) Quickserv는 실행 가능 여부를 확인합니다. 그렇다면 찾은 파일을 실행합니다. 그렇지 않은 경우 원시 파일 내용을 사용자에게 반환합니다. 두 경우 모두 QuickServ는 응답에 사용할 FilEtype (따라서 어떤 mimetype )를 추측합니다.
파일이 실행 가능한지 결정하는 기술은 런타임 운영 체제에 따라 다릅니다. Windows에서 .bat 또는 .exe 확장자가있는 모든 파일은 실행 파일로 간주됩니다. 비 창 시스템에서 실행 파일 권한 비트 세트가있는 모든 파일은 실행 파일로 간주됩니다. 모든 시스템에서, 파일은 처음에 유효한 유효한 유사한 의사가있는 경우에 실행 가능합니다. Shebang은 첫 번째 줄에 있어야하며 #! , 유효한 명령이어야합니다. 예를 들어, python3 설치되었다고 가정하고 PATH 에 다음과 같이 가정하면 다음 두 가지 모두 허용됩니다.
#!/usr/bin/python3#!python3 파일을 실행하려면 QuickServ는 파일 자체를 실행하거나 ( .exe 이거나 실행 파일 비트 세트가있는 경우) 파일의 경로를 Shebang에 나열된 실행 파일로 첫 번째 인수로 전달합니다. 요청 본문은 표준 입력에 따라 프로그램에 전달되며 표준 출력에 대한 프로그램에 의해 인쇄 된 모든 것이 응답 본문으로 사용됩니다. 실행 된 프로그램은 HTTP 응답 헤더를 작성할 책임이 없습니다.
모든 구문 분석 HTTP 양식 변수 ( Content-Type x-www-form-urlencoded 인 경우)도 프로그램이 실행될 때 명령 줄 인수로 전달됩니다. 이런 식으로 사용자는 변수 자체를 구문 분석 할 필요가 없습니다.
표준 오류에서 실행 된 프로그램 인쇄는 QuickServ에 의해 기록되므로 기본적으로 콘솔 창에 인쇄됩니다. 디버깅에 편리합니다. 프로그램이 0이 아닌 출구 코드로 종료되면 Quickserv는 500 내부 서버 오류로 응답합니다. 그렇지 않으면 200으로 돌아옵니다.
요청이 양식 데이터가 포함 된 URL 인코딩 포스트 요청 인 경우 Quickserv URL-Decode는 세 가지 기호를 제외한 모든 문자를 제공합니다 : % , & 및 = . 사용자는이를 대체 할 책임이 있습니다. 폼 데이터를 처리하는 프로그램에서 항상 URL-DECODE % 마지막으로하는 것이 중요합니다.
공개 인터넷에서 Quickserv를 실행하지 마십시오. 개인 네트워크에서만 실행하십시오.
Quickserv는 생산 용도로 설계되지 않았습니다. 빠르거나 안전하기 위해 만들어지지 않았습니다. Production에서 Quickserv를 사용하면 사용자와 자신이 위험에 처하게됩니다.
Quickserv는 사람들이 위험한 불안한 물건을 건설 할 수있게합니다. 입력이나 출력을 소독하지 않습니다. 요청 당 하나의 프로세스를 사용하며 서비스 거부 공격에 취약합니다. 보안 모델은 웹 사용자가 신뢰할 수 있다고 가정합니다. 이러한 특성은 프로토 타이핑이 쉽지만 공개 인터넷에서는 안전하지 않습니다.
Production에서 Quickserv를 사용하여 Port 42069 에서 실행됩니다. 바라건대, 모든 사람이 리버스 프록시 또는 포트 포워드 구성에 입력하기 전에 두 번 생각하게 만들기를 바랍니다. 보다 전문적인 데모의 경우 명령 줄 플래그 --random-port 런타임에 결정된 임의 포트를 사용합니다.
Quickserv는 고대 CGI 프로토콜과 유사합니다. CGI가 생산에 나쁘다는 잘 정립되고 잘 확립 된 많은 이유가 있으며, 모두 Quickserv에 생산에 적용됩니다.
Quickserv는 명령 줄 플래그를 통해 구성된 고급 옵션을 가지고 있습니다. 이들은 Quickserv가 실행하는 방법과 위치와 출력을 저장하는 위치를 변경합니다.
Usage:
quickserv [options]
Options:
--dir string
Folder to serve files from. (default ".")
--logfile string
Log file path. Stdout if unspecified. (default "-")
--no-pause
Don't pause before exiting after fatal error.
--random-port
Use a random port instead of 42069.
CGI를 모방하면서 HTTP 헤더는 환경 변수로 실행 된 프로그램으로 전달됩니다. Header-Name 이라는 헤더는 환경 변수 HTTP_HEADER_NAME 으로 설정됩니다.
요청이 GET , POST 등을 지정하는 REQUEST_TYPE 변수도 있습니다.
HTTP는 본체를 사용하여 신체를 표준 입력으로 실행 된 프로그램으로 전달합니다. 대부분의 경우, 요청 본문은 구두로 전달됩니다. HTML 양식의 경우에는 해당되지 않습니다.
HTML 양식 데이터는 튜토리얼에서와 같이 명령 줄 인수에서 읽거나 표준 입력에서 구문 분석 할 수 있습니다. 변수는 형식을 취합니다
name=value&othername=othervalue
튜토리얼의 간단한 추가 예제는 명령 줄 인수 대신 표준 입력에서 HTTP 양식 값을 구문 분석하기 위해 다시 작성할 수 있습니다.
#!python3
import sys
# In the form input, "=" and "&" determine where variables start and end. So if
# they are literally included in the variable name or value, they must be
# specially decoded. This code replaces every instance of the text on the left
# with the text on the right to do the decoding:
# %3D -> =
# %26 -> &
# %25 -> %
#
# NOTE: Order matters! "%" must be decoded last. If not, it can mess with
# decoding the others, since their encoded version uses "%"
def decode_characters ( text ):
text = text . replace ( "%3D" , "=" )
text = text . replace ( "%26" , "&" )
text = text . replace ( "%25" , "%" )
return text
first = second = 0
# Read all of the input into a variable. We are expecting the raw data to look
# like:
# first=123&second=456
data = sys . stdin . read ()
# The raw data looks like the above, so split it into pairs at each "&"
pairs = data . split ( "&" )
for pair in pairs :
# Each pair looks like the following, so split at each "=":
# name=value
name , value = pair . split ( "=" )
# Decode any special characters (=, &, %) now that we have split the
# variables up. This isn't necessary here since we're expecting numbers and
# not expecting any of those characters. But it matters a lot when a user
# could submit text with those characters
name = decode_characters ( name )
value = decode_characters ( value )
# If the name is what we're looking for, store the value for adding
if name == "first" :
first = int ( value )
elif name == "second" :
second = int ( value )
# Print the result -- anything printed out goes right to the user. In this
# case, the output is text. But you can print anything and QuickServ will try and
# guess the file type.
print ( first + second )이 프로젝트는 적극적으로 개발되고 유지됩니다. 최근 커밋이 없다면 모든 것이 순조롭게 진행되고 있음을 의미합니다!
버그, 제안 또는 질문으로 문제를여십시오. 여기에는 특히 오류 메시지를 최대한 명확하게 만드는 방법과 가능한 많은 사용자에게 기본 설정을 적용 할 수있는 방법에 대한 토론이 포함됩니다.
사전 토론이없는 풀 요청은 무시됩니다 - 병합 될 것을 확인하기 전에 코드 작성 시간을 낭비하지 마십시오. 바쁘고 고독한 개발자로서 모든 코드 기여가 컨텍스트가있을 때 반응하기가 더 쉽습니다.
블로그 게시물, 비디오, 튜토리얼, Hackathon 프로젝트 또는 QuickServ를 사용하는 다른 것을 만드는 경우 문제를 열거나 연락처 양식에 메시지를 보내서 다시 연결할 수 있도록 메시지를 보내주십시오!
프로젝트를 지원하는 몇 가지 방법이 있습니다.
이런 것들이 내가 구축 한 것을 계속 공유하도록 동기를 부여하고, 그들은 내 작품에 감사한다는 검증을 제공합니다! 또한 프로젝트를 개선하는 데 도움이됩니다. 미리 감사드립니다!
당신이 당신의 지원을 보여주기 위해 돈을 쓰는 것을 고집한다면, 나는 대신 다음 조직 중 하나에 관대 한 기부를하는 것이 좋습니다. 인터넷 자유를 옹호함으로써 이와 같은 조직은 웹에서 공개적으로 작업을 편안하게 풀어주는 데 도움이됩니다.
이 프로젝트는 다음의 도움 없이는 불가능합니다.