All Downloads are FREE. Search and download functionalities are using the official Maven repository.

notion.api.v1.http.HttpUrlConnPatchMethodWorkaround.kt Maven / Gradle / Ivy

/*
 * Copyright (c) 2011, 2021 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0, which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * This Source Code may also be made available under the following Secondary
 * Licenses when the conditions for such availability set forth in the
 * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
 * version 2 with the GNU Classpath Exception, which is available at
 * https://www.gnu.org/software/classpath/license.html.
 *
 * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
 */
package notion.api.v1.http

import java.lang.reflect.Field
import java.net.HttpURLConnection
import java.net.ProtocolException
import java.security.AccessController
import java.security.PrivilegedActionException
import java.security.PrivilegedExceptionAction

/**
 * Thanks to
 * https://github.com/eclipse-ee4j/jersey/blob/3.0.2/core-client/src/main/java/org/glassfish/jersey/client/internal/HttpUrlConnector.java#L473
 */
object HttpUrlConnPatchMethodWorkaround {

    fun setPatchRequestMethod(conn: HttpURLConnection) {
        try {
            conn.requestMethod = "PATCH" // Check whether we are running on a buggy JRE
        } catch (pe: ProtocolException) {
            try {
                AccessController.doPrivileged(
                    PrivilegedExceptionAction {
                        try {
                            conn.requestMethod = "PATCH"
                        } catch (pe: ProtocolException) {
                            var connectionClass: Class<*>? = conn.javaClass
                            val delegateField: Field?
                            try {
                                delegateField = connectionClass!!.getDeclaredField("delegate")
                                delegateField.isAccessible = true
                                val delegateConnection = delegateField[conn] as HttpURLConnection
                                setPatchRequestMethod(delegateConnection)
                            } catch (e: NoSuchFieldException) {
                                // Ignore for now, keep going
                            } catch (e: IllegalArgumentException) {
                                throw RuntimeException(e)
                            } catch (e: IllegalAccessException) {
                                throw RuntimeException(e)
                            }
                            try {
                                var methodField: Field
                                while (connectionClass != null) {
                                    try {
                                        methodField = connectionClass.getDeclaredField("method")
                                    } catch (e: NoSuchFieldException) {
                                        connectionClass = connectionClass.superclass
                                        continue
                                    }
                                    methodField.isAccessible = true
                                    methodField[conn] = "PATCH"
                                    break
                                }
                            } catch (e: Exception) {
                                throw RuntimeException(e)
                            }
                        }
                        null
                    })
            } catch (e: PrivilegedActionException) {
                val cause: Throwable? = e.cause
                if (cause is RuntimeException) {
                    throw cause
                } else {
                    throw RuntimeException(cause)
                }
            }
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy