Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
caddy
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
caddy
Commits
1cb00537
Commit
1cb00537
authored
Jun 04, 2015
by
Matt Holt
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #102 from brk0v/proxy-without
proxy: Add "without" option
parents
c6e2b9cc
822a615c
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
25 additions
and
13 deletions
+25
-13
middleware/proxy/proxy.go
middleware/proxy/proxy.go
+10
-9
middleware/proxy/proxy_test.go
middleware/proxy/proxy_test.go
+1
-1
middleware/proxy/reverseproxy.go
middleware/proxy/reverseproxy.go
+6
-1
middleware/proxy/upstream.go
middleware/proxy/upstream.go
+8
-2
No files found.
middleware/proxy/proxy.go
View file @
1cb00537
...
...
@@ -34,14 +34,15 @@ type UpstreamHostDownFunc func(*UpstreamHost) bool
// UpstreamHost represents a single proxy upstream
type
UpstreamHost
struct
{
// The hostname of this upstream host
Name
string
ReverseProxy
*
ReverseProxy
Conns
int64
Fails
int32
FailTimeout
time
.
Duration
Unhealthy
bool
ExtraHeaders
http
.
Header
CheckDown
UpstreamHostDownFunc
Name
string
ReverseProxy
*
ReverseProxy
Conns
int64
Fails
int32
FailTimeout
time
.
Duration
Unhealthy
bool
ExtraHeaders
http
.
Header
CheckDown
UpstreamHostDownFunc
WithoutPathPrefix
string
}
// Down checks whether the upstream host is down or not.
...
...
@@ -77,7 +78,7 @@ func (p Proxy) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) {
if
baseURL
,
err
:=
url
.
Parse
(
host
.
Name
);
err
==
nil
{
r
.
Host
=
baseURL
.
Host
if
proxy
==
nil
{
proxy
=
NewSingleHostReverseProxy
(
baseURL
)
proxy
=
NewSingleHostReverseProxy
(
baseURL
,
host
.
WithoutPathPrefix
)
}
}
else
if
proxy
==
nil
{
return
http
.
StatusInternalServerError
,
err
...
...
middleware/proxy/proxy_test.go
View file @
1cb00537
...
...
@@ -120,7 +120,7 @@ func (u *fakeUpstream) Select() *UpstreamHost {
uri
,
_
:=
url
.
Parse
(
u
.
name
)
return
&
UpstreamHost
{
Name
:
u
.
name
,
ReverseProxy
:
NewSingleHostReverseProxy
(
uri
),
ReverseProxy
:
NewSingleHostReverseProxy
(
uri
,
""
),
ExtraHeaders
:
proxyHeaders
,
}
}
...
...
middleware/proxy/reverseproxy.go
View file @
1cb00537
...
...
@@ -62,7 +62,9 @@ func singleJoiningSlash(a, b string) string {
// URLs to the scheme, host, and base path provided in target. If the
// target's path is "/base" and the incoming request was for "/dir",
// the target request will be for /base/dir.
func
NewSingleHostReverseProxy
(
target
*
url
.
URL
)
*
ReverseProxy
{
// Without logic: target's path is "/", incoming is "/api/messages",
// without is "/api", then the target request will be for /messages.
func
NewSingleHostReverseProxy
(
target
*
url
.
URL
,
without
string
)
*
ReverseProxy
{
targetQuery
:=
target
.
RawQuery
director
:=
func
(
req
*
http
.
Request
)
{
req
.
URL
.
Scheme
=
target
.
Scheme
...
...
@@ -73,6 +75,9 @@ func NewSingleHostReverseProxy(target *url.URL) *ReverseProxy {
}
else
{
req
.
URL
.
RawQuery
=
targetQuery
+
"&"
+
req
.
URL
.
RawQuery
}
if
without
!=
""
{
req
.
URL
.
Path
=
strings
.
TrimPrefix
(
req
.
URL
.
Path
,
without
)
}
}
return
&
ReverseProxy
{
Director
:
director
}
}
...
...
middleware/proxy/upstream.go
View file @
1cb00537
...
...
@@ -28,13 +28,13 @@ type staticUpstream struct {
Path
string
Interval
time
.
Duration
}
WithoutPathPrefix
string
}
// NewStaticUpstreams parses the configuration input and sets up
// static upstreams for the proxy middleware.
func
NewStaticUpstreams
(
c
parse
.
Dispenser
)
([]
Upstream
,
error
)
{
var
upstreams
[]
Upstream
for
c
.
Next
()
{
upstream
:=
&
staticUpstream
{
from
:
""
,
...
...
@@ -104,6 +104,11 @@ func NewStaticUpstreams(c parse.Dispenser) ([]Upstream, error) {
case
"websocket"
:
proxyHeaders
.
Add
(
"Connection"
,
"{>Connection}"
)
proxyHeaders
.
Add
(
"Upgrade"
,
"{>Upgrade}"
)
case
"without"
:
if
!
c
.
NextArg
()
{
return
upstreams
,
c
.
ArgErr
()
}
upstream
.
WithoutPathPrefix
=
c
.
Val
()
}
}
...
...
@@ -131,9 +136,10 @@ func NewStaticUpstreams(c parse.Dispenser) ([]Upstream, error) {
return
false
}
}(
upstream
),
WithoutPathPrefix
:
upstream
.
WithoutPathPrefix
,
}
if
baseURL
,
err
:=
url
.
Parse
(
uh
.
Name
);
err
==
nil
{
uh
.
ReverseProxy
=
NewSingleHostReverseProxy
(
baseURL
)
uh
.
ReverseProxy
=
NewSingleHostReverseProxy
(
baseURL
,
uh
.
WithoutPathPrefix
)
}
else
{
return
upstreams
,
err
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment