Пример #1
0
func (c *ErrorController) parseJavascriptContent(content string) (string, error) {
	if !strings.HasPrefix(content, "//javascript") {
		return "", fmt.Errorf("not javascript content")
	}
	content = strings.TrimSpace(strings.TrimPrefix(content, "//javascript"))

	rawUrl := c.Ctx.Input.Scheme() + "://" + c.Ctx.Request.Host + c.Ctx.Request.RequestURI

	request := utils.ToJson(map[string]interface{}{
		"params":  c.Input(),
		"host":    c.Ctx.Request.Host,
		"url":     rawUrl,
		"headers": c.Ctx.Request.Header,
	})

	var body []byte
	if strings.Contains(content, "$response.body") {
		// get origin request's response body
		finish := make(chan bool)
		go func() {
			client := newProxyHttpServer()
			client.OnResponse().DoFunc(func(resp *http.Response, ctx *goproxy.ProxyCtx) *http.Response {
				body, _ = ioutil.ReadAll(resp.Body)
				finish <- true
				return resp
			})
			client.ServeHTTP(c.Ctx.ResponseWriter.ResponseWriter, c.Ctx.Request)
		}()
		<-finish
	}
	response := utils.ToJson(map[string]interface{}{
		"body": string(body),
	})

	l.Lock()
	defer l.Unlock()
	_, err := vm.Run(fmt.Sprintf(`
    $request=%s;
    $response=%s;

    %s
    `, request, response, content))
	if err != nil {
		return "", err
	}

	if value, err := vm.Get("$output"); err == nil {
		if content, err := value.ToString(); err == nil {
			return content, nil
		}
	}

	return "", err
}
Пример #2
0
func (this *MockRule) Bind(c ResolveParameter) {
	id, _ := c.GetInt("id")
	projectId, _ := c.GetInt("projectId")
	url := c.GetString("url")
	title := c.GetString("title")
	method := c.GetString("method")
	templateDir := c.GetString("templateDir")
	templateFile := c.GetString("templateFile")
	backendUrl := c.GetString("backendUrl")

	headers := []Pair{}
	params := []Pair{}
	for i := 0; i < 100; i++ {
		key := c.GetString(fmt.Sprintf("headers[%d][key]", i))
		if key == "" {
			break
		}

		value := c.GetString(fmt.Sprintf("headers[%d][value]", i))
		headers = append(headers, Pair{Key: key, Value: value})
	}

	for i := 0; i < 100; i++ {
		key := c.GetString(fmt.Sprintf("params[%d][key]", i))
		if key == "" {
			break
		}

		value := c.GetString(fmt.Sprintf("params[%d][value]", i))
		params = append(params, Pair{Key: key, Value: value})
	}

	if this.Id <= 0 {
		this.Id = id
	}
	if this.ProjectId <= 0 {
		this.ProjectId = projectId
	}

	this.Url = url
	this.Title = title
	this.Method = method
	this.Url = url
	this.TemplateDir = templateDir
	this.TemplateFile = templateFile
	this.BackendUrl = backendUrl
	this.Headers = utils.ToJson(headers)
	this.Params = utils.ToJson(params)
	this.HeaderPair = headers
	this.ParamPair = params
	this.Enable = true

	var contents []*MockContent
	for i := 0; i < 100; i++ {
		val := c.GetString(fmt.Sprintf("contents[%d][id]", i))
		if val == "" {
			break
		}

		var content MockContent
		content.Id, _ = c.GetInt(fmt.Sprintf("contents[%d][id]", i))
		content.RuleId, _ = c.GetInt(fmt.Sprintf("contents[%d][ruleId]", i))
		content.Tag = c.GetString(fmt.Sprintf("contents[%d][tag]", i))
		content.DelaySeconds, _ = c.GetInt(fmt.Sprintf("contents[%d][delaySeconds]", i))
		content.Content = c.GetString(fmt.Sprintf("contents[%d][content]", i))
		contents = append(contents, &content)
	}
	this.Contents = contents
}