Skip to content

Commit

Permalink
tweak cookies to store hostname
Browse files Browse the repository at this point in the history
dump all http request/response with --verbose
  • Loading branch information
coryb committed Aug 3, 2016
1 parent f54267b commit f93fe79
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 24 deletions.
60 changes: 43 additions & 17 deletions cli.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,11 @@ import (
"gopkg.in/op/go-logging.v1"
"io/ioutil"
"net/http"
"net/http/httputil"
"net/http/cookiejar"
"net/url"
"os"
"os/exec"
"path"
"path/filepath"
"runtime"
"strings"
Expand Down Expand Up @@ -66,7 +66,22 @@ func New(opts map[string]interface{}) *Cli {
return cli
}

func (c *Cli) saveCookies(cookies []*http.Cookie) {
func (c *Cli) saveCookies(resp *http.Response) {
if _, ok := resp.Header["Set-Cookie"]; !ok {
return
}

cookies := resp.Cookies()
for _, cookie := range cookies {
if cookie.Domain == "" {
// if it is host:port then we need to split off port
parts := strings.Split(resp.Request.URL.Host, ":")
host := parts[0]
log.Debugf("Setting DOMAIN to %s for Cookie: %s", host, cookie)
cookie.Domain = host
}
}

// expiry in one week from now
expiry := time.Now().Add(24 * 7 * time.Hour)
for _, cookie := range cookies {
Expand All @@ -76,11 +91,11 @@ func (c *Cli) saveCookies(cookies []*http.Cookie) {
if currentCookies := c.loadCookies(); currentCookies != nil {
currentCookiesByName := make(map[string]*http.Cookie)
for _, cookie := range currentCookies {
currentCookiesByName[cookie.Name] = cookie
currentCookiesByName[cookie.Name+cookie.Domain] = cookie
}

for _, cookie := range cookies {
currentCookiesByName[cookie.Name] = cookie
currentCookiesByName[cookie.Name+cookie.Domain] = cookie
}

mergedCookies := make([]*http.Cookie, 0, len(currentCookiesByName))
Expand All @@ -102,14 +117,17 @@ func (c *Cli) loadCookies() []*http.Cookie {
}
if err != nil {
log.Errorf("Failed to open %s: %s", c.cookieFile, err)
os.Exit(1)
panic(err)
}
cookies := make([]*http.Cookie, 0)
err = json.Unmarshal(bytes, &cookies)
if err != nil {
log.Errorf("Failed to parse json from file %s: %s", c.cookieFile, err)
}
log.Debugf("Loading Cookies: %s", cookies)

if os.Getenv("LOG_TRACE") != "" && log.IsEnabledFor(logging.DEBUG) {
log.Debugf("Loading Cookies: %s", cookies)
}
return cookies
}

Expand Down Expand Up @@ -142,17 +160,8 @@ func (c *Cli) delete(uri string) (*http.Response, error) {
func (c *Cli) makeRequestWithContent(method string, uri string, content string) (*http.Response, error) {
buffer := bytes.NewBufferString(content)
req, _ := http.NewRequest(method, uri, buffer)

log.Infof("%s %s", req.Method, req.URL.String())
if log.IsEnabledFor(logging.DEBUG) {
logBuffer := bytes.NewBuffer(make([]byte, 0, len(content)))
req.Write(logBuffer)
log.Debugf("%s", logBuffer)
// need to recreate the buffer since the offset is now at the end
// need to be able to rewind the buffer offset, dont know how yet
req, _ = http.NewRequest(method, uri, bytes.NewBufferString(content))
}

if resp, err := c.makeRequest(req); err != nil {
return nil, err
} else {
Expand Down Expand Up @@ -190,7 +199,20 @@ func (c *Cli) get(uri string) (*http.Response, error) {
}

func (c *Cli) makeRequest(req *http.Request) (resp *http.Response, err error) {
req.Header.Set("Accept", "application/json")
req.Header.Set("Content-Type", "application/json")

// this is actually done in http.send but doing it
// here so we can log it in DumpRequest for debugging
for _, cookie := range c.ua.Jar.Cookies(req.URL) {
req.AddCookie(cookie)
}

if log.IsEnabledFor(logging.DEBUG) {
out, _ := httputil.DumpRequest(req,true);
log.Debugf("Request: %s", out)
}

if resp, err = c.ua.Do(req); err != nil {
log.Errorf("Failed to %s %s: %s", req.Method, req.URL.String(), err)
return nil, err
Expand All @@ -204,9 +226,13 @@ func (c *Cli) makeRequest(req *http.Request) (resp *http.Response, err error) {
})

if _, ok := resp.Header["Set-Cookie"]; ok {
c.saveCookies(resp.Cookies())
c.saveCookies(resp)
}
}
if log.IsEnabledFor(logging.DEBUG) {
out, _ := httputil.DumpResponse(resp,true);
log.Debugf("Response: %s", out)
}
return resp, nil
}

Expand Down
7 changes: 0 additions & 7 deletions commands.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,6 @@ func (c *Cli) CmdLogin() error {
if resp, err := c.makeRequest(req); err != nil {
return err
} else {
out, _ := httputil.DumpResponse(resp, true)
log.Debugf("%s", out)
if resp.StatusCode == 403 {
// probably got this, need to redirect the user to login manually
// X-Authentication-Denied-Reason: CAPTCHA_CHALLENGE; login-url=https://jira/login.jsp
Expand Down Expand Up @@ -260,7 +258,6 @@ func (c *Cli) CmdCreate() error {
fmt.Sprintf("create-%s-", sanitizedType),
issueData,
func(json string) error {
log.Debugf("JSON: %s", json)
uri := fmt.Sprintf("%s/rest/api/2/issue", c.endpoint)
if c.getOptBool("dryrun", false) {
log.Debugf("POST: %s", json)
Expand Down Expand Up @@ -519,8 +516,6 @@ func (c *Cli) CmdTransition(issue string, trans string) error {
}

handlePost := func(json string) error {
log.Debugf("POST: %s", json)
// os.Exit(0)
uri = fmt.Sprintf("%s/rest/api/2/issue/%s/transitions", c.endpoint, issue)
if c.getOptBool("dryrun", false) {
log.Debugf("POST: %s", json)
Expand Down Expand Up @@ -572,7 +567,6 @@ func (c *Cli) CmdComment(issue string) error {
log.Debugf("comment called")

handlePost := func(json string) error {
log.Debugf("JSON: %s", json)
uri := fmt.Sprintf("%s/rest/api/2/issue/%s/comment", c.endpoint, issue)
if c.getOptBool("dryrun", false) {
log.Debugf("POST: %s", json)
Expand Down Expand Up @@ -669,7 +663,6 @@ func (c *Cli) CmdLabels(action string, issue string, labels []string) error {
}

handlePut := func(json string) error {
log.Debugf("JSON: %s", json)
uri := fmt.Sprintf("%s/rest/api/2/issue/%s", c.endpoint, issue)
if c.getOptBool("dryrun", false) {
log.Debugf("PUT: %s", json)
Expand Down

0 comments on commit f93fe79

Please sign in to comment.