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)
}