forked from JonCooperWorks/judas
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtransformers.go
79 lines (65 loc) · 1.88 KB
/
transformers.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package main
import (
"bytes"
"fmt"
"io/ioutil"
"net/http"
"strings"
"github.com/PuerkitoBio/goquery"
)
// ResponseTransformer modifies a response in any way we see fit, such as inserting extra JavaScript.
type ResponseTransformer interface {
Transform(response *http.Response) error
}
// JavaScriptInjectionTransformer holds JavaScript filename for injecting into response.
type JavaScriptInjectionTransformer struct {
javascriptURL string
}
// Transform Injects JavaScript into an HTML response.
func (j JavaScriptInjectionTransformer) Transform(response *http.Response) error {
if !strings.Contains(response.Header.Get("Content-Type"), "text/html") {
return nil
}
// Prevent NewDocumentFromReader from closing the response body.
responseText, err := ioutil.ReadAll(response.Body)
responseBuffer := bytes.NewBuffer(responseText)
response.Body = ioutil.NopCloser(responseBuffer)
if err != nil {
return err
}
document, err := goquery.NewDocumentFromResponse(response)
if err != nil {
return err
}
payload := fmt.Sprintf("<script type='text/javascript' src='%s'></script>", j.javascriptURL)
selection := document.
Find("head").
AppendHtml(payload).
Parent()
html, err := selection.Html()
if err != nil {
return err
}
response.Body = ioutil.NopCloser(bytes.NewBufferString(html))
return nil
}
type LocationRewritingResponseTransformer struct{}
func (l LocationRewritingResponseTransformer) Transform(response *http.Response) error {
location, err := response.Location()
if err != nil {
if err == http.ErrNoLocation {
return nil
}
return err
}
// Turn it into a relative URL
location.Scheme = ""
location.Host = ""
response.Header.Set("Location", location.String())
return nil
}
type CSPRemovingTransformer struct{}
func (c CSPRemovingTransformer) Transform(response *http.Response) error {
response.Header.Del("Content-Security-Policy")
return nil
}