Compare commits
4 Commits
Author | SHA1 | Date | |
---|---|---|---|
f5f1625533 | |||
2e11c55981 | |||
59b5d686d4 | |||
1a48e7815f |
@ -1,8 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="SwUserDefinedSpecifications">
|
|
||||||
<option name="specTypeByUrl">
|
|
||||||
<map />
|
|
||||||
</option>
|
|
||||||
</component>
|
|
||||||
</project>
|
|
37
Makefile
37
Makefile
@ -1,18 +1,21 @@
|
|||||||
SHELL := /bin/bash
|
SHELL := /bin/bash
|
||||||
BIN := dist/gopkghsrv
|
PRODUCT_NAME := gopkghsrv
|
||||||
ENTRY_POINT := ./cmd/gopkghsrv
|
BIN := dist/${PRODUCT_NAME}
|
||||||
|
DNAME := ${PRODUCT_NAME}_
|
||||||
|
ENTRY_POINT := ./cmd/${PRODUCT_NAME}
|
||||||
HASH := $(shell git rev-parse --short HEAD)
|
HASH := $(shell git rev-parse --short HEAD)
|
||||||
COMMIT_DATE := $(shell git show -s --format=%ci ${HASH})
|
COMMIT_DATE := $(shell git show -s --format=%ci ${HASH})
|
||||||
BUILD_DATE := $(shell date '+%Y-%m-%d %H:%M:%S')
|
BUILD_DATE := $(shell date '+%Y-%m-%d %H:%M:%S')
|
||||||
VERSION := ${HASH}
|
VERSION := ${HASH}
|
||||||
LD_FLAGS := -s -w -X 'main.buildVersion=${VERSION}' -X 'main.buildDate=${BUILD_DATE}'
|
LD_FLAGS := -s -w -X 'main.buildVersion=${VERSION}' -X 'main.buildDate=${BUILD_DATE}' -X 'main.buildName=${PRODUCT_NAME}'
|
||||||
COMP_BIN := go
|
COMP_BIN := go
|
||||||
|
|
||||||
ifeq ($(OS),Windows_NT)
|
ifeq ($(OS),Windows_NT)
|
||||||
BIN := $(BIN).exe
|
BIN := $(BIN).exe
|
||||||
|
DNAME := $(DNAME).exe
|
||||||
endif
|
endif
|
||||||
|
|
||||||
.PHONY: build dev test clean
|
.PHONY: build dev test clean deploy d setup s
|
||||||
|
|
||||||
build:
|
build:
|
||||||
mkdir -p dist/
|
mkdir -p dist/
|
||||||
@ -24,8 +27,30 @@ dev:
|
|||||||
./${BIN}
|
./${BIN}
|
||||||
|
|
||||||
test:
|
test:
|
||||||
go test
|
${COMP_BIN} test
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
go clean
|
${COMP_BIN} clean
|
||||||
rm -r -f dist/
|
rm -r -f dist/
|
||||||
|
|
||||||
|
setup:
|
||||||
|
sudo cp "${PRODUCT_NAME}.service" /etc/systemd/system
|
||||||
|
sudo mkdir -p "/etc/${PRODUCT_NAME}"
|
||||||
|
sudo touch "/etc/${PRODUCT_NAME}/.env"
|
||||||
|
sudo systemctl daemon-reload
|
||||||
|
|
||||||
|
s:
|
||||||
|
sudo cp "${DNAME}.service" /etc/systemd/system
|
||||||
|
sudo mkdir -p "/etc/${DNAME}"
|
||||||
|
sudo touch "/etc/${DNAME}/.env"
|
||||||
|
sudo systemctl daemon-reload
|
||||||
|
|
||||||
|
deploy: build
|
||||||
|
sudo systemctl stop "${PRODUCT_NAME}"
|
||||||
|
sudo cp "${BIN}" /usr/local/bin
|
||||||
|
sudo systemctl start "${PRODUCT_NAME}"
|
||||||
|
|
||||||
|
d: build
|
||||||
|
sudo systemctl stop "${DNAME}"
|
||||||
|
sudo cp "${BIN}" "/usr/local/bin/${DNAME}"
|
||||||
|
sudo systemctl start "${DNAME}"
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
# GO Package Header Server
|
# GO Package Header Server
|
||||||
|
|
||||||
[![Build Status](https://ci.mrmelon54.xyz/api/badges/alfred/GOPackageHeaderServer/status.svg)](https://ci.mrmelon54.xyz/alfred/GOPackageHeaderServer)
|
[![Build Status](https://ci.mrmelon54.com/api/badges/alfred/GOPackageHeaderServer/status.svg)](https://ci.mrmelon54.com/alfred/GOPackageHeaderServer)
|
||||||
|
|
||||||
This allows for the required meta headers to be outputted in order for the GO package system to find the source files of the package.
|
This allows for the required meta headers to be outputted in order for the GO package system to find the source files of the package.
|
||||||
|
|
||||||
@ -8,11 +8,11 @@ The outputter can be configured in runtime, the server has a YAML configuration.
|
|||||||
The outputter can be used to add the extra meta tags to the head of the HTML document.
|
The outputter can be used to add the extra meta tags to the head of the HTML document.
|
||||||
|
|
||||||
Maintainer:
|
Maintainer:
|
||||||
[Captain ALM](https://code.mrmelon54.xyz/alfred)
|
[Captain ALM](https://code.mrmelon54.com/alfred)
|
||||||
|
|
||||||
License:
|
License:
|
||||||
[BSD 3-Clause](https://code.mrmelon54.xyz/alfred/GOPackageHeaderServer/src/branch/master/LICENSE.md)
|
[BSD 3-Clause](https://code.mrmelon54.com/alfred/GOPackageHeaderServer/src/branch/master/LICENSE.md)
|
||||||
|
|
||||||
Example configuration:
|
Example configuration:
|
||||||
[config.example.yml](https://code.mrmelon54.xyz/alfred/GOPackageHeaderServer/src/branch/master/config.example.yml)
|
[config.example.yml](https://code.mrmelon54.com/alfred/GOPackageHeaderServer/src/branch/master/config.example.yml)
|
||||||
The configuration must by placed in a .data sub-directory from the executable. A .env file must also be generated (Can be empty).
|
The configuration must by placed in a .data sub-directory from the executable. A .env file must also be generated (Can be empty).
|
42
conf/zone.go
42
conf/zone.go
@ -3,19 +3,21 @@ package conf
|
|||||||
import "golang.captainalm.com/GOPackageHeaderServer/outputMeta"
|
import "golang.captainalm.com/GOPackageHeaderServer/outputMeta"
|
||||||
|
|
||||||
type ZoneYaml struct {
|
type ZoneYaml struct {
|
||||||
Name string `yaml:"name"`
|
Name string `yaml:"name"`
|
||||||
Domains []string `yaml:"domains"`
|
Domains []string `yaml:"domains"`
|
||||||
CssURL string `yaml:"cssURL"`
|
CssURL string `yaml:"cssURL"`
|
||||||
HavePageContents bool `yaml:"havePageContents"`
|
HavePageContents bool `yaml:"havePageContents"`
|
||||||
BasePath string `yaml:"basePath"`
|
BasePath string `yaml:"basePath"`
|
||||||
UsernameProvided bool `yaml:"usernameProvided"` //If set, the outputter will do /{user}/{repo}/ for repos rather than /{repo}/ ; Should really be named usernameProvidedByRequest
|
UsernameProvided bool `yaml:"usernameProvided"` //If set, the outputter will do /{user}/{repo}/ for repos rather than /{repo}/ ; Should really be named usernameProvidedByRequest
|
||||||
Username string `yaml:"username"`
|
Username string `yaml:"username"`
|
||||||
BasePrefixURL string `yaml:"basePrefixURL"`
|
BasePrefixURL string `yaml:"basePrefixURL"`
|
||||||
SuffixDirectoryURL string `yaml:"suffixDirectoryURL"`
|
SuffixDirectoryURL string `yaml:"suffixDirectoryURL"`
|
||||||
SuffixFileURL string `yaml:"suffixFileURL"`
|
SuffixFileURL string `yaml:"suffixFileURL"`
|
||||||
RangeSupported bool `yaml:"rangeSupported"`
|
RangeSupported bool `yaml:"rangeSupported"`
|
||||||
PathLengthLimit uint `yaml:"pathLengthLimit"` //The length of the path (Number of entries in the path) to return in the responses; (If 0: defaults to 1, if the username is not expected to be provided by the request, otherwise defaulting to 2)
|
PathLengthLimit uint `yaml:"pathLengthLimit"` //The length of the path (Number of entries in the path) to return in the responses; (If 0: defaults to 1, if the username is not expected to be provided by the request, otherwise defaulting to 2)
|
||||||
CacheSettings CacheSettingsYaml `yaml:"cacheSettings"`
|
SuffixImportURL string `yaml:"suffixImportURL"`
|
||||||
|
BasePrefixSourceURL string `yaml:"basePrefixSourceURL"`
|
||||||
|
CacheSettings CacheSettingsYaml `yaml:"cacheSettings"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (zy ZoneYaml) GetPackageMetaTagOutputter() *outputMeta.PackageMetaTagOutputter {
|
func (zy ZoneYaml) GetPackageMetaTagOutputter() *outputMeta.PackageMetaTagOutputter {
|
||||||
@ -32,11 +34,13 @@ func (zy ZoneYaml) GetPackageMetaTagOutputter() *outputMeta.PackageMetaTagOutput
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return &outputMeta.PackageMetaTagOutputter{
|
return &outputMeta.PackageMetaTagOutputter{
|
||||||
BasePath: zy.BasePath,
|
BasePath: zy.BasePath,
|
||||||
Username: theUsername,
|
Username: theUsername,
|
||||||
BasePrefixURL: zy.BasePrefixURL,
|
BasePrefixURL: zy.BasePrefixURL,
|
||||||
SuffixDirectoryURL: zy.SuffixDirectoryURL,
|
SuffixDirectoryURL: zy.SuffixDirectoryURL,
|
||||||
SuffixFileURL: zy.SuffixFileURL,
|
SuffixFileURL: zy.SuffixFileURL,
|
||||||
PathLengthLimit: pthLength,
|
PathLengthLimit: pthLength,
|
||||||
|
SuffixImportURL: zy.SuffixImportURL,
|
||||||
|
BasePrefixSourceURL: zy.BasePrefixSourceURL,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
15
gopkghsrv.service
Normal file
15
gopkghsrv.service
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
# GO PKG Header Service
|
||||||
|
[Unit]
|
||||||
|
Description=GO PKG Header Service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
WorkingDirectory=/etc/gopkghsrv
|
||||||
|
ExecStart=/usr/local/bin/gopkghsrv
|
||||||
|
User=www-data
|
||||||
|
Group=www-data
|
||||||
|
Type=simple
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=15
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
15
gopkghsrv_.service
Normal file
15
gopkghsrv_.service
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
# GO PKG Header Service (Dev)
|
||||||
|
[Unit]
|
||||||
|
Description=GO PKG Header Service (Dev)
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
WorkingDirectory=/etc/gopkghsrv_
|
||||||
|
ExecStart=/usr/local/bin/gopkghsrv_
|
||||||
|
User=www-data
|
||||||
|
Group=www-data
|
||||||
|
Type=simple
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=15
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
@ -6,12 +6,14 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type PackageMetaTagOutputter struct {
|
type PackageMetaTagOutputter struct {
|
||||||
BasePath string
|
BasePath string
|
||||||
Username string //If set, the outputter will do /{repo}/ for repos rather than /{user}/{repo}/
|
Username string //If set, the outputter will do /{repo}/ for repos rather than /{user}/{repo}/
|
||||||
BasePrefixURL string
|
BasePrefixURL string
|
||||||
SuffixDirectoryURL string
|
SuffixDirectoryURL string
|
||||||
SuffixFileURL string
|
SuffixFileURL string
|
||||||
PathLengthLimit uint //The number of path entries in the go import paths
|
PathLengthLimit uint //The number of path entries in the go import paths
|
||||||
|
SuffixImportURL string
|
||||||
|
BasePrefixSourceURL string //If blank, use BasePrefixURL instead
|
||||||
}
|
}
|
||||||
|
|
||||||
func (pkgMTO *PackageMetaTagOutputter) GetMetaTags(pathIn string) string {
|
func (pkgMTO *PackageMetaTagOutputter) GetMetaTags(pathIn string) string {
|
||||||
@ -21,12 +23,12 @@ func (pkgMTO *PackageMetaTagOutputter) GetMetaTags(pathIn string) string {
|
|||||||
|
|
||||||
func (pkgMTO *PackageMetaTagOutputter) GetMetaContentForGoImport(pathIn string) string {
|
func (pkgMTO *PackageMetaTagOutputter) GetMetaContentForGoImport(pathIn string) string {
|
||||||
pathLoc := pkgMTO.GetPath(pathIn)
|
pathLoc := pkgMTO.GetPath(pathIn)
|
||||||
return pkgMTO.getPrefix(pathLoc) + " git " + pkgMTO.getHomeURL(pathLoc)
|
return pkgMTO.getPrefix(pathLoc) + " git " + pkgMTO.getHomeURL(pathLoc, false) + pkgMTO.SuffixImportURL
|
||||||
}
|
}
|
||||||
|
|
||||||
func (pkgMTO *PackageMetaTagOutputter) GetMetaContentForGoSource(pathIn string) string {
|
func (pkgMTO *PackageMetaTagOutputter) GetMetaContentForGoSource(pathIn string) string {
|
||||||
pathLoc := pkgMTO.GetPath(pathIn)
|
pathLoc := pkgMTO.GetPath(pathIn)
|
||||||
return pkgMTO.getPrefix(pathLoc) + " " + pkgMTO.getHomeURL(pathLoc) + " " +
|
return pkgMTO.getPrefix(pathLoc) + " " + pkgMTO.getHomeURL(pathLoc, true) + " " +
|
||||||
pkgMTO.getDirectoryURL(pathLoc) + " " + pkgMTO.getFileURL(pathLoc)
|
pkgMTO.getDirectoryURL(pathLoc) + " " + pkgMTO.getFileURL(pathLoc)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -53,6 +55,19 @@ func (pkgMTO *PackageMetaTagOutputter) assureBasePrefixURL() (failed bool) {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (pkgMTO *PackageMetaTagOutputter) assureBasePrefixSourceURL() (failed bool) {
|
||||||
|
if pkgMTO.BasePrefixSourceURL == "" {
|
||||||
|
if pkgMTO.assureBasePrefixURL() {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if pkgMTO.BasePrefixURL == "" {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
pkgMTO.BasePrefixSourceURL = pkgMTO.BasePrefixURL
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
func (pkgMTO *PackageMetaTagOutputter) getPrefix(pathIn string) string {
|
func (pkgMTO *PackageMetaTagOutputter) getPrefix(pathIn string) string {
|
||||||
if pkgMTO.BasePath == "" {
|
if pkgMTO.BasePath == "" {
|
||||||
return "_"
|
return "_"
|
||||||
@ -60,38 +75,48 @@ func (pkgMTO *PackageMetaTagOutputter) getPrefix(pathIn string) string {
|
|||||||
return path.Join(pkgMTO.BasePath, pathIn)
|
return path.Join(pkgMTO.BasePath, pathIn)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (pkgMTO *PackageMetaTagOutputter) getHomeURL(pathIn string) string {
|
func (pkgMTO *PackageMetaTagOutputter) getHomeURL(pathIn string, isSource bool) string {
|
||||||
if pkgMTO.assureBasePrefixURL() {
|
bpURL := ""
|
||||||
return "_"
|
if isSource {
|
||||||
}
|
if pkgMTO.assureBasePrefixSourceURL() {
|
||||||
|
return "_"
|
||||||
if pkgMTO.Username == "" {
|
} else {
|
||||||
return pkgMTO.BasePrefixURL + "/" + strings.TrimLeft(path.Clean(pathIn), "/")
|
bpURL = pkgMTO.BasePrefixSourceURL
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
return pkgMTO.BasePrefixURL + "/" + strings.TrimLeft(path.Join(pkgMTO.Username, pathIn), "/")
|
if pkgMTO.assureBasePrefixURL() {
|
||||||
|
return "_"
|
||||||
|
} else {
|
||||||
|
bpURL = pkgMTO.BasePrefixURL
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if pkgMTO.Username == "" {
|
||||||
|
return bpURL + "/" + strings.TrimLeft(path.Clean(pathIn), "/")
|
||||||
|
} else {
|
||||||
|
return bpURL + "/" + strings.TrimLeft(path.Join(pkgMTO.Username, pathIn), "/")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (pkgMTO *PackageMetaTagOutputter) getDirectoryURL(pathIn string) string {
|
func (pkgMTO *PackageMetaTagOutputter) getDirectoryURL(pathIn string) string {
|
||||||
if pkgMTO.assureBasePrefixURL() || pkgMTO.SuffixDirectoryURL == "" {
|
if pkgMTO.assureBasePrefixSourceURL() || pkgMTO.SuffixDirectoryURL == "" {
|
||||||
return "_"
|
return "_"
|
||||||
}
|
}
|
||||||
|
|
||||||
if pkgMTO.Username == "" {
|
if pkgMTO.Username == "" {
|
||||||
return pkgMTO.BasePrefixURL + "/" + strings.TrimLeft(path.Join(pathIn, pkgMTO.SuffixDirectoryURL), "/")
|
return pkgMTO.BasePrefixSourceURL + "/" + strings.TrimLeft(path.Join(pathIn, pkgMTO.SuffixDirectoryURL), "/")
|
||||||
} else {
|
} else {
|
||||||
return pkgMTO.BasePrefixURL + "/" + strings.TrimLeft(path.Join(pkgMTO.Username, pathIn, pkgMTO.SuffixDirectoryURL), "/")
|
return pkgMTO.BasePrefixSourceURL + "/" + strings.TrimLeft(path.Join(pkgMTO.Username, pathIn, pkgMTO.SuffixDirectoryURL), "/")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (pkgMTO *PackageMetaTagOutputter) getFileURL(pathIn string) string {
|
func (pkgMTO *PackageMetaTagOutputter) getFileURL(pathIn string) string {
|
||||||
if pkgMTO.assureBasePrefixURL() || pkgMTO.SuffixFileURL == "" {
|
if pkgMTO.assureBasePrefixSourceURL() || pkgMTO.SuffixFileURL == "" {
|
||||||
return "_"
|
return "_"
|
||||||
}
|
}
|
||||||
|
|
||||||
if pkgMTO.Username == "" {
|
if pkgMTO.Username == "" {
|
||||||
return pkgMTO.BasePrefixURL + "/" + strings.TrimLeft(path.Join(pathIn, pkgMTO.SuffixFileURL), "/")
|
return pkgMTO.BasePrefixSourceURL + "/" + strings.TrimLeft(path.Join(pathIn, pkgMTO.SuffixFileURL), "/")
|
||||||
} else {
|
} else {
|
||||||
return pkgMTO.BasePrefixURL + "/" + strings.TrimLeft(path.Join(pkgMTO.Username, pathIn, pkgMTO.SuffixFileURL), "/")
|
return pkgMTO.BasePrefixSourceURL + "/" + strings.TrimLeft(path.Join(pkgMTO.Username, pathIn, pkgMTO.SuffixFileURL), "/")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,8 +20,8 @@ func (htm handlerTemplateMarshal) GetGoSourceMetaContent() string {
|
|||||||
|
|
||||||
func (htm handlerTemplateMarshal) GetLink() string {
|
func (htm handlerTemplateMarshal) GetLink() string {
|
||||||
if htm.PageHandler.MetaOutput.Username == "" {
|
if htm.PageHandler.MetaOutput.Username == "" {
|
||||||
return htm.PageHandler.MetaOutput.BasePrefixURL + "/" + strings.TrimLeft(path.Clean(htm.PageHandler.MetaOutput.GetPath(htm.RequestPath)), "/")
|
return htm.PageHandler.MetaOutput.BasePrefixSourceURL + "/" + strings.TrimLeft(path.Clean(htm.PageHandler.MetaOutput.GetPath(htm.RequestPath)), "/")
|
||||||
} else {
|
} else {
|
||||||
return htm.PageHandler.MetaOutput.BasePrefixURL + "/" + strings.TrimLeft(path.Join(htm.PageHandler.MetaOutput.Username, htm.PageHandler.MetaOutput.GetPath(htm.RequestPath)), "/")
|
return htm.PageHandler.MetaOutput.BasePrefixSourceURL + "/" + strings.TrimLeft(path.Join(htm.PageHandler.MetaOutput.Username, htm.PageHandler.MetaOutput.GetPath(htm.RequestPath)), "/")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -37,6 +37,8 @@ func ProcessSupportedPreconditionsForNext(rw http.ResponseWriter, req *http.Requ
|
|||||||
}
|
}
|
||||||
if conditionFailed {
|
if conditionFailed {
|
||||||
SwitchToNonCachingHeaders(rw.Header())
|
SwitchToNonCachingHeaders(rw.Header())
|
||||||
|
rw.Header().Del("Content-Type")
|
||||||
|
rw.Header().Del("Content-Length")
|
||||||
WriteResponseHeaderCanWriteBody(req.Method, rw, http.StatusPreconditionFailed, "")
|
WriteResponseHeaderCanWriteBody(req.Method, rw, http.StatusPreconditionFailed, "")
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
@ -54,6 +56,8 @@ func ProcessSupportedPreconditionsForNext(rw http.ResponseWriter, req *http.Requ
|
|||||||
parse, err := time.Parse(http.TimeFormat, req.Header.Get("If-Unmodified-Since"))
|
parse, err := time.Parse(http.TimeFormat, req.Header.Get("If-Unmodified-Since"))
|
||||||
if err == nil && modT.After(parse) {
|
if err == nil && modT.After(parse) {
|
||||||
SwitchToNonCachingHeaders(rw.Header())
|
SwitchToNonCachingHeaders(rw.Header())
|
||||||
|
rw.Header().Del("Content-Type")
|
||||||
|
rw.Header().Del("Content-Length")
|
||||||
WriteResponseHeaderCanWriteBody(req.Method, rw, http.StatusPreconditionFailed, "")
|
WriteResponseHeaderCanWriteBody(req.Method, rw, http.StatusPreconditionFailed, "")
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
@ -99,6 +103,8 @@ func ProcessRangePreconditions(maxLength int64, rw http.ResponseWriter, req *htt
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
SwitchToNonCachingHeaders(rw.Header())
|
SwitchToNonCachingHeaders(rw.Header())
|
||||||
|
rw.Header().Del("Content-Type")
|
||||||
|
rw.Header().Del("Content-Length")
|
||||||
rw.Header().Set("Content-Range", "bytes */"+strconv.FormatInt(maxLength, 10))
|
rw.Header().Set("Content-Range", "bytes */"+strconv.FormatInt(maxLength, 10))
|
||||||
WriteResponseHeaderCanWriteBody(req.Method, rw, http.StatusRequestedRangeNotSatisfiable, "")
|
WriteResponseHeaderCanWriteBody(req.Method, rw, http.StatusRequestedRangeNotSatisfiable, "")
|
||||||
return nil
|
return nil
|
||||||
|
Loading…
Reference in New Issue
Block a user