static void handle_http_request()

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