[PATCH 1/5] http.sys: Allow sending response data.
Zebediah Figura
z.figura12 at gmail.com
Wed Aug 28 20:45:27 CDT 2019
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
dlls/http.sys/http.c | 45 ++++++++++++++++++++++++++++++++++++++++++++
include/wine/http.h | 8 ++++++++
2 files changed, 53 insertions(+)
diff --git a/dlls/http.sys/http.c b/dlls/http.sys/http.c
index 4115afc8672..b2400a26b7c 100644
--- a/dlls/http.sys/http.c
+++ b/dlls/http.sys/http.c
@@ -1193,6 +1193,48 @@ static NTSTATUS http_receive_request(struct request_queue *queue, IRP *irp)
return ret;
}
+static NTSTATUS http_send_response(struct request_queue *queue, IRP *irp)
+{
+ const struct http_response *response = irp->AssociatedIrp.SystemBuffer;
+ struct connection *conn;
+
+ TRACE("id %s, len %d.\n", wine_dbgstr_longlong(response->id), response->len);
+
+ EnterCriticalSection(&http_cs);
+
+ LIST_FOR_EACH_ENTRY(conn, &connections, struct connection, entry)
+ {
+ if (conn->req_id == response->id)
+ {
+ if (send(conn->socket, response->buffer, response->len, 0) >= 0)
+ {
+ conn->queue = NULL;
+ conn->req_id = HTTP_NULL_ID;
+ WSAEventSelect(conn->socket, request_event, FD_READ | FD_CLOSE);
+ irp->IoStatus.Information = response->len;
+ /* We might have another request already in the buffer. */
+ if (parse_request(conn) < 0)
+ {
+ WARN("Failed to parse request; shutting down connection.\n");
+ send_400(conn);
+ close_connection(conn);
+ }
+ }
+ else
+ {
+ ERR("Got error %u; shutting down connection.\n", WSAGetLastError());
+ close_connection(conn);
+ }
+
+ LeaveCriticalSection(&http_cs);
+ return STATUS_SUCCESS;
+ }
+ }
+
+ LeaveCriticalSection(&http_cs);
+ return STATUS_CONNECTION_INVALID;
+}
+
static NTSTATUS WINAPI dispatch_ioctl(DEVICE_OBJECT *device, IRP *irp)
{
IO_STACK_LOCATION *stack = IoGetCurrentIrpStackLocation(irp);
@@ -1210,6 +1252,9 @@ static NTSTATUS WINAPI dispatch_ioctl(DEVICE_OBJECT *device, IRP *irp)
case IOCTL_HTTP_RECEIVE_REQUEST:
ret = http_receive_request(queue, irp);
break;
+ case IOCTL_HTTP_SEND_RESPONSE:
+ ret = http_send_response(queue, irp);
+ break;
default:
FIXME("Unhandled ioctl %#x.\n", stack->Parameters.DeviceIoControl.IoControlCode);
ret = STATUS_NOT_IMPLEMENTED;
diff --git a/include/wine/http.h b/include/wine/http.h
index 1145cab71a7..eb75d8f60ef 100644
--- a/include/wine/http.h
+++ b/include/wine/http.h
@@ -26,6 +26,7 @@
#define IOCTL_HTTP_ADD_URL CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, 0)
#define IOCTL_HTTP_REMOVE_URL CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, 0)
#define IOCTL_HTTP_RECEIVE_REQUEST CTL_CODE(FILE_DEVICE_UNKNOWN, 0x802, METHOD_BUFFERED, 0)
+#define IOCTL_HTTP_SEND_RESPONSE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x803, METHOD_BUFFERED, 0)
struct http_add_url_params
{
@@ -41,4 +42,11 @@ struct http_receive_request_params
ULONG bits;
};
+struct http_response
+{
+ HTTP_REQUEST_ID id;
+ int len;
+ char buffer[1];
+};
+
#endif
--
2.22.0
More information about the wine-devel
mailing list