forked from ympons/go-orientrest
/
session.go
119 lines (110 loc) · 2.42 KB
/
session.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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
package orientrest
import (
"bytes"
"net/http"
"net/url"
"strings"
"mime/multipart"
"log"
"io/ioutil"
"github.com/jmcvetta/napping"
)
// Hack based on Napping Send method to allow uploading files
func (s *OSession) Upload(r *napping.Request, file []byte) (response string, err error) {
r.Method = strings.ToUpper(r.Method)
//
// Create a URL object from the raw url string. This will allow us to compose
// query parameters programmatically and be guaranteed of a well-formed URL.
//
u, err := url.Parse(r.Url)
if err != nil {
log.Printf("%v", err)
return
}
//
// Default query parameters
//
p := url.Values{}
//
// Encode parameters
//
u.RawQuery = p.Encode()
//
// Create a Request object; if populated, Data field is JSON encoded as
// request body
//
header := http.Header{}
if s.Header != nil {
for k, _ := range *s.Header {
v := s.Header.Get(k)
header.Set(k, v)
}
}
var req *http.Request
buf := new(bytes.Buffer)
w := multipart.NewWriter(buf)
part, err := w.CreateFormFile("filename", "dbimport")
if err != nil {
log.Printf("FormFile %v", err)
}
part.Write(file)
err = w.Close()
req, err = http.NewRequest(r.Method, u.String(), buf)
header.Set("Content-Type", w.FormDataContentType())
//
// Merge Session and Request options
//
var userinfo *url.Userinfo
if u.User != nil {
userinfo = u.User
}
if s.Userinfo != nil {
userinfo = s.Userinfo
}
// Prefer Request's user credentials
if r.Userinfo != nil {
userinfo = r.Userinfo
}
if r.Header != nil {
for k, v := range *r.Header {
header.Set(k, v[0]) // Is there always guarnateed to be at least one value for a header?
}
}
if header.Get("Accept") == "" {
header.Add("Accept", "application/json") // Default, can be overridden with Opts
}
req.Header = header
//
// Set HTTP Basic authentication if userinfo is supplied
//
if userinfo != nil {
pwd, _ := userinfo.Password()
req.SetBasicAuth(userinfo.Username(), pwd)
if u.Scheme != "https" {
//s.log("WARNING: Using HTTP Basic Auth in cleartext is insecure.")
}
}
//
// Execute the HTTP request
//
var client *http.Client
if s.Client != nil {
client = s.Client
} else {
client = &http.Client{}
s.Client = client
}
resp, err := client.Do(req)
if err != nil {
log.Printf("%v", err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Printf("Body: %v", err)
return
}
response = string(body)
return
}