@@ -734,4 +734,160 @@ void test_winhttp_crack_url() {
734734 sink (urlComponents.lpszExtraInfo );
735735 sink (*urlComponents.lpszExtraInfo ); // $ ir
736736 }
737+ }
738+
739+ using HTTP_REQUEST_ID = ULONGLONG;
740+ using HTTP_CONNECTION_ID = ULONGLONG;
741+ using HTTP_URL_CONTEXT = ULONGLONG;
742+ using HTTP_RAW_CONNECTION_ID = ULONGLONG;
743+
744+ typedef struct _HTTP_VERSION {
745+ USHORT MajorVersion;
746+ USHORT MinorVersion;
747+ } HTTP_VERSION, *PHTTP_VERSION;
748+
749+ typedef enum _HTTP_VERB {
750+ HttpVerbUnparsed = 0
751+ } HTTP_VERB, *PHTTP_VERB;
752+
753+ typedef struct _HTTP_COOKED_URL {
754+ USHORT FullUrlLength;
755+ USHORT HostLength;
756+ USHORT AbsPathLength;
757+ USHORT QueryStringLength;
758+ PCWSTR pFullUrl;
759+ PCWSTR pHost;
760+ PCWSTR pAbsPath;
761+ PCWSTR pQueryString;
762+ } HTTP_COOKED_URL, *PHTTP_COOKED_URL;
763+
764+ typedef struct _HTTP_TRANSPORT_ADDRESS {
765+ struct sockaddr * pRemoteAddress;
766+ struct sockaddr * pLocalAddress;
767+ } HTTP_TRANSPORT_ADDRESS, *PHTTP_TRANSPORT_ADDRESS;
768+
769+ typedef struct _HTTP_KNOWN_HEADER {
770+ USHORT RawValueLength;
771+ PCSTR pRawValue;
772+ } HTTP_KNOWN_HEADER, *PHTTP_KNOWN_HEADER;
773+
774+ typedef struct _HTTP_UNKNOWN_HEADER {
775+ USHORT NameLength;
776+ USHORT RawValueLength;
777+ PCSTR pName;
778+ PCSTR pRawValue;
779+ } HTTP_UNKNOWN_HEADER, *PHTTP_UNKNOWN_HEADER;
780+
781+ typedef struct _HTTP_REQUEST_HEADERS {
782+ USHORT UnknownHeaderCount;
783+ PHTTP_UNKNOWN_HEADER pUnknownHeaders;
784+ USHORT TrailerCount;
785+ PHTTP_UNKNOWN_HEADER pTrailers;
786+ HTTP_KNOWN_HEADER KnownHeaders[41 ];
787+ } HTTP_REQUEST_HEADERS, *PHTTP_REQUEST_HEADERS;
788+
789+ typedef struct _HTTP_DATA_CHUNK {
790+ int DataChunkType;
791+ union {
792+ struct {
793+ PVOID pBuffer;
794+ ULONG BufferLength;
795+ } FromMemory;
796+ };
797+ } HTTP_DATA_CHUNK, *PHTTP_DATA_CHUNK;
798+
799+ typedef struct _HTTP_SSL_CLIENT_CERT_INFO {
800+ ULONG CertFlags;
801+ ULONG CertEncodedSize;
802+ char * pCertEncoded;
803+ HANDLE Token;
804+ BOOL CertDeniedByMapper;
805+ } HTTP_SSL_CLIENT_CERT_INFO, *PHTTP_SSL_CLIENT_CERT_INFO;
806+
807+ typedef struct _HTTP_SSL_INFO {
808+ USHORT ServerCertKeySize;
809+ USHORT ConnectionKeySize;
810+ ULONG ServerCertIssuerSize;
811+ ULONG ServerCertSubjectSize;
812+ PCSTR pServerCertIssuer;
813+ PCSTR pServerCertSubject;
814+ PHTTP_SSL_CLIENT_CERT_INFO pClientCertInfo;
815+ ULONG SslClientCertNegotiated;
816+ } HTTP_SSL_INFO, *PHTTP_SSL_INFO;
817+
818+ typedef struct _HTTP_REQUEST {
819+ ULONG Flags;
820+ HTTP_CONNECTION_ID ConnectionId;
821+ HTTP_REQUEST_ID RequestId;
822+ HTTP_URL_CONTEXT UrlContext;
823+ HTTP_VERSION Version;
824+ HTTP_VERB Verb;
825+ USHORT UnknownVerbLength;
826+ USHORT RawUrlLength;
827+ PCSTR pUnknownVerb;
828+ PCSTR pRawUrl;
829+ HTTP_COOKED_URL CookedUrl;
830+ HTTP_TRANSPORT_ADDRESS Address;
831+ HTTP_REQUEST_HEADERS Headers;
832+ ULONGLONG BytesReceived;
833+ USHORT EntityChunkCount;
834+ PHTTP_DATA_CHUNK pEntityChunks;
835+ HTTP_RAW_CONNECTION_ID RawConnectionId;
836+ PHTTP_SSL_INFO pSslInfo;
837+ } HTTP_REQUEST, *PHTTP_REQUEST;
838+
839+ ULONG HttpReceiveHttpRequest (
840+ HANDLE RequestQueueHandle,
841+ HTTP_REQUEST_ID RequestId,
842+ ULONG Flags,
843+ PHTTP_REQUEST RequestBuffer,
844+ ULONG RequestBufferLength,
845+ PULONG BytesReturned,
846+ LPOVERLAPPED Overlapped
847+ );
848+
849+ ULONG HttpReceiveRequestEntityBody (
850+ HANDLE RequestQueueHandle,
851+ HTTP_REQUEST_ID RequestId,
852+ ULONG Flags,
853+ PVOID EntityBuffer,
854+ ULONG EntityBufferLength,
855+ PULONG BytesReturned,
856+ LPOVERLAPPED Overlapped
857+ );
858+
859+ ULONG HttpReceiveClientCertificate (
860+ HANDLE RequestQueueHandle,
861+ HTTP_CONNECTION_ID ConnectionId,
862+ ULONG Flags,
863+ PHTTP_SSL_CLIENT_CERT_INFO SslClientCertInfo,
864+ ULONG SslClientCertInfoSize,
865+ PULONG BytesReceived,
866+ LPOVERLAPPED Overlapped
867+ );
868+
869+ void test_http_server_api (HANDLE hRequestQueue) {
870+ {
871+ HTTP_REQUEST requestBuffer;
872+ ULONG bytesReturned;
873+ ULONG result = HttpReceiveHttpRequest (hRequestQueue, 0 , 0 , &requestBuffer, sizeof (requestBuffer), &bytesReturned, nullptr );
874+ char * p = reinterpret_cast <char *>(&requestBuffer);
875+ sink (p);
876+ sink (*p); // $ MISSING: ir
877+ }
878+ {
879+ char buffer[1024 ];
880+ ULONG bytesReturned;
881+ ULONG result = HttpReceiveRequestEntityBody (hRequestQueue, 0 , 0 , buffer, sizeof (buffer), &bytesReturned, nullptr );
882+ sink (buffer);
883+ sink (*buffer); // $ MISSING: ir
884+ }
885+ {
886+ HTTP_SSL_CLIENT_CERT_INFO certInfo;
887+ ULONG bytesReceived;
888+ ULONG result = HttpReceiveClientCertificate (hRequestQueue, 0 , 0 , &certInfo, sizeof (certInfo), &bytesReceived, nullptr );
889+ char * p = reinterpret_cast <char *>(&certInfo);
890+ sink (p);
891+ sink (*p); // $ MISSING: ir
892+ }
737893}
0 commit comments