in HAP/HAPIPAccessoryServer.c [2561:2858]
static void handle_http_request(HAPIPSessionDescriptor* session) {
HAPPrecondition(session);
HAPPrecondition(session->server);
HAPAccessoryServer* server = (HAPAccessoryServer*) session->server;
HAPPrecondition(session->securitySession.isOpen);
HAPAssert(session->httpReader.state == util_HTTP_READER_STATE_DONE);
HAPAssert(!session->httpParserError);
{
HAPPrecondition(session->securitySession.type == kHAPIPSecuritySessionType_HAP);
if ((session->httpURI.numBytes == 9) &&
HAPRawBufferAreEqual(HAPNonnull(session->httpURI.bytes), "/identify", 9)) {
if ((session->httpMethod.numBytes == 4) &&
HAPRawBufferAreEqual(HAPNonnull(session->httpMethod.bytes), "POST", 4)) {
if (!HAPAccessoryServerIsPaired(HAPNonnull(session->server))) {
identify_primary_accessory(session);
} else {
write_msg(&session->outboundBuffer, kHAPIPAccessoryServerResponse_InsufficientPrivileges);
}
} else {
write_msg(&session->outboundBuffer, kHAPIPAccessoryServerResponse_MethodNotAllowed);
}
} else if (
(session->httpURI.numBytes == 11) &&
HAPRawBufferAreEqual(HAPNonnull(session->httpURI.bytes), "/pair-setup", 11)) {
if ((session->httpMethod.numBytes == 4) &&
HAPRawBufferAreEqual(HAPNonnull(session->httpMethod.bytes), "POST", 4)) {
if (!session->securitySession.isSecured) {
// Close existing transient session.
for (size_t i = 0; i < server->ip.storage->numSessions; i++) {
HAPIPSession* ipSession = &server->ip.storage->sessions[i];
HAPIPSessionDescriptor* t = (HAPIPSessionDescriptor*) &ipSession->descriptor;
if (!t->server) {
continue;
}
// TODO Make this finish writing ongoing responses. Similar to Remove Pairing.
if (t != session && t->securitySession.type == kHAPIPSecuritySessionType_HAP &&
HAPSessionIsTransient(&t->securitySession._.hap)) {
HAPLog(&logObject,
"Closing transient session "
"due to /pair-setup while transient session is active.");
CloseSession(t);
}
}
// Handle message.
handle_pairing_data(session, HAPSessionHandlePairSetupWrite, HAPSessionHandlePairSetupRead);
} else {
HAPLog(&logObject, "Rejected POST /pair-setup: Only non-secure access is supported.");
write_msg(&session->outboundBuffer, kHAPIPAccessoryServerResponse_BadRequest);
}
} else {
write_msg(&session->outboundBuffer, kHAPIPAccessoryServerResponse_MethodNotAllowed);
}
} else if (
(session->httpURI.numBytes == 12) &&
HAPRawBufferAreEqual(HAPNonnull(session->httpURI.bytes), "/pair-verify", 12)) {
if ((session->httpMethod.numBytes == 4) &&
HAPRawBufferAreEqual(HAPNonnull(session->httpMethod.bytes), "POST", 4)) {
if (!session->securitySession.isSecured) {
handle_pairing_data(session, HAPSessionHandlePairVerifyWrite, HAPSessionHandlePairVerifyRead);
} else {
HAPLog(&logObject, "Rejected POST /pair-verify: Only non-secure access is supported.");
write_msg(&session->outboundBuffer, kHAPIPAccessoryServerResponse_BadRequest);
}
} else {
write_msg(&session->outboundBuffer, kHAPIPAccessoryServerResponse_MethodNotAllowed);
}
} else if (
(session->httpURI.numBytes == 9) &&
HAPRawBufferAreEqual(HAPNonnull(session->httpURI.bytes), "/pairings", 9)) {
if ((session->httpMethod.numBytes == 4) &&
HAPRawBufferAreEqual(HAPNonnull(session->httpMethod.bytes), "POST", 4)) {
if (session->securitySession.isSecured || kHAPIPAccessoryServer_SessionSecurityDisabled) {
if (!HAPSessionIsTransient(&session->securitySession._.hap)) {
handle_pairing_data(session, HAPSessionHandlePairingsWrite, HAPSessionHandlePairingsRead);
} else {
HAPLog(&logObject, "Rejected POST /pairings: Session is transient.");
write_msg(&session->outboundBuffer, kHAPIPAccessoryServerResponse_BadRequest);
}
} else {
write_msg(&session->outboundBuffer, kHAPIPAccessoryServerResponse_ConnectionAuthorizationRequired);
}
} else {
if (session->securitySession.isSecured || kHAPIPAccessoryServer_SessionSecurityDisabled) {
if (!HAPSessionIsTransient(&session->securitySession._.hap)) {
write_msg(&session->outboundBuffer, kHAPIPAccessoryServerResponse_MethodNotAllowed);
} else {
HAPLog(&logObject, "Rejected request for /pairings: Session is transient.");
write_msg(&session->outboundBuffer, kHAPIPAccessoryServerResponse_BadRequest);
}
} else {
write_msg(&session->outboundBuffer, kHAPIPAccessoryServerResponse_ConnectionAuthorizationRequired);
}
}
} else if (
(session->httpURI.numBytes == 15) &&
HAPRawBufferAreEqual(HAPNonnull(session->httpURI.bytes), "/secure-message", 15)) {
if ((session->httpMethod.numBytes == 4) &&
HAPRawBufferAreEqual(HAPNonnull(session->httpMethod.bytes), "POST", 4)) {
if (session->securitySession.isSecured || kHAPIPAccessoryServer_SessionSecurityDisabled) {
handle_secure_message(session);
} else {
write_msg(&session->outboundBuffer, kHAPIPAccessoryServerResponse_ConnectionAuthorizationRequired);
}
} else {
if (session->securitySession.isSecured || kHAPIPAccessoryServer_SessionSecurityDisabled) {
write_msg(&session->outboundBuffer, kHAPIPAccessoryServerResponse_MethodNotAllowed);
} else {
write_msg(&session->outboundBuffer, kHAPIPAccessoryServerResponse_ConnectionAuthorizationRequired);
}
}
} else if (
(session->httpURI.numBytes == 7) &&
HAPRawBufferAreEqual(HAPNonnull(session->httpURI.bytes), "/config", 7)) {
if ((session->httpMethod.numBytes == 4) &&
HAPRawBufferAreEqual(HAPNonnull(session->httpMethod.bytes), "POST", 4)) {
if (session->securitySession.isSecured || kHAPIPAccessoryServer_SessionSecurityDisabled) {
if (!HAPSessionIsTransient(&session->securitySession._.hap)) {
HAPLog(&logObject, "Rejected POST /config: Session is not transient.");
write_msg(&session->outboundBuffer, kHAPIPAccessoryServerResponse_ResourceNotFound);
} else {
HAPLog(&logObject, "Rejected POST /config: Session is transient.");
write_msg(&session->outboundBuffer, kHAPIPAccessoryServerResponse_BadRequest);
}
} else {
write_msg(&session->outboundBuffer, kHAPIPAccessoryServerResponse_ConnectionAuthorizationRequired);
}
} else {
if (session->securitySession.isSecured || kHAPIPAccessoryServer_SessionSecurityDisabled) {
if (!HAPSessionIsTransient(&session->securitySession._.hap)) {
write_msg(&session->outboundBuffer, kHAPIPAccessoryServerResponse_MethodNotAllowed);
} else {
HAPLog(&logObject, "Rejected request for /config: Session is transient.");
write_msg(&session->outboundBuffer, kHAPIPAccessoryServerResponse_BadRequest);
}
} else {
write_msg(&session->outboundBuffer, kHAPIPAccessoryServerResponse_ConnectionAuthorizationRequired);
}
}
} else if (
(session->httpURI.numBytes == 11) &&
HAPRawBufferAreEqual(HAPNonnull(session->httpURI.bytes), "/configured", 11)) {
if ((session->httpMethod.numBytes == 4) &&
HAPRawBufferAreEqual(HAPNonnull(session->httpMethod.bytes), "POST", 4)) {
HAPLog(&logObject, "Received unexpected /configured on _hap._tcp endpoint. Replying with success.");
write_msg(&session->outboundBuffer, kHAPIPAccessoryServerResponse_NoContent);
} else {
write_msg(&session->outboundBuffer, kHAPIPAccessoryServerResponse_MethodNotAllowed);
}
} else if (
(session->httpURI.numBytes == 12) &&
HAPRawBufferAreEqual(HAPNonnull(session->httpURI.bytes), "/accessories", 12)) {
if ((session->httpMethod.numBytes == 3) &&
HAPRawBufferAreEqual(HAPNonnull(session->httpMethod.bytes), "GET", 3)) {
if (session->securitySession.isSecured || kHAPIPAccessoryServer_SessionSecurityDisabled) {
if (!HAPSessionIsTransient(&session->securitySession._.hap)) {
get_accessories(session);
} else {
HAPLog(&logObject, "Rejected GET /accessories: Session is transient.");
write_msg(&session->outboundBuffer, kHAPIPAccessoryServerResponse_BadRequest);
}
} else {
write_msg(
&session->outboundBuffer,
kHAPIPAccessoryServerResponse_ConnectionAuthorizationRequiredWithStatus);
}
} else {
if (session->securitySession.isSecured || kHAPIPAccessoryServer_SessionSecurityDisabled) {
if (!HAPSessionIsTransient(&session->securitySession._.hap)) {
write_msg(&session->outboundBuffer, kHAPIPAccessoryServerResponse_MethodNotAllowed);
} else {
HAPLog(&logObject, "Rejected request for /accessories: Session is transient.");
write_msg(&session->outboundBuffer, kHAPIPAccessoryServerResponse_BadRequest);
}
} else {
write_msg(&session->outboundBuffer, kHAPIPAccessoryServerResponse_ConnectionAuthorizationRequired);
}
}
} else if (
(session->httpURI.numBytes >= 16) &&
HAPRawBufferAreEqual(HAPNonnull(session->httpURI.bytes), "/characteristics", 16)) {
if ((session->httpMethod.numBytes == 3) &&
HAPRawBufferAreEqual(HAPNonnull(session->httpMethod.bytes), "GET", 3)) {
if (session->securitySession.isSecured || kHAPIPAccessoryServer_SessionSecurityDisabled) {
if (!HAPSessionIsTransient(&session->securitySession._.hap)) {
get_characteristics(session);
} else {
HAPLog(&logObject, "Rejected GET /characteristics: Session is transient.");
write_msg(&session->outboundBuffer, kHAPIPAccessoryServerResponse_BadRequest);
}
} else {
write_msg(
&session->outboundBuffer,
kHAPIPAccessoryServerResponse_ConnectionAuthorizationRequiredWithStatus);
}
} else if (
(session->httpMethod.numBytes == 3) &&
HAPRawBufferAreEqual(HAPNonnull(session->httpMethod.bytes), "PUT", 3)) {
if (session->securitySession.isSecured || kHAPIPAccessoryServer_SessionSecurityDisabled) {
if (!HAPSessionIsTransient(&session->securitySession._.hap)) {
put_characteristics(session);
} else {
HAPLog(&logObject, "Rejected PUT /characteristics: Session is transient.");
write_msg(&session->outboundBuffer, kHAPIPAccessoryServerResponse_BadRequest);
}
} else {
write_msg(
&session->outboundBuffer,
kHAPIPAccessoryServerResponse_ConnectionAuthorizationRequiredWithStatus);
}
} else {
if (session->securitySession.isSecured || kHAPIPAccessoryServer_SessionSecurityDisabled) {
if (!HAPSessionIsTransient(&session->securitySession._.hap)) {
write_msg(&session->outboundBuffer, kHAPIPAccessoryServerResponse_MethodNotAllowed);
} else {
HAPLog(&logObject, "Rejected request for /characteristics: Session is transient.");
write_msg(&session->outboundBuffer, kHAPIPAccessoryServerResponse_BadRequest);
}
} else {
write_msg(&session->outboundBuffer, kHAPIPAccessoryServerResponse_ConnectionAuthorizationRequired);
}
}
} else if (
(session->httpURI.numBytes == 8) &&
HAPRawBufferAreEqual(HAPNonnull(session->httpURI.bytes), "/prepare", 8)) {
if ((session->httpMethod.numBytes == 3) &&
HAPRawBufferAreEqual(HAPNonnull(session->httpMethod.bytes), "PUT", 3)) {
if (session->securitySession.isSecured || kHAPIPAccessoryServer_SessionSecurityDisabled) {
if (!HAPSessionIsTransient(&session->securitySession._.hap)) {
put_prepare(session);
} else {
HAPLog(&logObject, "Rejected PUT /prepare: Session is transient.");
write_msg(&session->outboundBuffer, kHAPIPAccessoryServerResponse_BadRequest);
}
} else {
write_msg(
&session->outboundBuffer,
kHAPIPAccessoryServerResponse_ConnectionAuthorizationRequiredWithStatus);
}
} else {
if (session->securitySession.isSecured || kHAPIPAccessoryServer_SessionSecurityDisabled) {
if (!HAPSessionIsTransient(&session->securitySession._.hap)) {
write_msg(&session->outboundBuffer, kHAPIPAccessoryServerResponse_MethodNotAllowed);
} else {
HAPLog(&logObject, "Rejected request for /prepare: Session is transient.");
write_msg(&session->outboundBuffer, kHAPIPAccessoryServerResponse_BadRequest);
}
} else {
write_msg(&session->outboundBuffer, kHAPIPAccessoryServerResponse_ConnectionAuthorizationRequired);
}
}
} else if (
(session->httpURI.numBytes == 9) &&
HAPRawBufferAreEqual(HAPNonnull(session->httpURI.bytes), "/resource", 9)) {
if ((session->httpMethod.numBytes == 4) &&
HAPRawBufferAreEqual(HAPNonnull(session->httpMethod.bytes), "POST", 4)) {
if (session->securitySession.isSecured || kHAPIPAccessoryServer_SessionSecurityDisabled) {
if (!HAPSessionIsTransient(&session->securitySession._.hap)) {
post_resource(session);
} else {
HAPLog(&logObject, "Rejected POST /resource: Session is transient.");
write_msg(&session->outboundBuffer, kHAPIPAccessoryServerResponse_BadRequest);
}
} else {
write_msg(
&session->outboundBuffer,
kHAPIPAccessoryServerResponse_ConnectionAuthorizationRequiredWithStatus);
}
} else {
if (session->securitySession.isSecured || kHAPIPAccessoryServer_SessionSecurityDisabled) {
if (!HAPSessionIsTransient(&session->securitySession._.hap)) {
write_msg(&session->outboundBuffer, kHAPIPAccessoryServerResponse_MethodNotAllowed);
} else {
HAPLog(&logObject, "Rejected request for /resource: Session is transient.");
write_msg(&session->outboundBuffer, kHAPIPAccessoryServerResponse_BadRequest);
}
} else {
write_msg(&session->outboundBuffer, kHAPIPAccessoryServerResponse_ConnectionAuthorizationRequired);
}
}
} else {
HAPLogBuffer(&logObject, session->httpURI.bytes, session->httpURI.numBytes, "Unknown endpoint accessed.");
if (session->securitySession.isSecured || kHAPIPAccessoryServer_SessionSecurityDisabled) {
if (!HAPSessionIsTransient(&session->securitySession._.hap)) {
write_msg(&session->outboundBuffer, kHAPIPAccessoryServerResponse_ResourceNotFound);
} else {
HAPLog(&logObject, "Rejected request for unknown endpoint: Session is transient.");
write_msg(&session->outboundBuffer, kHAPIPAccessoryServerResponse_BadRequest);
}
} else {
write_msg(&session->outboundBuffer, kHAPIPAccessoryServerResponse_ConnectionAuthorizationRequired);
}
}
}
}