func()

in go/wtl/proxy/driverhub/driver_hub.go [211:299]


func (h *WebDriverHub) createSession(w http.ResponseWriter, r *http.Request) {
	ctx := r.Context()

	if err := h.waitForHealthyEnv(ctx); err != nil {
		sessionNotCreated(w, err)
		return
	}

	body, err := ioutil.ReadAll(r.Body)
	if err != nil {
		sessionNotCreated(w, err)
		return
	}

	j := map[string]interface{}{}

	if err := json.Unmarshal(body, &j); err != nil {
		sessionNotCreated(w, err)
		return
	}

	requestedCaps, err := capabilities.FromNewSessionArgs(j)
	if err != nil {
		sessionNotCreated(w, err)
		return
	}

	id := h.NextID()

	caps, err := h.Env.StartSession(ctx, id, requestedCaps)
	if err != nil {
		sessionNotCreated(w, err)
		return
	}

	var session *WebDriverSession

	if reusable, ok := h.GetReusableSession(ctx, caps); ok {
		reusable.Unpause(id)
		session = reusable
	} else {
		// TODO(DrMarcII) parameterize attempts based on browser metadata
		driver, err := webdriver.CreateSession(ctx, h.Env.WDAddress(ctx), 3, caps.Strip("google:canReuseSession"))
		if err != nil {
			if err2 := h.Env.StopSession(ctx, id); err2 != nil {
				log.Printf("error stopping session after failing to launch webdriver: %v", err2)
			}
			sessionNotCreated(w, err)
			return
		}

		s, err := CreateSession(id, h, driver, caps)
		if err != nil {
			sessionNotCreated(w, err)
			return
		}
		session = s
	}

	h.AddSession(session.WebDriver.SessionID(), session)

	var respJSON map[string]interface{}

	if session.WebDriver.W3C() {
		respJSON = map[string]interface{}{
			"value": map[string]interface{}{
				"capabilities": session.WebDriver.Capabilities(),
				"sessionId":    session.WebDriver.SessionID(),
			},
		}
	} else {
		respJSON = map[string]interface{}{
			"value":     session.WebDriver.Capabilities(),
			"sessionId": session.WebDriver.SessionID(),
			"status":    0,
		}
	}

	bytes, err := json.Marshal(respJSON)
	if err != nil {
		unknownError(w, err)
		return
	}

	w.Header().Set("Content-Type", contentType)
	httphelper.SetDefaultResponseHeaders(w.Header())
	w.WriteHeader(http.StatusOK)
	w.Write(bytes)
}