annotate controllers/externalwfs.go @ 369:a43495c91856

Show timing of writing in WFS proxy.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Thu, 09 Aug 2018 15:50:46 +0200
parents 765e056ab4e8
children 15369b41be74
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
335
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1 package controllers
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
2
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
3 import (
352
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
4 "compress/flate"
344
e98033e3683a Be more precise with HTTP headers in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
5 "compress/gzip"
335
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
6 "encoding/xml"
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
7 "io"
352
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
8 "io/ioutil"
335
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
9 "log"
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
10 "net/http"
346
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
11 "net/url"
335
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
12 "strings"
369
a43495c91856 Show timing of writing in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 365
diff changeset
13 "time"
335
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
14
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
15 "github.com/gorilla/mux"
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
16 "golang.org/x/net/html/charset"
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
17
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
18 "gemma.intevation.de/gemma/config"
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
19 )
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
20
359
ac7e0f980456 Unexport [Rr]oundTripFunc type.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 358
diff changeset
21 // roundTripFunc is a helper type to make externalWFSDirector a http.RoundTripper.
ac7e0f980456 Unexport [Rr]oundTripFunc type.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 358
diff changeset
22 type roundTripFunc func(*http.Request) (*http.Response, error)
346
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
23
359
ac7e0f980456 Unexport [Rr]oundTripFunc type.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 358
diff changeset
24 func (rtf roundTripFunc) RoundTrip(req *http.Request) (*http.Response, error) {
346
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
25 return rtf(req)
344
e98033e3683a Be more precise with HTTP headers in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
26 }
e98033e3683a Be more precise with HTTP headers in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
27
346
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
28 func externalWFSDirector(req *http.Request) {
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
29
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
30 abort := func(format string, args ...interface{}) {
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
31 log.Printf(format, args...)
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
32 panic(http.ErrAbortHandler)
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
33 }
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
34
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
35 external := config.ExternalWFSs()
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
36 if external == nil || len(external) == 0 {
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
37 abort("No external WFS proxy config found\n")
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
38 }
350
1ea90a22bd15 Better replacements for WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 349
diff changeset
39 vars := mux.Vars(req)
1ea90a22bd15 Better replacements for WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 349
diff changeset
40 wfs := vars["wfs"]
1ea90a22bd15 Better replacements for WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 349
diff changeset
41 rest := vars["rest"]
1ea90a22bd15 Better replacements for WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 349
diff changeset
42
1ea90a22bd15 Better replacements for WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 349
diff changeset
43 log.Printf("rest: %s\n", rest)
346
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
44
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
45 alias, found := external[wfs]
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
46 if !found {
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
47 abort("No config found for %s\n", wfs)
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
48 }
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
49 data, ok := alias.(map[string]interface{})
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
50 if !ok {
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
51 abort("error: badly configured external WFS %s\n", wfs)
344
e98033e3683a Be more precise with HTTP headers in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
52 }
346
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
53
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
54 urlS, found := data["url"]
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
55 if !found {
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
56 abort("error: missing url for external WFS %s\n", wfs)
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
57 }
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
58
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
59 prefix, ok := urlS.(string)
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
60 if !ok {
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
61 abort("error: badly configured url for external WFS %s\n", wfs)
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
62 }
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
63
358
55388227e7da Rewrite XML attributes in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 355
diff changeset
64 https := useHTTPS(req)
55388227e7da Rewrite XML attributes in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 355
diff changeset
65
346
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
66 log.Printf("%v\n", prefix)
350
1ea90a22bd15 Better replacements for WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 349
diff changeset
67 nURL := prefix + "/" + rest + "?" + req.URL.RawQuery
346
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
68 log.Printf("%v\n", nURL)
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
69
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
70 u, err := url.Parse(nURL)
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
71 if err != nil {
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
72 abort("Invalid url: %v\n", err)
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
73 }
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
74 req.URL = u
349
56f6c5ab0f3d Made WFS proxy rewriting work (to some degrees).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 348
diff changeset
75 req.Header.Set("X-Gemma-From", prefix)
358
55388227e7da Rewrite XML attributes in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 355
diff changeset
76 to := https + "://" + req.Host + "/api/externalwfs/" + wfs
349
56f6c5ab0f3d Made WFS proxy rewriting work (to some degrees).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 348
diff changeset
77 req.Header.Set("X-Gemma-To", to)
56f6c5ab0f3d Made WFS proxy rewriting work (to some degrees).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 348
diff changeset
78
346
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
79 req.Host = u.Host
349
56f6c5ab0f3d Made WFS proxy rewriting work (to some degrees).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 348
diff changeset
80
56f6c5ab0f3d Made WFS proxy rewriting work (to some degrees).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 348
diff changeset
81 //log.Printf("headers: %v\n", req.Header)
344
e98033e3683a Be more precise with HTTP headers in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
82 }
e98033e3683a Be more precise with HTTP headers in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
83
346
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
84 func externalWFSTransport(req *http.Request) (*http.Response, error) {
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
85
349
56f6c5ab0f3d Made WFS proxy rewriting work (to some degrees).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 348
diff changeset
86 from := req.Header.Get("X-Gemma-From")
56f6c5ab0f3d Made WFS proxy rewriting work (to some degrees).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 348
diff changeset
87 to := req.Header.Get("X-Gemma-To")
56f6c5ab0f3d Made WFS proxy rewriting work (to some degrees).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 348
diff changeset
88 req.Header.Del("X-Gemma-From")
56f6c5ab0f3d Made WFS proxy rewriting work (to some degrees).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 348
diff changeset
89 req.Header.Del("X-Gemma-To")
56f6c5ab0f3d Made WFS proxy rewriting work (to some degrees).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 348
diff changeset
90
56f6c5ab0f3d Made WFS proxy rewriting work (to some degrees).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 348
diff changeset
91 // To prevent some caching effects.
56f6c5ab0f3d Made WFS proxy rewriting work (to some degrees).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 348
diff changeset
92 req.Header.Del("If-None-Match")
346
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
93
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
94 resp, err := http.DefaultTransport.RoundTrip(req)
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
95 if err != nil {
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
96 return nil, err
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
97 }
349
56f6c5ab0f3d Made WFS proxy rewriting work (to some degrees).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 348
diff changeset
98 resp.Header.Set("X-Gemma-From", from)
346
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
99 resp.Header.Set("X-Gemma-To", to)
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
100
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
101 return resp, err
344
e98033e3683a Be more precise with HTTP headers in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
102 }
e98033e3683a Be more precise with HTTP headers in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
103
352
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
104 type nopCloser struct {
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
105 io.Writer
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
106 }
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
107
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
108 func (nopCloser) Close() error { return nil }
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
109
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
110 func encoding(h http.Header) (
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
111 func(io.Reader) (io.ReadCloser, error),
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
112 func(io.Writer) (io.WriteCloser, error),
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
113 ) {
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
114 switch enc := h.Get("Content-Encoding"); {
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
115 case strings.Contains(enc, "gzip"):
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
116 log.Println("gzip compression")
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
117 return func(r io.Reader) (io.ReadCloser, error) {
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
118 return gzip.NewReader(r)
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
119 },
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
120 func(w io.Writer) (io.WriteCloser, error) {
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
121 return gzip.NewWriter(w), nil
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
122 }
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
123 case strings.Contains(enc, "deflate"):
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
124 log.Println("Deflate compression")
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
125 return func(r io.Reader) (io.ReadCloser, error) {
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
126 return flate.NewReader(r), nil
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
127 },
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
128 func(w io.Writer) (io.WriteCloser, error) {
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
129 return flate.NewWriter(w, flate.DefaultCompression)
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
130 }
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
131 default:
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
132 log.Println("No content compression")
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
133 return func(r io.Reader) (io.ReadCloser, error) {
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
134 if r2, ok := r.(io.ReadCloser); ok {
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
135 return r2, nil
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
136 }
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
137 return ioutil.NopCloser(r), nil
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
138 },
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
139 func(w io.Writer) (io.WriteCloser, error) {
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
140 if w2, ok := w.(io.WriteCloser); ok {
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
141 return w2, nil
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
142 }
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
143 return nopCloser{w}, nil
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
144 }
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
145 }
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
146 }
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
147
346
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
148 func externalWFSModifyResponse(resp *http.Response) error {
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
149
349
56f6c5ab0f3d Made WFS proxy rewriting work (to some degrees).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 348
diff changeset
150 from := resp.Header.Get("X-Gemma-From")
346
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
151 to := resp.Header.Get("X-Gemma-To")
349
56f6c5ab0f3d Made WFS proxy rewriting work (to some degrees).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 348
diff changeset
152 resp.Header.Del("X-Gemma-From")
346
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
153 resp.Header.Del("X-Gemma-To")
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
154
355
e170075c22ac Cosmetics: Unindent some code in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 354
diff changeset
155 if !isXML(resp.Header) {
e170075c22ac Cosmetics: Unindent some code in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 354
diff changeset
156 return nil
e170075c22ac Cosmetics: Unindent some code in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 354
diff changeset
157 }
348
9543ca97aa70 Re-enable content gzip encoding in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 347
diff changeset
158
355
e170075c22ac Cosmetics: Unindent some code in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 354
diff changeset
159 log.Printf("rewrite from %s to %s\n", from, to)
e170075c22ac Cosmetics: Unindent some code in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 354
diff changeset
160
e170075c22ac Cosmetics: Unindent some code in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 354
diff changeset
161 pr, pw := io.Pipe()
348
9543ca97aa70 Re-enable content gzip encoding in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 347
diff changeset
162
355
e170075c22ac Cosmetics: Unindent some code in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 354
diff changeset
163 var (
e170075c22ac Cosmetics: Unindent some code in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 354
diff changeset
164 r io.ReadCloser
e170075c22ac Cosmetics: Unindent some code in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 354
diff changeset
165 w io.WriteCloser
e170075c22ac Cosmetics: Unindent some code in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 354
diff changeset
166 err error
e170075c22ac Cosmetics: Unindent some code in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 354
diff changeset
167 )
352
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
168
355
e170075c22ac Cosmetics: Unindent some code in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 354
diff changeset
169 reader, writer := encoding(resp.Header)
354
aa24b5691838 Simplified WFS proxy code a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 352
diff changeset
170
355
e170075c22ac Cosmetics: Unindent some code in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 354
diff changeset
171 if r, err = reader(resp.Body); err != nil {
e170075c22ac Cosmetics: Unindent some code in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 354
diff changeset
172 return err
e170075c22ac Cosmetics: Unindent some code in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 354
diff changeset
173 }
352
23d4a9104b0c Support deflate compression in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 351
diff changeset
174
355
e170075c22ac Cosmetics: Unindent some code in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 354
diff changeset
175 if w, err = writer(pw); err != nil {
e170075c22ac Cosmetics: Unindent some code in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 354
diff changeset
176 return err
e170075c22ac Cosmetics: Unindent some code in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 354
diff changeset
177 }
346
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
178
355
e170075c22ac Cosmetics: Unindent some code in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 354
diff changeset
179 go func(force io.ReadCloser) {
369
a43495c91856 Show timing of writing in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 365
diff changeset
180 start := time.Now()
355
e170075c22ac Cosmetics: Unindent some code in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 354
diff changeset
181 defer func() {
e170075c22ac Cosmetics: Unindent some code in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 354
diff changeset
182 //r.Close()
e170075c22ac Cosmetics: Unindent some code in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 354
diff changeset
183 w.Close()
e170075c22ac Cosmetics: Unindent some code in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 354
diff changeset
184 pw.Close()
e170075c22ac Cosmetics: Unindent some code in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 354
diff changeset
185 force.Close()
369
a43495c91856 Show timing of writing in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 365
diff changeset
186 log.Printf("rewrite took %s\n", time.Since(start))
355
e170075c22ac Cosmetics: Unindent some code in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 354
diff changeset
187 }()
e170075c22ac Cosmetics: Unindent some code in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 354
diff changeset
188 if err := rewrite(w, r, from, to); err != nil {
e170075c22ac Cosmetics: Unindent some code in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 354
diff changeset
189 log.Printf("rewrite failed: %v\n", err)
e170075c22ac Cosmetics: Unindent some code in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 354
diff changeset
190 return
e170075c22ac Cosmetics: Unindent some code in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 354
diff changeset
191 }
e170075c22ac Cosmetics: Unindent some code in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 354
diff changeset
192 log.Println("rewrite successful")
e170075c22ac Cosmetics: Unindent some code in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 354
diff changeset
193 }(resp.Body)
346
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
194
355
e170075c22ac Cosmetics: Unindent some code in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 354
diff changeset
195 resp.Body = pr
e170075c22ac Cosmetics: Unindent some code in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 354
diff changeset
196
346
ad0e47c1fedf Use httputil.ReverseProxy for WFS proxying.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 344
diff changeset
197 return nil
344
e98033e3683a Be more precise with HTTP headers in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
198 }
e98033e3683a Be more precise with HTTP headers in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
199
365
765e056ab4e8 Recognize more XML content types in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 359
diff changeset
200 var xmlContentTypes = []string{
765e056ab4e8 Recognize more XML content types in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 359
diff changeset
201 "application/xml",
765e056ab4e8 Recognize more XML content types in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 359
diff changeset
202 "text/xml",
765e056ab4e8 Recognize more XML content types in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 359
diff changeset
203 "application/gml+xml",
765e056ab4e8 Recognize more XML content types in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 359
diff changeset
204 }
765e056ab4e8 Recognize more XML content types in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 359
diff changeset
205
344
e98033e3683a Be more precise with HTTP headers in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
206 func isXML(h http.Header) bool {
e98033e3683a Be more precise with HTTP headers in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
207 for _, t := range h["Content-Type"] {
e98033e3683a Be more precise with HTTP headers in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
208 t = strings.ToLower(t)
365
765e056ab4e8 Recognize more XML content types in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 359
diff changeset
209 for _, ct := range xmlContentTypes {
765e056ab4e8 Recognize more XML content types in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 359
diff changeset
210 if strings.Contains(t, ct) {
765e056ab4e8 Recognize more XML content types in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 359
diff changeset
211 return true
765e056ab4e8 Recognize more XML content types in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 359
diff changeset
212 }
344
e98033e3683a Be more precise with HTTP headers in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
213 }
e98033e3683a Be more precise with HTTP headers in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
214 }
e98033e3683a Be more precise with HTTP headers in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
215 return false
e98033e3683a Be more precise with HTTP headers in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
216 }
e98033e3683a Be more precise with HTTP headers in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
217
335
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
218 func rewrite(w io.Writer, r io.Reader, from, to string) error {
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
219
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
220 decoder := xml.NewDecoder(r)
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
221 decoder.CharsetReader = charset.NewReaderLabel
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
222
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
223 encoder := xml.NewEncoder(w)
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
224
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
225 replace := func(s string) string {
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
226 return strings.Replace(s, from, to, -1)
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
227 }
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
228
351
b89138a25f9e Fixed namespace compression in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 350
diff changeset
229 var ns nsdef
335
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
230
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
231 tokens:
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
232 for {
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
233 tok, err := decoder.Token()
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
234 switch {
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
235 case tok == nil && err == io.EOF:
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
236 break tokens
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
237 case err != nil:
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
238 return err
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
239 }
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
240
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
241 switch t := tok.(type) {
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
242 case xml.StartElement:
351
b89138a25f9e Fixed namespace compression in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 350
diff changeset
243 ns = ns.push()
335
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
244 t = t.Copy()
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
245
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
246 attr := make([]xml.Attr, len(t.Attr))
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
247
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
248 for i, at := range t.Attr {
358
55388227e7da Rewrite XML attributes in WFS proxy, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 355
diff changeset
249 at.Value = replace(at.Value)
335
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
250 switch {
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
251 case at.Name.Space == "xmlns":
351
b89138a25f9e Fixed namespace compression in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 350
diff changeset
252 ns.define(at.Value, at.Name.Local)
b89138a25f9e Fixed namespace compression in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 350
diff changeset
253 at.Name.Local = "xmlns:" + at.Name.Local
b89138a25f9e Fixed namespace compression in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 350
diff changeset
254 at.Name.Space = ""
b89138a25f9e Fixed namespace compression in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 350
diff changeset
255
b89138a25f9e Fixed namespace compression in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 350
diff changeset
256 case at.Name.Space != "":
b89138a25f9e Fixed namespace compression in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 350
diff changeset
257 if s := ns.lookup(at.Name.Space); s != "" {
b89138a25f9e Fixed namespace compression in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 350
diff changeset
258 at.Name.Local = s + ":" + at.Name.Local
b89138a25f9e Fixed namespace compression in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 350
diff changeset
259 at.Name.Space = ""
b89138a25f9e Fixed namespace compression in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 350
diff changeset
260 }
335
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
261 }
351
b89138a25f9e Fixed namespace compression in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 350
diff changeset
262
b89138a25f9e Fixed namespace compression in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 350
diff changeset
263 attr[i] = at
335
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
264 }
351
b89138a25f9e Fixed namespace compression in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 350
diff changeset
265 if s := ns.lookup(t.Name.Space); s != "" {
b89138a25f9e Fixed namespace compression in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 350
diff changeset
266 t.Name.Space = ""
b89138a25f9e Fixed namespace compression in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 350
diff changeset
267 t.Name.Local = s + ":" + t.Name.Local
b89138a25f9e Fixed namespace compression in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 350
diff changeset
268 }
335
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
269 t.Attr = attr
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
270 tok = t
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
271
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
272 case xml.CharData:
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
273 tok = xml.CharData(replace(string(t)))
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
274
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
275 case xml.EndElement:
351
b89138a25f9e Fixed namespace compression in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 350
diff changeset
276 if s := ns.lookup(t.Name.Space); s != "" {
b89138a25f9e Fixed namespace compression in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 350
diff changeset
277 t.Name.Space = ""
b89138a25f9e Fixed namespace compression in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 350
diff changeset
278 t.Name.Local = s + ":" + t.Name.Local
b89138a25f9e Fixed namespace compression in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 350
diff changeset
279 tok = t
b89138a25f9e Fixed namespace compression in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 350
diff changeset
280 }
b89138a25f9e Fixed namespace compression in WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 350
diff changeset
281 ns = ns.pop()
335
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
282 }
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
283 if err := encoder.EncodeToken(tok); err != nil {
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
284 return err
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
285 }
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
286 }
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
287
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
288 return encoder.Flush()
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
289 }
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
290
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
291 type nsdef []map[string]string
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
292
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
293 func (n nsdef) lookup(ns string) string {
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
294 for i := len(n) - 1; i >= 0; i-- {
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
295 if s := n[i][ns]; s != "" {
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
296 return s
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
297 }
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
298 }
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
299 return ""
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
300 }
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
301
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
302 func (n nsdef) push() nsdef {
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
303 return append(n, make(map[string]string))
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
304 }
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
305
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
306 func (n nsdef) pop() nsdef {
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
307 if l := len(n); l > 0 {
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
308 n[l-1] = nil
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
309 n = n[:l-1]
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
310 }
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
311 return n
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
312 }
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
313
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
314 func (n nsdef) define(ns, s string) {
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
315 if n != nil {
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
316 n[len(n)-1][ns] = s
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
317 }
bd292a554b6e Made gemma a WFS proxy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
318 }